moin, wollte mal sehen was für Zeiger aufrufe ihr schon gesehen oder
programmiert habt wo man sagen könnte was zum teufel ist das den. Falls
geht mit Erklärung.
Erstell doch mal einen Zeiger auf eine Funktion, welche einen Zeiger auf
eine Funktion übernimmt (die meinetwegen einen int als Argument bekommt)
und einen ebensolchen Zeiger zurückliefert. Und das alles machst du ohne
typedef :-)
(Das wäre zb. eine Funktionszeiger auf eine Funktion die irgendwelche
Handler registriert)
ohne Gewähr
1
void(*)(int)registerHandler(void(*arg)(int))
2
{
3
...
4
}
5
6
voidfoo(intarg)
7
{
8
}
9
10
intmain()
11
{
12
void(*)(int)(*RegisterFnct)(void(*)(int));
13
14
void(*OldFnct)(int);
15
16
RegisterFnct=registerHandler;
17
OldFnct=(*RegisterFnct)(foo);
18
}
Zum Drüberstreuen hätte ich jetzt gerne noch ein Array aus derartigen
Funktionspointern und eine Funktion, die ein derartiges Array als
Argument bekommt
(Machs nicht wirklich! Ohne typedef ist sowas hoffnungslos)
Ich habe vor vielen Jahren einen kleinen embeddable Compiler gebastelt,
der mathematische Funktionen mit mehreren Argumenten als Textstring
einliest und als 68000-Binärcode ausgibt, der wie eine normale
C-Funktion aufgerufen werden kann. Die Compilerfunktion sieht
vereinfacht etwa so aus:
1
double(*compiler(constchar*source))(double*){
2
unsignedshort*code;
3
4
code=malloc(MAX_CODE_SIZE);
5
// code generation
6
// ...
7
return(double(*)(double*))code;
8
}
Um im gleichen Programm unterschiedliche Compiler-Algorithmen
gegeneinander zu testen, könnte man ein Array mit Pointern auf die
einzelnen Compiler anlegen, so dass diese in einer Schleife der Reihe
nach durchgetestet werden können. Das Array sähe dann so aus:
Deklariert foo als eine Funktion mit einem Paramater a, welcher ein
Zeiger auf eine Funktion ist, die 2 ints nimmt und einen
Funktionspointer zurückliefert, die ihrerseits einen Funktionspointer
auf eine Funktion liefert, die zwei ints nimmt und einen int
zurückliefert.
In Mathe würd de man sagen foo ist ein Funktional .
Johann
Der OP hat bereits im Titel des Threads das Stichwort geliefert:
kompliziert
Software ist nicht dazu da, um irgendetwas kompliziert auszudrücken.
Software ist dazu da, um Sachverhalte logisch sauber und
strukturiert darzustellen.
Das Programmieren ist der letzte - rein handwerkliche - Schritt bei der
Software-Entwicklung.
Hier hat Kompliziertheit nichts aber auch garnichts zu suchen!
Bernhard
Bernhard R. wrote:
> Kompliziertheit
Komplexität?
Die Beispiele oben kann man ja durch typedefs vereinfachen, aber er hat
eben nach kompliziert gefragt, wie du schon sagtest.
Jetzt mach dir mal nicht in die Hose.
Simon K. wrote:
> Bernhard R. wrote:>> Kompliziertheit> Komplexität?
Yep. Kompliziert ist immer relativ.
> Die Beispiele oben kann man ja durch typedefs vereinfachen,
Ich würd sogar sagen: Wenn jemand sowas ohne typedef macht, sollte man
den Code ausdrucken und ihm den Ausdruck solange um die Ohren dreschen,
bis er freiwillig auf Knien nach Lourdes pilgert, um Abbitte zu leisten
:-)
> Jetzt mach dir mal nicht in die Hose.
lol
Folgendes hat scheinbar nichts mit Pointern zu tun. Bei näherem Hinsehen
ist es aber Pointer pur und stellt eine geniale Möglichkeit dar, zu tief
verschachtelte Klammern übersichtlicher darzustellen. Trotzdem würde ich
diesen Stil nicht zur Nachahmung empfehlen ;-)
Das Ganze beruht darauf, dass
a[i] dasselbe ist wie i[a]
(folgt aus der C-Definition wie Array Indizierung über Pointer
Arithmetik abgewickelt wird:
Der Compiler formt a[i] sofort um zu *(a+i) (*)
und i[a] wird ohne Ansehen der Datentypen umgeformt zu *(i+a)
und so wie Pointer Arithmetik in C definiert ist, sind *(a+i) und *(i+a)
identische Ausdrücke)
Der Ausdruck
i[a][a][a][a][a][a][a][a]
ist äquivalent zu
a[a[a[a[a[a[a[a[i]]]]]]]]
Bsp
i sei gleich 1
a[1] ist daher 7
a[a[1]] ist daher gleich a[7] oder 0
a[a[a[1]]] ist daher gleich a[0] oder 3
a[a[a[a[1]]]] a[3] oder 2
.....
(Jetzt sollte das Prinzip schon klar sein. Der Index auf den zugegriffen
wird, kommt selbst aus dem Array)
Eine Spielart davon, mit der man Leute verblüffen kann
1
for(inti=10;i>=0;++i)
2
printf("%c",i["Hallo World"]);// ein Integer wird mit einem String indiziert :-)
( ist aber dieselbe Idee. a[i] <==> i[a] )
(*) Das ist auch der Grund, warum man beim Zugriff über Pointer auch
Array Syntax benutzen kann. Eigentlich war das wahrscheinlich sogar die
grundelegende Idee dahinter, dass man das können möchte
1
char*a=malloc(20);
2
a[0]='\0';
geht deswegen, weil a[0] sofort umgeformt wird zu *(a+0) und da a ein
Pointer ist, ist das jetzt eine legale Operation.
das Letzte beispiel von Bernd-Leitenberger geht aber nicht. Ich vermute
mal da fehlt ein wichtiges define - oder selbst mein compiler versteht
nicht was da sache ist.