Страница 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, ваще не могу разобраться. Пните на обучалку нормальную! Чтоб подробно (пошагово) и с примерами... :shock:

Добавлено: Ср дек 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 верно говорил.
В консоль высодится в данном случае типа того:

Код: Выделить всё

XV0x01
YV0x04
ZV0x08
Соответственно числам в массиве (я так понял, он сделан пока для теста). Их просто невидно, т.к. такого кода символа, видимо, нет.

Если в памяти у вас будет храниться значения в символьном виде (например 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, то надо уже конвертировать число в строку и выводить по частям.


Только как это делается ума не приложу (((