C: ошибка при использовании структуры с массивами переменных - PullRequest
0 голосов
/ 19 октября 2011

У меня есть такая структура:

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;
}

Хорошо, моя проблема с tg_poligono-> angulos tg_poligono-> lados работает нормально, но tg_poligono-> angulos дает сбой без видимой причины!

когда я использую функцию de в своей программе (внутри для статистики), приведенный выше код работает некоторое время, а затем завершается неудачно без сообщения.

Если я прокомментирую следующие строки, программа будет работать нормально, без ошибок:

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

Если вы посмотрите на мой код, вы увидите тест, который я делаю:

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 ++.

Ответы [ 2 ]

1 голос
/ 19 октября 2011

Вот как вы хотите определить свою структуру, я думаю:

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.Вот что тебя смущает, я думаю.

1 голос
/ 19 октября 2011

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

только выделяет место для указателя. Используйте sizeof(*tgPoligono).

...