Arduino memcpy искажает последовательный вывод - PullRequest
1 голос
/ 08 июля 2019

Я пишу некоторый код для Arduino Uno, который включает в себя копирование частей массивов. Использование memcpy приводит к тому, что совершенно не связанная переменная иногда появляется поврежденной в последовательном выходе. Вот код, необходимый для показа проблемы.

byte cchar[8][8];
byte fbold[16][16];
void setup() {
  Serial.begin(9600);
}

void loop() {
  for (byte i = 0; i < 8; i++) {
    memcpy(cchar + i*8, fbold + 16 * i , 8);
    Serial.println(i);
    Serial.println(i);
  }
  delay(500);
}

Я считаю, что при повторении должно получиться следующее:

1
1
2
2
3
3
4
4
5
5
6
6
7
7

но, как ни странно, это больше похоже на это: (взято непосредственно с последовательного монитора)

0
0
1
1
2
2ff
4
5
4
4
5
5
6
6
7
7
0
0
1
1
2
2
3
3
4
4
5
5ff
7
07
7

С удаленной командой memcpy она выводит, как я и ожидал. Логическим выводом будет то, что мой memcpy портит i. Но почему хотя? i предположительно никогда не превышает 7, cchar имеет длину 64 байта, и я копирую только 8 байтов, верно? Так как бы я копировал за пределами cchar?

1 Ответ

0 голосов
/ 09 июля 2019

проблема арифметики указателя. sizeof(*cchar) равно 8, поэтому адрес cchar + 1 равен 8 байтам после адреса cchar

это работает

byte cchar[8][8];
byte fbold[16][16];

void setup() {
  Serial.begin(115200);
  for (int i = 0; i < 16; i++) {
    for (int j = 0; j < 16; j++) {
      fbold[i][j] = j;
    }
  }
  for (int i = 0; i < 8; i++) {
    memcpy(cchar + i, fbold + i, 8);
    for (int j = 0; j < 8; j++) {
      Serial.print(cchar[i][j]);
      Serial.print(',');
    }
    Serial.println();
  }
}

void loop() {
}
...