这是一个矩阵乘法代码。它创建一个线程,将第一个矩阵的每一行乘以第二个矩阵,并将结果保存在矩阵C 中。
它在pthread_create行expected primary-expression before 'void'
中出错
我在ubunto 13.10虚拟机上运行此代码
提前谢谢。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
struct matrices
{
int matrixA[10][10];
int matrixB[10][10];
int matricC[10][10];
int r1,r2,c1,c2;
}*ptr;
int p;
void *matrixMul(void *);
int main()
{
int i=0,j=0;
pthread_t threads[10];
ptr=(struct matrices*)malloc(sizeof(struct matrices));
printf("Enter size of first matrix(Rows then Columns)");
scanf("%d",&(ptr->r1));
scanf("%d",&(ptr->c1));
printf("Enter elements of first array : ");
for(i=0; i<ptr->r1; i++)
{
for(j=0; j<ptr->c1; j++)
{
scanf("%d",&ptr->matrixA[i][j]);
}
}
printf("Enter size of second matrix(Rows then Columns)");
scanf("%d",&(ptr->r2));
scanf("%d",&(ptr->c2));
if(ptr->c1!=ptr->r2)
{
printf("Dimensions ERRORR! ");
}
else
{
printf("Enter elements of second array : ");
for(i=0; i<ptr->r2; i++)
{
for(j=0; j<ptr->c2; j++)
{
scanf("%d",&ptr->matrixB[i][j]);
}
}
for(i=0;i<ptr->r1;i++)
{
for(j=0;j<ptr->c2;j++)
{
ptr->matricC[i][j]=0;
}
}
for (p=0;p<ptr->r1;p++)
{
**********pthread_create(&threads[p],NULL, *matrixMul,void &p);**********
}
for(i=0;i<ptr->r1;i++)
{
pthread_join(threads[i],NULL);
}
for(i=0;i<ptr->r1;i++)
{
for(j=0;j<ptr->c2;j++)
{
printf("%d",ptr->matricC[i][j]);
}
}
}
return 0;
}
void *matrixMul(void *rownum)
{
int *i;
int n=0,m=0;
i=(int*)rownum;
for(n=0;n<ptr->c2;n++)
{
for(m=0;m<ptr->c1;m++)
{
ptr->matricC[*i][n]+=(ptr->matrixA[*i][m])*(ptr->matrixB[m][n]);
}
}
return NULL;
}
答案 0 :(得分:2)
您的代码包含轻微错误,但逻辑是正确的,请不要担心 我下载了代码并在我的机器上进行了测试,因此请注意以下事项:
这一行应该这样写......
pthread_create(&threads[i],NULL, matrixMul, &i);
因为根据pthread library的规范,pthread_create
应该采用void指针指向runner函数和void指向参数的指针。您不需要添加(void *)
,因为您已将转轮功能matrixMul
声明为void *
。
您的主要错误此处为(void) &i
,并且应该只有&i
,因为您已在转轮功能的原型中将此参数指定为void *
。您也应该像&matrixMul
一样传递跑步者功能。
其他一些注释:&#34; Code Review&#34;
printf("Dimensions ERRORR! ");
写exit(-1);
之后,因为这基本上是你在维度错误时所做的。pthread_create
和pthread_join