2011-10-19 19 views
0

を持つ構造体を使用して:機能でC:エラー私はこのような構造体持っている変数配列

typedef struct tgPoligono { 
    int numero_de_lados; 
    CvPoint** cantos; 
    float* lados; 
    double* angulos; 
} *tgPoligono; 

を、私はこのようにそれを使用しています:

tgPoligono criar_tgPoligono(CvSeq* poligono){ 
    int i; 
    tgPoligono tg_poligono = (tgPoligono) malloc(sizeof(tgPoligono)); 

    tg_poligono->numero_de_lados = poligono->total; 

    tg_poligono->cantos = (CvPoint**) malloc(tg_poligono->numero_de_lados * sizeof(CvPoint*)); 
    for(i= 0; i < tg_poligono->numero_de_lados; i++){ 
     tg_poligono->cantos[i] = (CvPoint*)cvGetSeqElem(poligono, i); 
    } 

    tg_poligono->lados = (float*) malloc(tg_poligono->numero_de_lados * sizeof(float)); 
    tg_poligono->angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double)); 
    double* angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double)); 
    for(i = 0; i < tg_poligono->numero_de_lados; i++){ 
     CvPoint* pt_0 = tg_poligono->cantos[((i == 0)?(tg_poligono->numero_de_lados - 1):(i - 1))];  //Canto anterior 
     CvPoint* pt_1 = tg_poligono->cantos[i];               //Canto atual 
     CvPoint* pt_2 = tg_poligono->cantos[(i + 1) % tg_poligono->numero_de_lados];     //Canto seguinte 

     //Calculo a distancia entre dois cantos, o que retorna o comprimento do lado do poligono 
     tg_poligono->lados[i] = sqrt(((pt_1->x - pt_2->x)*(pt_1->x - pt_2->x)) + ((pt_1->y - pt_2->y)*(pt_1->y - pt_2->y))); 

     //Calculo o cosseno do angulo correspondente ao ponto atualmente avaliado 
     tg_poligono->angulos[i] = cosseno(pt_0, pt_2, pt_1); 
     angulos[i] = cosseno(pt_0, pt_2, pt_1); 
    } 

    return tg_poligono; 
} 

[OK]を、私の問題はですtg_poligono-> angulos tg_poligono-> ladosはうまく動作しますが、tg_poligon-> angulosは失敗しません。

私のプログラムで(関数の内部で)関数を使用すると、上のコードはしばらくの間動作し、メッセージなしで失敗します。

私は次の行をコメントアウトした場合、プログラムは正常に動作し、エラーなしで:

あなたは私のコードを見れば、あなたは私がテスト表示されます:

double* angulos = (double*) malloc(tg_poligono->numero_de_lados * sizeof(double)); 
... 
angulos[i] = cosseno(pt_0, pt_2, pt_1); 

それは同じことだが、構造体を使用していないとうまく動作します。

ps:私はこのコードでopencv関数を使用していますが、問題とは無関係です。 関数cosseno(pt_0, pt_2, pt_1)は問題なく動作します。 これはCコードです。私はC++を使用できません。

+0

'malloc'の戻り値のキャストは必要なく、エラーを隠すかもしれません。私はあなたがキャストを削除し、コンパイラに関連性のあるエラーについて教えてもらうことをお勧めします。 – pmg

+0

あなたはこれを意味しましたか: tg_poligono-> angulos = malloc(tg_poligono-> numero_de_lados * sizeof(double)); 私は試してみよう! tnks! – vinigarcia87

+0

それは私が言っていることです。 ** [fizzerの答え](http://stackoverflow.com/questions/7820818/c-error-using-struct-with-variable-arrays/7820953#7820953)は**より関連性があります。 – pmg

答えて

1

これは、あなたの構造を定義する方法を、私が思うにさ:

typedef struct _tgPoligono { 
    int numero_de_lados; 
    CvPoint** cantos; 
    float* lados; 
    double* angulos; 
} tgPoligono; 

tgPoligono criar_tgPoligono(CvSeq* poligono){ 
    int i; 
    tgPoligono *tg_poligono = (tgPoligono*) malloc(sizeof(tgPoligono)); 

etc... 

は、あなたの構造定義とのtypedefの端からスターの除去に注意してください。それがあなたを混乱させるものです。

+0

完璧な男!それは私の問題でした!今は正しい! – vinigarcia87

+0

クール!あなたが好きなら、私の答えを投票してください;-) – noelicus

1

tgPoligono tg_poligono = (tgPoligono) malloc(sizeof(tgPoligono));

ポインタのみのためのスペースを割り当てます。 sizeof(*tgPoligono)を使用してください。

+0

しかし私の構造体は次のようなものです: typedef struct tgPoligono {...} * tgPoligono; このsizeof(* tgPoligono)は必要ありません。右? – vinigarcia87

+0

この場合、構造体ではなくポインタのメモリを割り当てます。 sizeof(tgPoligono)を調べてsizeof(* tgPoligono)と比較してみてください – Doraj

+0

Fizzerが正しいです。あなたはtypedefの後ろにポインタを隠すことによってあなた自身(そして他人)を混乱させています。その型からだけ異なる変数を作成することは良い習慣でもありません。 IMHO – wildplasser

関連する問題