将数组作为指针通过接口传递,然后用它们填充另一个数组

Passing arrays through an interface as pointers and then populating another array with them

提问人:Ciuboss 提问时间:11/10/2023 最后编辑:Ciuboss 更新时间:11/10/2023 访问量:91

问:

对我来说有点奇怪,所以我希望你的窥视能帮助我一点。我基本上的目标是填充一个由 16 个字节组成的数组。此外,我什至拥有我必须创建的这个数组的结构enter image description here

我遇到的问题是,除了此列表中的前两个基本值外,其他所有内容都是通过将它们作为参数传递到我无权访问的函数中来填充的。它不是由我的项目部分制作的,因此我拥有的关于该功能的唯一信息是它的界面,基本上是 .ReturnType GetValues(uint8* index, uint8* ID, uint8* buffer)

另一个问题是我如何基本上将这个 16 元素数组中,另一个数组本身放在其中。请注意,这应该是可扩展的,所以我不能手动将缓冲区数组的所有 10 个元素放入更大的数组中,因为将来我可能必须对 100 字节数组执行相同的操作,依此类推。

我所拥有的基本实现是这样的

uint8 index[2];
uint8 ID[2];
uint8 buffer[10];

GetValues(index, ID, buffer);

uint8 FinalArray[] = {0x01, 0x10, buffer, index, ID};

当然,所有这些都存在问题,首先是缓冲区、ID 和索引在 GetValues 函数中传递,它们将被视为指针,然后我只是随便将它们扔到 FinalArray 中。不幸的是,我是 C 语言的新手,因此即使我知道基本的算法,这门语言的指针和内存管理方面有时仍然让我感到困惑。我很感激你们能提供的任何帮助。谢谢!

嵌入的 C 指针

评论

0赞 Allan Wind 11/10/2023
每次提交请只问 1 个问题。我不确定,你的两个问题是什么。C 语言中的数组是统一类型的,所以它实际上是一个行协议。当你谈论字节顺序时,奇怪的是,他们没有告诉你索引和 ID 使用哪个顺序。
0赞 Ciuboss 11/10/2023
这是我挣扎的事情。我认为也许索引和 ID 实际上都是 uint16,因为在图片中它说它们占用 2 个字节。我的意思是对于缓冲区,他们写了“buffer[0]、buffer[1] 等”。但是对于索引和 ID,它只是它们的名称,都在 2 个字节上。但话又说回来,GetValues 肯定只接受 uint8* 值,所以我将它们视为数组。
0赞 Allan Wind 11/10/2023
对于您的函数是 your 和 in、out 或 inout 参数?GetValues()indexID
0赞 Ciuboss 11/10/2023
@AllanWind,我想我的问题是:我调用 GetValues 函数,以便缓冲区、ID 和索引不会保持为空。之后如何填充 FinalArray?因为我知道我之前对它的定义并没有真正的意义,基本上是声明它并将另一个数组“缓冲区”作为元素放入其中。
1赞 Ciuboss 11/10/2023
@AllanWind 是的,也许我需要对此进行更多澄清。即使是我最初认为是 uint16 的带有 index 和 ID 的部分,但后来将它们作为 uint8 的数组,因为它们每个包含 2 个字节。无论如何,感谢您的帮助,也许一旦我更清楚地了解了内容,我会在新线程中再次发布问题,其中包含更多详细信息。感谢您的帮助!

答:

1赞 Oka 11/10/2023 #1

您可以将数组中给定偏移量的指针直接传递到函数。

uint8 packet[16] = { 0x01, 0x10 };
                                                 
GetValues(packet + 12, packet + 14, packet + 2);

假设 and 是字符类型,并且 和 值的字节序是正确的(否则您需要类似于 htons/ntohs 的功能)。uint8IDindex

(也许一些宏可以替换这些神奇的数字。)

评论

0赞 Ciuboss 11/10/2023
我修改了我的初始帖子,我认为现在索引 ID 实际上是 uint16 变量。这就是为什么在表中,缓冲区数组中的每个元素都单独放在每个字节上,而索引和 ID 实际上分别放在 2 个单元格上。因此,我得出结论,实际上它们是单个元素,每个元素占用 2 个字节。
0赞 Ciuboss 11/10/2023
感谢您的回答,但我想问您,您是说这是在您的示例中实际填充“数据包”数组的唯一方法吗?我无法调用 GetValues 函数,然后才使用 GetValue 函数修改的值创建“packet”数组?
1赞 Oka 11/10/2023
你当然可以用来填充任何你想要的东西,然后用任何合适的方式(例如,赋值等)将这些值复制到你想要的任何位置,但你不能通过扩展另一个数组来初始化一个数组来获取它的所有元素。即,尝试使用两个值和三个值(转换为 )初始化一个数组。GetValuesmemcpyuint8 FinalArray[] = {0x01, 0x10, buffer, index, ID};intuint8 *uint8
0赞 Ciuboss 11/10/2023
因此,我可以执行例如FinalArray[0] = 0x01之类的操作吗?FinalArray[1] = 0x10;memcpy(&FinalArray[2], index, sizeof(index));对于我想要实现的目标来说,这似乎没问题吗?
1赞 Oka 11/10/2023
是的(除了偏移量),但由于我们假设已经进行了确切的逐字节复制,因此它是多余的。你已经有了内存(如果 ,那么实际上是一个你只想在评论的例子中使用的前半部分)。和的预期字节序是我在这里看到的唯一不清楚的问题。&FinalArray[12]GetValuesuint8 FinalArray[16]FinalArray + 12uint8 [4]indexID