Перейти к содержанию
    

Как сделать структуру видимой в других файлах?

Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 2-х файлов?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

во втором файле перед объявлением этой структуры укажите модификатор extern

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть структура, объявленная в одном .с-файле, вместе с ним компилится второй в котором нужно изменить одну из переменных, входящих в структуру. Где и как в ИАРе правильно объявить эту структуру, чтобы к ней был доступ из разных 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;
.....

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

extern не помогает почему-то... Ну да ладно, пока вышел из положения другим способом. А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.

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

#ifndef _MYLIB_H
#define _MYLIB_H

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

#endif

При компилировании исходного кода, даный код будет обработан компилятором только один раз.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот если в разных файлах эта сруктура будет носить одно имя, то компилятор ругается, что структура уже объявлена.

Вам же уже сказали. Объявлять структуру нужно только в одном .с файле, там где она инициализируется и/или ее члены модифицируются. В остальных .c файлах нужно указать, что эта структура внешняя с помощью квалификатора extern.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую я дать совет.

В 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 можно пользоваться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все гораздо проще

в 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все гораздо проще

в main.c к примеру объявляем структуру

...

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

 

...

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я сторонник следующей школы:

 

//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 модуля придется подключать хедер и дефайновый хедер.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я сторонник следующей школы:

Причем здесь "школа"? Любой вариант в котором структура описана более чем в одном месте есть глупость.

Зачем в terminals.c дубль terminals.h вместо его включения!? extern в "школе", похоже недоучили :( и испугались?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не понял - что не так? В terminals.c объявлена переменная. В terminals.h оформлена для подключения в сторонних модулях с extern. Просто во внешнем модуле я не пишу extern перед объявлением требуемой внешней структуры. По вашему так недопустимо?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я написал, то, что написал. Возмущался двойным описанием структуры. Что не понятно?

Исправлено:

 

// 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...