Как использовать указатель структуры, возвращаемый в основной из функции потока? - PullRequest
0 голосов
/ 24 марта 2019

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

Теперь я правильно выполнил вычисления fib и проверил их, напечатав ряд внутри функции.

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

typedef struct thread_func_param
{
    int *fib;
    int size;
} thread_func_param;
//===================================================    
void *fibGen(void *parameters)
{
    int num = atoi(parameters);
    struct thread_func_param *p;
    p = malloc (sizeof (thread_func_param));

    p->size = fibSize(num);
    p->fib = malloc(sizeof(int)* p->size);

    //Fibonacci Calculations
    //..
    //.

    return (void *) p;
    //pthread_exit((void *) p);
}
//=================================================== 
int main(int argc, char* argv[])
{
    void* thread_result;
    thread_func_param* p = malloc( sizeof(thread_func_param));
    assert(argc > 1);

    int noOfThreads = argc - 1;
    printf("No of Thread = %d\n", noOfThreads);
    pthread_t *threadID = malloc (sizeof (pthread_t) * noOfThreads);

    pthread_attr_t attributes;
    pthread_attr_init(&attributes);

    int i, j;
    for(i = 0; i < noOfThreads; i++)
    {
        pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);
        pthread_join(threadID[i], thread_result);


        //HOW TO USE THE RETURNED DATA?
        for (j = 0; j< ((thread_func_param*)thread_result->size)-1; j++)
        printf(" %d ", (thread_func_param*)thread_result->fib[j]);
    }

    return 0;
}

Решение, которое я использую, в конце концов, для печати данных, дает ошибкуразыменование пустого указателя (я новичок в C).Как я могу это исправить?

1 Ответ

2 голосов
/ 24 марта 2019

Здесь две проблемы:

  1. pthread_join() принимает void** в качестве второго параметра.Код передает только void*.
  2. Чтобы привести указатель, заключите его в скобки.Здесь приведение

    (thread_func_param*)thread_result->size
    

    относится к size, а не к thread_result.Так что вам нужно:

    ((thread_func_param*)thread_result)->size
    

Однако хорошее и чистое решение будет использовать только промежуточный указатель void.Это может выглядеть так:

int main(int argc, char* argv[])
{
  thread_func_param* thread_result;

  ...

    ...

    pthread_create(&threadID[i], &attributes, fibGen, argv[i+1]);

    {
      void * pv; 
      pthread_join(threadID[i], &pv);
      thread_result = pv;
    }

    if (NULL != thread_result) /* perform some sanity checking. */
    {
      for (j = 0; j < thread_result->size - 1; j++)
        printf(" %d ", thread_result->fib[j]);
    }

    ...
...