Как задекларировать структуру?
Как задекларировать структуру?
Здравствуйте уважаемые! Пишу код в 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. Там сказано что для системных файлов, перед именем файла нужно поставить два подчеркивания __ а для пользовательских файлов , оно вообще ненужно,и не слова про шрифт. Но все-равно ничего не работает.
Подскажите пожалуйста как с этим бороться? Спасибо
//Объединение в памяти структуры, и массива
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. Там сказано что для системных файлов, перед именем файла нужно поставить два подчеркивания __ а для пользовательских файлов , оно вообще ненужно,и не слова про шрифт. Но все-равно ничего не работает.
Подскажите пожалуйста как с этим бороться? Спасибо
- Реклама
- GARMIN
- Держит паяльник хвостом
- Сообщения: 954
- Зарегистрирован: Вс дек 02, 2012 16:58:33
- Откуда: от туда
- Контактная информация:
Re: Как задекларировать структуру?
В *.h файле:
extern Config Dev_NVRAM;
И в одном из *.c файлов
Config Dev_NVRAM;
extern Config Dev_NVRAM;
И в одном из *.c файлов
Config Dev_NVRAM;
Re: Как задекларировать структуру?
Garmin, я делал как вы советовали, но компилятор говорит что неизвестный тип данных.
Чуть позже выяснилось что вы были правы, только в H файл нужно было еще и саму структуру положить. Все работает, спасибо!
Чуть позже выяснилось что вы были правы, только в H файл нужно было еще и саму структуру положить. Все работает, спасибо!
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:35:03, всего редактировалось 1 раз.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как задекларировать структуру?
блин, одно и то же...
defines.h содержит:
typedef бла-бла-бла my_type; // описание типа
extern my_type var; // объявление переменной
main.c содержит:
#include "defines.h" // подключение вышеприведенного файла
my_type var; // выделение памяти под эту переменную
var = ... ; // работу с этой переменной
другие файлы *.c содержат:
#include "defines.h" // подключение вышеприведенного файла
var = ... ; // работу с этой переменной
ну что тут может быть непонятным?!
defines.h содержит:
typedef бла-бла-бла my_type; // описание типа
extern my_type var; // объявление переменной
main.c содержит:
#include "defines.h" // подключение вышеприведенного файла
my_type var; // выделение памяти под эту переменную
var = ... ; // работу с этой переменной
другие файлы *.c содержат:
#include "defines.h" // подключение вышеприведенного файла
var = ... ; // работу с этой переменной
ну что тут может быть непонятным?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Re: Как задекларировать структуру?
Спустя два дня все стало понятно, и уже работает. Это нормально,так бывает у начинающих
Но директива #ifnfef все равно не работает. Ради эксперимента я заменил в #ifnfef название своего файла на XXX и компилятор это проглотил
Но директива #ifnfef все равно не работает. Ради эксперимента я заменил в #ifnfef название своего файла на XXX и компилятор это проглотил
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:44:50, всего редактировалось 1 раз.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: Как задекларировать структуру?
ARV не всё так просто, для объединения правила работают немного иначе.
typedef union{...}name_TypeDef; - требует прямого назначения адреса размещения через
#define name ((name_TypeDef*) name_adress )
Используя объявление
union name_u{...}; - можно объединить переменную с уже известным адресом с новой созданной переменной.
Нельзя объединить переменные с неизвестным адресом, либо автономные переменные с известным адресом - должна быть одна точка опоры в расчётах смещения элементов объединения.
typedef union{...}name_TypeDef; - требует прямого назначения адреса размещения через
#define name ((name_TypeDef*) name_adress )
Используя объявление
union name_u{...}; - можно объединить переменную с уже известным адресом с новой созданной переменной.
Нельзя объединить переменные с неизвестным адресом, либо автономные переменные с известным адресом - должна быть одна точка опоры в расчётах смещения элементов объединения.
Re: Как задекларировать структуру?
#define name ((name_TypeDef*) name_adress ) что это такое? у меня в юнионе обьявлено 4 переменных и массив, и ничего и нигде больше. Все работает
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как задекларировать структуру?
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: Как задекларировать структуру?
ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18561
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Как задекларировать структуру?
в ваших кейлах, может быть, и не будет. я пользуюсь GCC - там работает на ура! найдите в своем кейле опцию поддержки этой фичи - должна быть, ведь это как бы современная возможность, всеми принятая...vovik15 писал(а):работать не будет.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Как задекларировать структуру?
[uquote="vovik15",url="/forum/viewtopic.php?p=3827892#p3827892"]ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура[/uquote]
Чушь полная! Именно так все и работает, как ARV написал.
Чушь полная! Именно так все и работает, как ARV написал.
- AVI-crak
- Прорезались зубы
- Сообщения: 202
- Зарегистрирован: Сб янв 09, 2016 15:51:17
- Контактная информация:
Re: Как задекларировать структуру?
[uquote="ARV",url="/forum/viewtopic.php?p=3827882#p3827882"]и все всегда работало без проблем[/uquote]
А это уже другое правило. Имя и прототип структуры можно не указывать в случае прямой видимости аргументов. То-есть когда объявление и использование находится в одной зоне видимости, ну или в одном файле. Если объявить и использовать в разных местах - магия не работает.
Пока программный код мал по размеру, и полностью помещается в один файл - проблем нет. Но как только обрастает мясом - начинаются проблемы.
А для того чтобы проблемы не появились - достаточно не создавать их.
А это уже другое правило. Имя и прототип структуры можно не указывать в случае прямой видимости аргументов. То-есть когда объявление и использование находится в одной зоне видимости, ну или в одном файле. Если объявить и использовать в разных местах - магия не работает.
Пока программный код мал по размеру, и полностью помещается в один файл - проблем нет. Но как только обрастает мясом - начинаются проблемы.
А для того чтобы проблемы не появились - достаточно не создавать их.
Re: Как задекларировать структуру?
Eddy_Em я только что вставил именно этот код в Keil, и получил ошибку! Это не работает. Компилятор ругается,и говорит что нужно имя в структуре
Re: Как задекларировать структуру?
[uquote="vovik15",url="/forum/viewtopic.php?p=3827977#p3827977"]Компилятор ругается,и говорит что нужно имя в структуре[/uquote]
Анонимные структуры появились в C11, а в C++ вроде всегда были.
Анонимные структуры появились в C11, а в C++ вроде всегда были.
Re: Как задекларировать структуру?
Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.
Re: Как задекларировать структуру?
[uquote="vovik15",url="/forum/viewtopic.php?p=3827986#p3827986"]Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.[/uquote]
А ты поддержку C11 хотя бы пробовал включать?
А ты поддержку C11 хотя бы пробовал включать?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как задекларировать структуру?
Давно замечено, что именно у кейловодов изменение настроек проекта вызывает Когнитивный Диссонанс. А переключение компилятора на v6 смерти подобно.
Re: Как задекларировать структуру?
Интересная статья... индивид пытается устранить несоответствие ранее полученных знаний со сложившийся ситуацией. Как настроить поддержку с11? И чем она лучше текущего С99 ?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как задекларировать структуру?
[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 работа всего этого ой как непредсказуема.
Google — мощный инструмент для поиска информации. Но как и каждым инструментом, Google нужно уметь пользоваться. Предлагаем вам небольшую подборку различных трюков, благодаря которым вы легко найдёте нужную информацию. Все секреты поиска в google.
[uquote="vovik15",url="/forum/viewtopic.php?p=3828046#p3828046"]И чем она лучше текущего С99 ?[/uquote]Текущего? Вы на календарь последний раз 20 лет назад смотрели?
PS: Кстати, а зачем в данном случае union вообще? Побайтовый доступ к структуре
Код: Выделить всё
*((uint8_t *)&Dev_NVRAM+i)

