2017-02-08 2 views
-2

Я создал структуру предмет:Включить переменные в отдельный файл в C?

typedef struct item 
{ 
    char name[20]; 
    char desc[100]; 
    int lp; 
    int shield; 
    int weapon; 
} item; 

Мне нужно 36 из них так я создаю массив item treasure[6][6];

Для каждого элемента я вставить данные в виде так:

strcpy(treasure[0][0].name, "name"); 
    strcpy(treasure[0][0].desc, "none"); 
    treasure[0][0].lp = 0; 
    treasure[0][0].shield = 0; 
    treasure[0][0].weapon = 200; 

я это делаю 36 раз и занимает много места в редакторе, мой вопрос: могу ли я поместить это в отдельный файл .c/.h, может быть? Я пытаюсь, но не могу заставить его работать.

Спасибо за помощь!

+0

Да, вы можете это сделать в отдельном файле. Скорее всего, это не лучший способ инициализации массива. Вы должны посмотреть, как правильно инициализировать массив: 'int array [6] [6] = {{1, 3, 9, 8, 3, 4}, {2, 9, 1, 0, -1, 7} , ...}; 'делает это для' int'; вам просто нужно заменить номера с помощью инициализатора, заключенного в скобки для каждой структуры. –

+0

за 36 предметов, почему вы делаете предмет сокровища [6] [6], а не предмет сокровища [36]. Хотя оба они правильны, но последний подход более понятен. –

ответ

2

Я предлагаю, чтобы использовать файл, как init.h со следующим содержанием

#include <string.h> 
typedef struct item { 
    char name[20]; 
    char desc[100]; 
    int lp; 
    int shield; 
    int weapon; 
} item; 

item treasure[1][1] = { 
    {{.name = "name", .desc = "none", .lp = 0, .shield = 0, .weapon = 200}}}; 

В этом случае вы должны быть в состоянии инициализировать-структуру из вас матрицы 6, 6 в другом файле, то вы должны быть в состоянии получить доступ из программы основной называя это так:

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

int main() { 
    printf("%s\n", treasure[0][0].name); 
    return 0; 
} 

Я надеюсь, что эта работа для вас, есть ли еще способы инициализации структур, но это один является то, что Я использую все чаще. Вы можете найти более подробную информацию здесь https://gcc.gnu.org/onlinedocs/gcc/Designated-Inits.html

+0

Не должно быть исполняемого кода в файле заголовка вообще, и не должно быть никаких объявлений переменных. Глобальные переменные - очень плохая практика, даже если они не объявлены в файле заголовка. Этот ответ - плохая рекомендация. – Lundin

0

Если вы хотите узнать, как сделать правильный дизайн программы C с самого начала, то это так.

Правильный способ сделать это - создать item.h и файл item.c. Вместе они образуют «модуль кода» (или класс, если хотите).

Ваш заголовочный файл item.h должен содержать защитные оболочки typedef и header. Вы также должны написать функцию инициализации.

// item.h 
#ifndef ITEM_H 
#define ITEM_H 

#include <string.h> 

typedef struct { 
    char name[20]; 
    char desc[100]; 
    int lp; 
    int shield; 
    int weapon; 
} item_t; 

void item_init (item_t* item, 
       const char name[20], 
       const char desc[100], 
       int  lp, 
       int  shield, 
       int  weapon); 

#endif 

Вы можете реализовать функцию инициализации в init.c:

// item.c 
#include "item.h" 

void item_init (item_t* item, 
       const char name[20], 
       const char desc[100], 
       int  lp, 
       int  shield, 
       int  weapon) 
{ 
    strcpy(item->name, name); 
    strcpy(item->desc, desc); 
    item->lp = lp; 
    item->shield = shield; 
    item->weapon = weapon; 
} 

Эти два файла, init.h и init.c озабочены только о поведении всех item_t переменных. Вы можете расширить их с помощью большего количества функций. Они не содержат и не должны содержать никаких фактических данных.

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

// item_data.h 
#include "item.h" 

#define ITEMS_N 36 

item_t* item_data_get (int item_n); 

Это просто функция «добытчик», который позволяет получить доступ к данным. Фактические данные инкапсулированные в файле .c:

// item_data.c 
#include "item_data.h" 

static item_t items [ITEM_N] = 
{ 
    [0] = {.name="name", .desc="none", .lp=0, .shield=0, .weapon=200}, 
    [1] = ... // fill up data here 
}; 

item_t* item_data_get (int item_n) 
{ 
    return items[n]; 
} 

Если позже вы хотите изменить данные данного элемента, вы можете сделать это по телефону item_init(item_data_get(n), ...);

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