2016-06-04 4 views
1

Я все еще изучаю C, несмотря на некоторые рабочие программы, но теперь я пришел к структурам, и боли начались. У меня уже есть рабочая программа, в XC8 под MPLABX (цель - PIC18), составленная Main.c, заголовком и некоторыми дополнительными файлами .c. В заголовке у меня уже есть массив структур (дескрипторы шрифтов), отлично работающий.Структуры массива в C

Теперь я хочу добавить новый кусок кода (динамические меню), поэтому я создал дополнительный файл заголовка (struct.h) с определением структуры и массива, а также новый файл C (menus.c), который будет обрабатывать меню; оба файла включены в main.c

Когда я начал писать в меню для строк assignements я получил следующие ошибки:

недопустимый размер

, а затем

отсутствует базовый тип; INT предполагается

Это (очень упрощенные) куски оскорбительных кодов:

STRUCT.h

#ifndef STRUCT_H 
#define STRUCT_H 

typedef struct Row 
{ 
    char *label; 
    int posX; 
    int posY; 
}; 

struct Row rows[20]; 

#endif /* STRUCT_H */ 

menus.c

#ifndef STRUCT_H 
#include "struct.h" 
#endif 

rows[0].posX = 1; 

Ошибка поднимается на последний ряд. Я на 100% уверен, что это моя очень глупая ошибка, но где? Благодаря

+2

'rows [0] .posX = 1;' должно быть в некоторой функции. – MikeCAT

+2

'typedef struct Row' ... to? –

+0

«Это (очень упрощенные) фрагменты оскорбительных кодов« Пожалуйста, напишите [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). – MikeCAT

ответ

0

Прежде всего, это не обязательно, чтобы защитить включают от основной, так как это уже сделано с STRUCT.h

Так вместо в основной

#ifndef STRUCT_H 
#include "struct.h" 
#endif 

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

#include "struct.h" 

Теперь вернемся к коду проблемы вы испытываете это т Если вы не изменяете структуру в функции, это означает, что строки [0].posX = 1; никогда не будет выполнена

Это должно работать:

#include "struct.h" 

int main(void) 
{ 

    rows[0].posX = 1; 

    //do something else like print result etc 
    return 0; 
} 

Также вы не используете ЬурейеЕ, это пустое использование ЬурейеЕ, так как вы не ставили никаких имен послесловие отметить эти две такие же:

typedef struct Row 
{ 
    char *label; 
    int posX; 
    int posY; 
}; 



struct Row 
{ 
    char *label; 
    int posX; 
    int posY; 
}; 

Я хотел бы использовать что-то вдоль линий

typedef struct Row 
{ 
    char *label; 
    int posX; 
    int posY; 
}row_t; 

Теперь вы можете напрямую используйте row_t как тип данных вместо STRUCT строки

Наконец-то я бы не сделать его глобальный переменный я бы сделать его локальным для основных и передать указатель на любую функцию, requieres в массиве/membery массива

#include <stdio.h> 

typedef struct Row 
{ 
    char *label; 
    int posX; 
    int posY; 
}row_t; 


int main(void) 
{ 

    row_t rows[20];//Not global local to main 
    rows[0].posX = 1; 
    printf("%d\n",rows[0].posX); 
    //do something else like print result etc 
    return 0; 
} 
+0

** примечание: ** 'typedef struct {...} Строка:' все, что нужно. У него просто было 'Row' * before *, а не * после * определения структуры. Нет ничего плохого в синтаксисе 'Row {...} row_t;', но обратите внимание, что это могло бы быть легко: 'Row {...} Row;' и не было конфликта. –

+0

Глупой ошибкой я пытался присвоить значения вне любой функции. Обертка строки назначения в функции фиксировала ошибку. Я также принял к сведению предложение других. – Orionis

+0

Замечательно, что это помогло, и хотя то, что @ DavidC.Rankin совершенно правильно, я лично предпочитаю прекращать typedefs с помощью _t. Практика, которая часто встречается ex: size_t uint16_t и т. Д. –

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