Не могу заполнить первые 2 ячейки массива

alexnf
Offline
Зарегистрирован: 13.03.2015

В Массив типа 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 чтто-то подобное?

alexnf
Offline
Зарегистрирован: 13.03.2015

код не правильно записал, вот так у меня:

int message_setting_int[10]; 
.....
int MIT = 11;    
int MIR = 55;   
int MF = 60; 
.....
message_setting_int[0]=MIT ;
message_setting_int[1]=MIR ;
message_setting_int[2]=MF ;
....

и не работает..

vk007
Offline
Зарегистрирован: 16.06.2015

alexnf пишет:

Массив из 11 значений.

Начнем с того, что массив не может быть из 11 значений, поскольку вы его объявляете размером в 10.

vk007
Offline
Зарегистрирован: 16.06.2015

alexnf пишет:

В справке нашел, что при объявлении массива типа char, в нем необходимо место для хранения обязательного нулевого символа

может и для INT чтто-то подобное?

Нет никакой необходимости для обязательного хранения нулевого символа ни в char массиве, ни в каком другом. Это ваше дело, что хранить в массиве. По нулевому символу в си принято определять конец строки, поэтому если вы намерены хранить строки разных размеров с массиве, то по нулевому символу просто удобно искать конец этих строк.

Но никто не заставляет вас этого делать, для длины строки можете завести отдельную переменную или даже выделить одну-две-...-n ячейки в самом массиве (по типу паскаля).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

чудес не бывает, кто-то гадит в первые 4 байта массива извне. :) 

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Загрузите такой код и посмотрите результат

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(){

}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexnf пишет:

и не работает..

С чего Вы взяли, что не работает? Вы это печатали или хрустальный шар тёрли? Давайет полный скетч (только короткий - присвоил - напечатал - бред. Давайте, посмотрим.

alexnf
Offline
Зарегистрирован: 13.03.2015


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

Вот полученные данные:

1,40,0,800,600,60,20,80,2010,12,500,50,1100,100,1,10,10,120,60,40,
 
xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

вы что то нам не договариваете...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Сейчас уже не могу, завтра до обеда обязательно посмотрю.

Но первое ощущение - у Вас слишком маленькая скорость сериала для постоянной печати - Вы ловите переполнение буффера.

Проверьте это, чтобы мне завтра не проверять. Поставьте скорость скажем 115200, и, уж для верности, после строки 46 вставьте delay(5); или там delay(10);

Если поможет, то точно скорость-буффер. Если нет, выложите свежий скетч и я его завтра внимательно посмотрю.

b707
Offline
Зарегистрирован: 26.05.2017

тут не только первые два значение не те - тут еще и в конце три числа лишних - 120,60,40,

Вангую, что автор в форум выложил один скетч, а на ардуине у него другой.

alexnf
Offline
Зарегистрирован: 13.03.2015

Скетч не весь, но та часть что за передачу отвечает - скопирован из скетча.

Задержку пробовал ставить, но не в цикле, а между циклами в 500 мс.

- 120,60,40, - это в моем скетче за этим циклом передачи массива, стоит еще однин на передачу массива из 3-х значений. Там массив значений Long и значения long - с этим массивом все хорошо.

Вечером попробую скорость поменять, отпишусь. Спасибо за советы.

alexnf
Offline
Зарегистрирован: 13.03.2015

del

b707
Offline
Зарегистрирован: 26.05.2017

alexnf - если вы просите решить проблему - будьте до конца корректны. Скетч, который вы пробуете и скетч, который постите в форум - должны совпадать до байта.

Либо выложите тот код, что у вас в ардуине - либо запустите этот же тест для кода, что выложен в форум.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexnf пишет:

Скетч не весь, но та часть что за передачу отвечает - скопирован из скетча. ...... это в моем скетче за этим циклом передачи массива, стоит еще однин 

Так не пойдёт! Вы просто издеваетесь и тратите наше время.

Будьте любезны выложить скетч из которого видно проблему и копипасту того, что именно этот (а не какой-то другой) скетч печатает.

alexnf
Offline
Зарегистрирован: 13.03.2015

Прошу прощения, просто хотел облегчить поиск ошибки, думал, что в какой то банальности ошибся, вот код который не работает:

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(","); // последняя "," и переход на новую строку
}    

выдает:

1,40,0,800,600,60,20,80,2010,12,500,50,1100,100,1,10,10,120,60,40,
 
 
alexnf
Offline
Зарегистрирован: 13.03.2015

наверно нашел ошибку, не правильно объявил массив:

unsigned long message_setting_long[2];  

заменил на:

unsigned long message_setting_long[3];  

все заработало

не понятно только почему ошибка в этом массиве, влияла на другой

vk007
Offline
Зарегистрирован: 16.06.2015

Я вам еще в субботу писал #2, что вы неправильно объявляете массив. Могли бы до этого времени уже проверить объявление всех своих массивов.

А по поводу, почему "ошибка в этом массиве, влияла на другой" то подумайте, если вам местная власть выделила 6 соток для огорода, а вы обрабатываете 8, то не кажется ли вам, что вы влезли на чей-то чужой огород?