Zeiger auf Funktion

Gast #367814
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.
1
   typedef struct{
2
      char             CmdString[12];
3
      unsigned char    (*ExecuteFunction)(char * Data);
4
   }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
Moderator Persönliche Seite #367815
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.
Gast #367816
Lesenswert?

Also, ich fülle die Tabelle wie folgt:
1
   {{"",     SCI_process_prompt},
2
    Die Tabelle geht hier noch weiter..

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

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.
Gast #367818
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:
1
RemCmdTbl[i].ExecuteFunction(Data);
Gast #367822
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.
1
   char  * Fault[4]   = {"OK",                                    // 0
2
                         "Bad command!",                             
3
  // 1
4
                         "Bad data format!",                   // 2
5
                         "Range error!",                       // 3
6
                        };

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren