0

我有以下二维数组:

float accumulator[MAX_CHANNELS][2*MAX_FRAME_LENGTH];

我一直在为每个通道移动代码中的内存块,如下所示:

for (int channel = 0; channel < nChannels; channel++) {
    memmove(accumulator[channel], accumulator[channel] + stepSize, fftFrameSize * 2 * sizeof(float));
}

但是,这给了我错误的结果,我不明白为什么。我正在使用的电话有什么问题memmove

或者,我尝试使用以下一维数组(每个通道 1 个)并得到正确的结果:

float accumulator1[2*MAX_FRAME_LENGTH];
float accumulator2[2*MAX_FRAME_LENGTH];

memmove(accumulator1, accumulator1 + stepSize, fftFrameSize * 2 * sizeof(float));
memmove(accumulator2, accumulator2 + stepSize, fftFrameSize * 2 * sizeof(float));
4

1 回答 1

0

几年来我没有进行任何编码,但在我看来,您可能编写了难以在逻辑上遵循的代码。

我唯一的建议是找笔和纸在纸中间水平画一条线,这样你就有两个部分,代表你要移动的每个内存块。让纸的下半部分代表 SOURCE,上半部分代表 DESTINATION。在上半部分垂直向下写下字母 A、B 和 C。然后将数字 1、2 和 3 垂直写在下半部分的一侧。

然后在另一张纸上写下计数器“通道”的名称,从零开始。

现在从目的地划掉字母A并将数字1放在它的位置=数字1从源到目的地覆盖目的地中的A。现在在另一张纸上将计数器“通道”增加 1。整个操作再重复 2 次。现在查看目标中的内容和源中剩余的内容以及计数器“通道”的值,这将向您显示计算机内存和计数器“通道”中发生的情况。个人会倾向于重写代码,以便 memmove 第二个参数不被命名为通道。方括号内。希望这可以帮助。这是解释http://www.cplusplus.com/reference/cstring/memmove/的功能. 不要忘记,只要 channel < nchannels,memmove 函数就会继续。您需要在循环期间写出所有变量中的值,这是调试的标准做法。

于 2017-01-11T23:07:45.727 回答