2012-06-24 20 views
7

Ciao, mi sono imbattuto nella domanda "Metti alla prova le tue abilità in C++".cosa significa char (* (* a [4])()) [5]?

Per favore fatemi sapere cosa significa con un esempio?

Edited Sezione: Ci scusiamo per la parentesi in più, a cura & rimosso.

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

[Regola a spirale] (http://c-faq.com/decl/spiral.anderson.html) vince di nuovo. – chris

+4

Si tratta di un errore di sintassi dovuto a parentesi non bilanciate. – Blastfurnace

+0

Che cosa era quel sito che traduceva le dichiarazioni _c incomprensibili_ in forma leggibile? –

risposta

16

Ho tradito rimuovendo quello che penso è un diritto-parentesi di extra e incollare il risultato in cdecl.

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

+0

Puoi per favore mostrarmi un esempio .. Grazie per la tua preziosa risposta. – Abhineet

+6

@Abhineet, so quali matrici, i puntatori di funzione, i valori di ritorno delle funzioni e i puntatori agli array di caratteri sono, ma non riesco a pensare ad un esempio pratico che utilizza questa particolare combinazione di caratteristiche linguistiche. – Blastfurnace

25

Seguendo la regola spirale (come legata a Chris), e inizia con l'identificatore:

a 

... è ...

a[4] 

.. .an array of 4 ...

*a[4] 

... puntatori a ...

(*a[4])() 

... una funzione di prendere alcun parametro ...

*(*a[4])() 

... tornando puntatore a ...

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

... una serie di cinque ...

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

... ch ars.

Nota a margine: Vai dare l'architetto che si avvicinò con questa una buona lavata di capo, quindi trovare il programmatore che ha scritto questo codice senza un commento che spiega e dare lo una buona lavata di capo. Nel caso ti venisse dato come compito, dì al tuo insegnante che avrebbe dovuto istruirti su come usare cdecl, o come progettare il codice in modo che non assomigli a scarabocchi di matti, invece di sprecare il tuo tempo con questo.

8

Ed ecco un esempio ...

#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

Grazie per la tua preziosa risposta. – Abhineet

13

E un altro esempio ... di cosa fare mai e poi mai in qualcosa di diverso un esempio.

#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 per 'typedef': rende il tuo codice cattivo migliore del mio codice errato! :) – acraig5075

+4

Sono totalmente C++ anche con cout! :) Il typedef è perché non riuscivo a capire come dichiarare le funzioni senza di esso. –

+0

@RetiredNinja: Grazie per la tua preziosa risposta. – Abhineet