2010-02-03 11 views
16

¡Esto me lo preguntaron en una entrevista! que realmente se confundióarray de N punteros a funciones que devuelven punteros a las funciones

  • ¿Cómo declarar una matriz de N punteros a funciones que devuelven punteros a funciones regresar punteros a caracteres

podría por favor, ayudar a nadie?

+3

qué pregunta de entrevista tonta. Hay una razón para internet. Es así que podemos buscar la sintaxis arcana cuando sea necesaria y no tener que saturar nuestro cerebro con ella. –

+8

'apt-get install cdecl; echo declara matriz de puntero a función que devuelve puntero a función que devuelve puntero a char | cdecl; '>>>' char * (* (* var [])())() ' –

+1

@Doug T: Me parece razonable. Saber cómo abordar declaraciones complicadas es, desafortunadamente, una habilidad muy útil en C. –

Respuesta

33

Typedefs son para wusses. He aquí un método sencillo, mecánico para averiguar declaraciones peludas:

  a     -- a 
      a[N]    -- is an N-element array 
     *a[N]    -- of pointers 
     (*a[N])()   -- to functions 
     *(*a[N])()   -- returning pointers 
     (*(*a[N])())()  -- to functions 
    *(*(*a[N])())()  -- returning pointers 
char *(*(*a[N])())()  -- to char. 

Por lo tanto, la respuesta está en el barrio de char *(*(*a[N])())();. Digo "en el vecindario" ya que nunca se especifica qué argumentos toman las funciones.

Es una pregunta de entrevista desagradable (tipos tan feos que son realmente raros IME), pero le da al entrevistador una idea de qué tan bien entiendes a los declaradores. O eso o estaban aburridos y solo querían ver si podían hacer que tu cerebro se cercenara.

EDITAR

casi todos los demás recomienda el uso de typedef. La única vez que recomiendo usar un typedef es si el tipo está destinado a ser verdaderamente opaco (es decir, no manipulado directamente por el programador, sino pasado a una API, algo así como el tipo de ARCHIVO). De lo contrario, si el programador está destinado a manipular objetos de ese tipo directamente, entonces IME es mejor tener toda esa información disponible en la declaración, por feo que sea. Por ejemplo, algo así como

NameFuncPickerPointer a[N]; 

me da ninguna información sobre cómo realmente usoa[i]. No sé si se puede llamar al a[i], o lo que devuelve, o qué argumentos debe tomar (si corresponde), o cualquier otra cosa. Tengo que ir a buscar a la typedef

typedef char *NameFunc(); 
typedef NameFunc *NameFuncPicker(); 
typedef NameFuncPicker *NameFuncPickerPointer; 

ya partir de ese rompecabezas de la manera de escribir la expresión que llama en realidad una de las funciones.Mientras que el uso de la, declaración no typedef'd "desnudo", sé inmediatamente que la estructura de la llamada es

char *theName = (*(*a[i])())(); 
+0

Ahora, este ** I ** incluso lo entiendo sin ser un programador de c. –

+1

Sobre el tema de los nombres, creo que me gustaría ver 'StringGetter_Getter a [N]', o 'StringGetter_Getter_Array a', o' FunctionTable a'. Debe tener algún significado en el contexto del código, y prefiero ver 'StringGetter_Getter' repetirse por todo el lugar, que' char * (* (*)())() '. Pero esto podría fácilmente convertirse en el mismo argumento de si nombrar constantes: "No quiero tener que ir a buscar el valor de DEFAULT_HTTP_PORT, si alguien está usando 80, quiero ver 80 en la fuente". Como programadores, la indirección es la causa y la solución de todos nuestros problemas. –

+0

... y, en última instancia, si su código C tiene tablas de funciones de fábrica que devuelven funciones de fábrica, entonces probablemente se haya equivocado al dirigirse a la clase "Completamente complejo Java de la empresa" ;-) –

6
typedef char* (* tCharRetFunc)(); 
typedef tCharRetFunc (* tFuncRetCharFunc)(); 

tFuncRetCharFunc arr[N]; 
+0

Creo que la pregunta está diseñada para ver si el entrevistado entiende typedef y ofrece una solución clara como esta o una solución técnica desagradable como las dadas en otras respuestas. Como tal, es una buena pregunta, ya que estas cosas van. – Elemental

3

Divide gran problema en partes más pequeñas:

/* char_func_ptr is pointer to function returning pointer to char */ 
typedef char* (*char_func_ptr)(); 

/* func_func_ptr is a pointer to function returning above type */ 
typedef char_func_ptr (*func_func_ptr)(); 

/* the_array is array of desired function pointers */ 
func_func_ptr the_array[42]; 
0

Es esto lo que busca:

typedef char* charptr; 
typedef charptr (*innerfun)(); 
typedef innerfun (*outerfun)(); 

const size_t N = 10; 
outerfun my_outerfun_array[N]; 

espero que lo tengo correcto, parece una pregunta extraña para mí especialmente en una entrevista :(

0

Usando typedefs como Christopher dice que es realmente la única forma humana de declarar tal cosa. t tyedefs, que va a ser:

char *(*(*arr[10])(void))(void); 

(si tuviera que hacer trampas y corrí cdecl> arr declarar como una matriz 10 de puntero a la función (void) puntero regrese a su función (void) devolver el puntero a char)

1

conjunto de N punteros a funciones que devuelven punteros a funciones devuelve un char:

int (*(*arr_fp[n])(void))(void) 
Cuestiones relacionadas