реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как сделать структуру видимой в других файлах?
MSprut
сообщение Aug 15 2007, 11:30
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов?
Go to the top of the page
 
+Quote Post
o-henry
сообщение Aug 15 2007, 11:49
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 435
Регистрация: 8-03-06
Из: степей Украины
Пользователь №: 15 069



во втором файле перед объявлением этой структуры укажите модификатор extern
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 15 2007, 11:55
Сообщение #3


Гуру
******

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



Цитата(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;
.....


--------------------
Go to the top of the page
 
+Quote Post
MSprut
сообщение Aug 15 2007, 12:12
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476



extern не помогает почему-то... Ну да ладно, пока вышел из положения другим способом. А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.
Go to the top of the page
 
+Quote Post
nss
сообщение Aug 15 2007, 12:33
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 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

При компилировании исходного кода, даный код будет обработан компилятором только один раз.
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 15 2007, 12:49
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

Вам же уже сказали. Объявлять структуру нужно только в одном .с файле, там где она инициализируется и/или ее члены модифицируются. В остальных .c файлах нужно указать, что эта структура внешняя с помощью квалификатора extern.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Aug 15 2007, 21:51
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 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 можно пользоваться.
Go to the top of the page
 
+Quote Post
Denisvak
сообщение Aug 18 2007, 06:46
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
prottoss
сообщение Aug 18 2007, 08:45
Сообщение #9


Гуру
******

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



Цитата(Denisvak @ Aug 18 2007, 14:46) *
Все гораздо проще
в main.c к примеру объявляем структуру
Код
...

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

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

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


--------------------
Go to the top of the page
 
+Quote Post
vesago
сообщение Aug 18 2007, 10:54
Сообщение #10


Тутэйшы
****

Группа: Свой
Сообщений: 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 модуля придется подключать хедер и дефайновый хедер.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 18 2007, 11:08
Сообщение #11


Гуру
******

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



Цитата(vesago @ Aug 18 2007, 13:54) *
А я сторонник следующей школы:

Причем здесь "школа"? Любой вариант в котором структура описана более чем в одном месте есть глупость.
Зачем в terminals.c дубль terminals.h вместо его включения!? extern в "школе", похоже недоучили sad.gif и испугались?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
vesago
сообщение Aug 18 2007, 11:34
Сообщение #12


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Не понял - что не так? В terminals.c объявлена переменная. В terminals.h оформлена для подключения в сторонних модулях с extern. Просто во внешнем модуле я не пишу extern перед объявлением требуемой внешней структуры. По вашему так недопустимо?
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 18 2007, 13:00
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.01531 секунд с 7
ELECTRONIX ©2004-2016