www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeiger auf Adresse des Unterprogramm


Autor: Siegfried Saueressig (dieleena)
Datum:

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

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Möglichkeit besteht.

Autor: yalu (Gast)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
habe es so probiert

unsigned int *ProzessUpAdresse;

ProzessUpAdresse = &FahrstrasseAusfahrenSbhGleis_15();

bekomme "syntax error"

Gruß Siegfried

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Siegfried
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
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.

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/...

Das zweitletze Kapitel interessiert dich:

  http://num.math.uni-goettingen.de/Dokumentationen/...

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>hier die Deklaration der Funktion
unsigned char FahrstrasseAusfahrenSbhGleis_15 (void)

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

Die Zuweisung wäre dann:
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.

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Eddy Current (chrisi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja sicher. Weniger ist mehr:

Funktionszeiger = FahrstrasseAusfahrenSbhGleis_15;

Autor: Klugscheisser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oops. Sorry.

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Klugscheisser (Gast)
Datum:

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

Autor: Siegfried Saueressig (dieleena)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
danke für die schnelle Info
Gruß Siegfried

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.