Переменная счетчика сбрасывается на 0 без сброса (мега)

(Arduino Mega2560) Я пытаюсь проверить размещение счетчика n в цикле for, проблема в том, что каждый раз, когда он выходит и возвращается в цикл for, n снова сбрасывается, поэтому он печатает «counter : 245 дюймов каждый раз. Однако, когда я комментирую *b++=data; и данные++; он правильно считает. Что именно происходит?!

Код:

uint8_t i=0;
uint8_t buf[245];
uint8_t *b=buf,*b2=buf;
uint8_t data=10;
int n=0;

void setup() {
Serial.begin(9600);
}

void loop() {  
for(i=0; i<245 ;i++){
  *b++=data;
  data++; 
  delay(50);
  n++;
  Serial.println(buf[i]);
  }
  data=0;
  delay(5000);
  Serial.println("counter:");
  Serial.println(n); 
  delay(5000);
}

, 👍0

Обсуждение

b уходит в неизвестность, а вы засоряете все свои переменные мусором., @Majenko

Ага, понятно ! Я никогда раньше не пробовал указатели, могу ли я сделать b = 0, чтобы сбросить его, или это делается по-другому?, @BigRedMachine

b = buf; сбросит b в начало переменной области памяти buf. Ваш b++ будет расти и расти без ограничений. После 254 приращений он будет указывать на что-то *после* buf, что для меня звучит как n., @Majenko


1 ответ


Лучший ответ:

2

Вы никогда не сбрасываете указатель b. В первый раз он работает через память, зарезервированную для buf. Во второй раз в вашем цикле он уже находится в конце этой памяти, и затем вы начинаете увеличивать (и заполнять) эту перезапись других переменных — первая из которых звучит так, как будто это может быть n — поэтому *b++=data записывает data (245) в n.

Вам нужно сбрасывать b каждый раз, когда вы проходите через цикл, чтобы он каждый раз начинался с начала массива:

b = buf;
,

Спасибо, Маженко, теперь это имеет смысл., @BigRedMachine

@Majenko ... проголосовал за ... действительно моя ошибка., @Michel Keijzers