Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Ср апр 15, 2020 06:19:53

Здравствуйте уважаемые! Пишу код в 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

Объединение возможно с элементом уже имеющим свой адрес.

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

Ср апр 15, 2020 07:44:00

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

И в одном из *.c файлов
Config Dev_NVRAM;

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

Ср апр 15, 2020 12:36:25

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

Чуть позже выяснилось что вы были правы, только в H файл нужно было еще и саму структуру положить. Все работает, спасибо!
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:35:03, всего редактировалось 1 раз.

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

Ср апр 15, 2020 14:16:52

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

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

Спустя два дня все стало понятно, и уже работает. Это нормально,так бывает у начинающих
Но директива #ifnfef все равно не работает. Ради эксперимента я заменил в #ifnfef название своего файла на XXX и компилятор это проглотил
Последний раз редактировалось vovik15 Ср апр 15, 2020 14:44:50, всего редактировалось 1 раз.

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

Ср апр 15, 2020 14:44:46

ARV не всё так просто, для объединения правила работают немного иначе.
typedef union{...}name_TypeDef; - требует прямого назначения адреса размещения через
#define name ((name_TypeDef*) name_adress )
Используя объявление
union name_u{...}; - можно объединить переменную с уже известным адресом с новой созданной переменной.
Нельзя объединить переменные с неизвестным адресом, либо автономные переменные с известным адресом - должна быть одна точка опоры в расчётах смещения элементов объединения.

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

Ср апр 15, 2020 14:46:55

#define name ((name_TypeDef*) name_adress ) что это такое? у меня в юнионе обьявлено 4 переменных и массив, и ничего и нигде больше. Все работает

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

Ср апр 15, 2020 14:53:11

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

ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура

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

Ср апр 15, 2020 15:22:45

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

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

Ср апр 15, 2020 17:13:49

ARV так как вы написали, работать не будет. В юнионе,структуре нужно присвоить имя, иначе вылетает ошибка, что использована анонимная структура

Чушь полная! Именно так все и работает, как ARV написал.

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

Ср апр 15, 2020 17:41:14

и все всегда работало без проблем

А это уже другое правило. Имя и прототип структуры можно не указывать в случае прямой видимости аргументов. То-есть когда объявление и использование находится в одной зоне видимости, ну или в одном файле. Если объявить и использовать в разных местах - магия не работает.
Пока программный код мал по размеру, и полностью помещается в один файл - проблем нет. Но как только обрастает мясом - начинаются проблемы.
А для того чтобы проблемы не появились - достаточно не создавать их.

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

Ср апр 15, 2020 18:05:55

Eddy_Em я только что вставил именно этот код в Keil, и получил ошибку! Это не работает. Компилятор ругается,и говорит что нужно имя в структуре

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

Ср апр 15, 2020 18:25:27

Компилятор ругается,и говорит что нужно имя в структуре

Анонимные структуры появились в C11, а в C++ вроде всегда были.

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

Ср апр 15, 2020 18:27:40

Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.

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

Ср апр 15, 2020 18:29:06

Ну тем немение этот код не компилируется. А если присвоить имя,то все норм.

А ты поддержку C11 хотя бы пробовал включать?

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

Ср апр 15, 2020 18:45:23

Давно замечено, что именно у кейловодов изменение настроек проекта вызывает Когнитивный Диссонанс. А переключение компилятора на v6 смерти подобно.

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

Чт апр 16, 2020 01:52:59

Интересная статья... индивид пытается устранить несоответствие ранее полученных знаний со сложившийся ситуацией. Как настроить поддержку с11? И чем она лучше текущего С99 ?

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

Чт апр 16, 2020 04:44:31

Как настроить поддержку с11?

Google — мощный инструмент для поиска информации. Но как и каждым инструментом, Google нужно уметь пользоваться. Предлагаем вам небольшую подборку различных трюков, благодаря которым вы легко найдёте нужную информацию. Все секреты поиска в google.
И чем она лучше текущего С99 ?
Текущего? Вы на календарь последний раз 20 лет назад смотрели?

PS: Кстати, а зачем в данном случае union вообще? Побайтовый доступ к структуре
Код:
*((uint8_t *)&Dev_NVRAM+i)


PPS: Без атрибута packed работа всего этого ой как непредсказуема.
Ответить