mikrocontroller.net

Forum: PC-Programmierung Zeiger auf Funktion übergeben, aber wie?


Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe eine Funktion
int ui8_vergleich(unsigned char a, unsigned char b)

, deren Zeiger ich gerne an eine weitere Funktion:
bubblesort(...)

übergeben möchte. Allerding krieg ich's nicht hin.

Meine Fragen:
Wie muß ich bubblesort(...) definieren, um den Zeiger auf eine Funktion 
wie int ui8_vergleich(...) zu übergeben?
Wie rufe ich die übergebene Funktion in bubblesort() auf?
Wie muß ich bubblesort() dann aufrufen?

Vielen Dank für eure Hilfe
Gruß
Boxi

Autor: Sebastian Oberwelland (Firma: nA) (zapp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, da war ich auch schon. Das beantwortet allerdings nicht meine 
Fragen...

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
int ui8_vergleich(unsigned char a, unsigned char b) 
{
   return a > b;
}

void bubblesort(int (*fp)(unsigned char, unsigned char), unsigned char a, unsigned char b) 
{
   fp(a, b);
}

int main(void)
{
   bubblesort(ui8_vergleich, 23, 42);
}

Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm, stimmt, läuft. danke!

allerdings:
sinn der sache ist ja, dass ich auch mal funktionen mit anderen 
parametern an bubblesort übergeben möchte.

z.B. ui32_vergleich(unsigend long a, unsigned long b)

dann sind sicher einige harte casts anzuwenden.
weiß jemand, wie das geht?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann man so machen.
Allerdings ist ein Funktionspointer einer der Punkte in C
an der ein typedef immer eine gute Idee ist.

http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Boxi Boxitec wrote:
> hm, stimmt, läuft. danke!
>
> allerdings:
> sinn der sache ist ja, dass ich auch mal funktionen mit anderen
> parametern an bubblesort übergeben möchte.

Schau dir an, wie qsort aus der Standardlibrary an das Problem
herangeht.
Das Stichwort lautet: void Zeiger.

Und ja: Du musst casten.

Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, habe jetzt ein
bubblesort(int (*comp)(void *, void *))
{
  ...
}

und ein
int ui8_vergleich(void *a, void *b)

damit könnte ich auch ein
int ui32_vergleich(void *a, void *b)

die ich so
bubblesort(ui32_vergleich);
bubblesort(ui8_vergleich);

aufrufe, je nachdem welche datentypen ich verwende.
Danke an euch nochmal

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dafür wurde C++ erfunden ;-)

In C könntest du statt der a,b selbst deren Adressen übergeben und die 
Grösse der Funktionsargumente a,b mitschleppen. In der Vergleichfunktion 
würdest du dann unterschiedliche Vergleiche je nach Grüsse 
implementieren.

ADD: Du warst schneller ;-)

Autor: Boxi Boxitec (boxi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du wirst lachen Stefan, aber bubblesort() wird eine Memberfunction eine 
Klasse ;)

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.