|
|
  |
Как сделать структуру видимой в других файлах? |
|
|
|
Aug 15 2007, 11:55
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(MSprut @ Aug 15 2007, 19:30)  Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов? Элементарно, Ватсон  - Объявите ее не в Си-файле, а в хедере, принадлежащему этому Си-файлу. А к другому Си евошний хедер подключите Код /* Файл unit1.h */
typedef struct __Foo { char a, b, c; } Foo; Код /* Файл uinit1.c */
#include "unit1.h"
Foo u1_item1, u1_item2; ..... Код /* Файл uinit2.c */
#include "unit1.h"
Foo u2_item1, u2_item2; .....
--------------------
|
|
|
|
|
Aug 15 2007, 12:33
|

Частый гость
 
Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277

|
Цитата(MSprut @ Aug 15 2007, 16:12)  А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена. Дополните заголовочный файл директивами компилятора Код #ifndef _MYLIB_H #define _MYLIB_H
typedef struct __Foo { char a, b, c; } Foo;
#endif При компилировании исходного кода, даный код будет обработан компилятором только один раз.
|
|
|
|
|
Aug 15 2007, 12:49
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(MSprut @ Aug 15 2007, 18:12)  А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена. Вам же уже сказали. Объявлять структуру нужно только в одном .с файле, там где она инициализируется и/или ее члены модифицируются. В остальных .c файлах нужно указать, что эта структура внешняя с помощью квалификатора extern.
|
|
|
|
|
Aug 15 2007, 21:51
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Попробую я дать совет. В Head.h файле обьявляется следующее: Код struct _Foo { ... }; // Это обьявление структуры как типа extern struct _Foo Foo; // Это обьявление внешнего обьекта Foo типа struct _Foo В одном *.c файле определяется обьект: Код #include "Head.h" ... struct _Foo Foo; // Это определение обьекта Foo типа struct _Foo В любом другом *.c файле, имеющем строку #include "Head.h", обьектом Foo можно пользоваться.
|
|
|
|
|
Aug 18 2007, 06:46
|
Частый гость
 
Группа: Участник
Сообщений: 141
Регистрация: 7-03-06
Из: Санкт-Петербург
Пользователь №: 15 038

|
Все гораздо проще в main.c к примеру объявляем структуру Код volatile struct{ unsigned char SensorCount; unsigned char InCount; unsigned char OutCount; unsigned char AOutCount; unsigned char UrovCount; }DeviceProfile; а другом файле где надо её использовать пишем Код extern struct{ unsigned char SensorCount; unsigned char InCount; unsigned char OutCount; unsigned char AOutCount; unsigned char UrovCount; }DeviceProfile;
|
|
|
|
|
Aug 18 2007, 08:45
|

Гуру
     
Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659

|
Цитата(Denisvak @ Aug 18 2007, 14:46)  Все гораздо проще в main.c к примеру объявляем структуру Код ... а другом файле где надо её использовать пишем Код ... Ага, и так во всех десяти файлах проекта. А потом вдруг захотелось добавить еще одно поле в нашей структуре... И что? Говорилось же - объявляем структуру в одном месте - подключаемом хедере. К какому модулю надо - подключили. Надо - изменили, при этом все модули видят измененную структуру
--------------------
|
|
|
|
|
Aug 18 2007, 10:54
|
Тутэйшы
   
Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263

|
А я сторонник следующей школы: Код //terminals.c #include <ioavr.h> #include <inavr.h> #include <string.h> #include "typedefines.h" #include "settings.h" #include "pins.h" #include "service.h"
#include "terminals_defines.h"
//--------------------------------------------------------------------------------------------------------
//************************************ // Variables //************************************ struct terminal_data { u8_t type; u8_t cmd; u8_t view_mode; u8_t view_time; u8_t buf[TERMINAL_BUF_SIZE]; u8_t flags; }terminal[TERMINAL_NUM];
//************************************ // Prototypes //************************************ u8_t Terminal_Check_Free(u8_t id);
//:::::::::::::::::::::::::::::::::::::::::::::::::::::: // Проверка - свободен ли терминал id // 1 - свободен // 0 - занят //:::::::::::::::::::::::::::::::::::::::::::::::::::::: u8_t Terminal_Check_Free(u8_t id) { return(terminal[id].cmd == TERMINAL_CMD_NOT); } Код //terminals.h #if !defined( TERMINALS_H ) #define TERMINALS_H //-----------------------------------------------------------------------------
//************************************ // Variables //************************************ extern struct terminal_data { u8_t type; u8_t cmd; u8_t view_mode; u8_t view_time; u8_t buf[TERMINAL_BUF_SIZE]; u8_t flags; }terminal[TERMINAL_NUM];
//************************************ // Prototypes //************************************ extern u8_t Terminal_Check_Free(u8_t id); //----------------------------------------------------------------------------- #endif Один недостаток - в каждом модуле, где понадобятся ресурсы terminal.c модуля придется подключать хедер и дефайновый хедер.
|
|
|
|
|
Aug 18 2007, 11:08
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(vesago @ Aug 18 2007, 13:54)  А я сторонник следующей школы: Причем здесь "школа"? Любой вариант в котором структура описана более чем в одном месте есть глупость. Зачем в terminals.c дубль terminals.h вместо его включения!? extern в "школе", похоже недоучили  и испугались?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 18 2007, 13:00
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Я написал, то, что написал. Возмущался двойным описанием структуры. Что не понятно? Исправлено: Код // terminals.c
#include "terminals.h"
td_t terminal[TERMINAL_NUM];
u8_t Terminal_Check_Free(u8_t id) { return(terminal[id].cmd == TERMINAL_CMD_NOT); } Код // terminals.h #ifndef TERMINALS_H #define TERMINALS_H
//----------------------------------------------------------------------------- typedef struct terminal_data { u8_t type; u8_t cmd; u8_t view_mode; u8_t view_time; u8_t buf[TERMINAL_BUF_SIZE]; u8_t flags; }td_t;
extern td_t terminal[TERMINAL_NUM];
//----------------------------------------------------------------------------- extern u8_t Terminal_Check_Free(u8_t id);
#endif
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|