Как отправить матрицу в функцию потока? - PullRequest
0 голосов
/ 21 апреля 2020

Мне нужно создать в C программу, способную вычислять определитель случайной матрицы 3х3, используя метод Сарруса. Я должен использовать одну нить (нить A) для вычисления синих диагоналей и вторую нить (нить B) для вычисления красных диагоналей. (См. Img https://i.stack.imgur.com/HQL1U.png)

Мой код:

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

#define m 3
#define n 3

typedef struct thread_params{
    int *data_matrix;
    int diag_result;
} thread_params;


void *diagA (void *params){
    thread_params *pp = (thread_params *) params;

    int **matrix_ptr = &pp->data_matrix;
    int diag = 0;

    diag = matrix_ptr[0][0] * matrix_ptr[1][1] * matrix_ptr[2][2] + matrix_ptr[0][1] * matrix_ptr[1][2] * matrix_ptr[2][0] + matrix_ptr[0][2] * matrix_ptr[1][0] * matrix_ptr[2][1];

    pp->diag_result = diag;
    return (void *) &pp->diag_result;
}

void *diagB (void *params){
    thread_params *pp = (thread_params *) params;

    int **matrix_ptr = &pp->data_matrix;
    int diag = 0;

    diag = matrix_ptr[2][0] * matrix_ptr[1][1] * matrix_ptr[0][2] + matrix_ptr[2][1] * matrix_ptr[1][2] * matrix_ptr[0][0] + matrix_ptr[2][2] * matrix_ptr[1][0] * matrix_ptr[0][1];

    pp->diag_result = diag;
    return (void *) &pp->diag_result;
}

int main(){

    // Create matrix
    int **matrix;
    int row;

    matrix = (int **) malloc(m * sizeof(int *));
    for (row = 0; row < m; row++){
        matrix[row] = (int *) malloc(n * sizeof(int));
    }

    // Matrix initialization
    srand(time(NULL));

    for (int i = 0; i < m; i++){
        for (int j = 0; j < n; j++){
            matrix[i][j] = rand() % 10;
            printf("%d ", matrix[i][j]);
        }printf("\n");
    }

    // Thread creation
    pthread_t threadA_id;
    pthread_t threadB_id;

    int *threadA_returnValue;
    int *threadB_returnValue;

    thread_params threadA_args;
    thread_params threadB_args;

    threadA_args.data_matrix = &matrix[0][0];
    threadA_args.diag_result = 0;

    threadB_args.data_matrix = &matrix[0][0];
    threadB_args.diag_result = 0;


    pthread_create(&threadA_id, NULL, &diagA, &threadA_args);
    pthread_create(&threadB_id, NULL, &diagB, &threadB_args);

    pthread_join(threadA_id, (void **) &threadA_returnValue);
    pthread_join(threadB_id, (void **) &threadB_returnValue);

    // Print results
    printf("%d - %d = %d\n", *threadA_returnValue, *threadB_returnValue, *threadA_returnValue - *threadB_returnValue);

    return 0;
}

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

Я думаю, что моя ошибка вызвана этим типом назначения:

threadA_args.data_matrix = &matrix[0][0];

Как я могу решить эту проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...