我正在尝试使用结构将这些矩阵传递给pthread。
矩阵分配
double **A = (double **)malloc(size_matrix * sizeof(double*));
double **B = (double **)malloc(size_matrix * sizeof(double*));
double **C = (double **)malloc(size_matrix * sizeof(double*));
for(i = 0; i < size_matrix; i++){
A[i] = (double *)malloc(size_matrix * sizeof(double));
B[i] = (double *)malloc(size_matrix * sizeof(double));
C[i] = (double *)malloc(size_matrix * sizeof(double));
}
传递结构
for (t=0; t<thread_num-1; t++) {
thread_data[t].start = thread_count;
thread_data[t].end = thread_count + rows_per_thread-1;
thread_data[t].A_Matrix = *A;
thread_data[t].B_Matrix = *B;
thread_data[t].C_Matrix = *C;
thread_count += rows_per_thread;
}
结构
typedef struct {
int start;
int end;
double *A_Matrix;
double *B_Matrix;
double *C_Matrix;
} thread_data_t;
线程执行的例程。
void *thread_mul(void *arg)
{
thread_data_t *td = (thread_data_t *) arg;
int i,j,k;
for ( i=td->start; i<=td->end; i++) {
for (j=0; j<size_matrix; j++){
for(k=0;k<size_matrix;k++){
td->*C[i][j]+=td->*A[i][k]*td->(*B[k][j]);
}
}
}
pthread_exit(0);
}
问题是当例程尝试执行它时,
中找不到矩阵td->*C[i][j]+=td->*A[i][k]*td->(*B[k][j]);
我收到一条错误消息,说它希望介于 - &gt;之间。和*。
感谢您的帮助!!
答案 0 :(得分:1)
首先,矩阵成员的声明需要有两个星号,因为它是指向指针的指针:
typedef struct {
int start;
int end;
double **A;
double **B;
double **C;
} thread_data_t;
语法td->*C[i][j]
不正确:取消引用运算符(即星号*
)不是必需的,因为方括号[]
会将间接级别降低一级:
td->C[i][j] += (td->A[i][k]) * (td->B[k][j]);
注意:这与您的问题无关,但是当您需要取消引用存储在struct
中的指针时,您可以将星号应用于表达式的结果,如下所示:{{1} }。那里不需要括号,因为*(td->ptrC[i][j])
具有更高的优先级,但我还是将它们放在一起来说明发生了什么。