Работа с массивами в C++

Здесь принимаются все самые невообразимые вопросы... Главное - не стесняйтесь. Поверьте, у нас поначалу вопросы были еще глупее :)
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Работа с массивами в C++

Сообщение 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] и т.д.

что-то я запутался уже, голова не варит, поэтому прошу помощи, как новичек в делах этих не опытный (
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18548
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

ничего не понятно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Ну щас еще разок попробую по подробней )

Есть прибор. Если на него подать команду по интерфейсу RS232 к примеру XV50, то на пьезу оси Х будет подано напряжение 50 вольт и она переместит столик на 250нм. Аналогично YV и ZV . тоесть первая буква указывает на какую пьезу подать напряжение.

Собираю девайс, который читает с карты памяти массив чисел вида
[3][n]

тоесть по 3 столбца * много строк.

прежде чем выводить числа из массива в UART, необходимо прелепить перед ними соответствующий текст комманды. То есть складывать покомпонентно два массива.
Вот как это реализовать не могу понять ( Свой вариант нефига не доделанный представил в первом посте.
Аватара пользователя
kentawrik
Встал на лапы
Сообщения: 115
Зарегистрирован: Сб дек 29, 2007 18:00:05
Откуда: ст.Каневская
Контактная информация:

Сообщение kentawrik »

"складывать" ты имеешь ввиду соединять строки и число преобразовывая его к символьному виду?
Прав не тот кто расскажет ЧТО было или объяснит ЧТО есть,
а тот кто может сказать ЧТО БУДЕТ...
(c) Моё
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Ну да.
То есть, к примеру, есть массив
1,2,3
4,5,6
7,8,9

должен получиться

XV1,YV2,ZV3
XV4,YV5,ZV6
XV7,YV8,ZV9

и так далее.

Тоесть к каждой строке массива прочитанного добавляются вот эти буковки.

Но не надо лопатить весь массив. Сперва надо обработать первую строку, выплюнуть ее в УАРТ, дождаться сигнала, обработать вторую... но с этим я разберусь...
Реклама
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение 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 будет..
Оптимизм х (Опыт + Знания) = const
Реклама
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Хмм.... Верно!!! Как это я сам не додумался ))) Спасибо огромнейшее! ))) Завтра поработаю ) Еще нету у меня мышления на си... вот всякие там квадратики да условия, графический скелет программы отлично рисуется в воображении, а на уровень языка еще не могу опуститься (((
Аватара пользователя
kentawrik
Встал на лапы
Сообщения: 115
Зарегистрирован: Сб дек 29, 2007 18:00:05
Откуда: ст.Каневская
Контактная информация:

Сообщение kentawrik »

два добавления - символ конца строки не забыть
и вывод элемента массива будет не putchar, а скорее всего сложнее - ведь это число из нескольких цифр.
Прав не тот кто расскажет ЧТО было или объяснит ЧТО есть,
а тот кто может сказать ЧТО БУДЕТ...
(c) Моё
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение 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);
Но не выводятся значения из массива(
Аватара пользователя
Aheir
Модератор
Сообщения: 4517
Зарегистрирован: Пн апр 03, 2006 11:43:25
Откуда: Санкт - Петербург
Контактная информация:

Сообщение Aheir »

а что выводится? Попробуйте объявить массив в ОЗУ, а не во флеш
Оптимизм х (Опыт + Знания) = const
Аватара пользователя
kentawrik
Встал на лапы
Сообщения: 115
Зарегистрирован: Сб дек 29, 2007 18:00:05
Откуда: ст.Каневская
Контактная информация:

Сообщение kentawrik »

Дык у тебя массив если и символов то непечатаемых.
Или прибавь к каждому числу в массиве 0x30, или возьми цифры в одинарные кавычки.
Прав не тот кто расскажет ЧТО было или объяснит ЧТО есть,
а тот кто может сказать ЧТО БУДЕТ...
(c) Моё
Аватара пользователя
Yellow Tiger
Сверлит текстолит когтями
Сообщения: 1148
Зарегистрирован: Вт июл 08, 2008 12:24:17

Сообщение 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);
    }
Аватара пользователя
Igor_67
Электрический кот
Сообщения: 1051
Зарегистрирован: Вт окт 21, 2008 11:46:23
Откуда: Барнаул

Сообщение Igor_67 »

Блин, кошаки, научите работать в С для AVR, ваще не могу разобраться. Пните на обучалку нормальную! Чтоб подробно (пошагово) и с примерами... :shock:
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

а что выводится? Попробуйте объявить массив в ОЗУ, а не во флеш
Выводятся буквы, потом пробел величиной с количество цифр которые должны были быть выведены.

kentawrik Это как так?, немного не понял ....
Yellow Tiger Пасиб, попробую ...

А вот еще попутный вопрос... Если я объявлю массив в еепром, в какой форме он там будет храниться ? То есть как мне его там редактировать можно ? там просто попорядку циферки будут или как ?
Тоесть как замутить можно неинициализированный массив, который бы брал значения из еепром ?
Аватара пользователя
kentawrik
Встал на лапы
Сообщения: 115
Зарегистрирован: Сб дек 29, 2007 18:00:05
Откуда: ст.Каневская
Контактная информация:

Сообщение 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}};
Прав не тот кто расскажет ЧТО было или объяснит ЧТО есть,
а тот кто может сказать ЧТО БУДЕТ...
(c) Моё
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

а как мне это использовать то ?
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Yellow Tiger
на int arr[ARRAY_LEN][3]; cavr ругается, что мол the programm has no 'main' function . и need array size . (((
Аватара пользователя
IfoR
Поставщик валерьянки для Кота
Сообщения: 2029
Зарегистрирован: Сб ноя 15, 2008 10:09:56
Откуда: г. Тула
Контактная информация:

Сообщение 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, то надо уже конвертировать число в строку и выводить по частям. :)
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение 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]. Что мне нужно поместить в еепром, чтоб МК прочитал верно все и вывел ? просто текстовый файлик с тремя столбиками и кучей строк думаю не прокатит, да ?
Аватара пользователя
Symbiosis
Вымогатель припоя
Сообщения: 600
Зарегистрирован: Вс апр 27, 2008 13:44:52
Контактная информация:

Сообщение Symbiosis »

Эххх, разбежался я! Вроде все как надо работать начинает, обрадовался, а тут на тебе! ( поставил в массив чила двузначные (максимальная цифра 75 может быть у меня в массиве) и нифига не работает ( И только тогда я обратил внимание вот на эту строчку
Ну а если значения от 0 до 255, то надо уже конвертировать число в строку и выводить по частям.


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

Вернуться в «Теория»