как объявить 2 массива с перекрестными ссылками?, на с++ |
Здравствуйте, гость ( Вход | Регистрация )
как объявить 2 массива с перекрестными ссылками?, на с++ |
30.06.2008 - 17:32
Вставить ник | Быстрая цитата | Сообщение
#1
|
|
Это вам не это... Группа: Участник Сообщений: 2357 Регистрация: 29.09.2003 Пользователь №: 106 |
Есть структура меню
Код struct Menu { int type; // тип Menu __flash * level_down; // куда переходим если нажали "enter" int dop_parametr; char __flash *text; // текст пункта меню }; __flash char Null[] = "\"; __flash char TitleMenu[] = "Главное меню\"; __flash char MainEcran[] = "экраны\"; и объявляем 2 менюшки по 3 пункта Код //__flash Menu menu_ecran[]; __flash Menu main_menu[] = { // tip enter parametr text { 2, 0, 0x00, TitleMenu}, { 2, menu_ecran, 0x00, MainEcran}, { 2, 0, 0x00, Null} }; __flash Menu menu_ecran[] = { // tip enter parametr text { 2, main_menu, 0x00, TitleMenu}, { 2, 0, 0x00, MainEcran}, { 2, 0, 0x00, Null} }; как видно есть 2 перкрестные ссылки , в main_menu есть ссылка на menu_ecran и в menu_ecran есть ссылка на main_menu. Компилер ругается , увидев имя массива до его объявления , т.е. ошибка в строке "{ 2, menu_ecran, 0x00, MainEcran}," Error[Pe020]: identifier "menu_ecran" is undefined D:\Projects\AVR\cii_prog\ver1_0_3\menu_items.cpp 18 "фокус" с предобъявлением как для функций не работает ( убираем "//" в строке "//__flash Menu menu_ecran[];") Error[Pe247]: variable "menu_ecran" has already been defined D:\Projects\AVR\cii_prog\ver1_0_3\menu_items.cpp 22 инициализировать массивы внутри какой либо функции нельзя дириктива __flash говорит о том что массивы лежат в сегменте кода и это вообще константы. как тогда быть? или это ограничение языка? компиллер с++ IAR4.12A для AVR, но это думаю не столько важно, можно и на сях для х86 это вымучить, "__flash" только убрать нужно (или заменить на аналог) |
|
|
1.07.2008 - 19:20
Вставить ник | Быстрая цитата | Сообщение
#2
|
|
Постоялец форума Группа: Модератор Сообщений: 967 Регистрация: 17.08.2004 Пользователь №: 4400 |
А ключевое слово extern не пробовал?!
Код #include <stdio.h> #define __flash struct Menu { int type; // тип struct Menu __flash *level_down; // куда переходим если нажали "enter" int dop_parametr; char __flash *text; // текст пункта меню }; __flash char Null[] = "\\"; __flash char TitleMenu[] = "Главное меню\\"; __flash char MainEcran[] = "экраны\\"; extern struct __flash Menu menu_ecran[]; struct __flash Menu main_menu[] = { // tip enter parametr text { 2, 0, 0x00, TitleMenu}, { 2, menu_ecran, 0x00, MainEcran}, { 2, 0, 0x00, Null}, { 0, 0, 0x00, 0} // terminator }; struct __flash Menu menu_ecran[] = { // tip enter parametr text { 2, main_menu, 0x00, TitleMenu}, { 2, 0, 0x00, MainEcran}, { 2, 0, 0x00, Null}, { 0, 0, 0x00, 0} // terminator }; int main() { int i; struct Menu *menu; menu = menu_ecran; printf ("menu_ecran: %x\n", menu); for(;menu->text != 0; menu++) { printf ("%02d 0x%08x 0x%02x %s\n", menu->type, menu->level_down, menu->dop_parametr, menu->text); } menu = main_menu; printf ("main_menu: %x\n", menu); for(;menu->text != 00; menu++) { printf ("%02d 0x%08x 0x%02x %s\n", menu->type, menu->level_down, menu->dop_parametr, menu->text); } } ЗЫ.. Так как ты делал, переменную не предопределяют, так функцию прототипируют.... Код leah@leah-laptop:~$ gcc test.c -o test
leah@leah-laptop:~$ ./test menu_ecran: 8049700 02 0x080496c0 0x00 Главное меню\ 02 0x00000000 0x00 экраны\ 02 0x00000000 0x00 \ main_menu: 80496c0 02 0x00000000 0x00 Главное меню\ 02 0x08049700 0x00 экраны\ 02 0x00000000 0x00 \ leah@leah-laptop:~$ |
|
|
1.07.2008 - 19:36
Вставить ник | Быстрая цитата | Сообщение
#3
|
|
Это вам не это... Группа: Участник Сообщений: 2357 Регистрация: 29.09.2003 Пользователь №: 106 |
хе, кто ж знал.
extern действительно помог, спсб. |
|
|
Текстовая версия | Сейчас: 2.05.2024 - 01:04 |