|
|
  |
Имею желание объявить массив строк с переменной длиной, Но не имею возможности :-( |
|
|
|
Aug 1 2006, 22:04
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Вобщем в целях экономии памяти программ и чтоб не извращаться я хочу объявить вот это: Код const char TablNames[] = { lChTablMax, "ЛЯЛЯЛЯЛЯЛЯ", "ДЫДЫДЫДДЫ", "ГУГУГУ" }; Разумеется, можно написать всё это через отдельные символы, но это не для меня. Я вот хачу так. Подскажите мне, что здесь надо поправить, чтоб компилятор меня не отсылал читать книжку? Обязательное требование - чтоб строки были переменной длины и между ними было по одному нулю. А при чтении программно я это дело разгребу как мне надо. Ну и на Си, конечно! Через указатели как-то криво всё получается. В смысле больше места занимает.
Сообщение отредактировал GetSmart - Aug 1 2006, 22:14
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 1 2006, 23:58
|
Местный
  
Группа: Свой
Сообщений: 376
Регистрация: 30-06-04
Из: Moskow
Пользователь №: 218

|
Не знаю как в IAR С, но в С это, вроде, делается так: typedef struct aaa{ int len; char **txt; }aaa; const aaa bbb = { 10, { "aaa","bbb", "cccc", "ddd" } }; Т.е. надо отдельно выделить "разницу" типов в массиве. В вашем примере были смешаны типы char* и int, хотя весь массив объявлялся как char* (что тоже ошибка. должен быть, хотябы char** или char *[]. т.к. в С строки - это указатель и если делаем массив из строк переменной длинны, то этот массив должен быть "указателем на указатели строк"  ).
--------------------
serpents on the way to paradise - dying for love, fighting for ages.
|
|
|
|
Guest_Гость_*
|
Aug 2 2006, 05:35
|
Guests

|
Объявить массив строк можно так: Код const char * const aaa[] = { "123", "aaaaaa", "bbbbbbbbbb" }; Доступ к строкам через aaa[i]. Строки, если они все разные(привет оптимизатору!), лягут друг за другом разделенные пробелом. Если нужно что то другое задайте вопрос точнее ( что там за lChTablMax ?)
|
|
|
|
|
Aug 2 2006, 06:38
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(GetSmart @ Aug 2 2006, 01:04)  Вобщем в целях экономии памяти программ и чтоб не извращаться я хочу объявить вот это: Код const char TablNames[] = { lChTablMax, "ЛЯЛЯЛЯЛЯЛЯ", "ДЫДЫДЫДДЫ", "ГУГУГУ" }; Разумеется, можно написать всё это через отдельные символы, но это не для меня. Я вот хачу так. Подскажите мне, что здесь надо поправить, чтоб компилятор меня не отсылал читать книжку? Обязательное требование - чтоб строки были переменной длины и между ними было по одному нулю. А при чтении программно я это дело разгребу как мне надо. Ну и на Си, конечно! Через указатели как-то криво всё получается. В смысле больше места занимает. Чтобы все легло во flash сделайте так: Код __flash char *TablNames[]={ "44444444444444", "555555555555555", "66666666666666666666", "7777777777777777777777" };
|
|
|
|
|
Aug 2 2006, 07:26
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата Имею желание объявить массив строк с переменной длиной Массив по тому и "маcсив", что однородный. Посему массивом может быть только массив указателей на строки, что Вам здесь и показали, как сделать. Цитата(Old1 @ Aug 2 2006, 09:38)  Чтобы все легло во flash сделайте так: Код __flash char *TablNames[]={ "44444444444444", "555555555555555", "66666666666666666666", "7777777777777777777777" }; Кстати, для _моего_ развития в части незнакомых мне AVRовских заморочек - то что указатели лягут во FLASH, это ясно. А вот на счет тела строк - уверены?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 2 2006, 07:30
|
Частый гость
 
Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750

|
Объявить массив строк можно так: Код const char * const aaa[] = { "123", "aaaaaa", "bbbbbbbbbb" }; Доступ к строкам через aaa[i]. Строки, если они все разные(привет оптимизатору!), лягут друг за другом разделенные нулем. Если нужно что то другое задайте вопрос точнее ( что там за lChTablMax ?) По поводу оптимизатора - компилятор если видет одинаковые строки, то в память кладет только одну копию, а указатели прописывает в массив одинаковые. Как это зависит от праметров оптимизации надо проверять на кошках.
|
|
|
|
|
Aug 2 2006, 07:38
|

Знающий
   
Группа: Свой
Сообщений: 697
Регистрация: 26-07-05
Из: Могилев
Пользователь №: 7 095

|
Цитата(zltigo @ Aug 2 2006, 10:26)  Цитата Имею желание объявить массив строк с переменной длиной
Массив по тому и "маcсив", что однородный. Посему массивом может быть только массив указателей на строки, что Вам здесь и показали, как сделать. Цитата(Old1 @ Aug 2 2006, 09:38)  Чтобы все легло во flash сделайте так: Код __flash char *TablNames[]={ "44444444444444", "555555555555555", "66666666666666666666", "7777777777777777777777" }; Кстати, для _моего_ развития в части незнакомых мне AVRовских заморочек - то что указатели лягут во FLASH, это ясно. А вот на счет тела строк - уверены? Насчет "все" я был не прав. Тела строк лягут в СРАМ. Но вот так ляжет все во flash: Код __flash char __flash *TablNames[]={ (char __flash *)"44444444444444", (char __flash *)"555555555555555", (char __flash *)"66666666666666666666", (char __flash *)"7777777777777777777777" }; Чтобы работало надо компилятору еще ключь указать: --string_literals_in_flash.
|
|
|
|
|
Aug 2 2006, 13:30
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Как много ответов :>) 1. Как положить во флэш и создать при этом массив указателей я как бы знал. Посему вариант Гостя, Old1 и Diper'a у меня оставлен на "провал операцыы Ы". 2. Что такое lChTablMax ? - Это число количества строк в массиве. Число должен прописывать я, а не компилятор. Число не больше 255. 3. Вариант Rst7 в каком-то смысле самый идеальный. Но строк может быть много и длиной до 50 символов. Хотя может и длиной 0. Скажите, можно описание одной этой длинной строки разбить на столько строк в тексте, сколько будет отдельных строк в общей? Через обратный слэш? Цитата(zltigo) Массив по тому и "маcсив", что однородный. Конечно однородный. Все элементы имеют тип char. Должны иметь. Так что, ничего невозможного я не требую  А вообще-то для АРМа требуется. Но компилер ведь такой же. Кроме как __flash на const поменять и всё.
Сообщение отредактировал GetSmart - Aug 2 2006, 13:45
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 2 2006, 14:11
|
Частый гость
 
Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750

|
Задачу так и не описал  Будем гадать дальше - так пойдет? Код #include <stdio.h> const char * const aaa[] = { (char const *)3, "123", "aaaaaa", "bbbbbbbbbb", };
int main( void ) { int i; for(i=0;i<(int)aaa[0]; i++) printf(aaa[i+1]); return 0; } По поводу разбить на строки Код const char * fff = "12345\0" "abcdef\0" "aaaaa\0" "bbbbb\0" ; Цитата Ну и на Си, конечно! Через указатели как-то криво всё получается. В смысле больше места занимает. Не так уж и много - по int на каждую строчку.
Сообщение отредактировал diper - Aug 2 2006, 14:13
|
|
|
|
|
Aug 2 2006, 14:41
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
rezidentЭто не для меню. Это для названий таблицы числовых констант. Сами константы можно менять, а вот строки - это ремарки (то есть их описание) и они не будут меняться, а будут лежать прибитые к программе намертво. diperПо 4 байта теряется. По 4 ! Цитата По поводу разбить на строки Чудно смотрится. А можно как-то через define выделить номер строки текстового редактора? Или как иначе, типа этого: Код #define startLine This_IDE_line const char * fff = #define FirstConst ((This_IDE_line - startLine) >> 1) "12345\0" #define SecondConst ((This_IDE_line - startLine) >> 1) "abcdef\0" #define ThirdConst ((This_IDE_line - startLine) >> 1) "aaaaa\0" ; Только не говорите, что изврат полный. Это задание творческое. И кто не готов мыслить - прошу не ругаться в прямом эфире.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 2 2006, 14:49
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Aug 2 2006, 16:30)  Все элементы имеют тип char. Должны иметь. Так что, ничего невозможного я не требую  Должны и все тут. Почему тогда Вы какиет-то посторонние слова типа "строка" поминаете? Перестант говорить о строке и будет Вас счастье. И почему не битов - тогда все и вся есть один однородный массив битов. Понимание сути отсутствует. Начните с азов, пожалуйста!
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Aug 2 2006, 15:05
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
zltigoДа за кого Вы меня принимаете?! Да я... Да я... Да я пять ассемблеров знаю, во! Так что азы уже остались далееко позади. Знаю я правила игры, и вроде как не нарушаю синтаксис. по правилам можно написать: Код char massiv[10] = "abcdefgh"; А раз можно так написать, значит и присваивать байтовому массиву строки можно. А вот можно ли несколько строк в такой массив уложить - я в процессе выяснения. Ну если не ндравится, то можно первый элемент (число) "массива" убрать, но много-много строк в один массив впритык мне надо очень-очень. help me, please
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Aug 2 2006, 15:15
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(GetSmart @ Aug 2 2006, 17:41)  А можно как-то через define выделить номер строки текстового редактора? Можно, но надо почитать про __LINE__, __FILE__, __DATE__, __TIME__ Цитата zltigo Да за кого Вы меня принимаете?! Да я... Да я... Да я пять ассемблеров знаю, во! будем считать, что был просто смайлик пропущен? Цитата А раз можно так написать, значит и присваивать байтовому массиву строки можно. А вот можно ли несколько строк в такой массив уложить - я в процессе выяснения. Ну если не ндравится, то можно первый элемент (число) "массива" убрать, но много-много строк в один массив впритык мне надо очень-очень. help me, please  Код massiv[] = "ofigennaja\0" \ "meshanina iz baitov\0kotorie\0" \ "mozno izvrativshis" " ispolzovat" \ " kak stroki";
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|