Тот же источник C, другой вывод

0

Я нашел старый исходный код 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-жесткой задачи: результаты являются одновременно решениями проблемы, но их пригодность отличается.

  • 0
    Можете ли вы поделиться немного больше о типе вывода, который производит ваша программа? и как именно это отличается между версиями?
  • 0
    Похоже, ошибка в коде. Возможно, вы полагаетесь на неопределенное или специфичное для реализации поведение?
Показать ещё 15 комментариев
Теги:
binary
compilation
mingw

1 ответ

1

Первое, что я хотел бы проверить, это размер int. Ваш код зависит от переполнения, и размер целых чисел может иметь значение.

Кажется, что ваш код подразумевает, что int не менее 32 бит (вы используете 0x0x269EC3), но, возможно, вы сейчас компилируете с int на 64 бит.

Я не буду беспокоиться о исполняемом файле, очень маловероятно, что вы получите одинаковый размер двумя разными компиляторами.

  • 0
    Нет, переполнения нет. Арифметика имеет unsigned int , который определен для получения определенного результата по модулю следующей более высокой степени двух. И я не могу себе представить, что OP случайно переключился бы на 64 бит. Это не так.
  • 0
    Я не сказал, что это неопределенное поведение. Поведение переполнения в случае unsigned int зависит от размера. Это то, что я имел в виду.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню