Как задекларировать структуру?

Кто любит RISC в жизни, заходим, не стесняемся.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Как задекларировать структуру?

Сообщение vovik15 »

Здравствуйте уважаемые! Пишу код в Keil, столкнулся с такой проблемой. Имеется вот такая структура

//Объединение в памяти структуры, и массива
typedef union
{
struct {
uint32_t Start_Key;
uint8_t Param_1;
uint8_t Param_2;
uint8_t Param_3;
uint8_t Param_4;
}
Config_T;
uint8_t Data [8]; //массив для доступа к структуре
} Config;//тип данных Config

Config Dev_NVRAM; //Определяется переменная для работы со структурой

При попытке доступа к структуре через переменную Dev_NVRAM из файла Main , компилятор выдает ошибку : Неопределенный тип данных, хотя в подключенном заголовке прописано extern Config Dev_NVRAM;

Ковырял много ресурсов в интернете, там высказали предложение переместить структуру в H файл. В этом случае возникает другая ошибка : L6200Е : многочисленное объявление. То-есть я так понимаю компилятор пытается включить H файл с этой структурой многократно, хотя в заголовке H файла прописана такая директива
#ifndef __File_H
#define __File_H

/*code*/

#endif

получается она совсем не работает.
//--------------------------------------------------
Что касается ошибки L6200Е, с ней я очень долго боролся, менял и имена файлов, и шрифт,и ставил такие символы _ (1 и 2)
даже был на сайте Keil, в разделе посвященной директиве #ifndef. Там сказано что для системных файлов, перед именем файла нужно поставить два подчеркивания __ а для пользовательских файлов , оно вообще ненужно,и не слова про шрифт. Но все-равно ничего не работает.

Подскажите пожалуйста как с этим бороться? Спасибо
Реклама
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Как задекларировать структуру?

Сообщение AVI-crak »

Объединение возможно с элементом уже имеющим свой адрес.
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

Re: Как задекларировать структуру?

Сообщение GARMIN »

В *.h файле:
extern Config Dev_NVRAM;

И в одном из *.c файлов
Config Dev_NVRAM;
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

Garmin, я делал как вы советовали, но компилятор говорит что неизвестный тип данных.

Чуть позже выяснилось что вы были правы, только в H файл нужно было еще и саму структуру положить. Все работает, спасибо!
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:35:03, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как задекларировать структуру?

Сообщение ARV »

блин, одно и то же...

defines.h содержит:
typedef бла-бла-бла my_type; // описание типа
extern my_type var; // объявление переменной


main.c содержит:
#include "defines.h" // подключение вышеприведенного файла
my_type var; // выделение памяти под эту переменную
var = ... ; // работу с этой переменной


другие файлы *.c содержат:
#include "defines.h" // подключение вышеприведенного файла
var = ... ; // работу с этой переменной


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

Мой уютный бложик... заходите!
Реклама
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

Спустя два дня все стало понятно, и уже работает. Это нормально,так бывает у начинающих
Но директива #ifnfef все равно не работает. Ради эксперимента я заменил в #ifnfef название своего файла на XXX и компилятор это проглотил
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:44:50, всего редактировалось 1 раз.
Реклама
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Как задекларировать структуру?

Сообщение AVI-crak »

ARV не всё так просто, для объединения правила работают немного иначе.
typedef union{...}name_TypeDef; - требует прямого назначения адреса размещения через
#define name ((name_TypeDef*) name_adress )
Используя объявление
union name_u{...}; - можно объединить переменную с уже известным адресом с новой созданной переменной.
Нельзя объединить переменные с неизвестным адресом, либо автономные переменные с известным адресом - должна быть одна точка опоры в расчётах смещения элементов объединения.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

#define name ((name_TypeDef*) name_adress ) что это такое? у меня в юнионе обьявлено 4 переменных и массив, и ничего и нигде больше. Все работает
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как задекларировать структуру?

Сообщение ARV »

AVI-crak, не понимаю, что вы хотите сказать, но то, что я написал, одинаково работает для любого typedef. да и случаев с typedef union, которые бы не работали, я ни разу не встречал - я люблю вводить свои типы, и в том числе частенько union-ю свои структуры.

например, так (не один раз советовал):

Код: Выделить всё

typedef union{
   uint32_t L;
   struct{
      uint16_t WL;
      uint16_t WH;
   };
   uint8_t B[4];
} my_type;
и все всегда работало без проблем
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18561
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Как задекларировать структуру?

Сообщение ARV »

vovik15 писал(а):работать не будет.
в ваших кейлах, может быть, и не будет. я пользуюсь GCC - там работает на ура! найдите в своем кейле опцию поддержки этой фичи - должна быть, ведь это как бы современная возможность, всеми принятая...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: Как задекларировать структуру?

Сообщение Eddy_Em »

[uquote="vovik15",url="/forum/viewtopic.php?p=3827892#p3827892"]ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура[/uquote]
Чушь полная! Именно так все и работает, как ARV написал.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: Как задекларировать структуру?

Сообщение AVI-crak »

[uquote="ARV",url="/forum/viewtopic.php?p=3827882#p3827882"]и все всегда работало без проблем[/uquote]
А это уже другое правило. Имя и прототип структуры можно не указывать в случае прямой видимости аргументов. То-есть когда объявление и использование находится в одной зоне видимости, ну или в одном файле. Если объявить и использовать в разных местах - магия не работает.
Пока программный код мал по размеру, и полностью помещается в один файл - проблем нет. Но как только обрастает мясом - начинаются проблемы.
А для того чтобы проблемы не появились - достаточно не создавать их.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

Eddy_Em я только что вставил именно этот код в Keil, и получил ошибку! Это не работает. Компилятор ругается,и говорит что нужно имя в структуре
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Как задекларировать структуру?

Сообщение Reflector »

[uquote="vovik15",url="/forum/viewtopic.php?p=3827977#p3827977"]Компилятор ругается,и говорит что нужно имя в структуре[/uquote]
Анонимные структуры появились в C11, а в C++ вроде всегда были.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.
Reflector
Поставщик валерьянки для Кота
Сообщения: 2089
Зарегистрирован: Вс июн 19, 2016 09:32:03

Re: Как задекларировать структуру?

Сообщение Reflector »

[uquote="vovik15",url="/forum/viewtopic.php?p=3827986#p3827986"]Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.[/uquote]
А ты поддержку C11 хотя бы пробовал включать?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как задекларировать структуру?

Сообщение VladislavS »

Давно замечено, что именно у кейловодов изменение настроек проекта вызывает Когнитивный Диссонанс. А переключение компилятора на v6 смерти подобно.
vovik15
Опытный кот
Сообщения: 768
Зарегистрирован: Сб ноя 08, 2008 18:32:36
Контактная информация:

Re: Как задекларировать структуру?

Сообщение vovik15 »

Интересная статья... индивид пытается устранить несоответствие ранее полученных знаний со сложившийся ситуацией. Как настроить поддержку с11? И чем она лучше текущего С99 ?
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как задекларировать структуру?

Сообщение VladislavS »

[uquote="vovik15",url="/forum/viewtopic.php?p=3828046#p3828046"]Как настроить поддержку с11?[/uquote]
Google — мощный инструмент для поиска информации. Но как и каждым инструментом, Google нужно уметь пользоваться. Предлагаем вам небольшую подборку различных трюков, благодаря которым вы легко найдёте нужную информацию. Все секреты поиска в google.
[uquote="vovik15",url="/forum/viewtopic.php?p=3828046#p3828046"]И чем она лучше текущего С99 ?[/uquote]Текущего? Вы на календарь последний раз 20 лет назад смотрели?

PS: Кстати, а зачем в данном случае union вообще? Побайтовый доступ к структуре

Код: Выделить всё

*((uint8_t *)&Dev_NVRAM+i)
PPS: Без атрибута packed работа всего этого ой как непредсказуема.
Ответить

Вернуться в «ARM»