如果你知道这背后的实际问题,请编辑标题。 我用C中的指针面对一个非常奇怪的行为。
版本1(我想要的但是输出不是我期望的):
void *partial_evolve(void * pars)
{
evolve_pars *p = (evolve_pars*)pars;
unsigned char *in = *p->grid_in;
unsigned char *out = *p->grid_out;
for (int t = 0; t < p->time_steps; ++t)
{
for (int y = 0; y < p->dim_y; ++y)
for (int x = p->start_x; x < p->end_x; ++x)
evolve(in, out, p->dim_x, p->dim_y, x, y);
swap(&in, &out);
pthread_barrier_wait(&barrier);
}
}
版本2(输出正确,但我必须使用两个我不想要的等待):
void *partial_evolve(void * pars)
{
evolve_pars *p = (evolve_pars*)pars;
for (int t = 0; t < p->time_steps; ++t)
{
for (int y = 0; y < p->dim_y; ++y)
for (int x = p->start_x; x < p->end_x; ++x)
evolve(*p->grid_in, *p->grid_out, p->dim_x, p->dim_y, x, y);
pthread_barrier_wait(&barrier);
swap(p->grid_in, p->grid_out);
pthread_barrier_wait(&barrier);
}
}
我使用的输入结构是:
typedef struct
{
unsigned int dim_x;
unsigned int dim_y;
unsigned char **grid_in;
unsigned char **grid_out;
unsigned int start_x;
unsigned int end_x;
unsigned int time_steps;
int is_master_thread;
} evolve_pars;
交换功能:
void swap(unsigned char **a, unsigned char **b)
{
unsigned char *tmp = *a;
*a = *b;
*b = tmp;
}
无论代码的其余部分如何,在两种情况下,partial_evolve函数的指针操作都应该表现相同。 有什么想法吗?
答案 0 :(得分:1)
在第一个版本中,使用2个本地指针的地址调用swap()
函数。
swap(&in, &out);
在第二个版本中,参数是结构的一部分
swap(p->grid_in, p->grid_out);