2011-12-28 80 views
3

我很難編譯這個C代碼。c中struct中的函數只有

基本上發生的事情是:

  • 它編譯,但是當我運行它(對終端),它打印我:非法指令
  • 我試圖調試,並在Xcode和它試圖何時執行(*分數).PRINT(),它說:EXC_BAD_ACCESS
  • 如果我刪除了(*分數).PRINT()行一切工作正常(同樣的情況,如果我只刪除下一行)

GNU99和-fn相關捐資函數標誌被允許

我不想改變主函數只是其他的東西

此代碼讓我抓狂了整整一個下午,那麼一點點的幫助將非常感激。 Thankyou

#include <stdlib.h> 
#include "string.h" 
#include "stdio.h" 

typedef struct 
{ 
    int numerator; 
    int denominator; 
    void (*print)(); // prints on screen "numerator/denominator" 
    float (*convertToNum)(); //returns value of numerator/denominator 
    void (*setNumerator)(int n); 
    void (*setDenominator)(int d); 
} Fraction; 

Fraction* allocFraction(Fraction* fraction); //creates an uninitialized fraction 
void deleteFraction(Fraction *fraction); 


Fraction* allocFraction(Fraction* fraction) 
{ 
    void print() 
    { 
     int a= 10; 
     printf("%i/%i", (*fraction).numerator, (*fraction).denominator); 
     a--; 
    } 

    float convertToNum() 
    { 
     return (float)(*fraction).numerator/(float)(*fraction).denominator; 

    } 

    void setNumerator (int n) 
    { 
     (*fraction).numerator= n; 
    } 

    void setDenominator (int d) 
    { 
     (*fraction).denominator= d; 
    } 

    if(fraction== NULL) 
     fraction= (Fraction*) malloc(sizeof(Fraction)); 



    if(fraction) 
    { 
     (*fraction).convertToNum= convertToNum; 
     (*fraction).print= print; 
     (*fraction).setNumerator= setNumerator; 
     (*fraction).setDenominator= setDenominator; 
    } 

    return fraction; 
} 


void deleteFraction(Fraction *fraction) 
{ 
    free(fraction); 
} 


int main (int argc, const char * argv[]) 
{ 
    Fraction *fraction= allocFraction(fraction); 
    (*fraction).setNumerator(4); 
    (*fraction).setDenominator(7); 
    (*fraction).print(); //EXC_BAD_ACCESS on debug. Illegal instruction in Terminal 
    printf("%f", (*fraction).convertToNum()); 
    (*fraction).print(); 

    deleteFraction(fraction); 
    return 0; 
} 
+0

順便說一下,你可以使用'fraction-> XXX'而不是'(* fraction).XXX'。 – Mysticial 2011-12-28 05:32:37

回答

3

你不能用寫JavaScript的方式編寫C代碼。

具體而言,似乎print()嵌套函數內部allocFraction()(它本身不是標準的C,但一個gcc擴展名)。你不能通過函數指針調用一個嵌套函數,它不在函數指針的定義範圍之內。即使您沒有從嵌套作用域訪問外部作用域中的任何內容,情況也是如此。

您的代碼似乎試圖在C中進行面向對象的編程。您是否考慮過C++?

+0

是的,我認爲oop。但是我想在結構中有函數不必接受結構本身。 – user1118686 2011-12-28 07:46:05

+1

你的目標在C中是不可能的。 – 2011-12-28 17:58:31