2015-05-09 2 views
2

Постановка задачи выглядит следующим образом: Вычислить сумму элементов в двумерной матрице, используя отдельный поток, чтобы вычислить сумму каждая строка. Основной поток добавляет эти суммы, выводя окончательный результат.Сумма элементов в матрице с использованием потоков в C

Из того, что я видел до сих пор, код работает правильно. Единственная проблема заключается в том, что я выбираю число строк, которое должно быть меньше, чем количество столбцов (например, rows = 2, columns = 3), поскольку оно вычисляет сумму только для первых двух столбцов, полностью игнорируя третий.

Это код, который я написал в C, и я был бы очень признателен за любую помощь в понимании того, что я сделал неправильно или пропустил. Спасибо.

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

#define M 10 
#define N 10 

int rows, columns, a[M][N], s[M]; 

// compute the sum of each row 

void* f(void* p) { 
    int k = *((int*) p); 
    int i; 
    for (i = 0; i < columns; i++) { 
     s[i] += a[k][i]; 
    } 
    return NULL; 
} 

int main() { 
    int i, j, *p, rc; 
    int sum = 0; 
    pthread_t th[M]; 

    // matrix creation 
    printf("no. of rows = "); 
    scanf("%d", &rows); 
    printf("no. of columns = "); 
    scanf("%d", &columns); 

    for (i = 0; i < rows; i++) { 
     for (j = 0; j < columns; j++) { 
      printf("a[%d][%d] = \n", i, j); 
      scanf("%d", &a[i][j]); 
     } 
    } 

    printf("\nThe matrix is: \n"); 
    for(i=0; i < rows; i++) { 
     for(j=0; j < columns; j++) 
      printf("%d ", a[i][j]); 
    printf("\n"); 
    } 

    // thread creation 
    for (i=0; i < rows; i++) { 
     p = malloc(sizeof(int)); 
     *p = i; 
     rc = pthread_create(&th[i], NULL, f, p); 
     if (rc != 0) { 
      printf("Thread creation failed"); 
      exit(-1); 
     } 
    } 

    for (i=0; i < rows; i++) { 
     pthread_join(th[i], NULL); 
    } 
    // compute the final sum 
    for (i=0; i < rows; i++) { 
     sum += s[i]; 
    } 
    printf("The sum is = %d\n", sum); 

    return 0; 
    } 

ответ

0

Вам нужно

s[k] += a[k][i]; 

вместо

s[i] += a[k][i]; 

Сумма каждой строки должны быть добавлены в каждом индексе каждого row, как s объявлен s[M].

+0

О, право. Благодаря! – Alexandra

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