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

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Имею желание объявить массив строк с переменной длиной, Но не имею возможности :-(
GetSmart
сообщение Aug 1 2006, 22:04
Сообщение #1


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Вобщем в целях экономии памяти программ и чтоб не извращаться я хочу объявить вот это:
Код
const char TablNames[] =
  { lChTablMax,
    "ЛЯЛЯЛЯЛЯЛЯ",
    "ДЫДЫДЫДДЫ",
    "ГУГУГУ"
  };

Разумеется, можно написать всё это через отдельные символы, но это не для меня. Я вот хачу так. Подскажите мне, что здесь надо поправить, чтоб компилятор меня не отсылал читать книжку?

Обязательное требование - чтоб строки были переменной длины и между ними было по одному нулю. А при чтении программно я это дело разгребу как мне надо.
Ну и на Си, конечно! Через указатели как-то криво всё получается. В смысле больше места занимает.

Сообщение отредактировал GetSmart - Aug 1 2006, 22:14


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
gab
сообщение Aug 1 2006, 23:58
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 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 *[]. т.к. в С строки - это указатель и если делаем массив из строк переменной длинны, то этот массив должен быть "указателем на указатели строк" smile.gif).


--------------------
serpents on the way to paradise -
dying for love, fighting for ages.

Go to the top of the page
 
+Quote Post
Guest_Гость_*
сообщение Aug 2 2006, 05:35
Сообщение #3





Guests






Объявить массив строк можно так:
Код
const char * const aaa[] = {
"123",
"aaaaaa",
"bbbbbbbbbb"
};

Доступ к строкам через aaa[i].
Строки, если они все разные(привет оптимизатору!), лягут друг за другом разделенные пробелом.
Если нужно что то другое задайте вопрос точнее ( что там за lChTablMax ?)
Go to the top of the page
 
+Quote Post
Old1
сообщение Aug 2 2006, 06:38
Сообщение #4


Знающий
****

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



Цитата(GetSmart @ Aug 2 2006, 01:04) *
Вобщем в целях экономии памяти программ и чтоб не извращаться я хочу объявить вот это:
Код
const char TablNames[] =
  { lChTablMax,
    "ЛЯЛЯЛЯЛЯЛЯ",
    "ДЫДЫДЫДДЫ",
    "ГУГУГУ"
  };

Разумеется, можно написать всё это через отдельные символы, но это не для меня. Я вот хачу так. Подскажите мне, что здесь надо поправить, чтоб компилятор меня не отсылал читать книжку?

Обязательное требование - чтоб строки были переменной длины и между ними было по одному нулю. А при чтении программно я это дело разгребу как мне надо.
Ну и на Си, конечно! Через указатели как-то криво всё получается. В смысле больше места занимает.


Чтобы все легло во flash сделайте так:
Код
__flash char *TablNames[]={
  "44444444444444",
  "555555555555555",
  "66666666666666666666",
  "7777777777777777777777"
};
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 2 2006, 07:11
Сообщение #5


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
"ЛЯЛЯЛЯЛЯЛЯ",    "ДЫДЫДЫДДЫ",    "ГУГУГУ"


А так:
__flash char aaa[]="ЛЯЛЯЛЯЛЯЛЯ\0ДЫДЫДЫДДЫ\0ГУГУГУ"


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 2 2006, 07:26
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
diper
сообщение Aug 2 2006, 07:30
Сообщение #7


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

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



Объявить массив строк можно так:
Код
const char * const aaa[] = {
"123",
"aaaaaa",
"bbbbbbbbbb"
};

Доступ к строкам через aaa[i].
Строки, если они все разные(привет оптимизатору!), лягут друг за другом разделенные нулем.
Если нужно что то другое задайте вопрос точнее ( что там за lChTablMax ?)

По поводу оптимизатора - компилятор если видет одинаковые строки, то в память кладет только одну копию, а указатели прописывает в массив одинаковые. Как это зависит от праметров оптимизации надо проверять на кошках.
Go to the top of the page
 
+Quote Post
Old1
сообщение Aug 2 2006, 07:38
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2006, 13:30
Сообщение #9


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Как много ответов :>)
1. Как положить во флэш и создать при этом массив указателей я как бы знал. Посему вариант Гостя, Old1 и Diper'a у меня оставлен на "провал операцыы Ы".

2. Что такое lChTablMax ? - Это число количества строк в массиве. Число должен прописывать я, а не компилятор. Число не больше 255.

3. Вариант Rst7 в каком-то смысле самый идеальный. Но строк может быть много и длиной до 50 символов. Хотя может и длиной 0. Скажите, можно описание одной этой длинной строки разбить на столько строк в тексте, сколько будет отдельных строк в общей? Через обратный слэш?

Цитата(zltigo)
Массив по тому и "маcсив", что однородный.
Конечно однородный. Все элементы имеют тип char. Должны иметь. Так что, ничего невозможного я не требую smile.gif

А вообще-то для АРМа требуется. Но компилер ведь такой же. Кроме как __flash на const поменять и всё.

Сообщение отредактировал GetSmart - Aug 2 2006, 13:45


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
diper
сообщение Aug 2 2006, 14:11
Сообщение #10


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

Группа: Свой
Сообщений: 94
Регистрация: 12-11-05
Из: Росиия, Нижний Новгород
Пользователь №: 10 750



Задачу так и не описал cranky.gif
Будем гадать дальше - так пойдет?
Код
#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
Go to the top of the page
 
+Quote Post
rezident
сообщение Aug 2 2006, 14:19
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



GetSmart, ты бы сказал, что тебе это надо для описания меню. И чем тебя обратный слэшь в виде разделителя не устраивает? И наглядность есть и все по стандарту СИ будет.
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2006, 14:41
Сообщение #12


.
******

Группа: Участник
Сообщений: 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"
;

Только не говорите, что изврат полный. Это задание творческое. И кто не готов мыслить - прошу не ругаться в прямом эфире.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 2 2006, 14:49
Сообщение #13


Гуру
******

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



Цитата(GetSmart @ Aug 2 2006, 16:30) *
Все элементы имеют тип char. Должны иметь. Так что, ничего невозможного я не требую smile.gif

Должны и все тут. Почему тогда Вы какиет-то посторонние слова типа "строка" поминаете?
Перестант говорить о строке и будет Вас счастье.
И почему не битов - тогда все и вся есть один однородный массив битов.
Понимание сути отсутствует. Начните с азов, пожалуйста!


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 2 2006, 15:05
Сообщение #14


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



zltigo
Да за кого Вы меня принимаете?! Да я... Да я... Да я пять ассемблеров знаю, во! Так что азы уже остались далееко позади.

Знаю я правила игры, и вроде как не нарушаю синтаксис.
по правилам можно написать:
Код
char massiv[10] = "abcdefgh";
А раз можно так написать, значит и присваивать байтовому массиву строки можно. А вот можно ли несколько строк в такой массив уложить - я в процессе выяснения. Ну если не ндравится, то можно первый элемент (число) "массива" убрать, но много-много строк в один массив впритык мне надо очень-очень. help me, please smile.gif


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 2 2006, 15: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 smile.gif

Код
massiv[] =
"ofigennaja\0" \
"meshanina iz baitov\0kotorie\0"   \
"mozno izvrativshis" " ispolzovat"  \
" kak stroki";


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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