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

Как сослаться на структуру typedef struct?

В одном хидере объявлена структура:

 

typedef struct ADC_my2 {            //Структура для хранения сырых значений
    uint16_t    ADC_CH0;            //
    uint16_t    ADC_CH1;            //
    uint16_t    ADC_CH2;            //
    uint16_t    ADC_CH3;            //
    uint16_t    ADC_CH4;            //    
    uint16_t    ADC_CH5;            //
    uint16_t    ADC_CH6;            //
    uint16_t    ADC_CH7;            //    
}ADC_my;                            //
ADC_my ADC_RAW;                        //

 

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

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


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

В хидеое должно быть так:

extern ADC_my ADC_RAW;

 

И только в одном из файлов должна быть еще такая строка:

ADC_my ADC_RAW

 

Как это сделать

любым текстовым редактором.

Изменено пользователем Genadi Zawidowski

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


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

В хидеое должно быть так:

extern ADC_my ADC_RAW;

Совсем не обязательно в хедере. Если нужно только в одном месте, то прямо в исходнике, можно даже внутри функции. Ну а если в нескольких местах, то в хедере удобнее.

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


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

Не получается однако. Я так уже пробовал. Потому и спросил.

 

../Src/stm32l1xx_it.c(91): error:  #20: identifier "ADC_my" is undefined

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


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

Не получается однако. Я так уже пробовал. Потому и спросил.

 

../Src/stm32l1xx_it.c(91): error:  #20: identifier "ADC_my" is undefined

что-то Вы умалчиваете.

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

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


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

Не получается однако. Я так уже пробовал. Потому и спросил.

 

Возможно влияет последовательность компиляции файлов

 

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


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

что-то Вы умалчиваете.

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

Возможно умалчиваю потому, что не понимаю механизма.

 

В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно?

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


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

Возможно умалчиваю потому, что не понимаю механизма.

 

В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно?

Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #include. Видит объявление типа структуры - запоминает, что это такое. Когда видит extern ADC_my ADC_RAW - запоминает, что где-то есть такая структура уже известного типа ADC_RAW. Когда видит ADC_my ADC_RAW - проверяет, не противоречит ли это ранее увиденной extern ADC_my ADC_RAW и отводит место в памяти для этой структуры.

 

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


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

Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #include. Видит объявление типа структуры - запоминает, что это такое. Когда видит extern ADC_my ADC_RAW - запоминает, что где-то есть такая структура уже известного типа ADC_RAW. Когда видит ADC_my ADC_RAW - проверяет, не противоречит ли это ранее увиденной extern ADC_my ADC_RAW и отводит место в памяти для этой структуры.

Спасибо. Почему тогда ругается на extern ADC_my ADC_RAW; ?

 

../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined
Изменено пользователем Димон Безпарольный

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


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

Спасибо. Почему тогда ругается на extern ADC_my ADC_RAW; ?
Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW;

 

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


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

Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW;

Вот какие тонкости оказывается. Получилось. Спасибо.

 

Но при обращении к такой структуре:

 

ADC_NMEA(ADC_RAW.ADC_CH0)

 

получаю ошибку:

 

../Src/stm32l1xx_it.c(152): error: #70: incomplete type is not allowed

 

Изменено пользователем Димон Безпарольный

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


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

Вот какие тонкости оказывается. Получилось. Спасибо.

 

Но при обращении к такой структуре:

 

 

 

получаю ошибку:

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

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


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

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

Подскажите, что конкретно надо написать. Что - то не получается.

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


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

// a.h
typedef struct A {int f; } AA;
extern AA a;

//b.cpp
#include "a.h" // тут будет включен полный текст файла а.h, в результате компилятор узнает, что есть тип АА и есть переменная а этого типа

// если бы мы не писали "extern AA a" в a.h, то это объявление пришлось бы писать везде, где нужна переменная "а". 
// Если она нужна всего в одном файле, то стоит ее там и определить, причем как "static AA a;" static означает, что переменная локальная для файла
void f() { a.f = 2; }

// c.cpp
#include "a.h" // компилятор работает с каждым файлом отдельно. Тут он уже забыл про АА и а, надо включить снова

AA a; // выше мы только объявили "а". Где-то должно быть и определение, иначе будет ошибка линковки. Определение может быть в любом файле проекта
// но только в одном - если мы в a.h уберем extern, то объявление окажется в двух файлах (b.cpp и c.cpp), в результате будет ошибка линковки

void g() { a.f += 1; }

 

А вообще наройте книжку по Си и почитайте, это ж основы. Сложно учить язык методом проб и ошибок :)

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


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

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

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

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

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

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

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

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

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

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