![](/img/trans.png)
[英]how to convert 'const char *' to 'const unsigned char *'
[英]error: cannot convert 'const unsigned char (*)[7]' to 'const unsigned char (*)[]' in initialization
我正在尝试构建一种基本的数据库(或者更确切地说是数据存储)结构来存储不同项目到特定测试用例的映射,这意味着在 Arduino 上运行 - 因此存储空间效率是一个主要问题。
所以我写了几个 typedef 和结构体,单独编译头文件就好了。 但是一旦我想创建结构的实例来实际存储数据,我就会遇到几个错误,这些错误似乎都与第一个非常相似:
error: cannot convert 'const uint8_t (*)[7] {aka const unsigned char (*)[7]}' to 'const uint8_t (*)[] {aka const unsigned char (*)[]}' in initialization
要重现此错误,只有以下 4 行相关:
- 在我的头文件中(请注意,注释说明了我期望的行是什么,而不是它是什么;))
typedef const uint8_t Testcase[]; //array of const uint8_t
typedef Testcase *Sequence[]; //array of pointer to Testcase (aka array of pointer to array of const uint8_t)
- 在我的代码文件中:
const Testcase ic_1tc_1 = {0x00, 0x10, 0x01, 0x61, 0x00, 0x30, 0x07};
Sequence s1 = {&ic_1tc_1};
错误发生在我的代码文件的第二行,我希望用一个指向测试用例的指针元素创建一个数组。
我发现的所有类似问题都是关于“const”关键字的问题,我已经整理好了(我认为),所以他们没有帮助我。
我理解编译器错误告诉我“我无法将长度为 7 的数组转换为任意长度的数组”,这对我来说没有意义。
任何人都可以向我解释一下吗?
特尔;博士:
代替
Sequence s1 = {&ic_1tc_1};
和
const uint8_t *s1[] = {ic_1tc_1};
解释:
让我们从简单的事情开始。
当您在定义中省略数组大小时,将推导出大小:
int x[] = {1,2,3};
这里, x
的类型是int[3]
。
请注意,类型不是int[]
。 表示未知边界数组的类型是不完整类型,不能创建此类类型的对象。
即使使用typedef
也可以使用上述方法:
typedef int array[];
array x = {1,2,3};
请注意, x
的类型不是array
,因为它是int[3]
而不是int[]
。
即使无法创建不完整类型的对象,您也可以创建指向此类类型的指针。
例如:
int (*ptr)[];
此声明与以下效果相同:
typedef int array[];
array *ptr;
这个指针唯一可以指向的是int[]
,但是由于不能创建这种类型的对象,所以不经常使用指向未知边界数组的指针。
(虽然我可以想象一些特殊的用例。你可以声明一个数组有一个未知的边界,并在别处定义它时指定一个大小。然后你可以使用声明形成一个指向数组的指针,这种指针的类型将是T(*)[]
.)
您不能将int[N]
的地址分配给这样的指针,因为正式的int[]
和int[N]
是不同的类型。
typedef int array[];
array x = {1,2,3};
array *ptr = &x; // Error, can't convert `int(*)[3]` to `int(*)[]`.
这正是您要在代码中执行的操作。
一种可能的解决方案是为指针使用正确的类型:
typedef int array[];
array x = {1,2,3};
int (*ptr)[3] = &x;
但是既然你说你需要一个指向各种大小数组的指针数组,那不是一个选项。
另一种可能的解决方案是强制转换指针,但这看起来并不方便(而且我不能 100% 确定使用结果指针是明确定义的)。
您可能应该只存储指向数组第一个元素的指针:
typedef int array[];
array x = {1,2,3};
int *ptr = x;
在您的代码中,它看起来像这样:
const Testcase ic_1tc_1 = {0x00, 0x10, 0x01, 0x61, 0x00, 0x30, 0x07};
const uint8_t *s1[] = {ic_1tc_1};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.