So ich weiss jetzt gar nicht genau wie ich das beschreiben soll. Hoffe
auch das mein Betr. überhaupt etwas aussagt. Mein Problem ist das ich
ein Struktur habe welches so aussieht:
1
typedefstruct{
2
unsignedcharlength;
3
unsignedchar*cmd;
4
void(*fct)(void);
5
}UART_MEN;
davon habe ich mehrere statisch angelegt:
1
staticUART_MENUART_menu_C[]={
2
{3,"lr",UART_menu_flash_clr},
3
{5,"lear",UART_menu_flash_clr}
4
};
5
...
Um diese jetzt zu verwalten habe ich ein Feld angelegt mit Pointern auf
die einzelnen Strukturen
1
staticUART_MEN*pUART_menu[]={
2
UART_menu_C,
3
...
jetzt muss ich wissen wie lang mein Statisches Strukturenfeld ist.
Wenn ich
1
i=sizeof(UART_menu_C);
ausführe erhalte ich 12, was auch der Länge von 2 Strukturen entspricht.
Da ich im Programm aber nur mit Pointern arbeite kann ich nur
1
i=sizeof(*pUART_menu_sub);
verwenden.
Das gibt mir natürlich nur den Wert 6 da es ja nur auf die erste
Struktur zeigt und nicht auf das gesammte Element.
Finde keine andere Art das zu machen, daher meine Frage ob das überhaupt
so machbar ist oder ob es nicht machbar ist. Für jede Hilfe bin ich echt
dankbar.
Kurze Erklärun noch dazu. Damit baue ich mir ein Menü auf welches über
die UART gesteuert wird. Ich untersuche da den ersten Buchstaben, stimmt
dieser den zweiten... dazu ist dann die Struktur da. In der wird die
Länge des Befehls und der Befehl selber definiert. Jetzt muss ich aber
wissen auf wie viele Elemente ich es für den jeweiligen ersten
Buchstaben untersuchen muss.
Hoffe das iss nich zu verwirrend und mir kann jemand helfen.
Greetz
Stephan
Stephan Plaschke wrote:
> Das gibt mir natürlich nur den Wert 6 da es ja nur auf die erste> Struktur zeigt und nicht auf das gesammte Element.> Finde keine andere Art das zu machen, daher meine Frage ob das überhaupt> so machbar ist oder ob es nicht machbar ist. Für jede Hilfe bin ich echt> dankbar.
Ist nicht machbar.
Wenn du nur einen Pointer hast, der auf ein Array zeigt, ist es
nicht möglich, die Größe des Arrays zu bestimmen.
Genau das ist zb. die Krux bei allen String-verarbeitenden
Funktionen. Ein strcpy kann sich per Definition nicht davor
schützen, das Zielarray zu überschreiben, weil es aus dem erhaltenen
Pointer nicht die Größe des Arrays ermitteln kann.
-> Größe mit übergeben oder ein Dummy-Element ins Array einfügen,
welches die Rolle von 'ich bin das letzte' spielt.
> In der wird die Länge des Befehls und der Befehl selber> definiert.
Diese Länge brauchst du wiederrum nicht. Diese Länge ist per
strlen aus dem Kommando bestimmbar.
In deinem Fall kannst du die Sache mit einer weiteren
Struktur retten, in der du einen Zeiger zu einem Menü
mit der Größe des Menüs verknüpfst.
OliverSo wrote:
>>Da ich im Programm aber nur mit Pointern arbeite kann ich> nuri=sizeof>(*pUART_menu_sub);>>verwenden.>> Und wer hindert dich daran, trotzdem
1
i=sizeof(UART_menu_C);
> zu benutzen?>
Dann setzt mal in diesem Code für die ??? richtig ein
@ Karl heinz Buchegger
Dachte ich mir. Werd das mit einer weiteren Struktur lösen. Vielen Dank!
@
OliverSo
Mein Programm! Ich habe ja nur einen Buchstaben und der zeigt über einen
Pointer auf das erste Element des Feldes. Da ich aber nicht immer mit
if() oder ähnlichen abfragen will welchen Buchstaben ich habe ist es
nicht möglich immer direkt abzufragen.
Danke noch mal!!
Steph0815
Stephan Plaschke wrote:
> Mein Programm! Ich habe ja nur einen Buchstaben und der zeigt über einen> Pointer auf das erste Element des Feldes. Da ich aber nicht immer mit> if() oder ähnlichen abfragen will welchen Buchstaben ich habe ist es> nicht möglich immer direkt abzufragen.
Üder diese Abfrage sollte man sowieso noch mal reden.
Anstatt da mit Buchstaben rumzuwurschteln, warum benutzt
du nicht einfach einen strcmp()?
http://www.mikrocontroller.net/articles/FAQ#strcmp.28_const_char.2A_str1.2C_const_char.2A_str2_.29
String wird komplett von der UART geholt und danach das Menü
Eintrag für Eintrag durchgegangen und mittels strcmp() verglichen
ob eines der Kommandos übereinstimmt. Wenn ja, wird die
zugehörige Funktion aufgerufen. Fertig!
Karl heinz Buchegger wrote:
> Stephan Plaschke wrote:>> Mein Programm! Ich habe ja nur einen Buchstaben und der zeigt über einen>> Pointer auf das erste Element des Feldes. Da ich aber nicht immer mit>> if() oder ähnlichen abfragen will welchen Buchstaben ich habe ist es>> nicht möglich immer direkt abzufragen.>> Üder diese Abfrage sollte man sowieso noch mal reden.> Anstatt da mit Buchstaben rumzuwurschteln, warum benutzt> du nicht einfach einen strcmp()?
Da hast du wirklch recht. Habe das jetzt auch so geändert. Ich suche
immer noch nach den ersten Buchstaben, ist dieser üngültig exit. Danach
nehme ich dann aber nicht strcmp() sondern strcasecmp() ist ja
eigentlich das gleiche nur unterscheidet Groß- und Kleinbuchstaben. Ist
dann ein gültiger Befehl erkannt ausführen des Befehls wenn nicht
Abbruch mit Error. Ganz einfach wenn ich das so betrachte!
Vielen Dank Karl heinz Buchegger, viel Arbeit erspart!!
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.