2012-10-31 5 views
2

Привет, У меня возникли проблемы с определением массива структур внутри структуры. Это моя идея, мне нужно иметь структуру, называемую фигурой, которая содержит имя фигуры, количество координат и координаты (x, y). Каждая фигура может иметь произвольное количество координат. Мне также нужно иметь возможность динамически перераспределять пространство для постоянно растущего списка коордов ... Пожалуйста, помогите указать мне в правильном направлении. спасибо,Определение массива структур внутри структуры в C

Tyler

typedef struct { 
    char fig_name[FIGURE_LEN + 1]; 
    int coordcount; 
    /* here i need to declare an array of coord structures that 
    but i am not sure how to do this properly. I was originally 
    going to try something like as follows */ 
    coords *pointer; 
    pointer = malloc(sizeof(coords)); 
    pointer = coords figcoord[]; 
    /* however i am quite certain that this would not work */ 
} figure; 

typedef struct { 
    double x; 
    double y; 
} coords; 
+2

Вы не можете присвоить значениям структуры по умолчанию для переменных-членов в C. У вас есть * код *, похороненный в середине определения вашей структуры. Не собираюсь работать в C. – WhozCraig

+0

Прежде чем вы сможете его использовать, должны быть объявлены уголки. Кроме того, C является статическим типизированным языком, поэтому вам нужно объявить, прежде чем вы сможете выполнить задание. – yeyo

+0

@ Кира да, я думал, что это проблема, я просто не знаю, как обойти это. – wenincode

ответ

1

удар в направлении вправо. Попробуйте что-то вроде этого. Прошу прощения за отсутствие проверки ошибок для malloc() звонков, но вы получите общее представление (я надеюсь):

#include <stdlib.h> 

#define FIGURE_LEN 128 

typedef struct 
{ 
    double x; 
    double y; 
} coords; 

typedef struct 
{ 
    char fig_name[FIGURE_LEN + 1]; 
    int coordcount; 
    coords *pointer; 
} figure; 


/* allocate a dynamic allocated figure */ 
figure* alloc_figure(char* name, int coordcount) 
{ 
    figure *fig = malloc(sizeof(figure)); 
    fig->coordcount = coordcount; 
    fig->pointer = malloc(sizeof(coords) * coordcount); 
    strncpy(fig->fig_name, name, FIGURE_LEN); 
    fig->fig_name[FIGURE_LEN] = 0; 
    return fig; 
} 

/* release a dynamic allocated figure */ 
void free_figure(figure** ppfig) 
{ 
    if (!*ppfig) 
     return; 

    free((*ppfig)->pointer); 
    free(*ppfig); 
    *ppfig = NULL; 
} 

int main(int argc, char *argv[]) 
{ 
    figure fig; 
    fig.coordcount = 10; 
    fig.pointer = malloc(10 * sizeof(coords)); 

    /* access fid.pointer[0..9] here... */ 
    fig.pointer[0].x = 1.0; 
    fig.pointer[0].y = 1.0; 

    /* don't forget to free it when done */ 
    free(fig.pointer); 

    /* dynamic allocation function use */ 
    figure *fig1 = alloc_figure("fig1", 10); 
    figure *fig2 = alloc_figure("fig2", 5); 

    fig1->pointer[9].x = 100.00; 
    fig2->pointer[0].y = fig1->pointer[9].x; 

    /* and use custom free function for releasing them */ 
    free_figure(&fig1); 
    free_figure(&fig2); 

    return EXIT_SUCCESS; 
} 
+0

спасибо, это похоже на то, что они ищут. – wenincode

1

Я думаю, что что-то, как это должно работать.

typedef struct { 
    char* figNamePtr; 
    int coordCount; 
    Coords *cordsPointer; 
    //void (*ReleaseMemory)(); // create this function. 
} Figure; 

typedef struct { 
    double x; 
    double y; 
} Coords; 

Figure * NewFigure(int coordCount){ 
    Figure * retVal = (Figure *) malloc(sizeof(Figure)); 

    /* Initialize Figure */ 
    retVal->figNamePtr = (char *) malloc(sizeof(char) * (FIGURE_LEN + 1)); 

    /* Set the Function pointer, 
     create a function named ReleaseMemory that free up the memory */ 
    //retVal->ReleaseMemory = ReleaseMemory; 

    retVal->cordCount = coordCount 

    retVal->cordsPointer = malloc(sizeof(Coords) * coordCount); 

    return retVal; 
} 

С помощью этого кода, если вы хотите создать новый рисунок, так называемая функция NewFigure() с необходимыми параметрами. После того, как вы закончите использовать его, нажмите ReleaseMemory().

Надеюсь, это поможет!

Смежные вопросы