Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Adresse des Unterprogramm


von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Besteht eine Möglichkeit, einen Zeiger auf die Adresse eine 
Unterprogramm zu setzen ?
Gruß Siegfried

von Severino R. (severino)


Lesenswert?

Ja, die Möglichkeit besteht.

von yalu (Gast)


Lesenswert?

Das geht in den meisten Programmiersprachen. In C heißen die Dinger
Funktionszeiger. Google kennt sich auch damit aus.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
habe es so probiert

unsigned int *ProzessUpAdresse;

ProzessUpAdresse = &FahrstrasseAusfahrenSbhGleis_15();

bekomme "syntax error"

Gruß Siegfried

von Klugscheisser (Gast)


Lesenswert?

@ Siegfried
1
unsigned int *ProzessUpAdresse;
ist kein Zeiger auf eine Funktion, sondern ein Zeiger auf unsigned int.

Damit, man den Zeiger richtig deklarieren kann, zeige mal die 
Deklaration der Funktion
1
FahrstrasseAusfahrenSbhGleis_15 ()

Nebenbei bemerkt, scheint mir die Nummer am Ende der Funktion auf 
mögliche Verbesserungen im Design hinzudeuten. Es ist sehr viel Aufwand 
15 oder mehr Funktionen zu deklarieren und zu schreiben. Das kann man 
vermutlich kürzer erledigen.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
hier die Deklaration der Funktion
->  unsigned char FahrstrasseAusfahrenSbhGleis_15(void)  <-

welch "Verbesserungen im Design" könnte ich machen ?
Die Deklaration der Funktion geht von FahrstrasseAusfahrenSbhGleis_11 
bis FahrstrasseAusfahrenSbhGleis_15.

möchte mal kurz beschreiben, was ich mit dem "Zeiger auf Adresse des 
Unterprogramm" vorhabe.

In der Funktion "FahrstrasseAusfahrenSbhGleis_XX" werden unterschiedlich 
Abläufe und Anzahl in einen Buffer geladen. Diese Abläufe werden über 
einen Timer ausgeführt. Sollte jedoch beim laden des Buffers, dieser 
überlaufen, möchte ich den letzten Auftrag (Unterprogramm) sichern, 
sodas dieser wenn der Buffer wieder genügend Platz verfügt, nach geladen 
wird.

Gruß Siegfried

von yalu (Gast)


Lesenswert?

Hast du kein C-Lehrbuch? Dort würde nämlich deine Frage beantwortet.
Alternativ gibt es auch Anleitungen für C im Web, bspw. diese hier:

  http://num.math.uni-goettingen.de/Dokumentationen/C/Einfuehrung/index.html

Das zweitletze Kapitel interessiert dich:

  http://num.math.uni-goettingen.de/Dokumentationen/C/Einfuehrung/funktionszeiger.html

von Klugscheisser (Gast)


Lesenswert?

>hier die Deklaration der Funktion
1
unsigned char FahrstrasseAusfahrenSbhGleis_15 (void)

Dann muss der Zeiger auf die Funktion wie folgt deklariert sein:
1
unsigned char (* Funktionszeiger)(void);

Die Zuweisung wäre dann:
1
Funktionszeiger = & FahrstrasseAusfahrenSbhGleis_15 ();

Detail dazu findest Du auch im K&R 2. Auflage, Hanser, S. 116

>welch "Verbesserungen im Design" könnte ich machen ?
Auch aufgrund Deiner Beschreibung lässt sich das nicht im Detail 
erklären.
Allgemein sollte man generisch behandeln, was in wechselnden 
Ausprägungen vorkommt. Du schreibst ja auch keine Funktionen plus_1, 
plus_2, plus_3 usw. sondern benutzt den + Operator.

Du sagst ja, das in den Funktionen verschiedene Kombinationen von Daten 
in einen Buffer geladen werden. Wenn Du diese Daten selbst in einem 
Array oder einer geeigneten Struktur speicherst, die mit der 
Fahrstrassennummer indiziert werden, brauchst Du nur eine Funktion mit 
der Nummer als Parameter, die dann die Daten in Deinen Buffer lädt.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,

*.h
unsigned char FahrstrasseAusfahrenSbhGleis_15 (void)
unsigned char (* Funktionszeiger)(void);


*.c
Funktionszeiger = & FahrstrasseAusfahrenSbhGleis_15 ();

leider
"E:\UsbPc\UsbPcProzess.c:120:Error: syntax error"


Gruß Siegfried

von Eddy C. (chrisi)


Lesenswert?

Ja sicher. Weniger ist mehr:

Funktionszeiger = FahrstrasseAusfahrenSbhGleis_15;

von Klugscheisser (Gast)


Lesenswert?

Oops. Sorry.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
Infos sind klasse, es funktioniert.
Habe bereits auch weiter geschrieben.

Funktionszeiger = FahrstrasseAusfahrenSbhGleis_15;
if (Funktionszeiger() == -1)
{
AddFahrstrasseError();
}

genau, das was ich haben wollte.

Vielen Dank an alle.

Gruß Siegfried

PS.
hat hierzu jemand die ISBN Nummer ?
K&R 2. Auflage, Hanser, S. 116

von Klugscheisser (Gast)


Lesenswert?

ISBN: 3-446-15497-3
Allerdings ist das Buch von 1990
Wahrscheinlich gibt es inzwischen Neuauflagen.

von Siegfried S. (dieleena)


Lesenswert?

Hallo,
danke für die schnelle Info
Gruß Siegfried

von yalu (Gast)


Lesenswert?

> Allerdings ist das Buch von 1990 Wahrscheinlich gibt es inzwischen
> Neuauflagen.

Soweit ich weiß, nicht. Eigentlich wäre so langsam eine C99-Auflage
fällig. Fast 10 Jahre nach Herausgabe des neuen Standards sinken aber
IMHO die Chancen, dass sich die Jungs noch einmal hinsetzen und das Buch
auf den neuesten Stand bringen.

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.