Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Funktion


von hans (Gast)


Lesenswert?

Hallo und guten Tag zusammen, ich habe hier ein Problem
Gegeben ist folgender Code:

/**********************************************************************/
typedef struct alt_flash_cfi_dev alt_flash_cfi_dev;

/*
 * Function pointers for performing operations on the flash
 */
typedef void (*alt_write_command_fn)(void* base_address, int offset, 
alt_u8 value);
typedef alt_u8 (*alt_read_query_fn)(alt_flash_cfi_dev* flash, int 
address);
typedef void (*alt_write_native_fn)(void* address, alt_u32 value);
typedef int (*alt_program_word_fn)(alt_flash_cfi_dev* flash, const int 
offset,
                              const alt_u8* src_addr);


/*
 *  Description of the flash
 */
struct  alt_flash_cfi_dev
{
  int           algorithm;
  int           mode_width;
  int           device_width;
  int           write_timeout;
  int           erase_timeout;
  int           primary_address;

  /*
   * Flash type specific functions to access the flash and perform 
various
   * operations
   */
  alt_write_command_fn  write_command;
  alt_read_query_fn     read_query;
  alt_write_native_fn   write_native;
};
/*********************************************************************** 
/

1) Oben werden Pointer auf Funktionen initialisiert ? oder ?
2) Was hat das typedef davor zu sagen ?
3) In der Struktur wird dann
alt_write_command_fn write_command; // Was bedeutet das ?

Meine Vermutung:
write_command ist ein funktionszeiger mit den eigenschaften von 
alt_write_command_fn ???


Vielen Dank für eure Hilfe

mfg hans

von Resonator (Gast)


Lesenswert?

Richtig.

von hans (Gast)


Lesenswert?

mhh. ok erstmal Danke !

aber was ist mit Frage 2) ?

Ach ja noch was...

muß write_command irgendwo deklariert werden ?

Vielen Dank

von yalu (Gast)


Lesenswert?

Die Zeile
1
typedef void (*alt_write_command_fn)(void* base_address, int offset, alt_u8 value);

definiert den neuen Datentyp alt_write_command_fn. Dieser Typ ist ein
Zeiger auf eine Funktion ohne Rückgabewert (void) mit drei Argumenten
des Typs void*, int und alt_u8.

Das Element write_command der Struktur alt_flash_cfi_dev ist genau
von diesem Typ. An anderer Stelle des Programms wird write_command
wahrscheinlich per Zuweisung
1
  write_command = my_write_func;

oder per Initialisierung
1
  struct alt_flash_cfi_dev my_dev =
2
  {
3
    ..., my_write_func, ...
4
  };

mit einem Zeiger auf die Funktion my_write_func belegt.

> muß write_command irgendwo deklariert werden ?

Ist ja schon, nämlich als Element der Struktur alt_flash_cfi_dev.

von hans (Gast)


Lesenswert?

...und was bringt mir ein Funktionszeiger in einer Struktur eigentlich ?

Danke

von hans (Gast)


Lesenswert?

ok...alles klar und vielen Dank für die Erklärung...jetzt aber noch was

weiter steht dort noch folgendes: Dabe handelt es sich übrigens um eine 
Header Datei.


int alt_flash_cfi_init( alt_flash_cfi_dev* flash );
//also der Prototyp der Funktion welche im folgenden beschrieben ist


in der dazgehörigen .c datei steht dann folgender Funktionsaufruf

int alt_flash_cfi_init( alt_flash_cfi_dev* flash  )
{
  ...
  flash->mode_width = 4;
  ...

}

1) Ich verstehe die Übergabe des Zeigers irgendwie nicht...Der Zeiger 
zeigt ja anscheinend auf die Struktur !?

Vielen Dank für eure Hilfe

von yxcv (Gast)


Lesenswert?

> ...und was bringt mir ein Funktionszeiger in einer Struktur eigentlich ?
Kennst du OOP?
Eine Struktur ist nichts anderes als eine einfache Klasse, es ist halt 
alles public und mit den Funktionszeigern hast du eine Art 
Methodenaufruf.
Wo wird das angewendet? Z.B. im Linux-Kernel. Du kannst also die 
Vorteile von OOP unter C nutzen, ob OOP nun Vorteile hat, ist 
Ansichtssache. ;-)

von hans (Gast)


Lesenswert?

mhhh.. ja OOP = Obejektorientierete Programmierung. Ja nicht 
wirklich-... leider...

aber könntest Du mir die Übergabe des Zeigers nochmal erklären ?

int alt_flash_cfi_init( alt_flash_cfi_dev* flash  )???

Vielen Dank

von yxcv (Gast)


Lesenswert?

Ich denke du solltest eher mal googlen und dich mit eigenen und 
speziell kleinen Beispielen an die Geschichte herantasten. Google hat 
da wirklich viele gute Beispiele. Man sollte den Einstieg in etwas Neues 
immer mit Minmalbeispielen machen.

von yalu (Gast)


Lesenswert?

1
int alt_flash_cfi_init( alt_flash_cfi_dev* flash  )
2
{
3
  ...
4
  flash->mode_width = 4;
5
  ...
6
7
}

Der Aufrufer dieser Funktion übergibt einen Zeiger auf eine Struktur,
die außerhalb der Funktion definiert wurde. Über diesen Zeiger hat die
Funktion die Möglichkeit, auf die Struktur zuzugreifen. Von dieser
Möglichkeit macht sie auch Gebrauch, indem sie das Strukturelement
mode_width mit 4 überschreibt. Ein typischer Aufruf sieht so aus:
1
  alt_flash_cfi_dev dev;
2
  ...
3
  alt_flash_cfi_init(&dev);

Danach ist das Element mode_width von dev mit 4 initialisiert.

Aber vielleicht solltest du dir tatsächlich einmal eine Programmier-
anleitung für C zu Gemüte führen, je nach Geschmack entweder eine aus
Papier (der Klassiker kommt von Kernighan & Ritchie, ISBN 3446154973)
oder eine aus Bits und Bytes (http://www.google.de/search?q=C+tutorial).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.