调用pthread_create错误-应为“void”之前的主表达式

调用pthread_create错误-应为“void”之前的主表达式,c,multithreading,pthreads,C,Multithreading,Pthreads,这是一个矩阵乘法代码。它创建一个线程,将第一个矩阵的每一行乘以第二个矩阵,并将结果保存在矩阵C中。 它在“void”之前的pthread_create行中给出了一个错误。 我在UBTO 13.10虚拟机上运行此代码。 提前谢谢 #include <stdio.h> #include <stdlib.h> #include <pthread.h> struct matrices { int matrixA[10][10]; int matrix

这是一个矩阵乘法代码。它创建一个线程,将第一个矩阵的每一行乘以第二个矩阵,并将结果保存在矩阵C中。 它在“void”之前的pthread_create行中给出了一个错误。 我在UBTO 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;
}

您的代码包含小错误,但逻辑是正确的,不要担心。 我下载了代码并在我的机器上进行了测试,因此请注意以下几点:

这行应该这样写

pthread_create(&threads[i],NULL, matrixMul, &i);
因为根据pthread的规范,create应该将void指针带到runner函数,将void指针带到参数。您不需要添加void*,因为您已经将runner函数matrixMul声明为void*。 这里的主要错误是void&i,应该是&i,因为您已经在runner函数的原型中将此参数delcaired为void*。您也应该像下面这样传递runner函数&matrixMul

其他注意事项:代码审查

你不应该把你的逻辑放在else语句中,你只需要在printfDimensions error!之后;写入exit-1;因为这基本上就是你在尺寸误差的情况下所做的。 检查pthread_create和pthread_join的返回值状态
代码在哪里?抱歉..这是@user3642723,错误消息将指示发生错误的行号。您能否重新编辑问题并添加错误的全文?如果您编辑问题代码以指示错误发生的行,这也会很有帮助,因为问题中的代码不会显示行号。这不应该是pthread_create&threads[i],NULL,matrixMul,void*&i;?matrixMulvoid*没有太多意义……在pthread_create行中,您使用matrixMulvoid*作为参数。但这并没有传递函数指针-调用函数并传递其响应,除非传递给matrixMul的参数不是值-它是一种类型,因此编译器会抱怨。我怀疑您只是想使用matrixMul作为pthread_create的参数。