Доступ к указателю на фигуру из другой фигуры в C - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь получить доступ к своим точкам структуры. Структурная память динамически расположена. У меня ошибка сегментации, которую я не могу понять. Мои определения структуры из моего .h файла следующие:

struct point{
double x;
double y;
};

struct figure{
char name[128];
int draw;
struct point *points;
};

extern struct figure *figures;

В моем файле .c у меня есть:

struct figure *figures;

//initializing 10 figures
figures = malloc(10 * sizeof(struct figure));
//left the obvious NULL checking out for brevity 

//I'm fairly sure this portion works for initializing 10 points for each figure
int i;
for(i = 0;i<10;i++){
figures[i].points = malloc(10 * sizeof(struct point));
//left out NULL checking again
}

Если проблема не была обнаружена до этого момента, у меня возникли проблемы с сохранением значений в точках ПРИМЕЧАНИЕ: индекс может быть любым int> = 0, просто для простоты используется общий термин

figures[index].points[index]->x = 10;
figures[index].points[index]->y = 15;

Любая помощь с его проблемой была бы фантастической. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 05 ноября 2011

figures[index].points - это массив структур, что означает, что его индексация (т.е. figures[index].points[index]) дает вам структуру. Последние две строки должны быть:

figures[index].points[index].x = 10;
figures[index].points[index].y = 15;

Я удивлен, что компилятор не поймал бы это.

0 голосов
/ 05 ноября 2011

Кроме того, что вы неправильно обращаетесь к внутренней структуре, я не вижу никаких проблем в этом коде.

Онлайн-демонстрация вашего примера кода, который работает.

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

struct point{
double x;
double y;
};

struct figure{
char name[128];
int draw;
struct point *points;
};


int main()
{
    struct figure *figures;
    figures = malloc(10 * sizeof(struct figure));

    int i = 0;
    for(i = 0;i<10;i++)
    {
        figures[i].points = malloc(10 * sizeof(struct point));
        figures[i].draw = i;
    }

    i = 0;
    for(i = 0;i<10;i++)
    {
        printf("\nfigures[%d].draw = [%d]",i,figures[i].draw); 
        int j;
        for(j = 0;j<10;j++)
        {
            figures[i].points[j].x = i;
            figures[i].points[j].y = j;

            printf("\nfigures[%d].points[%d].x = [%f]",i,j,figures[i].points[j].x);
            printf("\nfigures[%d].points[%d].y = [%f]",i,j,figures[i].points[j].y);
        }
    } 
    return 0;
}

Вывод:

цифры [0] .draw = [0]
цифры [0] .точки [0] .x = [0,000000]
цифры [0] .точки [0] .y = [0,000000]
цифр [0] .пунктов [1] .x = [0,000000]
цифр [0] .пунктов [1] .y = [1.000000]
цифр [0] .пунктов [2] .x =[0.000000]
... и так далее

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...