Чтение байтов из файла на SD-карте — понимание буфера

У меня есть следующий фрагмент кода, который открывает растровое изображение с SD-карты и выводит ширину на последовательный монитор.

#include <SPI.h>
#include <SD.h>

File bitmap;

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

  Serial.println("Initializing SD card...");
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  bitmap = SD.open("/TEST2.BMP");

  int width[0]; // почему я не могу просто написать "int width;"
  bitmap.seek(18);
  bitmap.read(width, 4);
  Serial.println(width[0]); // и "Serial.println(ширина);"
}

void loop() {

}

Он отлично работает, но я не понимаю, почему я должен объявлять буфер для ширины как int width[0];. Я попробовал int width;, но тогда на выходе просто 0.

, 👍1

Обсуждение

@jsotola Я знаю. Я устал, когда задавал этот вопрос, так что извините за опечатку, @prehfeldt


2 ответа


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

6

Вы не обязательны, это всего лишь один из способов сделать это.

В основном функции read требуется указатель на буфер для хранения данных. Используя массив с одной записью, вы получаете указатель на буфер, достаточно большой для одного (32-разрядного ) целое. И тогда вы получаете «простой» способ доступа к одному целому числу в этом буфере.

Другим способом было бы просто использовать простое целое число и передать указатель на это целое число для read:

uint32_t width; // Используйте целое число фиксированного размера для переносимости
bitmap.seek(18);
bitmap.read(&width, sizeof(width)); // Используйте sizeof для переносимости
Serial.println(width);
,

-1

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

Массив является указателем. Таким образом,

целое число[0];

эквивалентно

целое * простое;

Итак. read(arr... or read(&simple...

,