gpt4 book ai didi

c - 为什么这两个指针访问相同的元素?

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:13 24 4
gpt4 key购买 nike

我正在开发一个 MPI 程序,我的每个进程都有以下代码:

#define CELL(A,X,Y,MX,MY) (*(A+Y*MX+X))
int bs_x = 1;
int bs_y = 1;

int *this_data=calloc((bs_y+2)*(bs_x+2), sizeof(int));

//...

int *recv_top = calloc(bs_x, sizeof(int));
int *recv_left = calloc(bs_x, sizeof(int));

// Now I make some operations and I want to assign
// the value of recv_top and recv_left to this_data

for(i=0; i<bs_x; ++i) CELL(this_data, i+1, 0, bs_x+2, bs_y+2) = recv_top[i]; // Sets both (0,1) and (1,0) to recv_top!!
for(i=0; i<bs_x; ++i) CELL(this_data, 0, i+1, bs_x+2, bs_y+2) = recv_left[i]; // Again sets both (0,1) and (1,0) to recv_left!!

现在问题来了,当我检查元素 (1,0) 的值时,我发现第一次调用还保存了元素 (0,1) 中 recv_top 的值:

for(i=0; i<bs_x; ++i) CELL(this_data, i+1, 0, bs_x+2, bs_y+2) = recv_top[i];
if (rank == 4)
{
printf("Rank 4 value at (%d,0) = %d\n", 1, CELL(this_data,1,0,bs_x+2,bs_y+2));
printf("Rank 4 value at (0,%d) = %d\n", 1, CELL(this_data,0,1,bs_x+2,bs_y+2));
}
//Rank 4 value at (1,0) = 12
//Rank 4 value at (0,1) = 12

接下来:

for(i=0; i<bs_x; ++i) CELL(this_data, 0, i+1, bs_x+2, bs_y+2) = recv_left[i];
if (rank == 4)
{
printf("Rank 4 value at (%d,0) = %d\n", 1, CELL(this_data,1,0,bs_x+2,bs_y+2));
printf("Rank 4 value at (0,%d) = %d\n", 1, CELL(this_data,0,1,bs_x+2,bs_y+2));
}
//Rank 4 value at (1,0) = 1024
//Rank 4 value at (0,1) = 1024

也更新 (1,0)。

他们不应该这样做,因为他们不一样:

CELL(this_data, 0, i+1, bs_x+2, bs_y+2) = (*(this_data+(i+1)*(bs_x+2))
CELL(this_data, i+1, 0, bs_x+2, bs_y+2) = (*(this_data+i+1))

知道我做错了什么吗?

最佳答案

代码#define CELL(A,X,Y,MX,MY) (*(A+Y*MX+X))应该是

#define CELL(A,X,Y,MX,MY) ( *( (A) + (Y) * (MX) + (X) ) )

注意括号!

顺便说一句,为什么不使用内联函数?有了内联函数,您将拥有更好的代码。

在你的版本中代码

CELL(this_data, 0, i+1, bs_x+2, bs_y+2)

扩展为:

*(this_data+i+1*bs_x+2+bs_y+2)

这和你想象的不一样

更新

我仍然建议你把它做成一个内联函数!

inline void CELL(int* A, int X, int Y, int MX, int MY, int newValue)
{
int * cell = A + Y * MX + X;
*cell = newValue;
}

关于c - 为什么这两个指针访问相同的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24461709/

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