Определение массива структур внутри структуры в C

Обновить

December 2018

Просмотры

2.3k раз

2

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

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 ответы

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().

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

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