提问人:Ciuboss 提问时间:11/10/2023 最后编辑:Ciuboss 更新时间:11/10/2023 访问量:91
将数组作为指针通过接口传递,然后用它们填充另一个数组
Passing arrays through an interface as pointers and then populating another array with them
问:
对我来说有点奇怪,所以我希望你的窥视能帮助我一点。我基本上的目标是填充一个由 16 个字节组成的数组。此外,我什至拥有我必须创建的这个数组的结构
我遇到的问题是,除了此列表中的前两个基本值外,其他所有内容都是通过将它们作为参数传递到我无权访问的函数中来填充的。它不是由我的项目部分制作的,因此我拥有的关于该功能的唯一信息是它的界面,基本上是 .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 语言的新手,因此即使我知道基本的算法,这门语言的指针和内存管理方面有时仍然让我感到困惑。我很感激你们能提供的任何帮助。谢谢!
答:
1赞
Oka
11/10/2023
#1
您可以将数组中给定偏移量的指针直接传递到函数。
uint8 packet[16] = { 0x01, 0x10 };
GetValues(packet + 12, packet + 14, packet + 2);
假设 and 是字符类型,并且 和 值的字节序是正确的(否则您需要类似于 htons
/ntohs
的功能)。uint8
ID
index
(也许一些宏可以替换这些神奇的数字。)
评论
0赞
Ciuboss
11/10/2023
我修改了我的初始帖子,我认为现在索引 ID 实际上是 uint16 变量。这就是为什么在表中,缓冲区数组中的每个元素都单独放在每个字节上,而索引和 ID 实际上分别放在 2 个单元格上。因此,我得出结论,实际上它们是单个元素,每个元素占用 2 个字节。
0赞
Ciuboss
11/10/2023
感谢您的回答,但我想问您,您是说这是在您的示例中实际填充“数据包”数组的唯一方法吗?我无法调用 GetValues 函数,然后才使用 GetValue 函数修改的值创建“packet”数组?
1赞
Oka
11/10/2023
你当然可以用来填充任何你想要的东西,然后用任何合适的方式(例如,赋值等)将这些值复制到你想要的任何位置,但你不能通过扩展另一个数组来初始化一个数组来获取它的所有元素。即,尝试使用两个值和三个值(转换为 )初始化一个数组。GetValues
memcpy
uint8 FinalArray[] = {0x01, 0x10, buffer, index, ID};
int
uint8 *
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]
GetValues
uint8 FinalArray[16]
FinalArray + 12
uint8 [4]
index
ID
评论
GetValues()
index
ID