> Das mit dem Pointer ist mir nun klar.
> typedef uint8_t (*ks0108FontCallback)(const uint8_t*);
> (*ks0108FontCallback) ist der Poninter der auf unit8_t zeigt
Aeh. Nein.
Zunaechst mal ist das nur eine Datentypdefinition. Sonst nichts.
Insbesondere ist es keine Variable in der man was speichern
koennte. Ist also sowas wie ein int, char, double, float, ...
Nur sieht er halt komplizierter aus.
Das ist ein Datentyp fuer einen Funktionszeiger.
Stell Dir vor Du hast eine Funktion:
uint8_t TestFnkt( const uint8_t* Argument )
{
bla bla bla
}
So. Nun moechtest Du irgendwo einen Pointer auf diese Funktion
speichern, damit Du die Funktion indirekt ueber diesen Pointer
aufrufen kannst.
Wie muss der Datentyp fuer diesen Pointer sein?
uint8_t * pFnkt;
kann nicht sein, den das obige ist ein Pointer auf einen uint8_t,
also eine Speicherzelle in der ein Wert gespeichert wird.
Also wie dann?
So (die Syntax muss man sich einfach merken):
uint8_t (*pFnkt)( const uint8_t* );
Sieht ein bischen aus wie der Funktionskopf, nur dass der
Variablennamen in Klammern steht und ein * davor ist. So
was ist ein Funktionszeiger: pFnkt ist ein Zeiger auf eine
Funktion, wobei die Funktion einen const uint8_t Zeiger nimmt
und einen uint8_t zurueckliefert.
Damit kann man dann schreiben:
uint8_t TestFnkt( const uint8_t* Argument )
{
bla bla bla
}
int main()
{
uint8_t i;
uint8_t (*pFnkt)( const uint8_t* ); /* Zeiger definieren */
pFnkt = TestFnkt; /* Die Funktion zuordnen */
(*pFnkt)( &i ); /* Die Funktion ueber den
Zeiger (also indirekt)
aufrufen */
}
Nun ist es aber muehsam, fuer eine Variablendeklaration immer
diesen Rattenschwanz uint8_t (*xyz)( const uint8_t* ) zu schreiben.
Daher macht man sich einen Typedef:
typedef uint8_t (*ks0108FontCallback)(const uint8_t*);
und hat damit einen neuen Namen fuer den Datentyp
uint8_t (*)( const uint8_t* )
kreiert und kann diesen ganz normal (so wie int, char, double, ...)
verwenden:
typedef uint8_t (*ks0108FontCallback)(const uint8_t*);
uint8_t TestFnkt( const uint8_t* Argument )
{
bla bla bla
}
int main()
{
uint8_t i;
ks0108FontCallback pFnkt; /* Zeiger definieren */
pFnkt = TestFnkt; /* Die Funktion zuordnen */
(*pFnkt)( &i ); /* Die Funktion ueber den
Zeiger (also indirekt)
aufrufen */
}
Ist es jetzt klarer?
Uebrigens:
> typedef int unit8_t;
> Dann ist ein neuer Datentyp mit dem Name unit8_t;
typedef erzeugt keine neuen Datentypen. typedef gibt bereits
vorhandenen Datentypen einen neuen Namen (einen 'Alias' (englisch)).
Das ist ein kleiner, feiner Unterschied.
Im uebrigen hab ich nicht gesagt, dass ein uint8_t ein int ist.
Was ich gesagt habe ist: es ist ein unsigned integer mit 8 bit.
Und in C (zumindest auf einem AVR) ist der Datentyp der genau
das erfuellt (unsigned integer mit 8 bit) ein 'unsigned char'
typedef unsigned char uint8_t;
Der kommt aus irgendeinem #include File, das du vorher inkludiert
hast.