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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как сослаться на структуру 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
Genadi Zawidowsk...
сообщение Jun 20 2017, 09:29
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



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

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

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

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

Сообщение отредактировал Genadi Zawidowski - Jun 20 2017, 09:31
Go to the top of the page
 
+Quote Post
scifi
сообщение Jun 20 2017, 09:33
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(Genadi Zawidowski @ Jun 20 2017, 12:29) *
В хидеое должно быть так:
extern ADC_my ADC_RAW;

Совсем не обязательно в хедере. Если нужно только в одном месте, то прямо в исходнике, можно даже внутри функции. Ну а если в нескольких местах, то в хедере удобнее.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 20 2017, 09:37
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 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
Mareng
сообщение Jun 20 2017, 09:41
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487



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


Возможно влияет последовательность компиляции файлов
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Jun 20 2017, 09:43
Сообщение #7


Знающий
****

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



Цитата(Mareng @ Jun 20 2017, 13:41) *
Возможно влияет последовательность компиляции файлов

не может быть
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 20 2017, 09:52
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 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
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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
Димон Безпарольн...
сообщение Jun 20 2017, 10:08
Сообщение #12


Знающий
****

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



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

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

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

Цитата
ADC_NMEA(ADC_RAW.ADC_CH0)


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

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



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


Знающий
****

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



Цитата(Димон Безпарольный @ Jun 20 2017, 14:08) *
Вот какие тонкости оказывается. Получилось. Спасибо.

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



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

Объявление типа структуры надо подключать везде, где она используется. Компилятор обрабатывает каждый си-шный файл по отдельности, не запоминая результатов компиляции ранее обработанных файлов.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 20 2017, 10:27
Сообщение #14


Знающий
****

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



Цитата(novikovfb @ Jun 20 2017, 13:15) *
Объявление типа структуры надо подключать везде, где она используется. Компилятор обрабатывает каждый си-шный файл по отдельности, не запоминая результатов компиляции ранее обработанных файлов.

Подскажите, что конкретно надо написать. Что - то не получается.
Go to the top of the page
 
+Quote Post
Непомнящий Евген...
сообщение Jun 20 2017, 10:34
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 16-07-07
Из: Волгодонск
Пользователь №: 29 153



Код
// 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; }


А вообще наройте книжку по Си и почитайте, это ж основы. Сложно учить язык методом проб и ошибок sm.gif
Go to the top of the page
 
+Quote Post

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

 


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


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