|
Как объявить массив строк-констант в GCC?, Что-то не могу сообразить |
|
|
|
Oct 31 2010, 19:23
|

В поисках истины
  
Группа: Свой
Сообщений: 431
Регистрация: 7-01-06
Из: Россия
Пользователь №: 12 923

|
Всем привет! Вот что-то не получается объявить массив строк констант. Сейчас эт осделано так: Код const char PROGMEM StrLoadingEng[]="Loading..."; const char PROGMEM StrAnyKeyEng[]="Press any key"; const char PROGMEM StrLangEng[]="English";
const char PROGMEM StrLoadingRus[]="Загрузка..."; const char PROGMEM StrAnyKeyRus[]="Жми любую кнопку"; const char PROGMEM StrLangRus[]="Русский";
static uint8_t CurLang = 0; const char *LangStrings[2][3] = { { //English StrLoadingEng, StrAnyKeyEng, StrLangEng, }, { //Russian StrLoadingRus, StrAnyKeyRus, StrLangRus, } }; А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?
|
|
|
|
|
Oct 31 2010, 20:01
|

Частый гость
 
Группа: Свой
Сообщений: 91
Регистрация: 10-10-07
Из: Воронежа
Пользователь №: 31 250

|
А как-то так: Код const char* aaa[2][3] ={{"qqqq", "ggggg", "v56"}, {"wwwwwwwwwwwww", "jj", "gg23"}};
--------------------
- Бендер, ты же робот, зачем тебе пить пиво? - Незачем! Я могу бросить в любой момент!
|
|
|
|
|
Nov 1 2010, 04:48
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Или так: Код prog_int8_t string_prog[][9] ={ "--PrOG--", "t on ", "t of ", "Cur ", "St ", "CL ", "YEAr20 ", "1-12 ", "1-31 ", "0-23 ", "0-59 " }; Одно НО : строки должны быть одного размера
Сообщение отредактировал alexeyv - Nov 1 2010, 04:49
|
|
|
|
|
Nov 1 2010, 04:52
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 14-12-05
Пользователь №: 12 191

|
Цитата(Alexey Belyaev @ Oct 31 2010, 22:23)  А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки? С избыточностью кода не устраивает? Код const char PROGMEM LangStrings[2][3][ 30 ] = { { //English "Loading...", "Press any key", "English", }, { //Russian "Загрузка...", "Жми любую кнопку", "Русский", } }; Где 30 - максимальная длина строки + '\0' PROGMEM в GCC, как я понял, эквивалентен __flash в IAR.
|
|
|
|
|
Nov 1 2010, 05:32
|

Группа: Участник
Сообщений: 13
Регистрация: 14-02-09
Из: Нижний Новгород
Пользователь №: 44 857

|
А если во внешней памяти хранить? Запихать всё в какую нибудь 24C1024 и подгружать когда нужно (не забывая выгружать...)
|
|
|
|
|
Nov 1 2010, 08:00
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(Alexey Belyaev @ Oct 31 2010, 22:23)  А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки? В avr-gcc никак. Читайте первоисточник: http://www.nongnu.org/avr-libc/user-manual...l#faq_rom_arrayЦитата(rushack @ Nov 1 2010, 08:32)  А если во внешней памяти хранить? Запихать всё в какую нибудь 24C1024 и подгружать когда нужно (не забывая выгружать...) Напомнило:-) - Алло! Можно Свету? - Здесь всех можно! Это женское общежитие...
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Nov 1 2010, 08:15
|
Местный
  
Группа: Свой
Сообщений: 225
Регистрация: 25-04-06
Из: Украина, Луганск
Пользователь №: 16 476

|
Почему в ИАР никак? А так: Код __flash char *Cmnd[] = { "PHV", "PHC", "PHF", "BATV", "FUEL", "COOL", "OIL", "TACHO", "PHCTRL", "PWRSRC", "IGNIT", "START", "CHARGE", "EXCIT", "CLUTCH", "ASHUTT", "SETCFG", "GETCFG", "SETMODE", "GETMODE", "GENOFF", "SMSTEP", "GETSTAT", "SETSTAT", "SETSPEED", "GETSPEED", "PAUSE", "LAUNCH", "ASTART", "ARPM", "DVSSTAT", "LOADSTAT", "GASTAT", "SASTAT" };
|
|
|
|
|
Nov 2 2010, 07:43
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
CODE #define MSG_DEF(id,cont) case id: do{static PROGMEM char s[]=cont; return s;}while(0); char *msg(const uint16_t id) { switch(id) { MSG_DEF(1,"This is a string 1"); MSG_DEF(2,"This is a string 2"); } return NULL; }
Оверхед есть, на формировании возврата функции, но! Обратите внимание, что при -Os и достаточном кол-ве строк (у меня - больше 10) у оптимизатора лопнет терпение, и он перейдет от сравнения к косвенным переходам. Это если id будет покрывать множество без разрывов. Зато удобно. Если у нас будет enum для msg-ключей - компилер будет кричать, если пропущены элементы множества в конструкции switch-case. Эту байду можно нарастить многоязыковой поддержкой, добавив второй switch А вообще для текстов - *.csv - самописная утилитка - и вперед.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|