www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Funktion


Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Resonator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Richtig.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mhh. ok erstmal Danke !

aber was ist mit Frage 2) ?

Ach ja noch was...

muß write_command irgendwo deklariert werden ?

Vielen Dank

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Zeile
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
  write_command = my_write_func;

oder per Initialisierung
  struct alt_flash_cfi_dev my_dev =
  {
    ..., my_write_func, ...
  };

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.

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...und was bringt mir ein Funktionszeiger in einer Struktur eigentlich ?

Danke

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yxcv (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yxcv (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int alt_flash_cfi_init( alt_flash_cfi_dev* flash  )
{
  ...
  flash->mode_width = 4;
  ...

}

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:
  alt_flash_cfi_dev dev;
  ...
  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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.