2013-12-14 3 views
0

Я написал следующий код для реализации умножения матриц, но неоднократно получал ошибку ошибки сегментации. Кажется, все в порядке. может кто-нибудь сказать мне, в чем проблема.ошибка сегментации в распределении 2D-массива и вызов потока

это код:

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

int matrixSize; 
double ** a, ** b, ** c; 

typedef struct tparms { 
    int row; 
    int col; 
}tparms_t; 

double ** allocateMatrix() { 
    int i; 
    double *vals, **temp; 

    //allocate values 
    vals = (double *) malloc (matrixSize * matrixSize * sizeof(double)); 

     // allocate vector of pointers 
    temp = (double **) malloc (matrixSize * sizeof(double*)); 

    for(i=0; i < matrixSize; i++) 
     temp[i] = &(vals[i * matrixSize]); 
     return temp; 
} 

void* multiply (void* _arg){ 
    tparms_t * arg = (tparms_t *) _arg; 
    int i; 
    double sum; 
    for (i=0; i<matrixSize; i++) 
     sum += a[arg->row][i] * b[i][arg->col]; 
    c[arg->row][arg->col] = sum; 
} 

void main(int argc, char *argv[]) { 

    pthread_t *threads; 

    if (argc != 2) { 
     printf("Usage: %s <size>, where size is dimension of square matrix\n", argv[0]); 
     exit(1); 
    } 
    int matrixSize = atoi(argv[1]); 

    threads = (pthread_t *) malloc(matrixSize * matrixSize * sizeof(pthread_t)); 

    a = allocateMatrix(); 
    b = allocateMatrix(); 
    c = allocateMatrix(); 

    int i, j; 


    for (i=0; i<matrixSize; i++){ 
     for (j=0; j<matrixSize; j++){ 

      a[i][j] = i + j; 
      b[i][j] = i + j; 
     } 
    } 

    for (i=0; i<matrixSize; i++){ 
     for (j=0; j<matrixSize; j++){ 

      tparms_t * tt = (tparms_t *)malloc(sizeof(tparms_t)); 
      tt->row = i; 
      tt->col = j; 

      pthread_create(&threads[i*matrixSize + j], NULL, multiply, (void*)tt); 

     } 
    } 

    // two for for arrays 
    for (i=0; i<matrixSize; i++){ 
     for (j=0; j<matrixSize; j++){ 
      //do something ... 
      pthread_join(threads[i*matrixSize+j], NULL); 
     } 
    } 
    // end of two fors 
} 

есть структура, чтобы передать данные потоков, функцию распределения для выделения массивов и в основной функции я решил создать поток для каждого из матричных элементов. затем функцию соединения, чтобы подождать, пока все потоки выполняют свою работу и не создадут элементы матрицы c.

+0

Я не вижу здесь двухмерных массивов. Может быть, ваша проблема в том, что вы пытаетесь обрабатывать указатели, как если бы они были массивами? –

+0

жаль, что у меня этого не было. так как я должен получить доступ к массивам a, b или c? – muradin

ответ

2

У вас есть int matrixSize = atoi (argv[1]);. Удалите int, потому что это создает другой локальный экземпляр matrixSize.

+0

это был пункт. большое спасибо. – muradin

Смежные вопросы