СЦЕНАРИЙ: У меня есть простое приложение, которое проверяет свой RSS-канал и смотрит, есть ли более новая версия. Таким образом, я хочу проверить, меньше ли текущая версия, чем та, которая присутствует в ленте RSS. В идеале так просто, как:
CURRENTVERSION < updateVersion
ПРОБЛЕМА: Управление версиями состоит из major.minor.revision.build, и я не знаю, как разобрать это в число для проверки версии.
Вот параметры для сравнения:
#define CURRENTVERSION = 0,2,5,1
Версия, загруженная из Интернета, "0.2.6.1"
(как строка).
Что было бы лучшим способом проверить, если один меньше другого?
Я пытался преобразовать его в двойное, но значение становится 0,2 (только первый. Анализируется, остальные игнорируются).
CONSTRAINT: Это не должно быть решением с использованием библиотек .NET, так как приложение должно работать, когда нет .NET Framework.
(РЕДАКТИРОВАТЬ) Я согласился на следующее решение, благодаря ответу Картика Т.
struct Version
{
Version(string versionStr)
{
sscanf(versionStr.c_str(), "%d.%d.%d.%d", &major, &minor, &revision, &build);
}
bool operator<(const Version &otherVersion)
{
if(major < otherVersion.major)
return true;
if(minor < otherVersion.minor)
return true;
if(revision < otherVersion.revision)
return true;
if(build < otherVersion.build)
return true;
return false;
}
int major, minor, revision, build;
};
struct Version{
Version(std::string versionStr); //remember to use versionStr.c_str() if using C functions like sscanf or strtok
bool operator<(const Version &other); // could and perhaps should be a free function
int major,minor,revision,build;
};bool needtoUpdate = Version(CURRENTVERSION)<Version(latestVersion);
Пожалуйста, заполните определения.
Кроме того, ваш #define
это ошибка Вы хотите это как ниже. Или используйте const char *
если ты можешь.
#define CURRENTVERSION "0.2.5.1"
Ты можешь использовать sscanf или что-то вроде strtok разобрать в конструкторе.
Я рекомендую просто использовать функцию, аргумент которой состоит из двух строк, обозначающих номер версии. Нет необходимости использовать структуру или класс для такой простой вещи. Я думаю, что лучше держать вещи простыми. Например:
#include <stdio.h>
#include <string.h>
/*
* return 1 if v1 > v2
* return 0 if v1 = v2
* return -1 if v1 < v2
*/
int cmpVersion(const char *v1, const char *v2)
{
int i;
int oct_v1[4], oct_v2[4];
sscanf(v1, "%d.%d.%d.%d", &oct_v1[0], &oct_v1[1], &oct_v1[2], &oct_v1[3]);
sscanf(v2, "%d.%d.%d.%d", &oct_v2[0], &oct_v2[1], &oct_v2[2], &oct_v2[3]);
for (i = 0; i < 4; i++) {
if (oct_v1[i] > oct_v2[i])
return 1;
else if (oct_v1[i] < oct_v2[i])
return -1;
}
return 0;
}
int main()
{
printf("%d\n", cmpVersion("0.1.2.3", "0.2.3.4"));
}