Forum: Mikrocontroller und Digitale Elektronik Uebergabe von Funktionsparametern in C geht nicht


von Schnapp (Gast)


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?

von Peter II (Gast)


Lesenswert?

Schnapp schrieb:
> Event1.rise(&rising_trigger(1));

was braucht denn rise für ein Parameter? Ein funktionzeiger ein wert?

bei einen funktionszeiger:

Event1.rise( &rising_trigger );

von Schnapp (Gast)


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?

von Sven (Gast)


Lesenswert?

In C kann man keine Funktionswerte binden, da brauchst du C++ mit boost 
bind z.b.

von Rolf M. (rmagnus)


Lesenswert?

Ich glaube, ich ahne, was du willst. Parameter werden an eine Funktion 
bei ihrem Aufruf übergeben, nicht bei der Erzeugung eines Zeigers auf 
diese Funktion. Also geht das so nicht, wie du dir das vorstellst.

von huhu (Gast)


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

von Schnapp (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Ich glaube, ich ahne, was du willst. Parameter werden an eine Funktion
> bei ihrem Aufruf übergeben, nicht bei der Erzeugung eines Zeigers auf
> diese Funktion. Also geht das so nicht, wie du dir das vorstellst.

schade :-(

von Schnapp (Gast)


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.

von huhu (Gast)


Lesenswert?

hmm  .. dann finger weg...

bzw selbst neu schreiben.

von huhu (Gast)


Lesenswert?

grmpf...


wenn mal was wie jetzt ist steht man ohne source doof da...
ich nutze deswegen nur quellen die auch den source veröffentlichen


gabs von mbed nicht ein git?

von Peter II (Gast)


Lesenswert?

da das ganze ja eh C++ ist, warum nicht ein objekt übergeben

http://stackoverflow.com/questions/1380463/sorting-a-vector-of-custom-objects

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> da das ganze ja eh C++ ist,

ist es das?

> warum nicht ein objekt übergeben
>
> http://stackoverflow.com/questions/1380463/sorting-a-vector-of custom-objects

Auch da muß der Quellcode aber angepasst werden. Man kann ja nicht 
einfach irgendwo, wo ein Funktionszeiger gebraucht wird, stattdessen ein 
Objekt übergeben.

von Peter II (Gast)


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.

von Rolf M. (rmagnus)


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.

von Steffen R. (steffen_rose)


Lesenswert?

Schnapp schrieb:
> Event1.rise(&rising_trigger(1));

Erstelle notfalls eine Funktion ohne Parameter, die dann 
rising_trigger(1) aufruft.

Nicht so schön, aber wenns nicht ander geht.

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.