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