Ich verstehe den beigefügten Code nicht ganz
-
Hallo Kollegen.
Kannn mir einer den beigefügten Code erklären? Den verstehe ich nämlich komischer Weise an einigen Stellen überhaupt nicht. Habe manche dieser Zeilen, in dieser Weise, noch nie gesehen. Was ich nicht verstehe, habe ich mit einer "Kommentarzeile" versehen.
**
#include <stdio.h> /* puts /
#include <string.h> / strcmp */#define F(r,n,b) r n b** //nix verstehen: wie kann F(r,n,b) für r n b stehen?**#define FUNCTIONS \
F( void, beta, () { puts( "Bravo" ); } )** //wofür stehen die Klammern hinter beta,?**F( void, zeta, () { puts( "Zulu" ); } )FUNCTIONS
#undef F
#define F(r,n,b) n, void( * const function[] )() = { FUNCTIONS };** //was bedeutet diese komplette Zeile?**#undef F
#define F(r,n,b) #n,
char const * const name[] = { FUNCTIONS };** //wofür stehen diese und die vorangehende Zeile?**#undef Fint const top = sizeof name / sizeof 0[name];** //was hat die 0 hinter sizeof zu suchen - und ist sizeof nicht eine Funktion? (ist ja nicht mit runden Klammern versehen).void call( char const * const n ) //was für ein Datentyp ist der Parameter n?**
{
int i;for( i = 0; i < top; ++i )
{
if(!strcmp(n, i[ name ]))
i[function]();** //ist i der Funktionen enthaltende Vektor?**
}
}int main( void )
{
call( "beta" );
call( "zeta" );
}Für eine vollständige oder teilweise Erklärung wäre ich sehr, sehr dankbar.**
-
Alles nur verwirrung.
dieses define heißt nur, dass die 3 "Argumente" des Makros so hingeschrieben werden.
F(1, 2, Hallo)// wird zu 1 2 HalloF( void, beta, () { puts( "Bravo" ); } ) \\wird zu
void beta() { puts( "Bravo" )}; //und das ist ja verständlich
-
Bei mir geht der Code gar nicht zu kompilieren. Und wenn es einen Sinn ergäbe, wer braucht sowas? Ich denke kein vernünftiger Mensch.
Aber:
Wenn du von deinem Prof (oder wer auch immer diesen Code fabriziert hat), erklärt bekommen hast, was das bedeuten soll: Bitte poste es mal!
-
_Bongo schrieb:
*#define FUNCTIONS \
F( void, beta, () { puts( "Bravo" ); } )* //wofür stehen die Klammern hinter beta,?Das find ich ja mal geil.
#define FUNCTIONS \ void beta() { puts( "Bravo" ); }
zu schreiben, war dem Autor wohl zu kompliziert.
_Bongo schrieb:
int const top = sizeof name / sizeof 0[name]; //was hat die 0 hinter sizeof zu suchen - und ist sizeof nicht eine Funktion? (ist ja nicht mit runden Klammern versehen).
sizeof ist keine Funktion, sondern ein Schlüsselwort, genauer gesagt ein Operator. Und sofern du einen unären Ausdruck hast, ist eine Klammerung nicht erforderlich. Ausserdem hat hier 0[name] die gleiche Bedeutung wie name[0].
_Bongo schrieb:
void call( char const * const n ) //was für ein Datentyp ist der Parameter n?
Ein konstanter Zeiger auf ein konstantes Zeichen. Dahinter kann sich aber auch ein Array von Zeichen verbergen.
-
EDIT: JensE
***********Und wenn es einen Sinn ergäbe,
wer braucht sowas? Ich denke kein vernünftiger Mensch.Nur, weil du den Code vielleicht nicht auf Anhieb verstehst heisst das nicht das er keinen Sinn oder Nutzen hat.
bye
tt
-
@TheTester: Natürlich, ganz deiner Meinung.
Nur bin ich mir fast 100%ig sicher, das es bestimmt einen besser lesbaren Weg gibt, und der Meinung, dass man diese Wege immer bevorzugen sollte... Keiner kann mir weismachen, dass er den Code nach ein paar Wochen oder gar Monaten noch versteht .. es sei denn er hat ihn gut kommentiert + dokumentiert.
-
JensE
*****Natürlich gibt es andere Wege und dass das da nicht der Schönste ist darin sind wir uns hier wohl alle einig.
Und das so ein Stück Source ausführlich kommentiert wird sollte selbstverständlich sein.
bye
tt
-
Ich möchte mich zunächst mal für die grandiose Unterstützung euererseits bedanken. Hat doch einiges an Licht ins Dunkel gebracht. Werde wohl jetzt mal einige der Passagen einzeln testen. DANKE an alle.