Как правильно передать массив в функцию pthread - PullRequest
0 голосов
/ 13 июня 2019

Что я хочу сделать, это перебрать массив с помощью pthread и вывести его значения.Проблема в том, что выходные данные полностью отличаются от того, что я ожидаю.

#include <unistd.h>
#include <stdio.h>
#include <stdint.h>


int elements = 0;
int n = 0;

void *print_array(void* arg); 


int main()
{   
    /* ----- User input ----- */
    printf("Creating a NxN array. Give N: ");
    scanf("%d", &n);
    int element_array[n*n];
    elements = n*n;

    printf("Give the elements of the %dx%d array \n", n, n);
    for (int i=0; i<n; i++) {
        printf("\n");
        for (int j=0; j<n; j++) {
            printf("(%d,%d): ", i, j);
            scanf("%d", &element_array[i*n+j]);
            //This way the array will be filled line by line
            //eg. for n=4 --> element_array[0..3 then 4..7 then 8..11 then 12..15]
        }
    }


    pthread_t newthread;
    pthread_create(&newthread, NULL, print_array, (void *)element_array);
    pthread_join(newthread, NULL);

    return 0;
}


void* print_array(void* arg) {
    long int *element_array = (long int *) arg;
    for (int i = 0; i < elements; i++) {
        printf("Element %d of the array: %ld\n", i, element_array[i]);
    }

}

Для входа массива 2x2, например (0,0): 1, (0,1): 1, (1,0): 1, (1,1): 1 вывод будет:

Element 0: 4294967297
Element 1: 4294967297
Element 2: 194
Element 3: 8589934594

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

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

В print_array вы приводите свой аргумент к long int*, а не к int*.Это заставляет вас читать мимо вашего буфера.Кроме того, первое значение, которое вы читаете element_array[0], вероятно, является комбинацией первых двух значений.

0 голосов
/ 13 июня 2019

Массив int * передается как void *, затем приводится к long int *.Измените свою функцию на:

void* print_array(void* arg) {
    int *element_array = (int *)arg;

    for (int i = 0; i < elements; i++) {
        printf("Element %d of the array: %d\n", i, element_array[i]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...