我有以下2D数组:
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
电话有什么问题?
或者,我尝试使用以下1D数组(每个通道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));
答案 0 :(得分:0)
我好几年没有进行任何编码了,但在我看来,你可能编写的代码很难逻辑地遵循。
我唯一的建议是找到笔和纸在纸张中间水平画一条线,这样你就有两个部分,代表你想要移动的每一块记忆。使纸张的下半部分代表SOURCE,上半部分代表DESTINATION。将字母A,B和C垂直向下写在上半部分。然后将数字1,2和3垂直向下写入下半部分。
然后在另一张纸上写下计数器的名称&#34; channel&#34;以零值开始。
现在从目的地中删除字母A并将数字1放在其中=数字1从源到目的地覆盖A。现在递增计数器&#34; channel&#34;在单独的纸上1。整个操作重复2次。现在看一下目的地中的内容以及来源中剩下的内容以及计数器&#34;频道&#34;的价值。这将显示您的计算机内存和计数器&#34;频道&#34;内发生了什么。个人倾向于重写代码,以便memmove第二个参数也没有命名为channel。在方括号内。希望这可以帮助。这是解释http://www.cplusplus.com/reference/cstring/memmove/的函数。 不要忘记只要频道是&lt; memmove功能就会继续。 nchannels。您需要在循环期间写出所有变量中的值,这是调试的标准做法。