Не могу заполнить первые 2 ячейки массива
- Войдите на сайт для отправки комментариев
Сб, 10/02/2018 - 15:19
В Массив типа INT, вношу значения переменных, так же типа INT. Массив из 11 значений.
int message_setting_int[10]; ..... int MIT = 11; int MIR = 55; int MF = 60; ..... message_setting_int[0]=MIntervalTown; message_setting_int[1]=MIntervalRoad; message_setting_int[2]=MCoefRain; ....
вместо первых 2-х значений в массиве появляется 0 и 40, не зависимо от значения внесеенных переменных.
В справке нашел, что при объявлении массива типа char, в нем необходимо место для хранения обязательного нулевого символа
может и для INT чтто-то подобное?
код не правильно записал, вот так у меня:
и не работает..
Массив из 11 значений.
Начнем с того, что массив не может быть из 11 значений, поскольку вы его объявляете размером в 10.
В справке нашел, что при объявлении массива типа char, в нем необходимо место для хранения обязательного нулевого символа
может и для INT чтто-то подобное?
Нет никакой необходимости для обязательного хранения нулевого символа ни в char массиве, ни в каком другом. Это ваше дело, что хранить в массиве. По нулевому символу в си принято определять конец строки, поэтому если вы намерены хранить строки разных размеров с массиве, то по нулевому символу просто удобно искать конец этих строк.
Но никто не заставляет вас этого делать, для длины строки можете завести отдельную переменную или даже выделить одну-две-...-n ячейки в самом массиве (по типу паскаля).
чудес не бывает, кто-то гадит в первые 4 байта массива извне. :)
Загрузите такой код и посмотрите результат
int MIT = 11; int MIR = 55; int MF = 60; int message_setting_int[10]; void setup(){ Serial.begin(9600); message_setting_int[0]=MIT ; message_setting_int[1]=MIR ; message_setting_int[2]=MF ; Serial.println(message_setting_int[0]); Serial.println(message_setting_int[1]); Serial.println(message_setting_int[2]); } void loop(){ }и не работает..
С чего Вы взяли, что не работает? Вы это печатали или хрустальный шар тёрли? Давайет полный скетч (только короткий - присвоил - напечатал - бред. Давайте, посмотрим.
int message_setting_int[16]; int MIntervalTown = 800; int MIntervalRoad = 600; int MCoefRain = 60; int MMinSpeed = 20; int MRoadSpeed = 80; int MWeelCircle = 2010; int MSignalsOn1 = 12; int DurationImp = 500; int PNumberImp = 50; int PImpInterval = 1100; int Level = 100; int REG = 1; int REG_MILAGE = 10; int REG_TIMER = 10; void setup() { Serial.begin(9600); message_setting_int[0]=MIntervalTown; message_setting_int[1]=MIntervalRoad; message_setting_int[2]=MIntervalTown; message_setting_int[3]=MIntervalRoad; message_setting_int[4]=MCoefRain; message_setting_int[5]=MMinSpeed; message_setting_int[6]=MRoadSpeed; message_setting_int[7]=MWeelCircle; message_setting_int[8]=MSignalsOn1; message_setting_int[9]=DurationImp; message_setting_int[10]=PNumberImp; message_setting_int[11]=PImpInterval; message_setting_int[12]=Level; message_setting_int[13]=REG; message_setting_int[14]=REG_MILAGE; message_setting_int[15]=REG_TIMER; } void loop() { processMessage(); } void processMessage() { Serial.print("1"); for (int i = 0; i < 16; i++) { Serial.print(","); Serial.print(message_setting_int[i]); } Serial.println(","); }Вроде все проверил, но ни как не получается....
В ячейки массива 0 и в 1 - вписываем те же данные что и в 2 и 3 : 800 и 600
но при выводе в serial (вывожу все ячейки через запятую), в 2 и 3 получаю 800 и 600, а вот в 0 и 1 получаю 40 и 0
Вот полученные данные:
вы что то нам не договариваете...
Сейчас уже не могу, завтра до обеда обязательно посмотрю.
Но первое ощущение - у Вас слишком маленькая скорость сериала для постоянной печати - Вы ловите переполнение буффера.
Проверьте это, чтобы мне завтра не проверять. Поставьте скорость скажем 115200, и, уж для верности, после строки 46 вставьте delay(5); или там delay(10);
Если поможет, то точно скорость-буффер. Если нет, выложите свежий скетч и я его завтра внимательно посмотрю.
тут не только первые два значение не те - тут еще и в конце три числа лишних - 120,60,40,
Вангую, что автор в форум выложил один скетч, а на ардуине у него другой.
Скетч не весь, но та часть что за передачу отвечает - скопирован из скетча.
Задержку пробовал ставить, но не в цикле, а между циклами в 500 мс.
- 120,60,40, - это в моем скетче за этим циклом передачи массива, стоит еще однин на передачу массива из 3-х значений. Там массив значений Long и значения long - с этим массивом все хорошо.
Вечером попробую скорость поменять, отпишусь. Спасибо за советы.
del
alexnf - если вы просите решить проблему - будьте до конца корректны. Скетч, который вы пробуете и скетч, который постите в форум - должны совпадать до байта.
Либо выложите тот код, что у вас в ардуине - либо запустите этот же тест для кода, что выложен в форум.
Скетч не весь, но та часть что за передачу отвечает - скопирован из скетча. ...... это в моем скетче за этим циклом передачи массива, стоит еще однин
Так не пойдёт! Вы просто издеваетесь и тратите наше время.
Будьте любезны выложить скетч из которого видно проблему и копипасту того, что именно этот (а не какой-то другой) скетч печатает.
Прошу прощения, просто хотел облегчить поиск ошибки, думал, что в какой то банальности ошибся, вот код который не работает:
int cnt = 0; int ledpin=13; int BluetoothData; int TypeMess = 1; int message_setting_int[16]; unsigned long message_setting_long[2]; int MIntervalTown = 800; int MIntervalRoad = 600; int MCoefRain = 60; int MMinSpeed = 20; int MRoadSpeed = 80; int MWeelCircle = 2010; int MSignalsOn1 = 12; int DurationImp = 500; int PNumberImp = 50; int PImpInterval = 1100; int Level = 100; int REG = 1; int REG_MILAGE = 10; int REG_TIMER = 10; unsigned long TIntervalTown = 120; //Интервал в сек, между импульсами в Городе unsigned long TIntervalRoad = 60; //Интервал в сек, между импульсами на Трассе unsigned long TIntervalRain = 40; //Интервал в сек в дождь void setup() { Serial.begin(9600); pinMode(ledpin,OUTPUT); message_setting_int[0]=MIntervalTown; message_setting_int[1]=MIntervalRoad; message_setting_int[2]=MIntervalTown; message_setting_int[3]=MIntervalRoad; message_setting_int[4]=MCoefRain; message_setting_int[5]=MMinSpeed; message_setting_int[6]=MRoadSpeed; message_setting_int[7]=MWeelCircle; message_setting_int[8]=MSignalsOn1; message_setting_int[9]=DurationImp; message_setting_int[10]=PNumberImp; message_setting_int[11]=PImpInterval; message_setting_int[12]=Level; message_setting_int[13]=REG; message_setting_int[14]=REG_MILAGE; message_setting_int[15]=REG_TIMER; message_setting_long[0]=TIntervalTown; message_setting_long[1]=TIntervalRoad; message_setting_long[2]=TIntervalRain; } void loop() { cnt++; processMessage(); delay(1000); if (Serial.available()) { BluetoothData=Serial.parseInt(); MIntervalTown=BluetoothData; message_setting_int[2]=BluetoothData; if(BluetoothData=='1') { // if number 1 pressed .... digitalWrite(ledpin,1); Serial.println("Включен пин 13! "); } if (BluetoothData=='0') { // if number 0 pressed .... digitalWrite(ledpin,0); Serial.println("Выключен пин 13! "); } } } void processMessage() { Serial.print(TypeMess, DEC); for (int i = 0; i < 16; i++) { Serial.print(","); Serial.print(message_setting_int[i]); } for (int i = 0; i < 3; i++) { //цикл от 0 до 2 Serial.print(","); Serial.print(message_setting_long[i]); } Serial.println(","); // последняя "," и переход на новую строку }выдает:
наверно нашел ошибку, не правильно объявил массив:
заменил на:
все заработало
не понятно только почему ошибка в этом массиве, влияла на другой
Я вам еще в субботу писал #2, что вы неправильно объявляете массив. Могли бы до этого времени уже проверить объявление всех своих массивов.
А по поводу, почему "ошибка в этом массиве, влияла на другой" то подумайте, если вам местная власть выделила 6 соток для огорода, а вы обрабатываете 8, то не кажется ли вам, что вы влезли на чей-то чужой огород?