Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба В одном хидере объявлена структура: 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. Если я правильно понимаю. Как это сделать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 20 июня, 2017 Опубликовано 20 июня, 2017 (изменено) · Жалоба В хидеое должно быть так: extern ADC_my ADC_RAW; И только в одном из файлов должна быть еще такая строка: ADC_my ADC_RAW Как это сделать любым текстовым редактором. Изменено 20 июня, 2017 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба В хидеое должно быть так: extern ADC_my ADC_RAW; Совсем не обязательно в хедере. Если нужно только в одном месте, то прямо в исходнике, можно даже внутри функции. Ну а если в нескольких местах, то в хедере удобнее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Не получается однако. Я так уже пробовал. Потому и спросил. ../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Не получается однако. Я так уже пробовал. Потому и спросил. ../Src/stm32l1xx_it.c(91): error: #20: identifier "ADC_my" is undefined что-то Вы умалчиваете. В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Mareng 0 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Не получается однако. Я так уже пробовал. Потому и спросил. Возможно влияет последовательность компиляции файлов Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Возможно влияет последовательность компиляции файлов не может быть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба что-то Вы умалчиваете. В хедере должно быть объявление типа структуры и extern объявление переменной. Этот хедер должен подключаться во все файлы, где используется эта структура. В одном из файлов должна быть размещена эта струкутра, т.е. объявление переменной без extern, хедер этому мешать не будет. Возможно умалчиваю потому, что не понимаю механизма. В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Возможно умалчиваю потому, что не понимаю механизма. В каком хедере должно быть объявление типа структуры? У меня в одном хедере размещена структура, в другом - я на нее сослался с помощью extern. Но получил ошибку (выше). Что я сделал неправильно? Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #include. Видит объявление типа структуры - запоминает, что это такое. Когда видит extern ADC_my ADC_RAW - запоминает, что где-то есть такая структура уже известного типа ADC_RAW. Когда видит ADC_my ADC_RAW - проверяет, не противоречит ли это ранее увиденной extern ADC_my ADC_RAW и отводит место в памяти для этой структуры. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 (изменено) · Жалоба Ничего волшебного. Хедеры используются исключительно для удобства и уменьшения вероятности ошибки при переписывании. Компилятор последовательно просматривает текст программы, подключает все хедеры в том порядке, в котором они упомянуты в #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 Изменено 20 июня, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Спасибо. Почему тогда ругается на extern ADC_my ADC_RAW; ?Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 (изменено) · Жалоба Потому что к моменту, когда он встретил упоминание этого типа он еще не видел заголовочного файла с объявлением этого типа. Хотите, чтобы он ожидал это объявление позже - пишите extern struct ADC_my ADC_RAW; Вот какие тонкости оказывается. Получилось. Спасибо. Но при обращении к такой структуре: ADC_NMEA(ADC_RAW.ADC_CH0) получаю ошибку: ../Src/stm32l1xx_it.c(152): error: #70: incomplete type is not allowed Изменено 20 июня, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Вот какие тонкости оказывается. Получилось. Спасибо. Но при обращении к такой структуре: получаю ошибку: Объявление типа структуры надо подключать везде, где она используется. Компилятор обрабатывает каждый си-шный файл по отдельности, не запоминая результатов компиляции ранее обработанных файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба Объявление типа структуры надо подключать везде, где она используется. Компилятор обрабатывает каждый си-шный файл по отдельности, не запоминая результатов компиляции ранее обработанных файлов. Подскажите, что конкретно надо написать. Что - то не получается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 20 июня, 2017 Опубликовано 20 июня, 2017 · Жалоба // 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; } А вообще наройте книжку по Си и почитайте, это ж основы. Сложно учить язык методом проб и ошибок :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться