реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
Spider
сообщение Oct 31 2010, 19:23
Сообщение #1


В поисках истины
***

Группа: Свой
Сообщений: 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,
        }
    };

А как всё тоже самое, только не создавая для каждой строки отдельную константу? Как бы всё внести под скобки?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 31 2010, 19:54
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Alexey Belyaev @ Oct 31 2010, 22:23) *
Как бы всё внести под скобки?
Увы, никак. И в ИАРе тоже.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
injen-d
сообщение Oct 31 2010, 20:01
Сообщение #3


Частый гость
**

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



А как-то так:
Код
const char* aaa[2][3] ={{"qqqq", "ggggg", "v56"}, {"wwwwwwwwwwwww", "jj", "gg23"}};


--------------------
- Бендер, ты же робот, зачем тебе пить пиво?
- Незачем! Я могу бросить в любой момент!
Go to the top of the page
 
+Quote Post
alexeyv
сообщение Nov 1 2010, 04:48
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
plombir
сообщение Nov 1 2010, 04:52
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
Spider
сообщение Nov 1 2010, 04:57
Сообщение #6


В поисках истины
***

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



в моём случае каждая строка хранится во влеш конкретной длиной. А в вашем по 30 байт, не экнономно sad.gif
Go to the top of the page
 
+Quote Post
rushack
сообщение Nov 1 2010, 05:32
Сообщение #7





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



А если во внешней памяти хранить? Запихать всё в какую нибудь 24C1024 и подгружать когда нужно (не забывая выгружать...)
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 1 2010, 08:00
Сообщение #8


неотягощённый злом
******

Группа: Свой
Сообщений: 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 и подгружать когда нужно (не забывая выгружать...)

Напомнило:-)
- Алло! Можно Свету?
- Здесь всех можно! Это женское общежитие...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
MSprut
сообщение Nov 1 2010, 08:15
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 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"
};
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2010, 10:29
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(MSprut @ Nov 1 2010, 11:15) *
А так:
А так массив указателей на строки будет расположен в ОЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 1 2010, 10:39
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



А так?
__flash char * __flash Cmnd[] = {...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 1 2010, 11:59
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(IgorKossak @ Nov 1 2010, 13:39) *
А так?
Дежа-вю wink.gif http://electronix.ru/forum/index.php?showtopic=80852


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 1 2010, 12:41
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Сергей Борщ @ Nov 1 2010, 13:59) *

Вопрос по ссылке вроде бы решился указанием опции компилятору.
Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 1 2010, 18:46
Сообщение #14


неотягощённый злом
******

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



Цитата(IgorKossak @ Nov 1 2010, 15:41) *
Но это относилось к IAR, а с GCC как быть? Создать секции и размещать строки и массивы указателей в секциях?
Так я же дал ссылку, там всё внятно написано, полнее чем там нет:-)
Зачем секцию создавать, она и так есть - PROGMEM.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Nov 2 2010, 07:43
Сообщение #15


;
******

Группа: Участник
Сообщений: 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 - самописная утилитка - и вперед.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 14th July 2025 - 16:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01491 секунд с 7
ELECTRONIX ©2004-2016