Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: адрес Массива в массиве
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
andrvisht
Всех отмечающих с праздником !
никак не могу заставить компилятор сделать следущее:
пусть имеется массив во Flash
Код
__flash char Alph[24] = {'a','b','c','d','e','f','g','h','k', ...};
и другой массив во Flash
__flash char Param[] = {0x45,0x12,0x34,(char)Alpha,(char)(Alpha>>8), ...};

как видно мне нужно впихнуть в длинный список параметров массива Param адрес массива Alpha.
по логике все вроде как-бы должно работать, а по сути IAR выдает такое сообщение
Error[Pe031]: expression must have integral
причем ругается он на 5 элемент где сделано
Код
(char)(Alpha>>8)

Все попытки манипуляции с этой строкой приводят к разного рода сообщениям и одному, ошибочному, результату.
Ну и собственно вопрос Как ?
Laptop
Может сперва явно привести к инту, а потом уже сдвигать и приводить к чару? Компилятора под рукой нет чтобы проверить...
andrvisht
Цитата(Laptop @ Feb 23 2006, 12:12) *
Может сперва явно привести к инту, а потом уже сдвигать и приводить к чару? Компилятора под рукой нет чтобы проверить...

пробовал, все равно ругается. sad.gif такое ощущение что он не считает имя массива за константу и соответственно не может проинициализировать ей постоянные данные коими является flash. Но ведь имя массива константа ..... ?
vet
Должно работать явное указание адреса переменной, без каких-либо операций над ним; массив, конечно, придётся заменить на структуру.
Пример на CodeVision:
Код
typedef flash struct struct_menu_item {
  void (*fn)();
  flash struct struct_menu_item *link[2];
} TMenuItem;


extern flash TMenuItem mnMain;
extern flash TMenuItem mnLabel;
extern flash TMenuItem mnStat;
...

void fnMain() {
...
}

void fnLabel() {
...
}

flash TMenuItem mnMain         = {fnMain,          {&mnStat,    &mnLabel       }};
flash TMenuItem mnLabel        = {fnLabel,         {&mnStat,    &mnLogo        }};
...
andrvisht
Цитата(vet @ Feb 23 2006, 13:15) *
Должно работать явное указание адреса переменной, без каких-либо операций над ним; массив, конечно, придётся заменить на структуру.

Спасибо за пример, но тут дело принципа... как это обойти мысли были, либо структуры как Вы предлагаете, либо хранение на массива а индекса массива указателей в котором проинициализированы данные массивы. (их просто много)

Меня собственно интересует возможность именно такого подхода, или это невозможно ?
_artem_
По момему он должен ругаться и на четвертый элемент но сообшает 5-ый.
Попробуйте явно задать адрес массива во флеше Alph с помошью pragma. Инициализация требует константу но сам адрес Alph во флеше определяется во время линкования . Если это не поможет - запишите в инициализацию Param явное значение адреса заданного с помошью pragma.
andrvisht
Цитата(_artem_ @ Feb 23 2006, 15:39) *
По момему он должен ругаться и на четвертый элемент но сообшает 5-ый.
Попробуйте явно задать адрес массива во флеше Alph с помошью pragma. Инициализация требует константу но сам адрес Alph во флеше определяется во время линкования . Если это не поможет - запишите в инициализацию Param явное значение адреса заданного с помошью pragma.

явное значение работает, но мене такой подход не нравится sad.gif прото массивов много, и каждому адрес задавать как-то sad.gif((
а можно подробнее как
> задать адрес массива во флеше Alph с помошью pragma
???
_artem_
#pragma location=xxxx

Posmotri v IAR compiler reference page 220
andrvisht
Цитата(_artem_ @ Feb 24 2006, 00:53) *
#pragma location=xxxx

Posmotri v IAR compiler reference page 220

понял, но это тоже что указать @ 0x0130 например, опять-же указание контанты sad.gif(((
zltigo
Цитата(&-rey @ Feb 23 2006, 12:09) *
Меня собственно интересует возможность именно такого подхода, или это невозможно ?

Невозможно. Препроцессор не знает адреса массива (и не может выполнять
операций с тем, чего нет) - он будет известен только при линковке. Линкер знает адрес,
но ничего не знает о том, что Вы хотели-бы перед подстановкой его сдвинуть (эта информация
умерла в препроцессоре).
andrvisht
Цитата(zltigo @ Feb 24 2006, 11:32) *
Цитата(&-rey @ Feb 23 2006, 12:09) *

Меня собственно интересует возможность именно такого подхода, или это невозможно ?

Невозможно. Препроцессор не знает адреса массива (и не может выполнять
операций с тем, чего нет) - он будет известен только при линковке. Линкер знает адрес,
но ничего не знает о том, что Вы хотели-бы перед подстановкой его сдвинуть (эта информация
умерла в препроцессоре).

Понял, Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.