Я нашел старый исходный код C, который я реализовал несколько лет назад, а также его скомпилированный двоичный исполняемый файл.
В комментарии я написал, что команда компиляции была:
gcc -O3 source.c -o executable -lm
Поэтому я перекомпилировал его, но новый исполняемый файл отличается (по размеру) от старого.
На самом деле, если я запускаю новый и старый исполняемый файл, они дают мне разные результаты: старый исполняемый файл возвращает тот же результат, который был возвращен много лет назад, а новый возвращает другой результат.
Моя цель состояла бы в том, чтобы иметь возможность перекомпилировать источник и получить тот же исполняемый файл, что и старый (или, по крайней мере, исполняемый файл, который дает точно такой же результат).
Я уверен, что я запускаю две программы с одинаковыми параметрами и что код вообще не использует потоки. Единственная особенность в том, что мне нужны случайные целые числа, но я использую свою собственную функцию для их создания на всякий случай, чтобы убедиться, что последовательность случайных чисел всегда одна и та же (и, конечно, я всегда использую одно и то же семя).
unsigned int seed = 0;
void set_srand(unsigned int aseed) {
seed = aseed;
}
int get_rand() {
seed = seed * 0x12345 + 0xABC123;
int j = (seed >> 0x10) & RAND_MAX;
return j;
}
(Я думал, что это было скопировано из какой-то библиотеки).
Так что это может быть? Возможно, ОС, где выполняется компиляция (исходная была под WinXP, теперь я пытаюсь работать как с Win7, так и с Ubuntu), но я всегда использовал только MinGW. Так может быть, версия MinGW? Если это так, у меня проблемы, потому что я не помню, какую версию я использовал несколько лет назад.
Библиотеки, которые я использую:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
То, что я делаю, это только строковые операции и вычисления, такие как pow()
, sqrt()
, умножение и плюс/минус, чтобы применить алгоритм эвристической оптимизации для решения примерно NP-жесткой задачи: результаты являются одновременно решениями проблемы, но их пригодность отличается.
Первое, что я хотел бы проверить, это размер int. Ваш код зависит от переполнения, и размер целых чисел может иметь значение.
Кажется, что ваш код подразумевает, что int не менее 32 бит (вы используете 0x0x269EC3), но, возможно, вы сейчас компилируете с int на 64 бит.
Я не буду беспокоиться о исполняемом файле, очень маловероятно, что вы получите одинаковый размер двумя разными компиляторами.
unsigned int
, который определен для получения определенного результата по модулю следующей более высокой степени двух. И я не могу себе представить, что OP случайно переключился бы на 64 бит. Это не так.
unsigned int
зависит от размера. Это то, что я имел в виду.