2013-10-05 82 views
0

我在C中有一個函數,它正在崩潰我的代碼,我很難弄清楚發生了什麼。我有一個看起來像這樣的函數:使用函數指針

#define cond int 
void Enqueue(cond (*cond_func)()); 

cond read() { 
return IsEmpty(some_global); // Returns a 1 or a 0 as an int 
} 

Enqueue(&read); 

但是,當運行上面的代碼時,只要Enqueue被調用就會發生段錯誤。它甚至不執行任何內部函數。我運行了gdb,它只是在Enqueue被調用時顯示它即將死亡 - 沒有任何語句被處理。任何想法是怎麼回事?任何幫助,將不勝感激。

+4

'#define cond int' < - 這是幹什麼用的?他們發明了'typedef'是有原因的。 – us2012

+1

命名你的函數'read'會導致可怕的問題。更好地避免它。 – wildplasser

+0

有人告訴我cond必須是布爾值,所以我只是把它作爲int。 –

回答

0

你能給更多信息該代碼因爲根據我的解釋代碼工作正常。我已經嘗試過 -

#define cond int 
void Enqueue(cond (*cond_func)()); 
cond read() 
{ 
int some_global=1; 
return IsEmpty(some_global); // Returns a 1 or a 0 as an int 
} 

int IsEmpty() 
{ 
return 1; 
} 

void Enqueue(cond (*cond_func)()) 
{ 
printf("Perfect"); 
return 0; 
} 

int main() 
{ 
Enqueue(&read); 
return 0; 
} 

它工作正常。

+1

'main()'和'IsEmpty()'應該有一個返回類型,它不再是二十世紀七十年代了。 –

+0

謝謝你指出我愚蠢的錯誤。:) –

0
#define cond int 

的意思是:

typedef int cond; 

雖然定義你的函數指針的別名可能是更合理的位置,例如:

typedef int (*FncPtr)(void); 

int read() { 
    printf("reading..."); 
} 

void foo(FncPtr f) { 
    (*f)(); 
} 

int main() { 
    foo(read); 
    return 0; 
} 
0

這工作得很好:

#include <stdio.h> 
#include <stdbool.h> 

typedef bool cond; 

void Enqueue(cond (*cond_func)(void)) { 
    printf("In Enqueue()...\n"); 
    cond status = cond_func(); 
    printf("In Enqueue, 'status' is %s\n", status ? "true" : "false"); 
} 

bool IsEmpty(const int n) { 
    return true; 
} 

cond my_cond_func(void) { 
    printf("In my_cond_func()...\n"); 
    return IsEmpty(1); 
} 

int main(void) { 
    Enqueue(my_cond_func); 
    return 0; 
} 

你的問題很可能是從別的地方來,比如你的Enqueue()定義,你不提供,或者你的函數被調用read()的事實,並與衝突這個名字更常見的功能。

+0

閱讀縮短爲了簡潔的東西。我完全同意。 –