2015-05-14 32 views
-5

這裏是C文件: http://simul.iro.umontreal.ca/rng/WELL19937a.c(I未註釋,如L'Ecuyer告知)難以捉摸c函數在頭部聲明

這裏是C頭: http://simul.iro.umontreal.ca/rng/WELL19937a.h

的問題是:其中是這個double(* WELLRNG19937a)(void)在C文件中?

我看不到它。但它存在。此代碼的工作就TIGCC但產生0

#include "WELL44497a.h" 
#include <tigcclib.h> 
void _main(void) 
{ 
unsigned int u=33337; 
InitWELLRNG44497a(&u); //this function probably wants array of good seeds but I don't have them. 

double a = WELLRNG44497a() ; 
clrscr(); 
printf("%f",a); 
ngetchx();//wait for keyboard input 
} 

刪除InitWELLRNG44497a(& U)使得它扔SIGSEGV(其中向我保證其它功能存在)

如果你告訴我在哪裏,我會很感激這個功能。更甚者,如果你告訴我如何使用這個功能。

PS。沒有什麼可以澄清的了。這是非常愚蠢的問題,但已被正確回答。功能一直給零的原因是不同的。

+1

我不明白。它就在那裏,在你鏈接的C文件中。 –

+0

這是一個函數指針,它在init函數中被初始化。 – Sneftel

回答

0

double (*WELLRNG19937a) (void)是指向double funcname (void)函數的指針。

在第一功能

void InitWELLRNG19937a (unsigned int *init) 

你可以看到

WELLRNG19937a = case_1;

其中case_1是

double case_1 (void)

然後在馬在你正在調用一個指向WELLRNG19937a指針的函數。真正的被調用函數將是case_1

刪除InitWELLRNG44497a(& U)使得它扔SIGSEGV

這會導致因爲是InitWELLRNG44497a由init函數指針的段錯誤,否則指針未初始化。

+0

...和'InitWELLRNG44497a()'可能會將指針設置爲實際函數。因此,當'InitWELLRNG44497a'沒有被調用時,你會得到seg錯誤。 –

+0

謝謝。可能是個愚蠢的問題,但讓我感到困惑。由於ti89計算器上的默認int大小以及由於種子不好而引發了這些零。改變種子到1391和整數到長整數使它工作。 –

+0

不那麼愚蠢。我要求管理員重新打開它,但是...... – LPs