gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:57:24 25 4
gpt4 key购买 nike

我需要创建一个函数,将数组作为输入(及其维度 X、Y 或 ROW、COL)
并计算所有行的总和(将每个总和存储在 new 的单元格中)大批。
对于 NxN 数组的输入似乎工作正常。
对于 KxN 数组的输入,其中 K>N 似乎工作得很好。

int* linesum(int *ar,int X,int Y)
{
int i,j,lsum=0;
int *new=malloc(X*sizeof(int));
for(i=0;i<X;i++){
for(j=0;j<Y;j++){
lsum+=*(ar+i*X+j);
}
*(new+i)=lsum;
lsum=0;
}
return new;
}

最佳答案

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

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

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

这两种布局为您提供了上面显示的两种不同的指针算术。您在初始化数组时决定了布局,但您尚未发布该布局,因此我不知道您的情况中哪一个是正确的。

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

您还可以使用双数组/指针来绕过此类指针算术。另外我想最好避免使用 new 作为变量名,即使这是 C。如果有人尝试用 C++ 编译器编译你的代码,它会抛出错误,因为 new 是那里的保留关键字。

关于在某些情况下,数组输入打印错误结果的自定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com