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


von Boxi B. (boxi)


Lesenswert?

Hallo,
ich habe eine Funktion
1
int ui8_vergleich(unsigned char a, unsigned char b)

, deren Zeiger ich gerne an eine weitere Funktion:
1
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

von Sebastian O. (Firma: nA) (zapp)


Lesenswert?


von Boxi B. (boxi)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1
int ui8_vergleich(unsigned char a, unsigned char b) 
2
{
3
   return a > b;
4
}
5
6
void bubblesort(int (*fp)(unsigned char, unsigned char), unsigned char a, unsigned char b) 
7
{
8
   fp(a, b);
9
}
10
11
int main(void)
12
{
13
   bubblesort(ui8_vergleich, 23, 42);
14
}

von Boxi B. (boxi)


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?

von Karl H. (kbuchegg)


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

von Karl H. (kbuchegg)


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.

von Boxi B. (boxi)


Lesenswert?

ok, habe jetzt ein
1
bubblesort(int (*comp)(void *, void *))
2
{
3
  ...
4
}

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

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

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

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

von Stefan B. (stefan) Benutzerseite


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 ;-)

von Boxi B. (boxi)


Lesenswert?

Du wirst lachen Stefan, aber bubblesort() wird eine Memberfunction eine 
Klasse ;)

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.