Gast
#1217061
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.
|
Anzeige
|
komplizierte Zeiger Funktionen
Gast
#1217061
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
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)
Gast
#1217099
geil :)
Gast
#1217123
#include <stdio.h>
struct A
{
int a;
};
struct B
{
int b;
struct A a;
};
int main( void)
{
struct B b;
struct A* a = &b.a;
struct B* b2 = ( struct B*) ((( char*) a) - (( int) &((( struct B*)
NULL)->a)));
fprintf( stdout, "B: %p A: %p B2: %p\n", &b, a, b2);
return 0;
}
Gast
#1217137
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:
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:
Typedefs fand ich damals noch uncool ;-) Da reicht oft schon viel weniger aus:
Gast
#1217184
Wenn es richtig schön sein soll: http://www.ioccc.org/ Oliver
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
Gast
#1217365
Übrigens ist im K&R ein Codefetzen enthalten, der beliebige Typendinger verbal umformuliert :-)
Gast
#1217406
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 ;-)
Gast
#1217410
yalu, des raff ich ned :D wer erklärt ? 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
( 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
geht deswegen, weil a[0] sofort umgeformt wird zu *(a+0) und da a ein Pointer ist, ist das jetzt eine legale Operation. Hallo, hat jetzt zwar nicht nur mit Zeigern was zu tun, aber:
http://www.bernd-leitenberger.de/echte-programmierer.shtml dort ganz nach unten scrollen. Die monster.exe ist sauber, in der Dos-Box aufrufen, damit man die Ausgabe sieht. :-) Gruß aus Berlin Michael
Gast
#1217444
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.
Gast
#1217453
oh, geht doch. Ist halt kein C++ sonder C.
Gast
#1220507
Zur Ursprungsfrage. Die Definition der Funktion signal, wie sie früher unter Linux auch in der man-Page stand:
Heute verwendet die man-Page langweilige typedefs, durch die man sofort sieht, was das bedeutet. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|