Seite 1 von 1

[gelöst] Versionsnummer vergleichen

Verfasst: 22. Dezember 2009 01:32
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

Verfasst: 22. Dezember 2009 01:40
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

Verfasst: 22. Dezember 2009 02:16
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) ???

Verfasst: 22. Dezember 2009 10:03
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 :)

Verfasst: 22. Dezember 2009 15:49
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.

Verfasst: 22. Dezember 2009 15:57
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

Verfasst: 22. Dezember 2009 16:04
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: )

Verfasst: 22. Dezember 2009 17:54
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.

Verfasst: 31. März 2010 23:14
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

Verfasst: 1. April 2010 08:50
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);
}

Verfasst: 2. April 2010 00:02
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: