[gelöst] Versionsnummer vergleichen
[gelöst] Versionsnummer vergleichen
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
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)
(W. Heisenberg)
Pseudocode, aber so müsste es gehen:
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
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;
}
phlox
Super Dank,
hat geklappt werde mir sicherheitshalber nochmal die einzelnen Int werte die verglichen werden in meinem Statusfenster loggen.

@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) ???
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);
}
@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)
(W. Heisenberg)
1. Ja, hab ja gesagt das das Pseudocode ist...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) ???
2. Halt ohne Buildnummer, sondern nur jeweils einstillige Nummern: 1.2.3.4
3. nein
Ja das ist jetzt nach der funktionierenden FKT ne Sache die ich mir mal überlegen muss.phlox81 hat geschrieben:24dan hat geschrieben:
2. Halt ohne Buildnummer, sondern nur jeweils einstillige Nummern: 1.2.3.4
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
Hallo!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) ???
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
hört sich genau nach dem an was ich suche ....
Ich lese den aktuellen Versionsstand auch schon aus dem Header meines Hauptprogrammes:
Ich arbeite zur Zeit mit Git.
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
ch habe den nicht gefunden
)
Ich lese den aktuellen Versionsstand auch schon aus dem Header meines Hauptprogrammes:
Code: Alles auswählen
#define def_VERSION "2.0.0.0"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
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)
-
chrislo1976
- Beiträge: 105
- Registriert: 24. Februar 2008 09:45
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();"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)
Hab noch nen oldschool Vorschlag für oben 
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);
}
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.

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.
"Der erste Trunk aus dem Becher der Naturwissenschaften macht atheistisch, aber auf dem Grund des Bechers wartet Gott."
(W. Heisenberg)
(W. Heisenberg)