静态 uint8_t 数组的 Int 变量输入错误

Int variable input error for static uint8_t array

这是 的扩展,涉及建议解决方案中遇到的问题。

目前,我正在尝试创建一个 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));

如果我直接复制它并将其粘贴到 loop()setup() 之外的 IDE,我会收到以下错误:

    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,所以代码在某种程度上是 "ignoring" 放在 loop() 函数中的行。

字符串变量代码

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

如果我直接复制它并将其粘贴到 loop()setup() 之外的 IDE,我会收到以下错误:

 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 变量代码问题有任何关系,但我想我不妨展示一下。

If I copy this directly and paste it into the IDE outside of both loop() or setup(), I get the following error:

space外部函数可以用于声明函数、变量和类但不能用于代码的执行,它必须进入函数内部。 loop()setup() 是从 main 函数调用的函数,这就是它在它们之外起作用而不起作用的原因。

it was printing the value 1073488876 when I added the line:

hello 被声明为数组 hello[sizeof(int)]。数组倾向于衰减到指向其第一个元素的指针。当您将 (uint8_t *)hello 传递给 functional cast expression int(...) 并使用 (uint8_t *) 转换将数组 hello 显式转换为指向其第一个元素的指针时,它可能已经完成自动为您服务。 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);