【发布时间】:2021-02-17 14:58:57
【问题描述】:
我正在用 C++ 实现卷积代码(我知道它已经存在,但我只是为了练习,因为我是初学者),虽然我可以获得正确的输出,但我有一些方法尝试根据我如何访问存储在数组中的卷积值给出意外输出,但我不确定为什么。 无论我是通过数组索引还是指针递增来访问值,都可以使用的函数代码是:
void conv(int M, int* h, int L, int* x, int* y) {
int n, m = 0;
for (n = 0; n < L + M - 1; n++) {
for (m = std::max(0, n - L + 1); m <= std::min(n, M - 1); m++) {
*(y+n) += *(h + m) * *(x + n - m);
};
std::cout << "using array index: " << std::endl;
std::cout << "n = " << n << " " << "y = " << y[n] << " " << std::endl;
std::cout << std::endl;
std::cout << "using pointer: " << std::endl;
std::cout << "n = " << n << " " << "y = " << *(y+n) << " " << std::endl;
std::cout << std::endl;
//y++;
}
}
但是,如果我对此稍作改动(编号如下):
void conv(int M, int* h, int L, int* x, int* y) {
int n, m = 0;
for (n = 0; n < L + M - 1; n++) {
for (m = std::max(0, n - L + 1); m <= std::min(n, M - 1); m++) {
*y += *(h + m) * *(x + n - m); //[1]
};
std::cout << "using array index: " << std::endl;
std::cout << "n = " << n << " " << "y = " << y[n] << " " << std::endl;
std::cout << std::endl;
std::cout << "using pointer: " << std::endl;
std::cout << "n = " << n << " " << "y = " << *y << " " << std::endl; //[2]
std::cout << std::endl;
y++; //[3]
}
}
在这种情况下,只有通过指针访问值才能提供正确的输出,而通过数组索引访问它会提供随机垃圾。
我的测试代码是:
int main()
{
const int M = 5; const int L = 6;
int y[M + L - 1] = {};
int x[L] = { 1, -2, 5, 3, 8, -4 };
int h[M] = { 1,2,3,4,5 };
int* yPtr = y; int* hPtr = h; int* xPtr = x;
conv(M, hPtr, L, xPtr, yPtr);
std::cout << "value after leaving conv" << std::endl;
for (int i = 0; i < M+L-1; i++) {
std::cout << "i = " << i << " " << "y = " << y[i] << std::endl;
}
}
即使在conv 的 for 循环中访问数组元素时,它也始终提供正确的输出。
作为参考,正确的输出是y = {1, 0, 4, 11, 26, 31, 53, 35, 24, -20}。
我在conv 的第二个示例中做错了什么,在使用数组索引时得到了错误的值?
【问题讨论】:
-
我不知道为什么 -- 你的编译器工具集中有一个工具,那就是debugger。你没有提到你是否使用过调试器。
-
如果你一直使用索引,你会看到第一个打印
y[n]两次,而第二个打印第一个y[n]然后y[0]。