MSprut 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
o-henry 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба во втором файле перед объявлением этой структуры укажите модификатор extern Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 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; ..... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MSprut 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба extern не помогает почему-то... Ну да ладно, пока вышел из положения другим способом. А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
nss__ 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена. Дополните заголовочный файл директивами компилятора #ifndef _MYLIB_H #define _MYLIB_H typedef struct __Foo { char a, b, c; } Foo; #endif При компилировании исходного кода, даный код будет обработан компилятором только один раз. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена. Вам же уже сказали. Объявлять структуру нужно только в одном .с файле, там где она инициализируется и/или ее члены модифицируются. В остальных .c файлах нужно указать, что эта структура внешняя с помощью квалификатора extern. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
IgorKossak 0 15 августа, 2007 Опубликовано 15 августа, 2007 · Жалоба Попробую я дать совет. В 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 можно пользоваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Denisvak 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Все гораздо проще в 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prottoss 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Все гораздо проще в main.c к примеру объявляем структуру ... а другом файле где надо её использовать пишем ... Ага, и так во всех десяти файлах проекта. А потом вдруг захотелось добавить еще одно поле в нашей структуре... И что? :) Говорилось же - объявляем структуру в одном месте - подключаемом хедере. К какому модулю надо - подключили. Надо - изменили, при этом все модули видят измененную структуру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба А я сторонник следующей школы: //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 модуля придется подключать хедер и дефайновый хедер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба А я сторонник следующей школы: Причем здесь "школа"? Любой вариант в котором структура описана более чем в одном месте есть глупость. Зачем в terminals.c дубль terminals.h вместо его включения!? extern в "школе", похоже недоучили :( и испугались? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Не понял - что не так? В terminals.c объявлена переменная. В terminals.h оформлена для подключения в сторонних модулях с extern. Просто во внешнем модуле я не пишу extern перед объявлением требуемой внешней структуры. По вашему так недопустимо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 1 18 августа, 2007 Опубликовано 18 августа, 2007 · Жалоба Я написал, то, что написал. Возмущался двойным описанием структуры. Что не понятно? Исправлено: // 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться