2011-12-28 9 views
3

このCコードをコンパイルするのに苦労しています。struct in cの関数のみ

は、基本的に何が起こるかです:

  • それがコンパイルんが、私は(ターミナルで)それを実行すると、それは私を出力します。私はそれをデバッグしようとした
  • 不正な命令とXcode上で、それがしようとしたときに実行します(*分数)の.print()、それは言う:EXC_BAD_ACCESS
  • 私はすべてが

GNU99と(私は次の行を削除した場合、同じ問題が発生した)正常に動作します(*分数)の.print()の行を削除した場合-fn ested-機能フラグが

を有効になっている私は、このコードは、main関数にだけ他のもの

を変更したくない全体の午後のために狂気私を運転したので、少しの助けは本当にいただければ幸いです。 ありがとう

#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

Btwでは、 '(* fraction).XXX'の代わりに' fraction-> XXX'を使うことができます。 – Mysticial

答えて

3

あなたはJavascriptを書くのと同じ方法でCを書き込むことはできません。

具体的には、(標準Cしかし、GCC拡張自体されていない)print()allocFraction()内部入れ子関数であると思われます。ネストされた関数は、定義されているスコープ外の関数ポインタから呼び出すことはできません。ネストされたスコープから外側のスコープ内のものにアクセスしなくても、これは当てはまります。

あなたのコードは、Cでオブジェクト指向プログラミングを実行しようとしているようです。C++を考慮しましたか?

+0

はい私はoopと考えました。しかし、関数内で構造体を受け入れる必要がない関数を構造体内に配置したいと考えています。 – user1118686

+1

あなたの目標はCでは不可能です。 –