Как рекомендует @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
Если оклейка 'struct.c' буквальным ... вы не можете просто поместить случайные инструкции где угодно; они должны быть в пределах функции. Один из вариантов (возможно, не идеальный) - полностью исключить инструкции и вместо этого инициализировать «комнаты» с полной статической инициализацией. Вероятнее всего, лучше всего создать функцию, которую либо клиентский код должен вызвать для ее инициализации, либо если ваш компилятор поддерживает нестандартную концепцию общих функций конструктора, используйте это для автоматической инициализации. – mah
Что вы подразумеваете под «Определение компонентов невозможно»? Вы получаете ошибку компилятора? Если так, то, что это? –
Как раз в сторону, вы объявляете 'комнаты [20]', но пытаетесь напечатать из 'комнаты'. Это не единственная проблема с этим кодом, но это стоит отметить. –