2016-11-12 3 views
0

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

Прототип массива: void *(*arg_handler[4])(void *arg);

Я использую функцию с именем списка, чтобы сохранить разные адреса и возвращает адрес функции с конкретными аргументами:

void *list(int x, void *arg) 
{ 
    arg_handler[0] = &my_putstr; 
    arg_handler[1] = &my_put_printable; 
    arg_handler[2] = &my_put_nbr; 
    arg_handler[3] = &my_put_nbr; 
    return (arg_handler[x](arg)); 
} 

Я звоню список из основная функция через:

list(f_type(s[x + 1]), va_arg(args, void *)); 

, но я не могу понять, почему я получил эту ошибку:

warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] 

для:

arg_handler[0] = &my_putstr; 
arg_handler[1] = &my_put_printable; 
arg_handler[2] = &my_put_nbr; 
arg_handler[3] = &my_put_nbr; 

любая идея?

+0

Его полное предупреждение? Я ожидал, что это будет более конкретным. – alk

+0

Также вы получаете это предупреждение для какой строки кода? – alk

+0

да это полное предупреждение –

ответ

-1

Как сказал алк, предупреждения появлялись из-за того, что 4 функции не были напечатаны как void *. Поэтому вместо создания массива для каждого типа я преобразовал функции как void *:

arg_handler[0] = (void *)my_putstr; 
arg_handler[1] = (void *)my_put_printable; 
arg_handler[2] = (void *)my_put_nbr; 
arg_handler[3] = (void *)my_put_nbr; 
+0

Использование литейного молотка, в основном, почти всегда просто заставляет замолчать компилятор, его в основном никогда ни разу не предотвращает запуск кода в неопределенное поведение ... – alk

+0

f_type управляет анализом данных. –

+0

Таким образом, данные всегда будут соответствовать типу функции, которую я вызываю в обработчике аргументов –

Смежные вопросы