СЦЕНАРИЙ: у меня есть простое приложение, которое проверяет свой RSS-канал и ищет, доступна ли более новая версия. Таким образом, я хочу проверить, меньше ли текущая версия, чем та, которая присутствует в RSS-канале. В идеале просто:
CURRENTVERSION < updateVersion
ПРОБЛЕМА: версия состоит из major.minor.revision.build, и я не знаю, как преобразовать ее в число для выполнения проверки версии.
Это параметры для сравнения:
#define CURRENTVERSION = 0,2,5,1
Версия, загруженная из Интернета, — "0.2.6.1"
(в виде строки).
Как лучше всего проверить, меньше ли одно другого?
Я попытался преобразовать его в двойное, но значение становится равным 0,2 (разбирается только первый ., остальные игнорируются).
ОГРАНИЧЕНИЕ: это не должно быть решение, использующее библиотеки .NET, поскольку приложение должно работать при отсутствии .NET Framework.
(EDIT) Я остановился на следующем решении благодаря ответу Картика Т.
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;
};
#define
указываете версию как знак равенства, за которым следует список целых чисел, разделенных запятыми, по сравнению со списком целых чисел, разделенных точками, в веб-версии? Я не вижу там никакого смысла. Вы можете просто#define CURRENTVERSION "0.2.5.1"
или даже лучшеconst char CURRENTVERSION[] = "0.2.5.1";
, так как здесь нет необходимости использовать макрос. - person Arne Mertz   schedule 17.01.2013Version("1.0.0.0")
меньшеVersion("0.2.5.1")
. После каждогоif(x < otherVersion.x) return true;
должно бытьif(otherVersion.x < x) return false;
. - person reima   schedule 31.12.2013