www.mikrocontroller.net

Forum: Compiler & IDEs Zeiger auf Funktion


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

ich versuche mich gerade darin, einen Parser für RS232-Kommandos zu
schreiben. Leider habei ch ein paar Porbleme ein Kommando mit einer
Funktion zu verknüpfen.

Ich habe ein Array, in dem der Kommandstring und die dazu gehörigen
Funktion stehen sollen.
   typedef struct{
      char             CmdString[12];
      unsigned char    (*ExecuteFunction)(char * Data);
   }RemoteCommandStruct;

Das Problem ist, das die ExecuteFunktion das falsche Datenformat hat.
Weiß jemand welchen DatenTyp ich beim GCC nehmen muß, damit er sich
nicht "beklagt"?

MfG Mike

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Das Problem ist, das die ExecuteFunktion das
> falsche Datenformat hat.

Was hat sie?

Am besten, du postest mal die exakte Fehlermeldung mit (möglichst
in Englisch).

Die Deklararation sieht erstmal OK aus, aber die deklariert ja
nur einen Datentyp.  Den musst du noch irgendwo benutzen, und
dann musst du ja auch noch Funktionen haben, deren Adressen du
zum Initialisieren der Zeiger nehmen kannst.  Das braucht man
schon alles zusammen, um zu sehen, wo dein Problem liegt -- im
Moment ist schlicht kein Problem erkennbar.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich fülle die Tabelle wie folgt:
   {{"",     SCI_process_prompt},
    Die Tabelle geht hier noch weiter..

Wobei SCR_process_prompt der Name eine Funktion ist:
unsigned int SCI_process_prompt               (char * data)
{
//irgnedwas
}

Die Fehlermeldung ist dann

../parser.c:11: warning: initialization from incompatible pointer type


Auf einem anderen Controller mit anderem Compiler funktioniert das
ganze auch, nur leider mit dem GCC nicht.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja, der aufruf erfolgt später mit
(*RemCmdTbl[i].ExecuteFunction)(Data);

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler hat ja auch recht. Du hast einen Zeiger auf eine Funktion,
die einen unsigned char zurückgibt, und willst ihn auf eine Funktion
zeigen lassen, die stattdessen einen unsigned int zurückgibt. Die Typen
müssen übereinstimmen.
Übrigens: Beim Aufruf kannst du die Dereferenzierung weglassen. Es
reicht also:
RemCmdTbl[i].ExecuteFunction(Data);

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke jetzt funktioniert es wieder so, wie es soll.

Das kommt davon, wenn man versucht aus 2 Programmen eins zu machen und
nicht auf Rückgabewerte achtet.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es wäre besser die Adresse der Funktion zu speichern und eine Funktion
zu verwenden die einen char zurückgibt, wie in der Deklaration
angegeben.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Es wäre besser die Adresse der Funktion zu speichern

Huh?  Genau das tut er doch?!

Btw., ich würde keine Strings mit in das Array nehmen, sondern
stattdessen Zeiger auf Strings im Flash (PGM_P).

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Rückgabewert der Funktion habe ich gerade auf char geändert. Ein Int
ist da echt übertrieben. Wobei der voherige Controller 16Bit hatte, da
war es egal.

Das mit den Strings im Flash klingt Interressant. Aber bis jetzt sollte
erstmal die Funktion selber laufen, dann wird weiter optimiert :-)

Beim optimieren bi nich übrigens auf noch ein Problem gestoßen:
Ich habe eine Tabelle mit den Fehlermeldungen, die bisher auch noch im
Ram liegt, allerdings wieß ich nciht, wie ich die in den Flash legen
kann.
   char  * Fault[4]   = {"OK",                                    // 0
                         "Bad command!",                             
  // 1
                         "Bad data format!",                   // 2
                         "Range error!",                       // 3
                        };

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für das Array mit char* im Flash gibts hier ein Beispiel:

http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

/Ernst

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wobei ich die Notwendigkeit, auch die Zeiger in den ROM zu packen,
nicht immer sehe.   Die nehmen -- verglichen mit den vielen
Strings -- relativ wenig Platz ein.

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.