递归传递数组地址作为参数

时间:2016-08-15 20:48:28

标签: 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个字节。它会处理它一样。

EDIT2: 我的问题是,递归调用最终会在内存中写入,而不是在内存中,并且我的FPGA会锁定。

EDIT3: 一个更“完整”的例子。

1 个答案:

答案 0 :(得分:4)

您的代码中存在多个问题。

  • AddToBuffer应该有返回类型。

  • 您传递memcpy指针buffer_a的地址而不是其值。

  • 您忘记按照复制的块的大小递增WriteIndex

  • 您使用u16变量进行块大小计算,这与原型不一致: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);
    }
}