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

 
 
> Как сослаться на структуру typedef struct?, Из другого файла
Димон Безпарольн...
сообщение Jun 20 2017, 09:27
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



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

Код
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. Если я правильно понимаю. Как это сделать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Димон Безпарольн...
сообщение Jun 20 2017, 09:37
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



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

Код
../Src/stm32l1xx_it.c(91): error:  #20: identifier "ADC_my" is undefined
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 20 2017, 09:40
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Димон Безпарольный @ Jun 20 2017, 13:37) *
Не получается однако. Я так уже пробовал. Потому и спросил.

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

что-то Вы умалчиваете.
В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 20 2017, 09:52
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(novikovfb @ Jun 20 2017, 12:40) *
что-то Вы умалчиваете.
В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет.

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

В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно?
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 20 2017, 09:59
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Димон Безпарольный @ Jun 20 2017, 13:52) *
Возможно умалчиваю потому, что не понимаю механизма.

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

Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #include. Видит объявление типа структуры - запоминает, что это такое. Когда видит extern ADC_my ADC_RAW - запоминает, что где-то есть такая структура уже известного типа ADC_RAW. Когда видит ADC_my ADC_RAW - проверяет, не противоречит ли это ранее увиденной extern ADC_my ADC_RAW и отводит место в памяти для этой структуры.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 20 2017, 10:01
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(novikovfb @ Jun 20 2017, 12:59) *
Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #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


Сообщение отредактировал Димон Безпарольный - Jun 20 2017, 10:06
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 20 2017, 10:06
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Димон Безпарольный @ Jun 20 2017, 13:01) *
Спасибо. Почему тогда ругается на extern ADC_my ADC_RAW; ?
Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW;


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Димон Безпарольный   Как сослаться на структуру typedef struct?   Jun 20 2017, 09:27
- - Genadi Zawidowski   В хидеое должно быть так: extern ADC_my ADC_RAW; ...   Jun 20 2017, 09:29
|- - scifi   Цитата(Genadi Zawidowski @ Jun 20 2017, 12...   Jun 20 2017, 09:33
||- - Димон Безпарольный   Цитата(Сергей Борщ @ Jun 20 2017, 13:06) ...   Jun 20 2017, 10:08
||- - novikovfb   Цитата(Димон Безпарольный @ Jun 20 2017, 14...   Jun 20 2017, 10:15
||- - Димон Безпарольный   Цитата(novikovfb @ Jun 20 2017, 13:15) Об...   Jun 20 2017, 10:27
|- - Mareng   Цитата(Димон Безпарольный @ Jun 20 2017, 16...   Jun 20 2017, 09:41
|- - novikovfb   Цитата(Mareng @ Jun 20 2017, 13:41) Возмо...   Jun 20 2017, 09:43
- - Непомнящий Евгений   Код// a.h typedef struct A {int f; } AA; extern AA...   Jun 20 2017, 10:34
- - Lagman   В .h (для примера main.h) файле обычно находится о...   Jun 20 2017, 11:16
|- - novikovfb   Цитата(Lagman @ Jun 20 2017, 15:16) В дру...   Jun 20 2017, 11:27
|- - Lagman   Цитата(novikovfb @ Jun 20 2017, 14:27) ex...   Jun 20 2017, 11:30
|- - novikovfb   Цитата(Lagman @ Jun 20 2017, 15:30) Можно...   Jun 20 2017, 12:00
- - Димон Безпарольный   Да, спасибо. Так все заработало. В хидере: Кодty...   Jun 20 2017, 11:32
- - Lagman   Цитата(Димон Безпарольный @ Jun 20 2017, 14...   Jun 20 2017, 11:36


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 18:36
Рейтинг@Mail.ru


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