繁体   English   中英

错误:无法在初始化时将“const unsigned char (*)[7]”转换为“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM