2012-06-24 11 views
7

Hola, me encontré con la pregunta en "Pon a prueba tus habilidades en C++".¿Qué significa esto char (* (* a [4])()) [5]?

Háganme saber lo que significa con un ejemplo?

sección editada: Lo siento por el paréntesis adicional, editado & eliminado.

char (*(*a[4])())[5] 
+7

[Regla espiral] (http://c-faq.com/decl/spiral.anderson.html) gana de nuevo. – chris

+4

Es un error de sintaxis debido a paréntesis desequilibrados. – Blastfurnace

+0

¿Qué fue ese sitio que tradujo las declaraciones sin sentido de _C a la forma humana? –

Respuesta

16

hice trampa mediante la eliminación de lo que creo que es un derecho-paréntesis extra y pegar el resultado en cdecl.

declare a as array 4 of pointer to function returning pointer to array 5 of char

+0

¿Puedes mostrarme un ejemplo? Gracias por tu valiosa respuesta. – Abhineet

+6

@Abhineet, sé qué matrices, punteros de función, valores de retorno de función y punteros a matrices de caracteres son, pero no puedo pensar en un ejemplo práctico que utilice esta combinación particular de características de lenguaje. – Blastfurnace

25

Siguiendo la regla de espiral (como vinculado a por Chris), y comenzando con el identificador:

a 

... es ...

a[4] 

.. .una matriz de 4 ...

*a[4] 

... punteros a ...

(*a[4])() 

... una función sin parámetros ...

*(*a[4])() 

... volver puntero a ...

(*(*a[4])())[5] 

... una serie de cinco ...

char (*(*a[4])())[5] 

... ch ars.

Nota al margen: Ir dar al arquitecto que le ocurrió este un buen rapapolvo, y luego encontrar el programador que escribió este código sin un comentario explicando y darle él un buen rapapolvo. En caso de que esto se le haya dado como tarea, dígale a su maestro que debería haberle instruido sobre cómo usar cdecl en su lugar, o cómo diseñar código de una manera que no parezca garrapatas locas, en lugar de perder su tiempo con este.

8

Y aquí es un ejemplo ...

#include <stdio.h> 

char a[5] = "abcd"; 
char b[5] = "bcde"; 
char c[5] = "cdef"; 
char d[5] = "defg"; 

char (*f1())[5] { return &a; } 
char (*f2())[5] { return &b; } 
char (*f3())[5] { return &c; } 
char (*f4())[5] { return &d; } 

int main() 
{ 
     char (*(*a[4])())[5] = { &f1, &f2, &f3, &f4 }; 
     for (int i = 0; i < 4; i++) 
       printf("%s\n", *a[i]()); 
     return 0; 
} 
+0

Gracias por su valiosa respuesta. – Abhineet

13

Y otro ejemplo ... de qué hacer nunca jamás en algo más que un ejemplo.

#include <iostream> 

typedef char stuff[5]; 
stuff stuffarray[4] = { "This", "Is", "Bad", "Code" }; 

stuff* funcThis() { return &(stuffarray[0]); } 
stuff* funcIs()  { return &(stuffarray[1]); } 
stuff* funcBad() { return &(stuffarray[2]); } 
stuff* funcCode() { return &(stuffarray[3]); } 

int main() 
{ 
    char (*(*a[4])())[5] = { funcThis, funcIs, funcBad, funcCode }; 
    for(int i = 0; i < 4; ++i) 
    { 
     std::cout << *a[i]() << std::endl; 
    } 
    return 0; 
} 
+1

+1 para 'typedef': ¡hace que tu código sea mejor que mi código incorrecto! :) – acraig5075

+4

¡Totalmente C++ lo di con cout también! :) El typedef es porque no pude entender cómo declarar las funciones sin él. –

+0

@RetiredNinja: gracias por su valiosa respuesta. – Abhineet

Cuestiones relacionadas