Страница 1 из 2
Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 06:19:53
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. Там сказано что для системных файлов, перед именем файла нужно поставить два подчеркивания __ а для пользовательских файлов , оно вообще ненужно,и не слова про шрифт. Но все-равно ничего не работает.
Подскажите пожалуйста как с этим бороться? Спасибо
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 07:18:53
AVI-crak
Объединение возможно с элементом уже имеющим свой адрес.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 07:44:00
GARMIN
В *.h файле:
extern Config Dev_NVRAM;
И в одном из *.c файлов
Config Dev_NVRAM;
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 12:36:25
vovik15
Garmin, я делал как вы советовали, но компилятор говорит что неизвестный тип данных.
Чуть позже выяснилось что вы были правы, только в H файл нужно было еще и саму структуру положить. Все работает, спасибо!
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 14:16:52
ARV
блин, одно и то же...
defines.h содержит:
typedef бла-бла-бла my_type; // описание типа
extern my_type var; // объявление переменной
main.c содержит:
#include "defines.h" // подключение вышеприведенного файла
my_type var; // выделение памяти под эту переменную
var = ... ; // работу с этой переменной
другие файлы *.c содержат:
#include "defines.h" // подключение вышеприведенного файла
var = ... ; // работу с этой переменной
ну что тут может быть непонятным?!
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 14:36:58
vovik15
Спустя два дня все стало понятно, и уже работает. Это нормально,так бывает у начинающих
Но директива #ifnfef все равно не работает. Ради эксперимента я заменил в #ifnfef название своего файла на XXX и компилятор это проглотил
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 14:44:46
AVI-crak
ARV не всё так просто, для объединения правила работают немного иначе.
typedef union{...}name_TypeDef; - требует прямого назначения адреса размещения через
#define name ((name_TypeDef*) name_adress )
Используя объявление
union name_u{...}; - можно объединить переменную с уже известным адресом с новой созданной переменной.
Нельзя объединить переменные с неизвестным адресом, либо автономные переменные с известным адресом - должна быть одна точка опоры в расчётах смещения элементов объединения.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 14:46:55
vovik15
#define name ((name_TypeDef*) name_adress ) что это такое? у меня в юнионе обьявлено 4 переменных и массив, и ничего и нигде больше. Все работает
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 14:53:11
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;
и все всегда работало без проблем
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 15:05:47
vovik15
ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 15:22:45
ARV
vovik15 писал(а):работать не будет.
в ваших кейлах, может быть, и не будет. я пользуюсь GCC - там работает на ура! найдите в своем кейле опцию поддержки этой фичи - должна быть, ведь это как бы современная возможность, всеми принятая...
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 17:13:49
Eddy_Em
[uquote="vovik15",url="/forum/viewtopic.php?p=3827892#p3827892"]ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура[/uquote]
Чушь полная! Именно так все и работает, как ARV написал.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 17:41:14
AVI-crak
[uquote="ARV",url="/forum/viewtopic.php?p=3827882#p3827882"]и все всегда работало без проблем[/uquote]
А это уже другое правило. Имя и прототип структуры можно не указывать в случае прямой видимости аргументов. То-есть когда объявление и использование находится в одной зоне видимости, ну или в одном файле. Если объявить и использовать в разных местах - магия не работает.
Пока программный код мал по размеру, и полностью помещается в один файл - проблем нет. Но как только обрастает мясом - начинаются проблемы.
А для того чтобы проблемы не появились - достаточно не создавать их.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 18:05:55
vovik15
Eddy_Em я только что вставил именно этот код в Keil, и получил ошибку! Это не работает. Компилятор ругается,и говорит что нужно имя в структуре
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 18:25:27
Reflector
[uquote="vovik15",url="/forum/viewtopic.php?p=3827977#p3827977"]Компилятор ругается,и говорит что нужно имя в структуре[/uquote]
Анонимные структуры появились в C11, а в C++ вроде всегда были.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 18:27:40
vovik15
Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 18:29:06
Reflector
[uquote="vovik15",url="/forum/viewtopic.php?p=3827986#p3827986"]Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.[/uquote]
А ты поддержку C11 хотя бы пробовал включать?
Re: Как задекларировать структуру?
Добавлено: Ср апр 15, 2020 18:45:23
VladislavS
Давно замечено, что именно у кейловодов изменение настроек проекта вызывает
Когнитивный Диссонанс. А переключение компилятора на v6 смерти подобно.
Re: Как задекларировать структуру?
Добавлено: Чт апр 16, 2020 01:52:59
vovik15
Интересная статья... индивид пытается устранить несоответствие ранее полученных знаний со сложившийся ситуацией. Как настроить поддержку с11? И чем она лучше текущего С99 ?
Re: Как задекларировать структуру?
Добавлено: Чт апр 16, 2020 04:44:31
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 вообще? Побайтовый доступ к структуре
PPS: Без атрибута
packed работа всего этого ой как непредсказуема.