1 Востаннє редагувалося Ярослав (01.05.2013 09:20:24)

Тема: Покажчик на функцію

Є простий приклад реалізації покажчика на функцію:

#include <stdio.h>
#include <stdlib.h>

void my_qsort(int (*comp)(int, int));
int numcmp(int, int);
/*
 * 
 */
int main(int argc, char** argv) {
    int numeric = 1;
    my_qsort((int (*)(int, int))(numcmp));
    return (EXIT_SUCCESS);
}

void my_qsort(int(*comp)(int, int)){
    if((*comp)(2, 3))
            printf("1");
} 

int numcmp(int s1, int s2){
    return 1;
}

Яким чином компілятором опрацьовується оцей рядок?

    my_qsort((int (*)(int, int))(numcmp));

2

Re: Покажчик на функцію

Це одна з причин чому я люблю асемблер :)

    my_qsort((int (*)(int, int))(numcmp));

Якщо незрозумілий цей шматок:

(int (*)(int, int))(numcmp)

То це вказівник на функцію numcmp, яка бере 2 int параметра

Подякували: leofun011

3 Востаннє редагувалося Ярослав (01.05.2013 09:52:44)

Re: Покажчик на функцію

Як воно читається я розумію і усвідомлюю смисл того рядку. А як саме його опрацьовує компілятор, конкретно, чому ми не пишемо так:

    my_qsort((int (*)(numcmp)(int, int)));

4

Re: Покажчик на функцію

Тому що вказівник на функцію це тип даних такий самий, як і int/char/unsigned int.

Подякували: leofun011

5 Востаннє редагувалося Ярослав (01.05.2013 10:09:04)

Re: Покажчик на функцію

В цьому рядку void my_qsort(int (*comp)(int, int)); ідентифікатор comp стоїть перед дужками з аргументами, а цьому my_qsort((int (*)(int, int))(numcmp)); після. Якщо в другому рядку перенести numcmp на місце між зірочкою і аргументами, то програма не скомпілюється.
От тому у мене і виникає запитання. Чому в цьому рядку ми обов'язково вказуємо ідентифікатор функції після дужок з аргументами, а не перед ними?

6

Re: Покажчик на функцію

Ярослав написав:

В цьому рядку void my_qsort(int (*comp)(int, int)); ідентифікатор comp стоїть перед дужками з аргументами, а цьому my_qsort((int (*)(int, int))(numcmp)); після. Якщо в другому рядку перенести numcmp на місце між зірочкою і аргументами, то програма не скомпілюється.
От тому у мене і виникає запитання. Чому в цьому рядку ми обов'язково вказуємо ідентифікатор функції після дужок з аргументами, а не перед ними?

У даному разі ми маємо дві принципово різні операції: оголошення параметра типу "покажчик на функцію" та передача параметра вказаного типу до функції.

У вас програма скомпілюється і при

 my_qsort(/*(int (*)(int, int))*/(numcmp));

оскільки numcmp-у-собі де-факто є покажчиком на функцію numcmp(). Ви ж у коді просто явно звели цей покажчик до того самого типу. :

(int (*)(int, int))(numcmp)

Цей же варіант, до слова, може виглядати й наочніше:

typedef int (*MyPFuncType)(int, int));

//...

my_qsort( (MyPFuncType)(numcmp) );