在某些情况下,自定义函数与数组输入打印错误?

时间:2014-01-18 14:10:03

标签: c arrays pointers sum malloc

我需要创建一个函数,将数组作为输入(及其尺寸X,Y或ROW,COL)
并计算所有行的总和(将每个总和存储在{{1的单元格中) }}阵列。
对于NxN阵列的输入似乎工作得很好。
对于KxN阵列的输入,其中K> N似乎完美地工作。

new

1 个答案:

答案 0 :(得分:2)

lsum+=*(ar+i*X+j);

应该是

lsum += *(ar+i*Y+j);

lsum += *(ar+i+j*X);

这两者之间的区别在于选择的内存布局。 i计算当前行,而j计算当前列。矩阵现在有两种可能的(简单)内存布局(假设X=3Y=4为例):

0 1  2  3
4 5  6  7
8 9 10 11

0 3 6  9 
1 4 7 10
2 5 8 11

其中number是存储矩阵元素的线性数组的索引。在第一种情况下,只需添加1即可获得给定行的下一个元素,但您需要跳转4(列数Y)才能到达下一行

在第二种情况下,您需要跳转X=3(行数)才能到达给定行中的下一个元素,但如果您想要到达下一行,则只需添加{ {1}}。

这两个布局为您提供了上面显示的两个不同的指针算术。您在初始化阵列时确定了布局,但尚未发布,所以我不知道哪一个是正确的。

请注意,从性能角度来看(如果矩阵非常大),第一种情况对于您的特定访问模式更好,因为可以逐个元素地读取数组,而第二种布局需要重复跳转{{1}内存中的元素。

你也可以使用双数组/指针来绕过这样的指针算法。另外我想避免将1作为变量名称会很好,即使这是C.如果有人试图用C ++编译器编译你的代码,它会抛出错误,因为Y是一个保留关键字。