2015-12-18 7 views
-3

поплавок Аш (символ ** с, ИНТ б, символ * а) { ...... } поплавок Ма (символ ** с, ИНТ б, голец * а) { ...... }как вернуть apointer функционировать с

float(*pointer)(char** c, int b, char* a); 

?????Funk(int size) 
{ 
switch (startingLetter) 
    { 
    case 'a': 
     return(&Aco); 
     break; 
    case 'b': 
     return(&Ma); 
     break; 
    default: 
     return NULL; 
     break; 
    } 
} 

Если я хочу «Funk», чтобы вернуть NULL или вернуть указатель на функцию Ма/Асо, что мне нужно сделать, чтобы написать вместо ??????

+5

http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work?rq=1 – TsSkTo

+0

При работе с указателями на функции, это проще, если вы определите для него 'typedef'. – Barmar

ответ

1

Это должно помочь:

#include <stdio.h> 

typedef double (*div_type)(int, int); 

double div(int a, int b) { 
    return ((double)a/(double)b); 
} 
div_type div_fun() { 
    return (div); 
    // or: return (NULL); 
} 

int main() { 
    div_type fun_ptr = div_fun(); 
    if (fun_ptr != NULL) { 
     printf("%f\n", fun_ptr(4, 2)); 
    } else { 
     puts("Undefined"); 
    } 

    return (0); 
} 

Это произведет

% ./a.out 
2.000000 
+0

и как насчет NULL? –

+0

Просто позвольте div_fun вернуть NULL. Очевидно, что в моем примере это создало бы segfault. – Jeremy

0

без:

определений типов
float (*Funk(int size))(char** c, int b, char* a) 

, который гласит

 Funk           -- Funk 
     Funk(  )        -- is a function 
     Funk(int size)        -- with parameter size 
     *Funk(int size)        -- returning a pointer 
     (*Funk(int size))(      ) -- to a function 
     (*Funk(int size))(char **c, int b, char *a) -- with parameters a,b, and c 
float (*Funk(int size))(char **c, int b, char *a) -- returning float 

Обратите внимание, что при возврате функций вам не нужен &; выражения функций, такие как выражения массива, «распад» на тип указателя. Таким образом, вы можете просто написать:

case 'a': 
    return Aco; 
    break; 
case 'b': 
    return Ma; 
    break; 
default: 
    return NULL; 
    break; 
+0

большое спасибо –

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

  • Нет связанных вопросов^_^