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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.