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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как определить массив строк в С для AVR?, в СИ ноль с +
The Fresh
сообщение May 1 2007, 10:04
Сообщение #1


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

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Нужно харнить в озу строки есть char szString[15] = "555555555555", как сделать чтобы это был массив строк от 1 до 5 скажем.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 1 2007, 10:43
Сообщение #2


Гуру
******

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



Цитата(The Fresh @ May 1 2007, 10:04) *
Нужно..

Массивы могу быть и двухмерными. Или я не понял вопрос?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
nss
сообщение May 1 2007, 11:42
Сообщение #3


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Код
char *StringArray[]={
                               "строка 1",
                               "строка 2",
                               "строка 3",
                               "строка 4",
                               "строка 5",
                               "строка 6"
                               }
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 1 2007, 11:54
Сообщение #4


Гуру
******

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



Цитата(nss @ May 1 2007, 11:42) *
Код
char *StringArray[]={
                               "строка 1",
                               "строка 2",
                               "строка 3",
                               "строка 4",
                               "строка 5",
                               "строка 6"
                               }

Это массив указателей, что для описанного случая совсем не то.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
nss
сообщение May 1 2007, 12:19
Сообщение #5


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

Группа: Свой
Сообщений: 112
Регистрация: 15-03-06
Пользователь №: 15 277



Цитата(zltigo @ May 1 2007, 12:54) *
Это массив указателей, что для описанного случая совсем не то.

Ну почему же сразу не то.
Человеку скорее всего надо хранить список "нумерованных строк". На пример, для сопоставления коду ошибки ее описания.
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 1 2007, 12:23
Сообщение #6


Гуру
******

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



Цитата(nss @ May 1 2007, 12:19) *
Человеку скорее всего надо хранить список "нумерованных строк". На пример, для сопоставления коду ошибки ее описания.

Трудно сказать, но это точно не хранят в RAM и не вкладывают строки в массивы байтов фиксированного размера. Надо ждать Автора.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
The Fresh
сообщение May 1 2007, 18:40
Сообщение #7


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

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



В процессе работы неоходимо считать с девайса ASCII данные в виде 5 строк одинакового размера. И хранить я так понимаю их можно либо в ОЗУ либо в eeprom МК. Т.к. данные эти хоть и не часто могут меняться, я так подумал и решил с ними работать в ОЗУ. Написал что-то типа
char mystring[15]="53453453454"; - т.е. строка из символов. Как определить данные так чтобы получилась переменная типа array of string [0..4], которая изначально пустая ничем не забитая, а забивается в процессе.
Go to the top of the page
 
+Quote Post
Legotron
сообщение May 1 2007, 19:31
Сообщение #8


инопланетянин
***

Группа: Свой
Сообщений: 236
Регистрация: 24-12-06
Из: Питер
Пользователь №: 23 832



Если заранее известна длина предполагамых строк в массиве (например 15), а также количество самих строк (например 5), то можно сделать 2-мерный массив:

char Arr[5][15];

тогда обращение к нему будет такое:

Arr[0] - это указатель на 1 строку, Arr[1] - на 2-ю и.т.д (будьте внимательны Arr[n] будет иметь тип char *)

или

Arr[0][0] - 1-й символ 1 строки, (Arr[n][m] будет иметь тип просто char)
Arr[0][1] - 2-й символ 1 строки,
Arr[1][0] - 1-й символ 2-й строки,
Arr[1][1] - 2-й символ 2-й строки, думаю понятно...

Если же в перспективе размер самих строк будет неизвестен заранее, тогда придется пользоваться динамическим выделением памяти... Но советую, для начала, этого не делать... Лучше сделайте обычный массив с запасом smile.gif

Если неизвестно количество самих строк можно использовать связанный список (он тоже основан на динамическом выделении памяти), но тоже не рекомендую им пользоваться, если не чувствуете уверенности. smile.gif

Пользуйтесь 2-мерным массивом заданной размерности.
Это поможет вам избежать лишних и неприятных ошибок. smile.gif

Сообщение отредактировал Legotron - May 1 2007, 19:33
Go to the top of the page
 
+Quote Post
The Fresh
сообщение May 1 2007, 20:22
Сообщение #9


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

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Большой респфенкс!

Есть вот такой код. Суть отправлять dest=0, dest=1.....,dest=4. Не нравится он мне, кажется легче можно сделать подскажите и засыпает вот такими мессагами

main_ATMEGA8.c:251: warning: initialization makes integer from pointer without a cast
main_ATMEGA8.c:252: warning: initialization makes integer from pointer without a cast
main_ATMEGA8.c:255: warning: implicit declaration of function `itoa'
main_ATMEGA8.c:256: warning: assignment makes integer from pointer without a cast

на эти строки соответственно
char temp = szstring;
char temp2 = "";
itoa (index,temp2, 10);
temp=temp+temp2+"\x0d";


Сам код

const char szstring[] PROGMEM = "dest=";
char index=0;

char temp2 = "";
while (index<5){
UART_ClearRxBuf();
char temp = szstring;
itoa (index,temp2, 10);
temp=temp+temp2+"\x0d";
UART_outstr(temp);
index=index+1;
}

И если необходимо извлечь из строки цифру и преобразовать скажем в цифровое значение, то можно ли сделать так (извлекаем 95)
char Gettemp(void)
{
char n = 0;
char* pBuf = UART_Recv(&n);//pBuf= "temp: 0,95"
return atoi(strncpy (pBuf, strchr(pBuf, ",")+1, 2));
}

Сообщение отредактировал The Fresh - May 1 2007, 20:46
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 1 2007, 21:19
Сообщение #10


Гуру
******

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



Цитата(The Fresh @ May 1 2007, 20:22) *
char temp = szstring;
char temp2 = "";
itoa (index,temp2, 10);
temp=temp+temp2+"\x0d";

Сказать что-либо разумное мне по этому поводу трудно sad.gif, поскольку все это представляет из бессмысленный набор всяких слов.
Для начала писания, надо хоть самую малость представлять язык. Не воспринимайте, пожалуйса это слижком близко к сердцу - но надо почитать хоть чуть-чуть о типах данных.
"char temp и temp2" это байты в них "строка" не вмещается ну никак. "\x0d" - это тоже строка и в ней два байта и ее тоже нельзя присвоить байту. itoa() имеет три аргумента, причем первый это указатель на строчку, чем 'index' не является - он у Вас опять байт.
Далее.
Cо стоками операции '+' и прочие не выполняются - смотрите библиотечные функции strcat() и прчие для работы со строками. Указатели не могут указывать в никуда, точнее конечно могут, но ими тогда пользоваться нельзя, поскольку туда, куда они указывают должно быть место, для того чего туда хочется положить.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
The Fresh
сообщение May 2 2007, 03:52
Сообщение #11


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

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Да я и сам догадывался, что char это max=255 или буковка "A" или "B", источников толковых не нашел. Да и не совсем понимаю подойдут ли обычные книжки по C для МК. Была у меня книжка в электронном виде автор ШПАК, прогр на C для AVR, ушла в небытие. Может выложите что-нибудь. Винете полно примеров работы с таймерами, уартом, и подобной перефирией, а со строками работа в примерах не попадалась, отсюда мои бесмысленные перлы smile.gif

Сообщение отредактировал The Fresh - May 2 2007, 04:14
Go to the top of the page
 
+Quote Post
Losik
сообщение May 2 2007, 08:01
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 453
Регистрация: 22-04-07
Пользователь №: 27 235



Цитата(The Fresh @ May 2 2007, 03:52) *
Да я и сам догадывался, что char это max=255 или буковка "A" или "B", источников толковых не нашел. Да и не совсем понимаю подойдут ли обычные книжки по C для МК. Была у меня книжка в электронном виде автор ШПАК, прогр на C для AVR, ушла в небытие. Может выложите что-нибудь. Винете полно примеров работы с таймерами, уартом, и подобной перефирией, а со строками работа в примерах не попадалась, отсюда мои бесмысленные перлы smile.gif


avr123DOTnmDOTru
DOT->.
там много чего, есть ссылки на курс лекций по avr(для новичка очень хороший)
есть ссылки и на литературу в хорошем качестве.

Сообщение отредактировал Losik - May 2 2007, 08:03
Go to the top of the page
 
+Quote Post
zltigo
сообщение May 2 2007, 08:13
Сообщение #13


Гуру
******

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



Цитата(The Fresh @ May 2 2007, 03:52) *
источников толковых не нашел.

Ну не надо, ладно?
Цитата
Да и не совсем понимаю подойдут ли обычные книжки по C для МК.

Естественно подойдут. Иначе это был-бы не 'C'.
Цитата
Винете полно примеров работы ...

Не надо "примеров", возьмите описание именно языка - кратко, четко, исчерпывающе.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
The Fresh
сообщение May 2 2007, 15:57
Сообщение #14


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

Группа: Новичок
Сообщений: 146
Регистрация: 3-12-06
Пользователь №: 23 071



Немного поправил с учетом критики, но немного не работает.


const char szstring[] PROGMEM = "dest=";

int index = 0;//счетчик
char temp[15],temp2[1]; //инициализируем массивы
strcpy(temp, szstring);//копируем в temp="dest=" ??????????Вот здесь что-то не то

while (index<1){//примера ради 1 так до 4
UART_ClearRxBuf();
itoa(index+1,temp2, 10);//здесь из счетчика получаем его строков представление
strcat(temp, temp2);//соединяем и должны получить "dest=1"
strcat(temp, "\x0d");//соединяем и должны получить "dest=1\x0d"
UART_outstr(temp);// в итоге на выходе только "1" без "dest="
index=index+1;
}

Сообщение отредактировал The Fresh - May 2 2007, 15:58
Go to the top of the page
 
+Quote Post
AndryG
сообщение May 3 2007, 10:01
Сообщение #15


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

Группа: Свой
Сообщений: 139
Регистрация: 23-05-05
Из: UA
Пользователь №: 5 317



Цитата
Была у меня книжка в электронном виде автор ШПАК, прогр на C для AVR, ушла в небытие.

http://lord-n.narod.ru/walla.html#ShpakCforAVRiPIC

Не читал ... замечательная книга по С авторов "Керниган и Рич" -- я читаю ее (в электронке нет - только распечатка осталась) -- коротко и доступно.

Сообщение отредактировал AndryG - May 3 2007, 10:03
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:45
Рейтинг@Mail.ru


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