Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как объявить массив строк-констант в GCC?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Spider
Всем привет!

Вот что-то не получается объявить массив строк констант. Сейчас эт осделано так:
Код
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,
        }
    };

А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?
Сергей Борщ
Цитата(Alexey Belyaev @ Oct 31 2010, 22:23) *
Как бы всё внести под скобки?
Увы, никак. И в ИАРе тоже.
injen-d
А как-то так:
Код
const char* aaa[2][3] ={{"qqqq", "ggggg", "v56"}, {"wwwwwwwwwwwww", "jj", "gg23"}};
alexeyv
Или так:
Код
prog_int8_t string_prog[][9] ={
                           "--PrOG--",
                           "t on    ",
                           "t of    ",
                           "Cur     ",
                           "St      ",
                           "CL      ",
                           "YEAr20  ",
                           "1-12    ",
                           "1-31    ",
                           "0-23    ",
                           "0-59    "
};

Одно НО : строки должны быть одного размера
plombir
Цитата(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.
Spider
в моём случае каждая строка хранится во влеш конкретной длиной. А в вашем по 30 байт, не экнономно sad.gif
rushack
А если во внешней памяти хранить? Запихать всё в какую нибудь 24C1024 и подгружать когда нужно (не забывая выгружать...)
demiurg_spb
Цитата(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 и подгружать когда нужно (не забывая выгружать...)

Напомнило:-)
- Алло! Можно Свету?
- Здесь всех можно! Это женское общежитие...
MSprut
Почему в ИАР никак? А так:
Код
__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"
};
Сергей Борщ
Цитата(MSprut @ Nov 1 2010, 11:15) *
А так:
А так массив указателей на строки будет расположен в ОЗУ.
IgorKossak
А так?
__flash char * __flash Cmnd[] = {...
Сергей Борщ
Цитата(IgorKossak @ Nov 1 2010, 13:39) *
А так?
Дежа-вю wink.gif http://electronix.ru/forum/index.php?showtopic=80852
IgorKossak
Цитата(Сергей Борщ @ Nov 1 2010, 13:59) *

Вопрос по ссылке вроде бы решился указанием опции компилятору.
Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?
demiurg_spb
Цитата(IgorKossak @ Nov 1 2010, 15:41) *
Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?
Так я же дал ссылку, там всё внятно написано, полнее чем там нет:-)
Зачем секцию создавать, она и так есть - PROGMEM.
_Pasha
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 - самописная утилитка - и вперед.
ReAl
+1
Только я подобные макросы стараюсь называть со словом CASE, например, CASE_MSG, CASE_STATUS_STR и т.п.
DEF — это для определений строк/структур для обращения к ним из разных мест по имени.

Вроде и непринципиально, но в итоге читабельность повышает.

Для enum часто бывает так
Код
#define CASE_ENUM_STR(a) case a: return PSTR( #a )

typedef enum { ok, packet_error, invalid_command } status_t;

const prog_char * status_str(status_t status)
{
        switch(status) {
                CASE_ENUM_STR(ok);
                CASE_ENUM_STR(packet_error);
                CASE_ENUM_STR(invalid_command);
        }
}

И потом где-то, например
Код
      log_printf( PSTR("Operation complete, %S\n"), status_str(status) );
бомж
Цитата(Alexey Belyaev @ Oct 31 2010, 20:23) *
...
Вот что-то не получается объявить массив строк констант. Сейчас эт осделано так:
...
А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?

У меня получилось вот так:
Код
#define flash __attribute__((__progmem__))

char* LangStrings[][3] flash = {

/*      Englisch                Deutsch                 Le franзais*/

        {"Error:",               "Fehler:",              "Erreur:"},
        {"      OK",             "      IO",             "      OK"},
        {"Please wait",          "Bitte warten",         "attendre"}
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.