c ++:使用指针访问缓冲区与使用增量变量
c++: using a pointer to access a buffer vs using an incremental variable
我正在写一个基于循环缓冲区的延迟。这是我的实现。
#include <iostream>
using namespace std;
int main() {
cout << "Fixed delay with circular buffer" << endl;
int dtime = 5;
int buffersize = 10;
auto *in = new int[buffersize];
auto *del = new int[dtime];
auto *out = new int[buffersize];
int p = 0;
// zero-initialise the delay line
for (int i = 0; i < dtime; i++) {
del[i] = 0;
}
// fill the in buffer
for (int i = 0; i < buffersize; i++) {
in[i] = i;
}
// apply delay
for (int i = 0; i < buffersize; i++) {
// read
out[i] = del[p];
// write
del[p] = in[i];
// update pointer
p = (p != dtime-1? p+1 : 0);
}
for (int i = 0; i < buffersize; i++) {
cout << out[i] << ' ';
}
delete[] in;
delete[] out;
delete[] del;
return 0;
}
这是结果:0 0 0 0 0 0 1 2 3 4
。
阅读 this book,作者为 writing/reading 操作实现了一个指向延迟线的指针。这意味着,我必须使 p
指向延迟线的头部,即 int *p = del
并在访问延迟线时取消引用指针,即 out[i] = del[*p]
用于读取和 del[p] = in[i]
为写操作。最后,我像以前一样更新值。
但是,我得到了这个结果:8 9 0 0 0 0 0 0 0 0
。此外,如果我检查指针内的值,我会得到这个级数 0 1 2 3 4 0 6 7 8 9
,这很奇怪。
我试图理解为什么会出现这种行为,因为我希望这两个版本是相同的。
为了完整性,我还附上了带有指针的版本。
#include <iostream>
using namespace std;
int main() {
cout << "Fixed delay with circular buffer" << endl;
int dtime = 5;
int buffersize = 10;
auto *in = new int[buffersize];
auto *del = new int[dtime];
auto *out = new int[buffersize];
int *p = del;
// zero-initialise the delay line
for (int i = 0; i < dtime; i++) {
del[i] = 0;
}
// fill the in buffer
for (int i = 0; i < buffersize; i++) {
in[i] = i;
}
// apply delay
for (int i = 0; i < buffersize; i++) {
cout << *p << ' ';
// read
out[i] = del[*p];
// write
del[*p] = in[i];
// update pointer
*p = (*p != dtime-1? *p+1 : 0);
}
for (int i = 0; i < buffersize; i++) {
cout << endl << out[i] << ' ';
}
delete[] in;
delete[] out;
delete[] del;
return 0;
}
您没有正确处理指针。 *p
替换了原始代码中的 del[p]
操作。
out[i] = *p;
*p = in[i];
"update pointer" 代码然后需要更新指针,而不是它指向的值。
p = p != &del[dtime - 1] ? p + 1 : del;
或
if (++p == &del[dtime])
p = del;
我正在写一个基于循环缓冲区的延迟。这是我的实现。
#include <iostream>
using namespace std;
int main() {
cout << "Fixed delay with circular buffer" << endl;
int dtime = 5;
int buffersize = 10;
auto *in = new int[buffersize];
auto *del = new int[dtime];
auto *out = new int[buffersize];
int p = 0;
// zero-initialise the delay line
for (int i = 0; i < dtime; i++) {
del[i] = 0;
}
// fill the in buffer
for (int i = 0; i < buffersize; i++) {
in[i] = i;
}
// apply delay
for (int i = 0; i < buffersize; i++) {
// read
out[i] = del[p];
// write
del[p] = in[i];
// update pointer
p = (p != dtime-1? p+1 : 0);
}
for (int i = 0; i < buffersize; i++) {
cout << out[i] << ' ';
}
delete[] in;
delete[] out;
delete[] del;
return 0;
}
这是结果:0 0 0 0 0 0 1 2 3 4
。
阅读 this book,作者为 writing/reading 操作实现了一个指向延迟线的指针。这意味着,我必须使 p
指向延迟线的头部,即 int *p = del
并在访问延迟线时取消引用指针,即 out[i] = del[*p]
用于读取和 del[p] = in[i]
为写操作。最后,我像以前一样更新值。
但是,我得到了这个结果:8 9 0 0 0 0 0 0 0 0
。此外,如果我检查指针内的值,我会得到这个级数 0 1 2 3 4 0 6 7 8 9
,这很奇怪。
我试图理解为什么会出现这种行为,因为我希望这两个版本是相同的。
为了完整性,我还附上了带有指针的版本。
#include <iostream>
using namespace std;
int main() {
cout << "Fixed delay with circular buffer" << endl;
int dtime = 5;
int buffersize = 10;
auto *in = new int[buffersize];
auto *del = new int[dtime];
auto *out = new int[buffersize];
int *p = del;
// zero-initialise the delay line
for (int i = 0; i < dtime; i++) {
del[i] = 0;
}
// fill the in buffer
for (int i = 0; i < buffersize; i++) {
in[i] = i;
}
// apply delay
for (int i = 0; i < buffersize; i++) {
cout << *p << ' ';
// read
out[i] = del[*p];
// write
del[*p] = in[i];
// update pointer
*p = (*p != dtime-1? *p+1 : 0);
}
for (int i = 0; i < buffersize; i++) {
cout << endl << out[i] << ' ';
}
delete[] in;
delete[] out;
delete[] del;
return 0;
}
您没有正确处理指针。 *p
替换了原始代码中的 del[p]
操作。
out[i] = *p;
*p = in[i];
"update pointer" 代码然后需要更新指针,而不是它指向的值。
p = p != &del[dtime - 1] ? p + 1 : del;
或
if (++p == &del[dtime])
p = del;