Не могу обойти, как передать функцию в качестве параметра - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь передать эту функцию: void* checkMatrix(); в качестве аргумента этой функции: void createThreads(void*(*f));.

Я прочитал здесь пост, поэтому мое заявление выше является результатом этого.

Я вызываю функцию следующим образом: createThreads(checkMatrix);, но она предупреждает меня, что тип несовместим [void ** и void * ()].Я могу обойтись с быстрым приведением, но это не решит проблему.

Наконец, я пишу такую ​​функцию (простая инициализация):

void createThreads(void* (*f)) {
    pthread_t* a;
    int i;

    a = (pthread_t*) malloc(*arr.l * sizeof(pthread_t));
    if (a == NULL) {
        fprintf(stderr, "ERROR!\n");
        exit(1);
    }

    for (i = 0; i < *arr.l; i++) {
        if (pthread_create((a + i), NULL, (void*) &f, NULL)) {
            fprintf(stderr, "ERROR IN THREAD CREATION!\n");
            exit(2);
        }
    }

    for (i = 0; i < *arr.l; i++)
        pthread_join(*(a + i), NULL);
}

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

Спасибо за ваше время!

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Для начала void* checkMatrix(); является устаревшим стилем и не должен использоваться.Во-вторых, функции обратного вызова pthread принимают void* в качестве параметра.Вместо этого используйте void* checkMatrix(void*);.

Чтобы передать его функции, просто выполните

void createThreads (void* (*f)(void*))

. Рекомендуется использовать указатели на функции, иначе использовать typedefs для повышения читабельности.Например, вы можете приготовить что-то вроде

typedef void* pthread_callback (void*);

void createThreads (pthread_callback* f)
0 голосов
/ 31 мая 2018

Попробуйте изменить сигнатуру функции на void createThreads(void* (*f)(void *)) и измените вызов функции pthread_create на pthread_create((a + i), NULL, f, NULL)

0 голосов
/ 31 мая 2018

void* (*f) это просто void **f с набором избыточных скобок.Вы, вероятно, хотели использовать это для типа параметра:

void* (*f)()

Однако это не , что ожидает pthread_create.Предполагается, что основная функция потока возвращает void* и принимает void* параметр .Так что вы действительно хотите, вероятно, это:

void createThreads(void* (*f)(void*)) {
  /* ... as before ... */
          if (pthread_create((a + i), NULL, f, NULL)) {
  /* ... as before ... */
}
...