c - 递归传入数组地址作为参数

标签 c arrays pointers recursion

我有一个函数,它将接受缓冲区和大小,并将该缓冲区(缓冲区 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/

相关文章:

javascript - 比较同一数组的当前版本和先前版本以了解 JavaScript 中值的变化

c++ - 指向成员函数声明/使用问题的 Variadic 模板指针

c++ - curl_getenv() 写这个函数的原因

ruby-on-rails - 在 Rails 中运行 C 进程

javascript - 数组更改时不调用 AngularJs Formatter

javascript - 当数组只有 1 个元素时,从 JavaScript 数组中获取键

c - 为什么这个说法是正确的? &f 是 float 类型**

c++ - 将 char 地址分配给 int 指针,然后写入 int 大小的内存块

c - 坚持向字符串添加字符

更改 R 包中的 C 源代码