mikrocontroller.net

Forum: Compiler & IDEs Seltsamer Effekt bei dtostrf() und strcat()


Autor: Christoph Roters (chroters)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe folgenden Effekt, hervorgerufen durch folgende Zeilen:

    lcd_clear();

    dtostrf(messung,4,0,txt);

    lcd_txt = "ADC:";

    strcat(lcd_txt, txt);
    lcd_write_s(lcd_txt);
    lcd_txt = "";
(Der Rest des codes im Anhang)

Im LCD Display erscheint beim ertsen Durchlauf "ADC: 260", wobei
260 der Wert aus adc-messung ist.
Beim zweiten Durchlauf steht "ADC: 260 260" im Display.
Beim dritten Durchlauf dann "ADC: 260 260 260"

Das geht dann munter so weiter mit Stacküberlauf und fiesen Dingen.

Ich weiss nicht woran es liegt.
Ich habe schon einiges umgestellt und probiert.

Würde mich über Hilfe sehr freuen.

gruss
christoph

Autor: J. S. (munk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch's mal so
    lcd_txt[0] = 0;
    strcat(lcd_txt,"ADC:");
    strcat(lcd_txt, txt);
    lcd_write_s(lcd_txt);

Autor: Christoph Roters (chroters)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super klasse funktioniert!

Wäre auch schön wenn ich jetzt auch noch verstehen würde, was da genau 
passiert.

Aber erstmal recht herzlichen Dank.

gruss
Christoph

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, wieviel Speicher wird denn allokiert für ein char* ... erstmal nur 
soviel wie der Pointer selbst braucht. Und wenn man diesem Pointer 
fröhlich Strings "zuweist", wie schaut's dann mit dem Speicher aus?

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

Bewertung
0 lesenswert
nicht lesenswert
Christoph Roters schrieb:

> Wäre auch schön wenn ich jetzt auch noch verstehen würde, was da genau
> passiert.


Du schreibst jetzt 100 mal:
Ein konstanter String, ein sog. String Literal, kann nicht verändert 
werden. Niemals!

Und dann schreibst du noch 100 mal:
Wenn ich einen String verändern möchte, zb indem ich ihn verlängere, 
dann brauche ich daher ein char-Array, in welchem der String abgelegt 
werden kann.

Und dann denkst du mal darüber nach, was das alles mit dem hier

>     lcd_txt = "ADC:";
>
>     strcat(lcd_txt, txt);

zu tun hat.

Autor: Christoph Roters (chroters)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das jetzt besser verstanden.
Eher durch diesen Link
http://de.wikibooks.org/wiki/C-Programmierung:_Arr...
als durch die beiden letzten Beiträge. Habe es 100 mal hingeschrieben , 
hat aber irgendwie keinen Erkenntnissgewinn gebracht. ;-)
Trotzdem Danke für die nette Hilfe hier im Forum

Aber ich weiss jetzt, dass ein char immer ein Array ist und ich nicht so 
einfach Zuweisungen machen darf.
Und das ich die Arrays am besten über Funktionen oder Pointer anspreche 
bzw. verwalte.
Ich hoofe ich habe das einigermaßen richtig formuliert.


Noch 2 Fragen:

1) Was genau bedeutet  char *
2) Wen ich z.b. LCD_TXT[0] = 0; schreibe und vorher stand etwas in 
LCD_txt.
   Bleben das Reste von LCD_TXT im Speicher?



Trotzdem Danke für die nette Hilfe hier im Forum

Gruss
Christoph

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

Bewertung
0 lesenswert
nicht lesenswert
Christoph Roters schrieb:

> http://de.wikibooks.org/wiki/C-Programmierung:_Arr...
> als durch die beiden letzten Beiträge. Habe es 100 mal hingeschrieben ,
> hat aber irgendwie keinen Erkenntnissgewinn gebracht. ;-)
> Trotzdem Danke für die nette Hilfe hier im Forum

Jetzt fehlt nur noch die Einsicht, dass Online Tutorials einem 
vernünftigen Buch (zb. dem Klassiker "Kernighan & Ritchi") nicht das 
Wasser reichen können. Und ohne Literatur wirst du immer in der 
Situation sein, dass du über Halbwissen verfügst, das hinten und vorne 
nicht zusammenpasst.

> Aber ich weiss jetzt, dass ein char immer ein Array ist und ich nicht so
> einfach Zuweisungen machen darf.

Siehst du: Genau das meine ich.
Ein char ist kein Array. Ein char ist ein char.

Strings werden immer als Abfolge von chars im Speicher abgelegt. Das 
kann sein ein char-Array, das kann aber auch ein String-Literal sein, 
von dem man einen Pointer auf den Anfang des Literals hat.

> Und das ich die Arrays am besten über Funktionen oder Pointer anspreche
> bzw. verwalte.

Nicht notwendigerweise.
Aber wenn du von Strings sprichst, kannman das so formulieren. Für 
Strings gibt es vorgefertigte Funktionen, die damit umgehen können.


> 1) Was genau bedeutet  char *

char * a;

a ist ein Pointer auf einen char. Ob sich an dieser Stelle im Speicher 
ein einzelner char befindet, oder ob dort der Start einer Sequenz von 
char ist, lässt sich am Pointer nicht ablesen. Das muss der 
Programmierer wissen.

> 2) Wen ich z.b. LCD_TXT[0] = 0; schreibe und vorher stand etwas in
> LCD_txt.
>    Bleben das Reste von LCD_TXT im Speicher?

Ja, klar. Die Zuweisung verändert ja nur LCD_TEXT[0]. Alle anderen 
Elemente des Arrays bleiben unangetastet.
Die Operation macht genau das, was da steht. Und nur das!

Noch ein anderer Link
http://www.mikrocontroller.net/articles/FAQ#Wie_fu...

Aber: Das alles ist kein Ersatz für Literatur!
Die paar Euros, die dir ein K&R kosten, sind gut investiertes Geld. 
Dafür bekommst du einen vernünftigen, umfangreichen und vor allem 
systematisch aufgebauten Kurs in alle Bereiche von C. Eine 
Programmiersprache wie C, mit all ihren Facetten, kann man nicht durch 
"Versuch und Irrtum" lernen und dadurch, dass man immer nur ein bischen 
Halbwissen ansammelt. Alles ist mit allem irgendwie verknüpft und hängt 
zusammen. Mit Halbwissen wirst du einen Teilbereich einer Sprache (zb 
Stringverarbeitung) niemals richtig verstehen, wenn du über andere 
wichtige Bereiche (Arrays, Pointer und die Zusammenhänge von Arrays und 
Pointer) überhaupt nichts weißt.

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.