我需要创建一个函数,将数组作为输入(及其尺寸X,Y或ROW,COL)
并计算所有行的总和(将每个总和存储在{{1的单元格中) }}阵列。
对于NxN阵列的输入似乎工作得很好。
对于KxN阵列的输入,其中K> N似乎完美地工作。
new
答案 0 :(得分:2)
lsum+=*(ar+i*X+j);
应该是
lsum += *(ar+i*Y+j);
或
lsum += *(ar+i+j*X);
这两者之间的区别在于选择的内存布局。 i
计算当前行,而j
计算当前列。矩阵现在有两种可能的(简单)内存布局(假设X=3
和Y=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
是一个保留关键字。