@all, ich habe ein kleines Problem mit einer LCDausgabe eines Strings der per Zeiger übergeben wird. Das ganze soll später mal eine Menusteuerung werden. Ich habe nun ein Stukur gemacht und der die Strings gespeichert werden. greife ich nun über einen Zeiger auf diese Struktur zu werden die ersten 10 Zeichen nicht ausgegeben. Wenn ich nun im Main.c den gleichen String speichere kette[] = "abcdefgd usw."; den gleichen Zeiger auf diesen setze werden alle Zeichen ausgegeben und das verstehe ich nicht. Im LCD.c habe ich mal folgen Zeilen makiert. #1-5 funktioniert alle Zeichen werden ausgegeben #6-7 werden die ersten 10 Zeichen nicht ausgegeben Ich kann mir nicht erklären warum. Danke für Eure Hilfe. Thomas
@all, ich scheine das Problem gefunden zu haben es ist die for Schleife die die Struktur nach einem gleichen Wert durchsuchen soll.
1 | for(uint=0; menu_state[uint].state; uint++) |
2 | {
|
3 | if ( menu_state[uint].state == LCD_Status ) |
4 | {
|
5 | LCD_01_StatusText = menu_state[0].ptext |
6 | LCD_02_StatusText = menu_state[uint].ptext |
7 | }
|
8 | }
|
9 | pStateFunc = NULL; |
10 | lcd_string(LCD_01_StatusText,1); |
11 | lcd_string(LCD_02_StatusText,2); |
Wird nun die for Schleife durchlaufen ist uint=0 ist menu_state[uint].state =64,beim nächsten durchlauf uint=1 ist menu_state[uint].state = 1000, beim nächsten Durchlauf ist uint=2 und menu_state[uint].state=100 und somit gleich LCD_Status. ST_Startmenu ist mit 100 definiert und ist an der ersten Zeile also "0" und somit sollte menu_state[uint].state == LCD_Status schon beim ersten Durchlauf gleich sein ist es jedoch nicht.
1 | MENU_STATE menu_state[] = |
2 | {
|
3 | //STATE STATE_TEXT_Display_1 STATE_FUNKTION
|
4 | {ST_Startmenu, MT01_Startmenu, LCD_MENU_Startmenu}, |
5 | {ST_Transponder, MT_Transponder, NULL}, |
6 | |
7 | };
|
Hat jemand eine Erklärung hierführ? WAS mache ich falsch oder wo ist mein Denkfehler. Beim ersten lcd_string(...) wird die korrekte Zeichenkette ausgegeben beim zweiten fehlen die ersten zehn Zeichen. Gruß und Danke!!!! Thomas
@all, ich habe nun mal die Werte der Struktur in eine Variable schreiben lassen
1 | value0 = menu_state[0].state; |
2 | value1 = menu_state[1].state; |
3 | value2 = menu_state[2].state; |
Wenn ich mir diese dann mit dem AVR Studio Simulator anzeigen lassen kommen folgende Werte heraus. value0 = 64 value1 = 1000 value2 = 100 Sie ST_.. Werte sind wie folgt definiert
1 | #define ST_Startmenu 0100
|
2 | #define ST_Transponder 1000
|
Es gibt im struct ja nur 2 Einträge wie können da dann 3 Werte stehen, ST_Startmenu ist ja als erster Eintrag in der struct aber wie kommt da 64 für state hin.Sollte es nicht wie folgt aussehen. value0 = 100 value1 = 1000 Jedoch wie kann ST_Startmenu auf menu_state[2].state gefunden werden und der dazugehörige String steht auf menu_state[0].ptext. Hat jemand eine Erklärung bzw. was mache ich falsch sind meine ersten gehversuche mit Strukturen daher ist ein Fehler nicht auszuschliessen. Danke Thomas
Thomas S. wrote: > Es gibt im struct ja nur 2 Einträge wie können da dann 3 Werte stehen, Das ist C. Dem Prozessor ist es völlig egal. Du könntest auch den Index 89 auslesen und er würde es tun, obwohl es diesen Eíntrag nicht gibt. Da wird einfach von der Startadresse 89 mal die Größe eines Eintrags hinzuaddiert und von der dadurch erhaltenen Speicheradresse gelesen. Den Compiler interessiert das herzlich wenig, dass dieser Speicherbereich nicht mehr zum Array gehört. Du bist der Programmierer. Du hast dafür zu sorgen, dass die Logik stimmt. > ST_Startmenu ist ja als erster Eintrag in der struct aber wie kommt da > 64 für state hin.Sollte es nicht wie folgt aussehen. > > value0 = 100 #define ST_Startmenu 0100 Nein. Zahlen die mit einer 0 beginnen, sind Oktal-Zahlen Und Oktal 0100 ist nun mal dezimal 64. Also lass die führende 0 einfach weg.
Hallo Karl-Heinz, oje das mit den Oktalzahlen habe ich nicht gewußt. Naja man lernt immer wieder hinzu. Danke für die Antwort Karl heinz Buchegger wrote: > Thomas S. wrote: > >> Es gibt im struct ja nur 2 Einträge wie können da dann 3 Werte stehen, > > Das ist C. > Du bist der Programmierer. Du hast dafür zu sorgen, > dass die Logik stimmt. > Wie kann ich sicher sein, dass nur der Speicherbereich der Struktur geprüft wird.Mit sizeof kann ich ja die Größe ermitteln aber wie kann ich es definieren, daß die for schleife nach Index X aufhört. Gut ich könnte wenn ich fertig bin einfach die Maximale Zahl eintragen aber wie funktioniert dies flexibel. Die orginal FOR Schleifen Programmierung ist
1 | for(uint=0; menu_state[uint].state; uint++) |
Diese wird jedoch auch zu oft durchlaufen. Gruß Thomas
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.