gpt4 book ai didi

c++ - 错误: cannot convert 'const unsigned char (*)[7]' to 'const unsigned char (*)[]' in initialization

转载 作者:行者123 更新时间:2023-11-30 19:59:44 24 4
gpt4 key购买 nike

我正在尝试构建一种基本的数据库(或者更确切地说是数据存储)结构来存储不同项目到特定测试用例的映射,该测试用例旨在在 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 的数组转换为任意长度的数组”这对我来说没有意义。

谁能给我解释一下吗?

最佳答案

TL;博士:

替换

Sequence s1 = {&ic_1tc_1};

const uint8_t *s1[] = {ic_1tc_1};
<小时/>

说明:

让我们从简单的事情开始。

当您在定义中省略数组大小时,会推导出大小:

int x[] = {1,2,3};

这里,x的类型是int[3]

请注意,类型不是 int[]。表示未知边界数组的类型是不完整类型,并且无法创建此类类型的对象。

即使使用 typedefs,上面的代码也能工作:

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};

关于c++ - 错误: cannot convert 'const unsigned char (*)[7]' to 'const unsigned char (*)[]' in initialization,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55120498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com