Ошибка компиляции, которую я не могу понять - PullRequest
2 голосов
/ 14 августа 2011

я получаю «размер хранилища данных не известен», когда я пытаюсь использовать определенную структуру.

Код:

ioHelper.h:

    #ifndef IOHELPER_H_
    #define IOHELPER_H_

    typedef struct fileValues data;

    struct fileValues ioInput(FILE* file,int dim,int sign);

    #endif /* IOHELPER_H_ */

ioHelper.c:

    struct fileValues
    {
int dim;
char sign;
double x;
double y;
    };

map.c:

    void drawData(FILE* vectors)
    {

double paramLoc [MAX_DIMENSION];
char sign;
(this is where i get the error) struct fileValues data;
    ...
    }

есть идеи?

Ответы [ 3 ]

5 голосов
/ 14 августа 2011

Это потому, что при компиляции map.c компилятор не может увидеть полное определение структуры в IoHelper.c.

Возможно, вы включили только IoHelper.h, который имеет (неполное) объявление,не определение.

Таким образом, вы не можете объявить переменную этого типа структуры внутри map.c, если вы не

  • включите IoHelper.c (BAD IDEA)
  • поместите определение структуры в IoHelper.h
  • , объявите указатель на структуру в map.c и вставьте ее malloc.
1 голос
/ 14 августа 2011

Предполагая, что map.c не включает IoHelper.c, он видит только typedef, но не объявление struct fileValues. Поскольку он не видел объявление, он не может понять, насколько велика структура, следовательно, ошибка компиляции.

Обычно вы объявляете структуру в заголовочном файле - переместите ее из iohelper.c в iohelper.h, и теперь map.c должен скомпилироваться.

0 голосов
/ 14 августа 2011

data является неполным типом . Это означает, что он не полностью определен, поэтому его размер неизвестен. в этом случае он вообще не определен, просто объявлен.

вам нужно сделать определение доступным для кода, который объявляет переменную этого типа, например, в вашей функции drawData.

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

ура и hth.,

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