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


von Christoph R. (chroters)


Angehängte Dateien:

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

von J. S. (munk)


Lesenswert?

versuch's mal so
1
    lcd_txt[0] = 0;
2
    strcat(lcd_txt,"ADC:");
3
    strcat(lcd_txt, txt);
4
    lcd_write_s(lcd_txt);

von Christoph R. (chroters)


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

von Mark B. (markbrandis)


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?

von Karl H. (kbuchegg)


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.

von Christoph R. (chroters)


Lesenswert?

Ich habe das jetzt besser verstanden.
Eher durch diesen Link
http://de.wikibooks.org/wiki/C-Programmierung:_Arrays_und_Strings
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

von Karl H. (kbuchegg)


Lesenswert?

Christoph Roters schrieb:

> http://de.wikibooks.org/wiki/C-Programmierung:_Arrays_und_Strings
> 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_funktioniert_String-Verarbeitung_in_C.3F

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.

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.