Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как определить массив строк в С для AVR?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
The Fresh
Нужно харнить в озу строки есть char szString[15] = "555555555555", как сделать чтобы это был массив строк от 1 до 5 скажем.
zltigo
Цитата(The Fresh @ May 1 2007, 10:04) *
Нужно..

Массивы могу быть и двухмерными. Или я не понял вопрос?
nss
Код
char *StringArray[]={
                               "строка 1",
                               "строка 2",
                               "строка 3",
                               "строка 4",
                               "строка 5",
                               "строка 6"
                               }
zltigo
Цитата(nss @ May 1 2007, 11:42) *
Код
char *StringArray[]={
                               "строка 1",
                               "строка 2",
                               "строка 3",
                               "строка 4",
                               "строка 5",
                               "строка 6"
                               }

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

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

Трудно сказать, но это точно не хранят в RAM и не вкладывают строки в массивы байтов фиксированного размера. Надо ждать Автора.
The Fresh
В процессе работы неоходимо считать с девайса ASCII данные в виде 5 строк одинакового размера. И хранить я так понимаю их можно либо в ОЗУ либо в eeprom МК. Т.к. данные эти хоть и не часто могут меняться, я так подумал и решил с ними работать в ОЗУ. Написал что-то типа
char mystring[15]="53453453454"; - т.е. строка из символов. Как определить данные так чтобы получилась переменная типа array of string [0..4], которая изначально пустая ничем не забитая, а забивается в процессе.
Legotron
Если заранее известна длина предполагамых строк в массиве (например 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
The Fresh
Большой респфенкс!

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


avr123DOTnmDOTru
DOT->.
там много чего, есть ссылки на курс лекций по avr(для новичка очень хороший)
есть ссылки и на литературу в хорошем качестве.
zltigo
Цитата(The Fresh @ May 2 2007, 03:52) *
источников толковых не нашел.

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

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

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


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;
}
AndryG
Цитата
Была у меня книжка в электронном виде автор ШПАК, прогр на C для AVR, ушла в небытие.

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

Не читал ... замечательная книга по С авторов "Керниган и Рич" -- я читаю ее (в электронке нет - только распечатка осталась) -- коротко и доступно.
zltigo
Цитата(Losik @ May 2 2007, 08:01) *
там много чего, есть ссылки на курс лекций по avr(для новичка очень хороший)
есть ссылки и на литературу в хорошем качестве.

Здесь он фигурирует под названием "запрещенный курс", по той причине, что для новичка, он очень плох - надерганные "примеры" и ошибочные утверждения изобилуют sad.gif.
Losik
Цитата(zltigo @ May 3 2007, 14:19) *
Здесь он фигурирует под названием "запрещенный курс", по той причине, что для новичка, он очень плох - надерганные "примеры" и ошибочные утверждения изобилуют sad.gif.smile.gif


а мне понравилась, правда тогда это была первая литература, которую я читал по AVRам.
zltigo
Если "чисто формально" повторить и заставить работать:
Код
//const char szstring[] PROGMEM = "dest=";

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

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

}

Но это жуткие каракули, хоть и будут "работать". Ну и itoa() не ansii - может и не быть в библиотеке.

Лобовое что-то вроде:
Код
int index = 0;
char temp[15];
    while( index < 1 )
        sprintf( temp, "dest=%i\d", ++index );


Короче - читаем книжки НЕ пытаемся дергать куски кода откуда то ни было.
Pyku_He_oTTyda
Могу отправить, у меня есть в пдф, меньше метра.
The Fresh
Спасибо всем, буду книжки читать, попробую хотя бы ту часть С изучить, которая для программирования МК необходима!
mdmitry
Строки из ПЗУ в РАМ напрямую не копируются в AVR. Требуется использование специальных функций, которые зависят от типа компилятора. Размещение строк в ПЗУ тоже требует некоторых усилий. На форуме по AVR это обсуждалось.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.