www.mikrocontroller.net

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


Autor: Thomas S. (thomass)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all,

ich scheine das Problem gefunden zu haben es ist die for Schleife die 
die Struktur nach einem gleichen Wert durchsuchen soll.

for(uint=0; menu_state[uint].state; uint++)
{
  if ( menu_state[uint].state == LCD_Status )
  {
        LCD_01_StatusText =  menu_state[0].ptext
        LCD_02_StatusText =  menu_state[uint].ptext
  }
}
pStateFunc = NULL;
lcd_string(LCD_01_StatusText,1);
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.

MENU_STATE menu_state[] =
{
  //STATE        STATE_TEXT_Display_1    STATE_FUNKTION
  {ST_Startmenu,      MT01_Startmenu,      LCD_MENU_Startmenu},
  {ST_Transponder,    MT_Transponder,      NULL},

};

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

Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all,

ich habe nun mal die Werte der Struktur in eine Variable schreiben 
lassen
value0 = menu_state[0].state;
value1 = menu_state[1].state;
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
#define ST_Startmenu          0100
#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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas S. (thomass)
Datum:

Bewertung
0 lesenswert
nicht 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
for(uint=0; menu_state[uint].state; uint++)

Diese wird jedoch auch zu oft durchlaufen.

Gruß

Thomas

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.