Вопрос по организации меню

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 2
Зарегистрирован: Пт июл 07, 2017 04:46:45

Сообщение Seryoga74 »

Здравствуйте. Что-то я совсем запутался со связанными константными структурами в Си. Ведь они должны быть определены при их инициализации, но так как они связаны между собой, компилятор начинает ругаться.

Файл Menu.c

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

#include <avr/pgmspace.h>
#include <stdlib.h>
#include "Menu.h"

const char PROGMEM main_menu_text[]={0xA1, 0xBB, 0x61, 0xB3, 0xBD, 0x6F, 0x65, 0x80, 0xBC, 0x65, 0xBD, 0xC6}; //Главное меню
const char PROGMEM time_set_text[]={0x48, 0x61, 0x63, 0xBF, 0x70, 0x6F, 0xB9, 0xBA, 0x61, 0x80, 0xB3, 0x70, 0x65, 0xBC, 0x65, 0xBD, 0xB8}; //Настройка времени
const char PROGMEM bright_set_text[]={0x48, 0x61, 0x63, 0xBF, 0x70, 0x6F, 0xB9, 0xBA, 0x61, 0x80, 0xC7, 0x70, 0xBA, 0x6F, 0x63, 0xBF, 0xB8}; //Настройка яркости
	
const MenuStruct main_menu={main_menu_text,NULL,NULL,time_set,NULL};
const MenuStruct time_set={time_set_text,NULL,NULL,bright_set,main_menu};
const MenuStruct bright_set={bright_set_text,NULL,NULL,NULL,time_set};

MenuStruct* curr_menu; 
Файл Menu.h

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

#ifndef MENU_H_
#define MENU_H_

#include <avr/pgmspace.h>

typedef struct PROGMEM
{
	const char* menu_name;
	void* const parent;
	void* const child;
	void* const next;
	void* const prev;
} MenuStruct;


void Menu_Init(void);
void Menu_LCD_FSM (void);
void Menu_KeyBoard_Handler (void);



#endif /* MENU_H_ */
Компилятор выдаёт ошибки:
- 'time_set' undeclared here (not in a function)
- 'bright_set' undeclared here (not in a function)
- initializer element is not constant
- (near initialization for 'time_set.prev')
- initializer element is not constant
- (near initialization for 'bright_set.prev')

Помогите чем сможете. Заранее спасибо.
Реклама
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

перед const MenuStruct main_menu=... вам надо объявить time_set
Примерно как то так,

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

extern const MenuStruct time_set;
это говорит компилятору, что time_set где-то объявлена, но дальше, ищи её.

Что бы не городить такое для каждого пункта меню, проще создать макрос(define)
У меня он выглядит так. Вам надо по убирать лишнее.

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

#define MAKE_MENU(Name, Next, Previous, Parent, Child,Right_m,Left_m,showfunc,ShowCursor1,ACT_LEFT,ACT_RIGHT,OK,ESC,UP,DW,Text) \
    extern menuItem Next;     \
    extern menuItem Previous; \
    extern menuItem Parent;   \
    extern menuItem Child;  \
    menuItem  Name = {(menuItem*)&Next, (menuItem*)&Previous,	\
						(menuItem*)&Parent, (menuItem*)&Child,	\
						(menuItem*)&Right_m,(menuItem*)&Left_m,	\
						showfunc,ShowCursor1,					\
						ACT_LEFT,ACT_RIGHT,						\
						OK,ESC,UP,DW,							\
						{ Text }}								\
Реклама
Родился
Сообщения: 2
Зарегистрирован: Пт июл 07, 2017 04:46:45

Сообщение Seryoga74 »

Спасибо большое, pokk. Я думал о том, что надо объявить эти структуры, но меня останавливало то, что константы должны быть определены во время объявления. Про extern не знал. Спасибо.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Главный критерий для создания меню - создание новых элементов, редактирование в одном месте. На данный момент для меня почти по всем пунктам подходит этот проект. Но за основу я взял исходный проект. Именования я взял из проекта статьи.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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