2015-01-31 2 views
0

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

typedef uint8 (*fnHandlr)(uint16 iD, uint32 Process); 

const funHandlr arr[] = 
{ 
    fun1, fun2, fun3 
} 
uint8 fun1(uint16 iD, uint32 Process) 
{ 
    /*Piece of code*/ 
} 
uint8 fun3(uint16 iD, uint32 Process) 
{ 
    /*Piece of code*/ 
} 
uint8 fun3(uint16 iD, uint32 Process) 
{ 
    /*Piece of code*/ 
} 

мои вопросы ниже,

  1. Что такое использование ЬурейеЕ здесь.
  2. Если вызвано funHandlr, будут ли вызваны все функции в массиве?
  3. что такое arr [] средний. Сколько байтов выделяет компилятор?

ответ

1
  1. The typedef используется для упрощения объявления массива функциональных указателей.
  2. Как funHandlr является typedef-name, его нельзя назвать.

    Также не может быть вызван массив неявной длины 3 (arr), поскольку он не является ни функцией, ни указателем на функцию.

    Значение funHandlrявляется вызываемым указателем функции.

  3. const funHandlr arr[] = { ... }; определяет массив с именем arr из выведенной длины (3, от инициализаторов) из const funHandlr, funHandlr быть описанными выше типа.
+0

Тогда как fun1, fun2, fun2 будет исполнять –

+0

Я не совсем понимаю ваш смысл, извините. Не могли бы вы уточнить? – Deduplicator

+0

Я имею в виду, если я хочу позвонить fun1. Как я могу позвонить. я могу вызвать прямо fun1(). если да, то, что использует массив функции –

1
  1. typedef облегчает для людей, чтобы «разобрать» определение указателя функции. Здесь здесь нет никакой другой цели, потому что он используется только один раз.
  2. funHandlr не может быть «вызван», потому что это тип. Объект типа funHandlr (например, любой из элементов массива) можно вызвать так же, как вы вызываете указатель на функцию.
  3. arr - это имя массива указателей функций. Когда вы хотите вызвать функцию, примените к ней индекс, а затем введите круглые скобки для вызова.

Вот пример того, как вызвать одну из функций на основе его индекса:

int index; 
printf("Which function you wish to call? Enter 0, 1, or 2 >"); 
scanf("%d", &index); 
// Make a call like this: 
arr[index](myId, myProc); 

Что является использование множества функций, если мы можем fun1, fun2 или fun3 напрямую ?

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

scanf("%d", &index); 
switch (index) { 
case 0: fun1(myId, myProc); break; 
case 1: fun2(myId, myProc); break; 
case 2: fun3(myId, myProc); break; 
} 

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

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

+0

Если это случай, то в чем заключается использование массива функций и указателя функции funHandlr ?. Непосредственно мы можем весело или весело 2, верно? –