Итак, если бы мне дали следующие 2 функции:

void printhex(int x, char y, char z)
{
    printf("%x%x%x,x,y,z);
}
void printdecimal( int x, char y ,char z)
{
    printf("%i%i%i,x,y,z);
}

Как мне определить переменную, то есть указатель на функцию, которой можно присвоить любую из двух заданных функций?

Также в основной функции, как я могу определить, были ли введены какие-либо аргументы командной строки после имени программы при ее выполнении. Если что-то было введено, как я мог бы назначить указатель функции на функцию printhex, но в противном случае назначил бы функцию printdecimal?

c
1
user3773272 14 Апр 2016 в 08:08

6 ответов

Лучший ответ

A1) Так будет выглядеть указатель функции:

void (*myFuncPtr)(int, char, char);

Затем вы назначаете ему такую функцию:

myFuncPtr = &printhex;

И назовите это так:

(*myFuncPtr )(1, 'a', 'b');

A2) Переменная argc в main() сообщит, были ли введены какие-либо аргументы командной строки, кроме самого имени программы. Если argc > 1, то при вызове программы были переданы argc - 1 другие строки. Это потому, что argc также считает имя программы как один из параметров. У вас должно сработать что-то вроде этого:

if (1 < argc)
{
    myFuncPtr = &printhex;
}
else
{
    myFuncPtr = &printdecimal;
}
1
CinCout 14 Апр 2016 в 05:17

Вы можете объявить переменную аналогично:

void (*printSomething)(int, char, char);

Вы можете назначить его одной из этих функций с помощью:

printSomething = &printhex;

Или

printSomething = &printdecimal;

Значок & amp; является совершенно необязательным, поэтому вы также можете, например, просто написать printSomething = printhex;.

Вы также не спрашивали, но вы можете вызвать функцию через указатель (например):

(*printSomething)(1, 2, 3);

Символ * также необязателен, поэтому вы можете просто написать:

printSomething(1, 2, 3);

Если вам также нужна помощь с аргументами командной строки, это должен быть отдельный вопрос.

2
user253751 14 Апр 2016 в 05:11

Используйте typedef

void printhex(int x, char y, char z) {
      printf("%x%x%x",x,y,z);
}

void printdecimal( int x, char y ,char z) {
      printf("%i%i%i",x,y,z);
}     

typedef void (*printer)(int x, char y ,char z);

printer hex = &printhex;
printer dec = &printdecimal;
1
Harry 14 Апр 2016 в 05:12

Если я вас правильно понял, это должно быть просто:

void (* ptr)(int, char, char);
ptr = printhex;

(*ptr)(a, b, c); //this will call the function
1
andersfylling 14 Апр 2016 в 05:13

Такая переменная будет объявлена как

void (*fptr)(int, char, char);

Затем присвоили значение:

fptr = printhex;

И используется для вызова функции:

fptr(13, 'a', 'b');

Или вы можете объявить новое имя для типа функции:

typedef void (*PrintFuncPtr)(int, char, char);

Затем используйте его для объявления переменной:

PrintFuncPtr  fptr;
0
CiaPan 14 Апр 2016 в 05:19

Чтобы определить указатель на функцию, вы должны использовать следующий синтаксис:

return-type (*pointer name)(parameters);

В этом случае вы должны использовать: void (*fp)(int, char, char); для указателя на функцию с именем fp, подходящего для двух определенных вами функций.

Назначение указателя функции может быть выполнено как любой другой указатель, за исключением того, что вы используете имя функции. Например, fp = printhex; будет делать именно то, что он говорит: назначать адрес printhex указателю fp. Вам не нужно использовать оператор & для printhex, потому что идентификатор неявно преобразуется в указатель на функцию.

0
doppelheathen 14 Апр 2016 в 05:21