0

谁能建议我为什么会出现以下错误以及我的程序是否正确?我的程序出现以下错误。我没有得到任何结果输入文件是
2 3
1 2 3
3 4 5
3 4
3 5 6 7
1 3 4 8
2 3 5 6
我的程序是

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
int m,p,q,n; Matrix A has dimensions m, n and B has dimensions p,q
int **a, ** b, **c;
void *mulrow(void* row);

void print(int** a,int _i, int _j) 
{
int i,j;
for (i = 0; i < _i; ++i) {
    for (j = 0; j < _j; ++j)
    printf("%d  ",a[i][j]);
    printf("\n");
    }
}

void writeMat(int** a,int _i, int _j, FILE* f)
{
    int i,j;
    for (i = 0; i < _i; ++i) {
        for (j = 0; j < _j; ++j)
            fprintf(f,"%d ",a[i][j]);
        fprintf(f,"\n");
    }
}

void matrix_multiply()
{
    // Every row of matrix is computed 
    int i,r;
    pthread_t** threads = (pthread_t**) malloc(sizeof(pthread_t*)*m);
    int* rows = (int*) malloc(sizeof(int)*m);

    for (i = 0; i < m; ++i) {
        threads[i] =(pthread_t*) malloc(sizeof(pthread_t));
        rows[i] = i;
        r = pthread_create(threads[i], NULL, mulrow, (void*) &rows[i]);
        if (r<0)
            printf("failed to create thread at mul2 at i =  %d\n",i);
    }

    for (i = 0; i < m; ++i)
        pthread_join(*threads[i],NULL);
    free(threads);
    free(rows);
}

void *mulrow(void* row)
{
    int j, i = *((int*)row) ,k;

    for (j = 0 ; j < n ; j ++)
        for (k = 0 ; k < p ; k++)
            c[i][j] += a[i][k] * b[k][j];
    pthread_exit(NULL);
}

int **read_matrix(FILE *f,int m, int n)
{
    int i,j;
    int **a = (int**) malloc(sizeof(int *)*m);
    for (i = 0; i < m; ++i) {
        a[i] = (int *) malloc(sizeof(int)*n);
        for (j = 0; j < n; ++j) {
        fscanf(f,"%d",&a[i][j]);
    }
    return a;
}

int main(void)  
{
    int i,j;
    FILE* in  = fopen("input.txt","r");
    fscanf(in,"%d %d",&m,&p);
    a = read_matrix(in,m,p);
    fscanf(in,"%d %d",&q,&n);
    b = read_matrix(in,q,n);
    if (p!=q){
        printf("incompatible matrices --not supported\n");
        return 0;
    }
    c = (int**) malloc(sizeof(int *)*m);
    for (i = 0; i < m; ++i){
        c[i] = (int *) malloc(sizeof(int)*n);
        for (j = 0; j < n; ++j)
            c[i][j] = 0;
    }
    printf("Result of multiplication \n");
    matrix_multiply();
    return 0;
}
4

2 回答 2

0

线

int j, i = *((int*)row) ,k;

正在给你带来问题。C 不允许多个初始化程序,并且不能在同一语句中的 decalrartions 之间进行赋值。在 = 的右侧,您使用的是逗号运算符,它执行左边的语句,然后执行并返回右边的结果。所以你将 j 和 i 都设置为 k (不管是什么)

我想你想要的是:

void *mulrow(void* row)
{
    int i = *((int*)row);
    int j;
    int k;

    for (j = 0 ; j < n ; j ++)
        for (k = 0 ; k < p ; k++)
            c[i][j] += a[i][k] * b[k][j];
    pthread_exit(NULL);
}
于 2013-02-20T23:01:28.223 回答
0

在您的程序中,您需要注释掉一个语句。

int m,p,q,n; //Matrix A has dimensions m, n and B has dimensions p,q

最后一行缺少一个右大括号,即之后return 0;

通过此更改并与 pthread 库链接应该可以编译您的程序。

gcc -o test_exe file.c -lpthread

我已经成功编译了你的代码。

于 2013-02-19T00:37:52.667 回答