Ошибка ввода переменной Int для статического массива uint8_t - PullRequest
0 голосов
/ 14 сентября 2018

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

В настоящее время я пытаюсь создать переменную int и переменную string, которые вводятся в static uint8_t array и затем печатаются с использованием Serial.println.

Я использую:

#include <U8x8lib.h>

Код переменной Int (имеет ошибку):

int world = 1;
static uint8_t hello[sizeof(world)];
memcpy(hello, &world, sizeof(hello));

Если я скопирую это напрямую и вставлю в IDE вне обоих loop() или setup(), я получу следующую ошибку:

    memcpy(hello, &world, sizeof(hello));
       ^
exit status 1
expected constructor, destructor, or type conversion before '(' token

Прочитав немного об этой проблеме, я обнаружил, что это должно быть введено в loop(), что я и сделал. В результате при компиляции и загрузке проблем не возникало, однако при добавлении строки печаталось значение 1073488876:

Serial.println(int((uint8_t*)hello));

Я тоже сделал:

Serial.println(sizeof(hello));

И он напечатал 4, что означает, что код определяет переменную "hello" как int (так как int 4 байта).

Интересно, что если я закомментирую строку memcpy, то получу тот же результат - 1073488876, поэтому код каким-то образом «игнорирует» строку при помещении в функцию loop().

Код строковой переменной

String world = "Hello"; // 6 chars including \0
static uint8_t hello[6];
world.toCharArray((char *)hello, sizeof(hello));

Если я скопирую это напрямую и вставлю в IDE вне обоих loop() или setup(), я получу следующую ошибку:

 world.toCharArray((char *)hello, sizeof(hello));
 ^
exit status 1
'world' does not name a type

Если я поставлю строку world.toCharArray((char *)hello, sizeof(hello)); в loop(), она будет работать.

Серийная печать также работает со строкой:

  Serial.println(String((char *)hello));

Я не знаю, имеет ли это какое-либо отношение к моей проблеме с кодом Int Variable, но подумал, что я мог бы также показать это.

1 Ответ

0 голосов
/ 14 сентября 2018

Если я скопирую это напрямую и вставлю в IDE вне функции loop () или setup (), я получу следующую ошибку:

Могут использоваться функции вне пространствадля объявления функций, переменных и классов, но не для выполнения кода, он должен идти внутри функций.loop() и setup() - это функции, вызываемые из основной функции, поэтому она работает и не работает вне их.

она печатала значение 1073488876, когда я добавил строку:

hello был объявлен как массив hello[sizeof(int)].Массивы имеют тенденцию затухать до указателя на его первый элемент.Когда вы передаете (uint8_t *)hello в функциональное выражение приведения int(...) и конвертируете массив hello в указатель на его первый элемент явно с помощью (uint8_t *) приведения, это может быть сделано для вас автоматически.int(hello) или int((uint8_t *)hello) в основном одинаковы.int(...) - это приведение, как упоминалось выше, которое превращает ваш указатель uint8_t * в int, поэтому значение, которое вы видите, является адресом памяти первого элемента, представленного как int.

Если вы хотите println чтобы вывести 1, вы можете преобразовать массив байтов обратно в int так же, как вы преобразовали его в массив:

int world = 1;
static uint8_t hello[sizeof(world)];
memcpy(hello, &world, sizeof(hello));

//convert back
int world2;
memcpy(&world2, hello, sizeof(world2));

//print
Serial.println(world2);
...