|
|
  |
адрес Массива в массиве, Не могу указать :( |
|
|
|
Feb 23 2006, 07:42
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Всех отмечающих с праздником ! никак не могу заставить компилятор сделать следущее: пусть имеется массив во 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) Все попытки манипуляции с этой строкой приводят к разного рода сообщениям и одному, ошибочному, результату. Ну и собственно вопрос Как ?
|
|
|
|
|
Feb 23 2006, 08:28
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(Laptop @ Feb 23 2006, 12:12)  Может сперва явно привести к инту, а потом уже сдвигать и приводить к чару? Компилятора под рукой нет чтобы проверить... пробовал, все равно ругается.  такое ощущение что он не считает имя массива за константу и соответственно не может проинициализировать ей постоянные данные коими является flash. Но ведь имя массива константа ..... ?
|
|
|
|
|
Feb 23 2006, 09:15
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
Должно работать явное указание адреса переменной, без каких-либо операций над ним; массив, конечно, придётся заменить на структуру. Пример на 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 }}; ...
Сообщение отредактировал vet - Feb 23 2006, 09:56
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Feb 23 2006, 10:09
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(vet @ Feb 23 2006, 13:15)  Должно работать явное указание адреса переменной, без каких-либо операций над ним; массив, конечно, придётся заменить на структуру. Спасибо за пример, но тут дело принципа... как это обойти мысли были, либо структуры как Вы предлагаете, либо хранение на массива а индекса массива указателей в котором проинициализированы данные массивы. (их просто много) Меня собственно интересует возможность именно такого подхода, или это невозможно ?
|
|
|
|
|
Feb 23 2006, 12:40
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(_artem_ @ Feb 23 2006, 15:39)  По момему он должен ругаться и на четвертый элемент но сообшает 5-ый. Попробуйте явно задать адрес массива во флеше Alph с помошью pragma. Инициализация требует константу но сам адрес Alph во флеше определяется во время линкования . Если это не поможет - запишите в инициализацию Param явное значение адреса заданного с помошью pragma. явное значение работает, но мене такой подход не нравится  прото массивов много, и каждому адрес задавать как-то  (( а можно подробнее как > задать адрес массива во флеше Alph с помошью pragma ???
|
|
|
|
|
Feb 24 2006, 07:11
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(_artem_ @ Feb 24 2006, 00:53)  #pragma location=xxxx
Posmotri v IAR compiler reference page 220 понял, но это тоже что указать @ 0x0130 например, опять-же указание контанты  (((
|
|
|
|
|
Feb 24 2006, 07:32
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(&-rey @ Feb 23 2006, 12:09)  Меня собственно интересует возможность именно такого подхода, или это невозможно ? Невозможно. Препроцессор не знает адреса массива (и не может выполнять операций с тем, чего нет) - он будет известен только при линковке. Линкер знает адрес, но ничего не знает о том, что Вы хотели-бы перед подстановкой его сдвинуть (эта информация умерла в препроцессоре).
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Feb 24 2006, 07:50
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

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