Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> как объявить 2 массива с перекрестными ссылками?, на с++
Вилен
сообщение 30.06.2008 - 17:32

Это вам не это...
*******
10 лет с форумомОрден имени Чингачгука Большого Змея
Группа: Участник
Сообщений: 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" только убрать нужно (или заменить на аналог)
Перейти в начало страницы
 
+Цитировать сообщение
leah
сообщение 1.07.2008 - 19:20

Постоялец форума
*****

Группа: Модератор
Сообщений: 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

Это вам не это...
*******
10 лет с форумомОрден имени Чингачгука Большого Змея
Группа: Участник
Сообщений: 2357
Регистрация: 29.09.2003
Пользователь №: 106


хе, кто ж знал.
extern действительно помог, спсб.
Перейти в начало страницы
 
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 2.05.2024 - 01:04