Почему происходит изменения последнего элемента массива хотя в коде это нигде не прописано.

dimin21590
dimin21590 аватар
Offline
Зарегистрирован: 26.10.2016

Есть у меня код для парсинга одного байта который я получил через i2c:

#include <Wire.h>
byte buffer = 0;
void setup() {
 Serial.begin(9600);
 Serial.println("Start"); 
 Wire.begin();
 Wire.beginTransmission(0x68);
 Wire.write(0B111);  //SQW/OUT register adres
 Wire.write(0B10000);  // Set Square Wave to 1 Hz
 Wire.endTransmission(); 
}
void loop() {
  Wire.beginTransmission(0x68);   //begin communication with device on addres 0x68
  Wire.write(0x00);               //specify the register to interact
  Wire.endTransmission();         // stop transmission
  Wire.requestFrom(0x68, 1);      //request 1 byte of data
  while(Wire.available() == 0);   //wait for respons
  buffer = Wire.read();           //read the data
  Serial.println(buffer, BIN);
  decode(buffer);
  delay (1000);
  Serial.println("------------------------------------");
}
byte decode(byte dec_input){
  boolean one_buffer[8] = {0,0,0,0,0,0,0,0};
  boolean ten_buffer[8] = {0,0,0,0,0,0,0,0};
  boolean bit_buffer[8] = {0,0,0,0,0,0,0,0};
  for(byte bit_idx = 0; bit_idx < 8; bit_idx++){
    bit_buffer[bit_idx] = dec_input & (0x80 >> bit_idx);
    Serial.print(bit_buffer[bit_idx]);
    if(bit_idx > 0 && bit_idx <= 3){
      ten_buffer[bit_idx - 1] = bit_buffer[bit_idx];
    }else if(bit_idx > 3){
      one_buffer[bit_idx - 5] = bit_buffer[bit_idx]; 
    }
    /////////////////
    ten_buffer[7] = 0;
    /////////////////
  }
  Serial.println("<--- bit_buffer");
  for(int x = 0; x < 8; x++){
    Serial.print(ten_buffer[x]);
  }
  Serial.println("<--- 10x sec");
    for(int x = 0; x < 8; x++){
    Serial.print(one_buffer[x]);
  }
  Serial.println("<--- sec");
  return 1;
}

Выделенный кусок кода — это костыль для того, чтобы всегда устанавливать последний "бит" ten_buffer в 0. Если этого не сделать, то он буден равен одному если внутри bit_buffer будет такая картина 00001000. Тоесть вот этот бит переходит на последнюю позицию ten_buffer в независимости от всех остальных битов. Код я проверял и получается, что нет в коде, куска, который бы прописывал ему это состояние. В чем может быть причина и как это решить?

 

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

при значении bit_idx =4 в строке 34 вы присваиваете значение элементу массива с отрицательным индексом и, вероятно, при этом затираете значение соседнего массива