Forum: Mikrocontroller und Digitale Elektronik LCD-Forum Routine mit String Übergabe per Zeiger/Pointer funktioniert nicht


von Thomas S. (thomass)


Angehängte Dateien:

Lesenswert?

@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

von Thomas S. (thomass)


Lesenswert?

@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

von Thomas S. (thomass)


Lesenswert?

@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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas S. (thomass)


Lesenswert?

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
Noch kein Account? Hier anmelden.