Страница 1 из 3
Работа с массивами в C++
Добавлено: Вс дек 21, 2008 10:56:31
Symbiosis
Подскажите с массивами. Есть комманды XV, YV, ZV , число после них указывает какое напряжение установить на соответствующую ось.
Я сделал один массив с коммандами, другой с числами. Пока не использую флэшку. а просто из еепром, тестирую...
Как так сложить два массива, чтобы к каждому первому элемента второго массива добавлялся первый и четвертый элемент первого массива, к каждому второму элементу второго массива добавлялся второй и четвертый элемент первого массива и так далее...
Код: Выделить всё
flash char COM[5] = "XYZV"; //массив комманд
eeprom char DATA[900]; // массив значений координат в EEPROM
тоесть должно получаться X+V+ DATA[1] , Y+V+ DATA[2], Z+V+DaTA[3], X+V+DATA[4] и т.д.
что-то я запутался уже, голова не варит, поэтому прошу помощи, как новичек в делах этих не опытный (
Добавлено: Вс дек 21, 2008 17:14:28
ARV
ничего не понятно.
Добавлено: Вс дек 21, 2008 17:27:26
Symbiosis
Ну щас еще разок попробую по подробней )
Есть прибор. Если на него подать команду по интерфейсу RS232 к примеру XV50, то на пьезу оси Х будет подано напряжение 50 вольт и она переместит столик на 250нм. Аналогично YV и ZV . тоесть первая буква указывает на какую пьезу подать напряжение.
Собираю девайс, который читает с карты памяти массив чисел вида
[3][n]
тоесть по 3 столбца * много строк.
прежде чем выводить числа из массива в UART, необходимо прелепить перед ними соответствующий текст комманды. То есть складывать покомпонентно два массива.
Вот как это реализовать не могу понять ( Свой вариант нефига не доделанный представил в первом посте.
Добавлено: Вс дек 21, 2008 19:49:03
kentawrik
"складывать" ты имеешь ввиду соединять строки и число преобразовывая его к символьному виду?
Добавлено: Вс дек 21, 2008 19:56:44
Symbiosis
Ну да.
То есть, к примеру, есть массив
1,2,3
4,5,6
7,8,9
должен получиться
XV1,YV2,ZV3
XV4,YV5,ZV6
XV7,YV8,ZV9
и так далее.
Тоесть к каждой строке массива прочитанного добавляются вот эти буковки.
Но не надо лопатить весь массив. Сперва надо обработать первую строку, выплюнуть ее в УАРТ, дождаться сигнала, обработать вторую... но с этим я разберусь...
Добавлено: Вс дек 21, 2008 19:57:55
Aheir
Зачем такие сложности? Зачем вообще массив команд?
Есть массив данных MxN, где М = 0..2, N = 0..n
Хотим вывести строку n.
Тогда пишем (условно):
putchar ('X');
putchar ('V');
putchar (massiv[0][n]);
putchar ('Y');
putchar ('V');
putchar (massiv[1][n]);
putchar ('Z');
putchar ('V');
putchar (massiv[2][n]);
Явно будет быстрее работать, чем всякое сложение массивов и последующий вывод, который все равно через putchar будет..
Добавлено: Вс дек 21, 2008 20:02:22
Symbiosis
Хмм.... Верно!!! Как это я сам не додумался ))) Спасибо огромнейшее! ))) Завтра поработаю ) Еще нету у меня мышления на си... вот всякие там квадратики да условия, графический скелет программы отлично рисуется в воображении, а на уровень языка еще не могу опуститься (((
Добавлено: Вс дек 21, 2008 21:13:56
kentawrik
два добавления - символ конца строки не забыть
и вывод элемента массива будет не putchar, а скорее всего сложнее - ведь это число из нескольких цифр.
Добавлено: Пн дек 22, 2008 07:06:20
Symbiosis
Было несколько проблем, с горем пополам но разобрался. Сперва грешил на то что не юзаю кварц, а от внутреннего RC работаю,т.к кракозябра левая лезла, но после замены стабилизатора на 5 вольт, все работает как часы, строго идет цикл (а раньше кусками, иногда середина символов выводится, задержки разные по времени между выводом и тому подобное).
Единственное с чем не получается разобраться - с массивом.
Не хочет читать из него (((
Вот есть инициализированный массив
flash unsigned char massiv[3][3]={{1,2,3},{4,5,6},{8,9,0}};
и есть следующий код:
putchar ('X');
putchar ('V');
putchar (massiv[0][1]);
putchar ('\n');
delay_ms(1000);
putchar ('Y');
putchar ('V');
putchar (massiv[1][1]);
putchar ('\n');
delay_ms(1000);
putchar ('Z');
putchar ('V');
putchar (massiv[2][1]);
putchar ('\n');
delay_ms(1000);
Но не выводятся значения из массива(
Добавлено: Вт дек 23, 2008 19:46:50
Aheir
а что выводится? Попробуйте объявить массив в ОЗУ, а не во флеш
Добавлено: Вт дек 23, 2008 21:21:23
kentawrik
Дык у тебя массив если и символов то непечатаемых.
Или прибавь к каждому числу в массиве 0x30, или возьми цифры в одинарные кавычки.
Добавлено: Вт дек 23, 2008 23:48:00
Yellow Tiger
Aheir писал(а):Тогда пишем (условно): putchar ('X');...
Если числа в массиве не находятся в диапазоне 0-9, то, пожалуй, проще сначала сформировать строку вызовом sprintf, а затем уже готовую строку слать в выходной поток. Приблизительно так:
Код: Выделить всё
#define BUF_LEN 20
#define ARRAY_LEN ...
unsigned char msg_buf[BUF_LEN];
int arr[ARRAY_LEN][3];
int i;
for(i=0; i<ARRAY_LEN; ++i){
// форматирование строки с командами
sprintf(msg_buf,"XV%d,YV%d,ZV%d\n",arr[i][0],arr[i][1],arr[i][2]);
// вывод строки
out_str(msg_buf);
}
Добавлено: Ср дек 24, 2008 01:05:30
Igor_67
Блин, кошаки, научите работать в С для AVR, ваще не могу разобраться. Пните на обучалку нормальную! Чтоб подробно (пошагово) и с примерами...

Добавлено: Ср дек 24, 2008 08:59:32
Symbiosis
а что выводится? Попробуйте объявить массив в ОЗУ, а не во флеш
Выводятся буквы, потом пробел величиной с количество цифр которые должны были быть выведены.
kentawrik Это как так?, немного не понял ....
Yellow Tiger Пасиб, попробую ...
А вот еще попутный вопрос... Если я объявлю массив в еепром, в какой форме он там будет храниться ? То есть как мне его там редактировать можно ? там просто попорядку циферки будут или как ?
Тоесть как замутить можно неинициализированный массив, который бы брал значения из еепром ?
Добавлено: Ср дек 24, 2008 10:00:18
kentawrik
Или как тигра сказал - но для мелких МК это лишний код для библиотеки поддержки или подобно этому(цифра на вывод это символ как и буква):
Код: Выделить всё
/* [8] "ПнВтСрЧтПтСбВс" */ const char soob8[7][3]={{168,189,0},
{66,191,0},
{67,112,0},
{171,191,0},
{168,191,0},
{67,178,0},
{66,99,0}};
Добавлено: Ср дек 24, 2008 10:07:09
Symbiosis
а как мне это использовать то ?
Добавлено: Ср дек 24, 2008 10:53:52
Symbiosis
Yellow Tiger
на int arr[ARRAY_LEN][3]; cavr ругается, что мол the programm has no 'main' function . и need array size . (((
Добавлено: Ср дек 24, 2008 14:38:03
IfoR
Насчёт (если я правильно понял):
Symbiosis писал(а):Единственное с чем не получается разобраться - с массивом.
Не хочет читать из него (((
Вот есть инициализированный массив
flash unsigned char massiv[3][3]={{1,2,3},{4,5,6},{8,9,0}};
и есть следующий код:
putchar ('X');
putchar ('V');
putchar (massiv[0][1]);
putchar ('\n');
delay_ms(1000);
putchar ('Y');
putchar ('V');
putchar (massiv[1][1]);
putchar ('\n');
delay_ms(1000);
putchar ('Z');
putchar ('V');
putchar (massiv[2][1]);
putchar ('\n');
delay_ms(1000);
Но не выводятся значения из массива(
Тут kentawrik верно говорил.
В консоль высодится в данном случае типа того:
Соответственно числам в массиве (я так понял, он сделан пока для теста). Их просто невидно, т.к. такого кода символа, видимо, нет.
Если в памяти у вас будет храниться значения в символьном виде (например 0x31,0x32 - сответственно 1,2) то значения в массиве надо заключать в одинарные кавычки
Код: Выделить всё
unsigned char massiv[][]={{'1','2','3'},{'4','5','6'},{'8','9','0'}};
Если в числовом (0x01,0x02) тогда при выводе нужно добавлять код начала чисел (Символ '0') (Чесно говаря я его непомню. Доверяю kentawrik

) 0x30
Будет типа:
Код: Выделить всё
putchar ('X');
putchar ('V');
putchar (massiv[0][1] + 0x30);
putchar ('\n');
delay_ms(1000);
putchar ('Y');
putchar ('V');
putchar (massiv[1][1]+ 0x30);
putchar ('\n');
delay_ms(1000);
putchar ('Z');
putchar ('V');
putchar (massiv[2][1]+ 0x30);
putchar ('\n');
delay_ms(1000);
Ну а если значения от 0 до 255, то надо уже конвертировать число в строку и выводить по частям.

Добавлено: Ср дек 24, 2008 15:41:44
Symbiosis
Ребята, посмотрите, имеет ли право на существование такой код ?
Код: Выделить всё
while (1)
{
if (PINC.0==0)
{
for(i=0; i<999; i++)
{
putchar ('X');
putchar ('V');
putchar (massiv[i][0] + 0x30);
putchar ('\n');
delay_ms(1000);
putchar ('Y');
putchar ('V');
putchar (massiv[i][1]+ 0x30);
putchar ('\n');
delay_ms(1000);
putchar ('Z');
putchar ('V');
putchar (massiv[i][2]+ 0x30);
putchar ('\n');
delay_ms(1000);
while (PINC.0==1){};
}
}
};
А вот как заменить выражение для цикла for, чтобы не до 999, а до бесконечности ?
И еще разочек повторюсь с вопросом про хранение массива ... В какой форме он хранится в памяти ? Вот если у меня записано eeprom unsigned char massiv
[3]. Что мне нужно поместить в еепром, чтоб МК прочитал верно все и вывел ? просто текстовый файлик с тремя столбиками и кучей строк думаю не прокатит, да ?
Добавлено: Ср дек 24, 2008 15:52:21
Symbiosis
Эххх, разбежался я! Вроде все как надо работать начинает, обрадовался, а тут на тебе! ( поставил в массив чила двузначные (максимальная цифра 75 может быть у меня в массиве) и нифига не работает ( И только тогда я обратил внимание вот на эту строчку
Ну а если значения от 0 до 255, то надо уже конвертировать число в строку и выводить по частям.
Только как это делается ума не приложу (((