2015-03-30 6 views
2

Я делят структуру в моем заголовочном файле, и теперь я хочу определить массив этой структуры в другом c-файле, чтобы отделить ее от моего основного c-файла. Определение компонентов невозможно во втором c-файле, как я его попробую (см. Код ниже). Как я могу определить структуру в другом c-файле (или h-файле, но я думаю, что в h-файлах не должно быть определений).c define struct в другом файле c

main.c

#include "struct.h" 
int main(void) 
{ 
    printf("%s",room[0].name); 
    return 0; 
} 

struct.h

struct RoomStruct 
{ 
    char name[20]; 
    int rRight, rLeft, rFront, rBack, rUp, rDown; 
}; 
typedef struct RoomStruct Room; 

extern Room rooms[20]; 

struct.c

#include <string.h> 

#include "struct.h" 

Room rooms[20]; 

strcpy(rooms[0].name,"firstRoom"); 
rooms[0].rLeft = 1; 
+2

Если оклейка 'struct.c' буквальным ... вы не можете просто поместить случайные инструкции где угодно; они должны быть в пределах функции. Один из вариантов (возможно, не идеальный) - полностью исключить инструкции и вместо этого инициализировать «комнаты» с полной статической инициализацией. Вероятнее всего, лучше всего создать функцию, которую либо клиентский код должен вызвать для ее инициализации, либо если ваш компилятор поддерживает нестандартную концепцию общих функций конструктора, используйте это для автоматической инициализации. – mah

+1

Что вы подразумеваете под «Определение компонентов невозможно»? Вы получаете ошибку компилятора? Если так, то, что это? –

+0

Как раз в сторону, вы объявляете 'комнаты [20]', но пытаетесь напечатать из 'комнаты'. Это не единственная проблема с этим кодом, но это стоит отметить. –

ответ

1

Как рекомендует @mah, я бы рассмотрел функции вызова, чтобы ваши данные были разделены. Это добавляет ценность сохранения «кода спагетти» из вашей кодовой базы. Например, если у вас есть глобальный массив из Room struct, его можно вызывать из любого места. Наличие статического массива из Room. Структура внутри файла является лучшей практикой (IMHO). Вот простой пример, который я разработал:

main.c

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

int main (void) 
{ 
    Room localRoom[20]; 

    strcpy(localRoom[0].name, "firstRoom"); 
    StructFunc_UpdateStruct(localRoom); 
    strcpy(localRoom[0].name, "renamed"); 
    StructFunc_Print(); 
    printf("%s", localRoom[0].name); 

    return 0; 
} 

struct.h

typedef struct 
{ 
    char name[20]; 
    int rRight, rLeft, rFront, rBack, rUp, rDown; 
} Room; 

void StructFunc_UpdateStruct(Room * roomData); 
void StructFunc_Print(void); 

StructFunc.c

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

static Room gRoom[20]; 

extern void StructFunc_UpdateStruct(Room * roomData) 
{ 
    strcpy(gRoom[0].name, roomData[0].name); 
} 

extern void StructFunc_Print(void) 
{ 
    printf("%s\r\n", gRoom[0].name); 
} 

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

EDITED НА ОСНОВЕ КОММЕНТАРИЕВ
Я хотел бы предположить (основываясь на ваш комментарий), что вы хотели бы быть в состоянии восстановить эту программу с различными «комнаты» в зависимости от .c файл, который вы используете для компиляции с. Если это то, что вы пытаетесь достичь, то это должно работать для вас:

main.c

#include "struct.h" 
#include <stdio.h> 

int main (void) 
{ 
    printf("%s", rooms[0].name); 
    return 0; 
} 

структура.ч

#define NUM_OF_ROOMS 2 
#define MAX_STRING_SIZE 20 

typedef struct 
{ 
    char name[MAX_STRING_SIZE]; 
    int rRight, rLeft, rFront, rBack, rUp, rDown; 
} Room; 

extern Room rooms[]; 

struct.c

#include "struct.h" 

Room rooms[NUM_OF_ROOMS] = 
{ 
    /* Room 0 */ 
    { 
     /* Name  rRight rLeft rFront rBack rUp  rDown */ 
     "Living", 1,  2,  3,  4,  5,  6 
    }, 
    /* Room 1 */ 
    { 
     "Dining", 2,  3,  4,  5,  6,  0 
    } 
}; 

ПРОЩЕ BUILD FORMAT

Другим вариантом было бы добавить #define, так что вы не должны изменять файлы, вы строите - просто измените значение #define следующим образом:

struct.h

#define MAP_NUMBER  0 //Change this value to use a different map. 
#define NUM_OF_ROOMS 2 
#define MAX_STRING_SIZE 20 

typedef struct 
{ 
    char name[MAX_STRING_SIZE]; 
    int rRight, rLeft, rFront, rBack, rUp, rDown; 
} Room; 

extern Room rooms[]; 

struct.c

#include "struct.h" 

#if (MAP_NUMBER == 0) 
Room rooms[NUM_OF_ROOMS] = 
{ 
    /* Room 0 */ 
    { 
     /* Name  rRight rLeft rFront rBack rUp  rDown */ 
     "Living", 1,  2,  3,  4,  5,  6 
    }, 
    /* Room 1 */ 
    { 
     "Dining", 2,  3,  4,  5,  6,  0 
    } 
}; 
#elif (MAP_NUMBER == 1) 
Room rooms[NUM_OF_ROOMS] = 
{ 
    /* Room 0 */ 
    { 
     /* Name  rRight rLeft rFront rBack rUp  rDown */ 
     "Kitchen", 1,  2,  3,  4,  5,  6 
    }, 
    /* Room 1 */ 
    { 
     "Bathroom", 2,  3,  4,  5,  6,  0 
    } 
}; 
#else 
Room rooms[NUM_OF_ROOMS] = 
{ 
    /* Room 0 */ 
    { 
     /* Name  rRight rLeft rFront rBack rUp  rDown */ 
     "Bedroom", 1,  2,  3,  4,  5,  6 
    }, 
    /* Room 1 */ 
    { 
     "Dungeon", 2,  3,  4,  5,  6,  0 
    } 
}; 
#endif 
+0

Эй, спасибо за ответ. Но я думаю, что я не указал правильную проблему правильно. Мой план состоит в том, чтобы иметь второй c-файл, который можно легко заменить другим, поэтому мне не нужно менять основной файл, чтобы загрузить другое определение массива " комнаты "в моей программе – winegum

+0

@winegum, просто для выяснения ... вы пытаетесь создать массив' Room', который инициализируется для разных значений в зависимости от того, какую версию вашего файла .c вы создаете? –

+0

Спасибо! это то, что я искал, извините, за мои плохие английские навыки .. затрудняло прояснить мою проблему. Не думал об этой возможности – winegum

0

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

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

room.c

#include "room.h" 
struct room my_room; 

main.c

#include "room.h" 
extern struct room my_room; 

ехЬегпа декларация сообщает компилятор, что память для данных переменного определяется в каком-либо другом чтобы быть связанным файл. Нет причин не определять основную структуру, которую вы определили в другом файле заголовка, хотя я бы не использовал такие externs.

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