Funktion als Parameter

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Funktion als Parameter

Beitrag von Xeon » Do Jun 11, 2020 1:33 pm

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

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion als Parameter

Beitrag von cloidnerux » Do Jun 11, 2020 1:45 pm

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 :D :

Deine Funktion "funktion" erwartet keine Parameter und verarbeitet dementsprechend auch keine.
Daher sollte

Code: Alles auswählen

 funktion(funktion_als_parameter);
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");
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Funktion als Parameter

Beitrag von Xeon » Do Jun 11, 2020 2:11 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Funktion als Parameter

Beitrag von cloidnerux » Do Jun 11, 2020 2:17 pm

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:

Code: Alles auswählen

void funktion(void (*funk_pointer))
dann fehlen da zwei Klammern für die leere Parameterliste des Funktionspointers:

Code: Alles auswählen

void funktion(void (*funk_pointer)(void))
hättest du eine Funktion

Code: Alles auswählen

int addiere(int a, int b){return a+b;}
würde der Funktionspointer so aussehen:

Code: Alles auswählen

int (*funk)(int, int) = addiere;
Mit den beiden Klammern funktioniert es.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Funktion als Parameter

Beitrag von Xeon » Sa Jun 13, 2020 12:28 pm

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?

Code: Alles auswählen

int (*funk)(int, int) = addiere;

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Funktion als Parameter

Beitrag von mfro » Sa Jun 13, 2020 1:01 pm

Xeon hat geschrieben:
Sa Jun 13, 2020 12:28 pm
Wohin kommt diese Codezeile und warum das '=' Zeichen?

Code: Alles auswählen

int (*funk)(int, int) = addiere;
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)

Code: Alles auswählen

addiere(1, 1);
oder

Code: Alles auswählen

(*funk)(1, 1);
schreiben. In beiden Fällen wird addiere() aufgerufen, einmal direkt und einmal über den Funktionszeiger.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Xeon
Beiträge: 169
Registriert: So Dez 17, 2017 4:10 pm

Re: Funktion als Parameter

Beitrag von Xeon » Sa Jun 13, 2020 2:04 pm

Wie komme ich jetzt an das Ergebnis heran?

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Funktion als Parameter

Beitrag von mfro » Sa Jun 13, 2020 2:40 pm

Wie immer:

Code: Alles auswählen

a = addiere(1, 1);
oder

Code: Alles auswählen

a = (*funk)(1, 1);
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

Antworten