visht 0 16 января, 2006 Опубликовано 16 января, 2006 (изменено) · Жалоба Нужно хранить строки логических параметров для вывода их как значение на ЖКД. наиболее подходящим способом мне показалось создание массива указателей на строки. например так: char *EnumMes[] = {"Вкл\0Выкл","Авто\0Ручн","Зан\0Ocв"}; но такое размещение строк производится в ОЗУ а хотелось бы во FLASH, и вот тут проблема: char __flash *EnumMes[] = {"Вкл\0Выкл","Авто\0Ручн","Зан\0Ocв"}; Error: a value of type "char *" cannot be used to initialize an entity of type "char __flash *" т.е. указатель на Flash не может указать на данные в SRAM которыми, видимо, являются мои строки. Включение опции --string_literals_in_flash ситуацию не изменило :( пришлось применить запись типа: __flash char mess1[] = "Вкл\0Выкл"; // Точность параметра=10 __flash char mess2[] = "Авто\0Ручн"; // Точность параметра=11 __flash char mess3[] = "Зан\0Ocв"; // Точность параметра=12 char __flash *EnumMes[] = {mess1, mess2, mess3}; Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ? Далее полученный массив указателей на Flash строки можно тоже запихнуть во flash (хотя наверное доступ к нему из-за этого увеличиться :-) ) ... __flash char __flash *EnumMes[] = {mess1, mess2, mess3}; А теперь для передачи его в функцию как аргумента обьявляю указатель на массив указателей, но :( char __flash *GetEnumMes(char __flash **EnumMess, char dPrm, char fPrm) Error: argument of type "char __flash *__flash *" is incompatible with parameter of type "char __flash **" Вопрос 2-й - как правильно передать его функции, если вообще возможно ? Изменено 16 января, 2006 пользователем &-rey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба __flash char mess1[] = "Вкл\0Выкл"; // Точность параметра=10 __flash char mess2[] = "Авто\0Ручн"; // Точность параметра=11 __flash char mess3[] = "Зан\0Ocв"; // Точность параметра=12 char __flash *EnumMes[] = {mess1, mess2, mess3}; Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ? Я обычно поступаю так typedef char __flash * STR; .... // Сообщения основного меню __flash STR Message_MainMenu[]= { (STR)"Фотон-А", (STR)"Просмотр архива событий", (STR)"Перезапуск системы", (STR)"Конфигурация ПУ", (STR)"Конфигурация ППКП", (STR)"Конфигурация извещателей", (STR)"Конфигурация зон", (STR)"Конфигурация ТК", (STR)"Конфигурация БРА", (STR)"Конфигурация АПС", (STR)"Изменение адресов", (STR)"Отладка приборов" }; char __flash *GetEnumMes(char __flash **EnumMess, char dPrm, char fPrm) Error: argument of type "char __flash *__flash *" is incompatible with parameter of type "char __flash **" Вопрос 2-й - как правильно передать его функции, если вообще возможно ? Ну оно же тебе пишет что с чем инкомпатибле, следовательно char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GxOST 0 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба Вопрос 1-й - Такая запись не очень удобна. Можно ли это сделать более лаконично ? Вопрос 2-й - как правильно передать его функции, если вообще возможно ? Я делаю так: const char __flash mess[][MESS_MAX_LEN]={"OK", "ERROR"}; #define MESS_OK 0 #define MESS_ERROR 1 и передаю в функцию не указатель, а номер строки n (в данном случае - MESS_OK или MESS_ERROR), а там уж mess[n] и будет искомой строкой Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 16 января, 2006 Опубликовано 16 января, 2006 (изменено) · Жалоба Я обычно поступаю так typedef char __flash * STR; .... При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ? Ну оно же тебе пишет что с чем инкомпатибле, следовательно char __flash *GetEnumMes(char __flash * __flash *EnumMess, char dPrm, char fPrm) Да, так сработало, Спасибо. to GxOST Такой вариант я пробовал, но он мне показался неэкономичным. Ведь длина строк всего массива будет считаться по максимальной. Кроме того задавать разрядность не хочеться. Изменено 16 января, 2006 пользователем &-rey Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GxOST 0 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба Такой вариант я пробовал, но он мне показался неэкономичным.Смотря что экономить ;) Если такты процессора - то мой способ экономичней B) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба При таком подходе строки в отладчике нечитабельны, хотя в самом *.bin эти строки есть, но указатель указывает не туда ... Это только в отладчике так ? --string_literals_in_flash в дополнительных опциях компилятора. В результате этого дела будет создан массив указателей на строки: DW a1 DW a2 ... a1: db "upor",0 a2: db "upor2",0 и т.д. Так должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
visht 0 16 января, 2006 Опубликовано 16 января, 2006 · Жалоба --string_literals_in_flash в дополнительных опциях компилятора. Так должно быть. Да, так и есть. Работает :). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться