Я получаю ошибку, когда я передаю указатель на функцию - PullRequest
0 голосов
/ 20 апреля 2019

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

static void iterate_test(void *node);
void delete(void *item);
static void printing(FILE *fp, const char *key, void *item);

int
main()
{   
    char *name = "name.txt";
    int *intp = malloc(sizeof(int));
    typedef void (*func1)(void*, char*, void*) = iterate_test;
    FILE *fp = fopen(name, "w");
    set_t *set = set_new(); // testing making a new set

    //Testing Iterate   
        //Function exists 
            set_iterate(set, intp, iterate_test);
        //Function doesn't exists 
            set_iterate(set, intp, iterate_test);
    //Testing Print

        //Printing normally
            set_print(set, fp, printing);
        //Printing with an inexistant function
            set_print(set, fp, printingfffff);
    //Testing Delete

        //Deleting a normal node
            set_delete(set, delete);
        //Deleteing from null set 
            set_delete(NULL, delete);
    fclose(fp);
    free(name);
    free(intp);
    return 0;
}

// Tests to see if it is able to move through the list set
static void iterate_test(void *node, char *key, void *item)
{
    if (node->key != NULL && node->item != NULL){
    }else{
    }
}

void delete(void *item)
{
    free(item);
}


/* Prints a single item */ 
static void printing(FILE *fp, const char *key, void *item)
{
  char *items = (char*)item;
  fputc('(', fp);
  fputs(key, fp);
  fputc(',', fp);
  fputs(items, fp);
  fputc(')', fp);
  fputc(',', fp);
  free(items);

Даже когда я передаю указатель func1, он выдает ошибку

ошибка / предупреждение, которое я получаю: предупреждение: передача аргумента 3 'set_iterate' из несовместимого типа указателя

set_iterate прототип: void set_iterate (set_t * set, void * arg, void (* itemfunc) (void * arg, const char * key, void * item));

1 Ответ

1 голос
/ 20 апреля 2019
 typedef void (*func1)(void*, char*, void*) = iterate_test;

недопустимо, поскольку typedef определяет тип, а не переменную


Объявление

 static void iterate_test(void *node);

неверно, потому что функция

 static void iterate_test(void *node, char *key, void *item)
 {
    ...
 }

замените ее на

 static void iterate_test(void *node, char *key, void *item);

Даже когда я передаюУказатель func1 выдаёт мне ошибку

После предыдущего исправления void (*func1)(void*, char*, void*) = iterate_test; правильно (без typedef)


Ошибка / предупреждение Я получаю: предупреждение: передача аргумента 3 'set_iterate' из несовместимого типа указателя

прототип set_iterate: void set_iterate (set_t * set, void * arg, void (* itemfunc) (void * arg, const char * key, void * item));

указатель функции, ожидаемый set_iterate, требует const char * для своего второго параметра, но iterate_test имеет char * для своего второго параметра, вот почемусообщение

Удалите const в профиле set_iterate или измените объявление и определение iterate_test на

 static void iterate_test(void *node, const char *key, void *item);
 ...
 static void iterate_test(void *node, const char *key, void *item)
 {
     ...
 }

Конечно, во втором случае, если вы все еще хотите сохранить указатель в func1 , вам нужно иметь

void (*func1)(void*, const char*, void*) = iterate_test;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...