Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать структуру видимой в других файлах?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
MSprut
Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов?
o-henry
во втором файле перед объявлением этой структуры укажите модификатор extern
prottoss
Цитата(MSprut @ Aug 15 2007, 19:30) *
Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов?
Элементарно, Ватсон smile.gif - Объявите ее не в Си-файле, а в хедере, принадлежащему этому Си-файлу. А к другому Си евошний хедер подключите smile.gif smile.gif smile.gif


Код
/* Файл 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
extern не помогает почему-то... Ну да ладно, пока вышел из положения другим способом. А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.
nss
Цитата(MSprut @ Aug 15 2007, 16:12) *
А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.

Дополните заголовочный файл директивами компилятора
Код
#ifndef _MYLIB_H
#define _MYLIB_H

typedef struct __Foo
{    
    char a, b, c;
} Foo;

#endif

При компилировании исходного кода, даный код будет обработан компилятором только один раз.
rezident
Цитата(MSprut @ Aug 15 2007, 18:12) *
А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.

Вам же уже сказали. Объявлять структуру нужно только в одном .с файле, там где она инициализируется и/или ее члены модифицируются. В остальных .c файлах нужно указать, что эта структура внешняя с помощью квалификатора extern.
IgorKossak
Попробую я дать совет.
В 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
Все гораздо проще
в 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
Цитата(Denisvak @ Aug 18 2007, 14:46) *
Все гораздо проще
в main.c к примеру объявляем структуру
Код
...

а другом файле где надо её использовать пишем

Код
...
Ага, и так во всех десяти файлах проекта. А потом вдруг захотелось добавить еще одно поле в нашей структуре... И что? smile.gif

Говорилось же - объявляем структуру в одном месте - подключаемом хедере. К какому модулю надо - подключили. Надо - изменили, при этом все модули видят измененную структуру
vesago
А я сторонник следующей школы:

Код
//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
Цитата(vesago @ Aug 18 2007, 13:54) *
А я сторонник следующей школы:

Причем здесь "школа"? Любой вариант в котором структура описана более чем в одном месте есть глупость.
Зачем в terminals.c дубль terminals.h вместо его включения!? extern в "школе", похоже недоучили sad.gif и испугались?
vesago
Не понял - что не так? В terminals.c объявлена переменная. В terminals.h оформлена для подключения в сторонних модулях с extern. Просто во внешнем модуле я не пишу extern перед объявлением требуемой внешней структуры. По вашему так недопустимо?
zltigo
Я написал, то, что написал. Возмущался двойным описанием структуры. Что не понятно?
Исправлено:

Код
// 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
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.