[gelöst] Versionsnummer vergleichen

Alles rund um die Programmierung mit Qt
Antworten
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

[gelöst] Versionsnummer vergleichen

Beitrag von 24dan »

brauche einen sicheren Algorithmus zum vergleichen von Versionsnummern:

Ausgangssituation:

Version des Programms: 2.0.1.102
Neue Version auf dem Server: 2.0.2.0

Ich dachte die einzelnen Teile nacheinander miteinander zu vergleichen:
Und aus dem verglsich auszusteigen sobald die Version vom Server größer ist als die des aktuellen Programms

Teil 1: 2.
Teil 2: 0.
Teil 3: 1.
Teil 4: 102
Zuletzt geändert von 24dan am 22. Dezember 2009 02:23, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag von phlox81 »

Pseudocode, aber so müsste es gehen:

Code: Alles auswählen

QStringList numbers = versionstring.split('.');
QVector<int> vnum;
bool ok;
foreach(numbers,QString str)
{
   int i = str.toInt(&ok);
   if(ok)
      vnum.push_back(i);
   else break;
}
Und das für beide Versionsstrings, danach müsstest du nur noch in einer Schleife die Vectoren vergleichen. Die Konvertierung zu int wäre bei einstelligen Versionsnummern überflüssig.

phlox
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Super Dank,
hat geklappt werde mir sicherheitshalber nochmal die einzelnen Int werte die verglichen werden in meinem Statusfenster loggen.

Code: Alles auswählen

//! Vergleicht zwei Versionsnummern des Typs X.X.X.X
/*!
\param programm QString mit der Versionsnummer des Programms
\param server QString mit der Versionsnummer auf dem Server
\return bool neue Version vorhanden
*/
bool UpdateSW::versionVergleichen(QString programm, QString server)
{
    bool ok;
    int i;

    // Programm Version in Zahlen splitten
    QStringList numbers1 = programm.split('.');
    QVector<int> vnum1;
    foreach(QString str1, numbers1)
    {
       i = str1.toInt(&ok);
       if(ok)
          vnum1.push_back(i);
       else break;
    };
    // Server Version in Zahlen splitten
    QStringList numbers2 = server.split('.');
    QVector<int> vnum2;
    foreach(QString str2, numbers2)
    {
       i = str2.toInt(&ok);
       if(ok)
          vnum2.push_back(i);
       else break;
    }
    // Versionsnummern vergleichen
    ok = false; // default kein Unterschied
    for(i = 0; i <= 3; i++)
    {
        // server größer als programm ?
        if(vnum2.at(i) > vnum1.at(i)) return true; // server hat neue Version       
        if(vnum2.at(i) < vnum1.at(i)) return false; // server hat keine neue Version
    }
    return (ok);
}

:P

@phlox81
Anmerkung:
1. foreach: Parameter mussten einmal gedreht werden!

2. Einstellige Versionsnummern? Programm Version: 1 und Version: 2 ???

3. Hast Du ne Ahnung wie ich meine exe in QT mit einer Versionsnummer automatisch kompilieren lassen kann so das auch die build raufgezählt werden? 2.0.0. -> .102 (build nummer) ???
Zuletzt geändert von 24dan am 31. März 2010 23:11, insgesamt 1-mal geändert.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
phlox81
Beiträge: 97
Registriert: 7. Juli 2009 12:30
Kontaktdaten:

Beitrag von phlox81 »

24dan hat geschrieben:
@phlox81
Anmerkung:
1. foreach: Parameter mussten einmal gedreht werden!

2. Einstellige Versionsnummern? Programm Version: 1 und Version: 2 ???

3. Hast Du ne Ahnung wie ich meine exe in QT mit einer Versionsnummer automatisch kompilieren lassen kann so das auch die build raufgezählt werden? 2.0.0. -> .102 (build nummer) ???
1. Ja, hab ja gesagt das das Pseudocode ist...

2. Halt ohne Buildnummer, sondern nur jeweils einstillige Nummern: 1.2.3.4

3. nein :)
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

phlox81 hat geschrieben:
24dan hat geschrieben:
2. Halt ohne Buildnummer, sondern nur jeweils einstillige Nummern: 1.2.3.4
Ja das ist jetzt nach der funktionierenden FKT ne Sache die ich mir mal überlegen muss.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag von chrislo1976 »

24dan hat geschrieben:
@phlox81
Anmerkung:
1. foreach: Parameter mussten einmal gedreht werden!

2. Einstellige Versionsnummern? Programm Version: 1 und Version: 2 ???

3. Hast Du ne Ahnung wie ich meine exe in QT mit einer Versionsnummer automatisch kompilieren lassen kann so das auch die build raufgezählt werden? 2.0.0. -> .102 (build nummer) ???
Hallo!

Zu 3.:
Ich verwende für diese Funktion einen Prebuild-Step der vor jeder Kompilierung die aktuelle Revisionsnummer in eine Headerdatei schreibt.
Die Revisionsnummer kommt in meinem Fall von SVN, und genauer gesagt von einem Tool von TortoiseSVN : SubWCRev. Mit diesem Tool kannst du in einer Datei Platzhalter angeben und dieses Tool ersetzt diese Platzhalter mit den entsprechenden Daten, z.B. die Revisionsnummer, das Datum usw...

Gruß,
Christian
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

hört sich genau nach dem an was ich suche ....

Ich lese den aktuellen Versionsstand auch schon aus dem Header meines Hauptprogrammes:

Code: Alles auswählen

#define def_VERSION "2.0.0.0"
Ich arbeite zur Zeit mit Git. :cry:
Hast Du Windows mit QTCreator und SVN am laufen?
Funktioniert das auch mit den anderen Sachen was die Versionskontrolle betrifft gut?

Kannst Du mir sagen wie ich das unter Win installieren/ konfigurieren muss.
Ich hatte schon beim runterladen des Installers Probleme (Ich habe den nicht gefunden
:oops: )
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
chrislo1976
Beiträge: 105
Registriert: 24. Februar 2008 09:45

Beitrag von chrislo1976 »

Ich verwende überwiegend Windows mit VS2008 und TortoiseSVN.
Also für mich reicht das SVN voll und ganz, aber ich weiß ja nicht welche Anforderungen du an ein CVS hast...

Es gibt für Git ja auch TortoiseGit, evtl. ist da das SubWCRec auch dabei.
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

Zähle mir meine Build Versionen jetzt selber hoch:

Code: Alles auswählen

    QFile file("buildNummer.txt");
    file.open(QIODevice::ReadOnly);
    QString build = file.readLine(200);
    file.remove();
    bool ok;
    int i_build = build.toInt(&ok, 10);
    i_build++;
    file.setFileName("buildNummer.txt");
    file.open(QFile::WriteOnly | QFile::Text);
    QTextStream out(&file);
    out << QString::number(i_build,10);
    file.close();
:P
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Hab noch nen oldschool Vorschlag für oben :D

Code: Alles auswählen

int compare(const char* v1, const char* v2)
{
   char b1[20];
   char b2[20];
   char* d = b1;
   const char* s = v1;

   for (int i = 0; i < 2; i++)
   {
      while (*s)
      {
         if (*s != '.')
         {
            d += sprintf(d, "%.3d", atoi(s));
            while (*s && *s != '.') s++;
         }

         if (*s) s++;
      }

      s= v2;
      d= b2;
   }

   return strcmp(b1, b2);
}
24dan
Beiträge: 274
Registriert: 26. Juni 2006 14:15
Wohnort: Hamburg

Beitrag von 24dan »

danke....

im oberen Vorschlag von mir habe ich noch einen BUG gefixed. Die alteren Versionsnummern wurden da bisher nicht als ALT und somit bitte kein Update der SW eingestufft.

:wink:
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
Antworten