我發現,我已經在幾年前實施的,以及它的編譯的二進制可執行文件的舊的C源代碼。相同的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;
}
(我以爲這是從一些圖書館複製)。
那麼它會是什麼?也許在編譯完成的OS(原之一是在WinXP下,現在我想雙方的Win7和Ubuntu下),但我一直只用MinGW的。那麼也許MinGW的版本?如果是這樣的話,我會陷入困境,因爲我不記得幾年前我使用過哪個版本。
圖書館,我用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
我不只是字符串操作和計算像pow()
,sqrt()
,乘,加/減,爲了應用啓發式優化算法來近似求解的NP-難題:結果都是問題的解決方案,但是它們的適應性是不同的。
你能分享一下你的程序產生的輸出類型嗎?以及版本之間的差異究竟如何? – MultiVAC
聽起來像代碼中的錯誤。依靠未定義的或實現特定的行爲? – user694733
如果您需要相同的可執行文件,請使用您用於舊版本的相同版本的編譯器。如果你的程序是確定性的,但你得到了不同的結果,那麼它會暗示其中一個編譯器被竊聽(不太可能),或者你自己的代碼有未定義的行爲。舊的可執行文件是否使用調試符號編譯?嘗試在調試器中運行並查看執行發散的位置。(哎呀,只是注意到命令是在問題中,運氣不好) – user2079303