我有一个函数,它将接受缓冲区和大小,并将该缓冲区(缓冲区 A)复制到更大的缓冲区(缓冲区 b)中。如果缓冲区 B 的当前大小加上缓冲区 A 的大小太大,我们会将缓冲区 A 拆分为一些放入当前缓冲区 B 中,其余部分在处理完整缓冲区 b 后插入。
像这样:
#define MAX_SIZE 1400
int WriteIndex = 0;
u8 buffer_b[2500];
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
if ((WriteIndex + bufferSize) <= MAX_SIZE) {
memcpy(&(buffer_b[WriteIndex]), &buffer_a, bufferSize);
WriteIndex += bufferSize;
} else {
u16 bytesAddedToCurrentBuffer = (MAX_SIZE - WriteIndex);
u16 bytesAddedToNextBuffer = (bufferSize - bytesAddedToCurrentBuffer);
memcpy(&(buffer_b[WriteIndex]), &buffer_a, bytesAddedToCurrentBuffer);
// calls another function, process data, resets writer index to 0
doSomething();
AddToBuffer(&buffer_a[bytesAddedToCurrentBuffer], bytesAddedToNextBuffer];
}
}
int main() {
...
u8 buff[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g'};
for (;;) {
AddToBuffer(buff, 7);
}
...
}
现在,上面的函数除了递归调用之外还可以工作。我相信我只想传入索引 bytesAddedToCurrentBuffer 处的数组地址。如果我注释掉递归调用,它就可以工作,如果我用与前面的 if 语句逻辑(第 4 行和第 5 行)相同的逻辑替换递归调用,它就可以很好地工作。我希望它是一个递归调用,以便该函数能够处理比 MAX_SIZE 大得多的缓冲区。
提前致谢。
编辑: WriteIndex从0开始。它显然会增加,直到达到MAX_SIZE,此时它将陷入其他情况,填充buffer_b,处理buffer_b,然后开始一个新的缓冲区,WriteIndex回到0。
传入的缓冲区大小也并不重要。它可以是 2 个字节,可以是 10 个字节,也可以是 1000 个字节。它会处理这一切。
编辑2: 我的问题是,递归调用最终写入了不应该写入的内存中,并且我的 FPGA 锁定了。
编辑3: 一个更“完整”的例子。
最佳答案
您的代码中存在多个问题。
AddToBuffer
应该有一个返回类型。您向
memcpy
传递指针buffer_a
的地址,而不是其值。您忘记将 WriteIndex 增加您复制的 block 的大小
您使用
u16
变量来计算 block 大小,这与原型(prototype)不一致:unsigned int
可能大于u16
> 并且实际传递的缓冲区大小可能大于64K。 编辑您更改了问题,因此这一点没有实际意义。
这是一个更简单的版本:
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
while (WriteIndex + bufferSize >= MAX_SIZE) {
unsigned int bytesAddedToCurrentBuffer = MAX_SIZE - WriteIndex;
memcpy(&buffer_b[WriteIndex], buffer_a, bytesAddedToCurrentBuffer);
writeIndex += bytesAddedToCurrentBuffer;
// calls another function, process data, resets WriteIndex to 0
doSomething();
buffer_a += bytesAddedToCurrentBuffer;
bufferSize -= bytesAddedToCurrentBuffer;
}
memcpy(&buffer_b[WriteIndex], buffer_a, bufferSize);
WriteIndex += bufferSize;
}
如果你绝对坚持要编写递归函数,只需解决提到的 3 个问题即可:
void AddToBuffer(u8 buffer_a[], u16 bufferSize) {
if ((WriteIndex + bufferSize) <= MAX_SIZE) {
memcpy(&(buffer_b[WriteIndex]), buffer_a, bufferSize);
WriteIndex += bufferSize;
} else {
u16 bytesAddedToCurrentBuffer = (MAX_SIZE - WriteIndex);
u16 bytesAddedToNextBuffer = (bufferSize - bytesAddedToCurrentBuffer);
memcpy(&(buffer_b[WriteIndex]), buffer_a, bytesAddedToCurrentBuffer);
WriteIndex += bytesAddedToCurrentBuffer;
// calls another function, process data, resets writer index to 0
doSomething();
AddToBuffer(&buffer_a[bytesAddedToCurrentBuffer], bytesAddedToNextBuffer);
}
}
关于c - 递归传入数组地址作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38962823/