Перейти к содержанию
    

Как объявить массив строк-констант в GCC?

Всем привет!

 

Вот что-то не получается объявить массив строк констант. Сейчас эт осделано так:

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,
        }
    };

А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как бы всё внести под скобки?
Увы, никак. И в ИАРе тоже.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Или так:

prog_int8_t string_prog[][9] ={
                           "--PrOG--",
                           "t on    ",
                           "t of    ",
                           "Cur     ",
                           "St      ",
                           "CL      ",
                           "YEAr20  ",
                           "1-12    ",
                           "1-31    ",
                           "0-23    ",
                           "0-59    " 
};

Одно НО : строки должны быть одного размера

Изменено пользователем alexeyv

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?

С избыточностью кода не устраивает?

const char PROGMEM LangStrings[2][3][ 30 ] = {
        { //English
            "Loading...",
            "Press any key",
            "English",
        },
        { //Russian
            "Загрузка...",
            "Жми любую кнопку",
            "Русский",
        }
    };

Где 30 - максимальная длина строки + '\0'

PROGMEM в GCC, как я понял, эквивалентен __flash в IAR.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в моём случае каждая строка хранится во влеш конкретной длиной. А в вашем по 30 байт, не экнономно :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?
В avr-gcc никак.

Читайте первоисточник:

http://www.nongnu.org/avr-libc/user-manual...l#faq_rom_array

 

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

Напомнило:-)

- Алло! Можно Свету?

- Здесь всех можно! Это женское общежитие...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему в ИАР никак? А так:

__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"
};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А так:
А так массив указателей на строки будет расположен в ОЗУ.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос по ссылке вроде бы решился указанием опции компилятору.

Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?
Так я же дал ссылку, там всё внятно написано, полнее чем там нет:-)

Зачем секцию создавать, она и так есть - PROGMEM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#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 - самописная утилитка - и вперед.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...