Uebergabe von Funktionsparametern in C geht nicht

Gast #3935310
Lesenswert?

Ich will einen Parameter an eine Funktion übergeben:
1
#include "mbed.h"
2
 
3
InterruptIn Event1(D2);
4

5
void trigger() {
6
    printf("triggered!\n");
7
}
8

9
void rising_trigger(int no) {
10
    printf("rising %d", no); 
11
}
12

13
void falling_trigger(int no) {
14
    printf("falling %d", no); 
15
}
16
 
17
int main() {
18
    Event1.rise(&rising_trigger(1));
19
    // Event1.fall(&falling_trigger(1));
20
    
21
    while(1) {
22
        wait(0.001);
23
    }
24
}

Probleme macht dieser Funktionsaufruf:
1
    Event1.rise(&rising_trigger(1));

Es kommt ein Error:
Error: Expression must be an lvalue or a function designator

Kann ich keinen Funktionsparameter übergeben?
Gast #3935323
Lesenswert?

Peter II schrieb:
> bei einen funktionszeiger:
>
> Event1.rise( &rising_trigger );

Ich wollte mit den Interrupts experimentieren. Ich habe es jetzt 
hinbekommen, dass ich bei einem Ausgang einen Interrupt auslösen kann. 
Ich wollte nun probieren, mehere Interrupts zu setzen, die immer die 
gleiche Funktion aufrufen, aber ein Argument übergeben, dass dann 
angezeigt wird:
1
void falling_trigger(int no) {
2
    printf("falling %d", no);
3
}

Ich wollte nicht fünf verschiedene Funktionen falling_trigger erzeugen, 
sondern das Argument übergeben, dass für den jeweiligen Trigger 
verwendet werden soll. Aber scheinbar geht das nicht.

Bei Python hatte ich mal ein ähnliches Problem, dass ich Funktionen an 
bestimmten Stellen nicht mit einem Argument aufrufen konnte, dazu gab es 
dann die "Hilfsfunktion" partial(funktionsname, argument). Gibts sowas 
in C auch?
Gast #3935337
Lesenswert?

dann bau das struct um , um dem einen parameter mitgeben zu können...

event1.rise = &rising;
event1.fall = &falling;
event1.param = 1;

der aufruf der callback muss dann modifiziert werden.
aus ->func(); muss ->func(->param) werden.

evtl hier lieber einen void* als parameter....
das kann sich mal als nützlich erweisen
Gast #3935361
Lesenswert?

huhu schrieb:
> dann bau das struct um , um dem einen parameter mitgeben zu können...
>
> event1.rise = &rising;
> event1.fall = &falling;
> event1.param = 1;
>
> der aufruf der callback muss dann modifiziert werden.
> aus ->func(); muss ->func(->param) werden.
>
> evtl hier lieber einen void* als parameter....
> das kann sich mal als nützlich erweisen

Hmm, dann muss ich aber auch an den Quellcode herankommen. In der 
Headerdatei wird lediglich der Wert initialisiert und die einzelnen 
Module liegen als compilierte Dateien vor.
Gast #3935439
Lesenswert?

Rolf Magnus schrieb:
> ist es das?
1
InterruptIn Event1(D2);
2
Event1.rise(&rising_trigger(1));

deutet zumindest darauf hin.

> Auch da muß der Quellcode aber angepasst werden. Man kann ja nicht
> einfach irgendwo, wo ein Funktionszeiger gebraucht wird, stattdessen ein
> Objekt übergeben.
irgendwie hatte ich erwartet das es mit dem überladen () Operator geht.
#3935913
Lesenswert?

Peter II schrieb:
> InterruptIn Event1(D2);
> Event1.rise(&rising_trigger(1));
>
> deutet zumindest darauf hin.

Die zweite Zeile hätte durchaus auch C sein können, aber die 
Konstruktor-Initialisierung deutet tatsächlich stark auf C++ hin.

> irgendwie hatte ich erwartet das es mit dem überladen () Operator
> geht.

Nein, das geht nicht. Nur weil du einen Operator() schreibst, wird ja 
aus einem Zeiger auf das Objekt nicht automatisch ein Funktionszeiger.
Die Standard-Funktionen, denen man sowohl einen Funktionszeiger, als 
auch ein Objekt mit operator() übergeben kann, sind allesamt Templates. 
Die können den Aufruf entsprechend auflösen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren