Seite 1 von 1
Funktion als Parameter
Verfasst: Do Jun 11, 2020 1:33 pm
von Xeon
Hallo zusammen
Hier der Quellcode von mir:
Code: Alles auswählen
#include <stdio.h>
void funktion()
{
printf("Funktion gerufen\n");
}
void funktion_als_parameter()
{
printf("funktion_als_parameter wurde gerufen\n");
}
int main()
{
funktion(funktion_als_parameter);
return 0;
}
Ich möchte das die Funktion "funktion_als_parameter" ausgeführt wird und zugleich soll sie selber der Parameter sein. Leider wird nur funktion() ausgeführt. Was muss ich machen damit auch "funktion_als_parameter" ausgeführt wird?
Liebe Grüße
Von Xeon
Re: Funktion als Parameter
Verfasst: Do Jun 11, 2020 1:45 pm
von cloidnerux
Ich möchte das die Funktion "funktion_als_parameter" ausgeführt wird und zugleich soll sie selber der Parameter sein. Leider wird nur funktion() ausgeführt. Was muss ich machen damit auch "funktion_als_parameter" ausgeführt wird?
Du musst das dann genau so programmieren und nicht nur wollen

:
Deine Funktion "funktion" erwartet keine Parameter und verarbeitet dementsprechend auch keine.
Daher sollte
zumindest zu einer Compiler-Warnung führen.
Was du haben möchtest sind Pointer auf Funktionen und du willst deiner Funktion "funktion" einen solchen Pointer übergeben:
Code: Alles auswählen
void funktion(void (*funk_pointer)(/*Paramter der zu übergebenden Funktion*/)){
if(funk_pointer != NULL){ //Checken, dass auch tatsächlich ein pointer übergeben wurde
funk_pointer(); //Ausführen
}
printf("Funktion gerufen\n");
}
Re: Funktion als Parameter
Verfasst: Do Jun 11, 2020 2:11 pm
von Xeon
Code: Alles auswählen
#include <stdio.h>
void funktion(void (*funk_pointer))
{
if(funk_pointer != NULL)
{
funk_pointer();
}
printf("Funktion gerufen\n");
}
void funk_pointer()
{
printf("funktion_pointer wurde gerufen\n");
}
int main()
{
funktion(funk_pointer);
return 0;
}
Irgendwie will es nicht gehen.
Re: Funktion als Parameter
Verfasst: Do Jun 11, 2020 2:17 pm
von cloidnerux
Irgendwie will es nicht gehen.
Naja, es gibt schon einen sehr guten Grund, warum es nicht geht. Mein gcc sagt mir:
Code: Alles auswählen
test.c: In function 'funktion':
test.c:7:9: error: called object 'funk_pointer' is not a function or function pointer
funk_pointer();
^
test.c:3:22: note: declared here
void funktion(void (*funk_pointer))
^
Also ist "funk_pointer" gar kein korrekter Funktionspointer. Wenn wir uns nochmal deine Funktionsprototypen anschauen:
dann fehlen da zwei Klammern für die leere Parameterliste des Funktionspointers:
hättest du eine Funktion
würde der Funktionspointer so aussehen:
Mit den beiden Klammern funktioniert es.
Re: Funktion als Parameter
Verfasst: Sa Jun 13, 2020 12:28 pm
von Xeon
Hab das jetzt mal so gemacht:
Code: Alles auswählen
#include <stdio.h>
void funktion(int (* addiere)(int, int))
{
int Ergebnis;
if(addiere != NULL)
{
Ergebnis = addiere(4+4, 1+1);
}
printf("Ergebnis %d\n", Ergebnis);
}
int addiere(int a, int b)
{
return a + b;
}
int main()
{
funktion(addiere);
return 0;
}
Wohin kommt diese Codezeile und warum das '=' Zeichen?
Re: Funktion als Parameter
Verfasst: Sa Jun 13, 2020 1:01 pm
von mfro
Xeon hat geschrieben: ↑Sa Jun 13, 2020 12:28 pm
Wohin kommt diese Codezeile und warum das '=' Zeichen?
Der Teil links vom Gleichheitszeichen ist - auch wenn's für dich vielleicht nicht so aussieht - die Deklaration einer Variable namens funk. Der Typ dieser Variable ist ein Zeiger auf eine Funktion, die zwei int-Parameter annimmt und ein int Ergebnis zurückliefert.
Der Teil rechts vom Gleichheitszeichen ist die Adresse der Funktion addiere. Hier ist eine der wenigen echten Inkonsistenzen von C zu sehen: es ist völlig egal, ob Du da "addiere" oder "&addiere" hinschreibst, es bedeutet in diesem Fall genau dasselbe: die Adresse der Funktion (ich persönlich schreibe den Adressoperator immer hin, dann weiss man, was gemeint ist).
Anschliessend kannst Du (gleichwertig)
oder
schreiben. In beiden Fällen wird addiere() aufgerufen, einmal direkt und einmal über den Funktionszeiger.
Re: Funktion als Parameter
Verfasst: Sa Jun 13, 2020 2:04 pm
von Xeon
Wie komme ich jetzt an das Ergebnis heran?
Re: Funktion als Parameter
Verfasst: Sa Jun 13, 2020 2:40 pm
von mfro