www.mikrocontroller.net

Forum: Compiler & IDEs Array mit Funktionspointern


Autor: Student 08 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich arbeite gerade an meiner Studien Arbeit.Zu besseren ausführung 
meines Messprogrammes soll ich, von meinem Chef aus, ein Array auf eine 
Struktur mit Funktionspointer erstellen.Kann mir irgend jemand sagen wie 
dies aussieht?Habe sowas noch nie gemacht.
Betsen Dank schon mal.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int (*func[])(int arg) = 
{ 
  func1,
  func2,
  0
}

int func1(int arg);
int func2(int arg);

int (*pFunc)(int arg) = 0;
int ret = 0;

pFunc = func[i];
ret   = pFunc(arg);

Strip down aus nem Programm von mir. Hoffentlich hab ich mich nicht 
vertan :-)


VG,
/th.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist ein Array auf eine Struktur?  Ich kann mir höchstens ein Array 
von structs vorstellen, wobei aber unklar ist, was die struct enthalten 
soll.

Also mal ohne die "Struktur", da dafür die nötigen Informationen fehlen. 
Ein Array von structs ist auch nichts wirklich Unangenehmes oder 
Schwieriges.  Zum Array von Funktionspointern.

Nehmen wir an, die Funktionen haben folgenden Prototyp:
char func1(void);
char func2(void);
So definierst Du Dir dann ein initialisiertes Array von 
Funktionspointern:
char (*f_array[])(void) = { func1, func2 };
Und so rufst Du eine Funktion aus dem Array auf:
f_array[1]();  //ruft func2 auf

Ich hoffe, das genügt zum Einstieg.

Autor: paco89 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe dazu noch eine frage:

was passiert z.B. wenn die funktion func1 keinen rückgabetyp hat. so 
z.B.

void func1(void)

muss ich dann mein array mit funktionspointern, dann so deklarieren:

void (*f_array[]) (void) = {func1};




edit: das mit func2 habe ich jez mal rausgelassen

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

Autor: xfr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann es auch mit einem typedef leserlicher machen:
typedef char (*meinefunktion_t)(void);

"meinefunktion_t" ist jetzt der Typ "Zeiger auf eine Funktion, die void 
als Parameter nimmt und char zurück gibt".

Das Array sieht dann ganz normal aus:
char funktion1(void) {
  // mach was
}

char funktion2(void) {
  // mach was anderes
}

meinefunktion_t meinarray[2] = {funktion1, funktion2};

Und aufrufen einer Funktion aus dem Array sieht so aus wie in den 
anderen Beispielen:
meinarray[0]();

Oder wenn man möchte:
meinefunktion_t zeiger;
zeiger = meinarray[1];
zeiger();

Autor: zander (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hätte da noch eine ergänzende Frage zum Thema.
Kann ich so auch ein dreidimensionales Array erzeuegen?

sprich:
void (*hallo_array[][][])() = {{{x_1, x_2}, {x_3, x_4}},
                               {{x_5, x_6}, {x_7, x_8}},
                               {{x_9, x_10}, {x_11, x_12}}};

Bekomme hier immer den Fehler:
error: array type has incomplete element type

Bin für jede Rückmeldung dankbar!
zander

Beitrag #2979812 wurde vom Autor gelöscht.
Autor: DirkB (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Arrays kann nur der höchste Index (der linke) automatisch ermittelt 
werden.
Die anderen Größen musst du angeben.

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.