mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Minifrage - gcc strcat() - erweitert eigenständig die die Arrays


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab folgendes Mini-Programm. (Zahlen in Zeichen umwandeln
und mit strcat() in einem gemeinsamen Array speichern)
char mydata[100];

void myadd(u16 data) {
   char tmp[80];
   
   ltoa(data, tmp, 10);
   strcat(mydata, tmp);
   strcat(mydata, "-");
   
   printf("%s\n", mydata); // Debug...
}

int main(void) {
   u16 counter = 0;
   while (1) {
       counter++;
       myadd(counter);
   }
}


Wie oft ich auch die Zahl in mydata schreibe,
die Ausgabe wird immer größer - vermutlich
bis kein Flashspeicher mehr da ist.

Ich find nur nirgends diesbezüglich Infos.

Das Verhalten könnte später kritsch werden.
Wollte nur kurz fragen ob das so richtig ist... :)
Möchte ungern etwas einbauen was ich nicht richtig
verstehe ...

Vielen Dank
Jens

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Ganze ist unkritisch, solange du in den 80 Bytes bleibst
(inkl. abschließender 0).
Alles danach ist Glückssache.

Außerdem hat das mit Flash nix zu tun, es geht hier um RAM.

> Das Verhalten könnte später kritsch werden.

Das wird es sicher.

> Wollte nur kurz fragen ob das so richtig ist... :)

Es ist grundfalsch.

> Möchte ungern etwas einbauen was ich nicht richtig
> verstehe ...

C-Buch lesen und verstehen!
Das hat schon vielen geholfen.
Aber viel mehr probieren es ohne...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich find nur nirgends diesbezüglich Infos.

Dann will ich nicht fragen, wie du gesucht hast :-)

Autor: strcat (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eine gute idee wäre schon einmal, auf deine max array size zu testen. 
Sonst schreibst du dir über das array hinaus in speicherbreiche rein. da 
kommen dann noch ganz andere sachen. vergiss beim überprüfen der länge 
aber nicht das \0

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super danke, für die schnelle hifle

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jens schrieb:
> Hallo,
>
> ich hab folgendes Mini-Programm. (Zahlen in Zeichen umwandeln
> und mit strcat() in einem gemeinsamen Array speichern)
>
>
> char mydata[100];
> 
> void myadd(u16 data) {
>    char tmp[80];
> 
>    ltoa(data, tmp, 10);
>    strcat(mydata, tmp);
>    strcat(mydata, "-");
> 
>    printf("%s\n", mydata); // Debug...
> }
> 
> int main(void) {
>    u16 counter = 0;
>    while (1) {
>        counter++;
>        myadd(counter);
>    }
> }
> 
> 
>
> Wie oft ich auch die Zahl in mydata schreibe,
> die Ausgabe wird immer größer - vermutlich
> bis kein Flashspeicher mehr da ist.

Nö, bis kein RAM mehr vorhanden ist.

myadd hängt nur was an mydata an, aber niemand "leert" mydata. Das 
könnte zB erledigt werden durch
mydata[0] = '\0';
am Ende von myadd oder zu Beginn. Dann lassen sich allerdings durch 
mehrfache Aufrufe keine längeren Strings mehr zusammenbasteln, was ja 
unerwünscht ist. Andernfalls müsste es ausserhalb von myadd geschehen, 
etwa
   ...
   if (counter % 4 == 0)
      mydata[0] = '\0';
   counter++;
   ...  

Autor: High Performer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
strcat hängt zwei Strings aneinander. Das terminierende Nullzeichen des 
Zielstrings wird überschrieben mit dem ersten Zeichen des Quellstrings. 
Nach dem Kopiervorgang wird wieder ein Nullzeichen angehängt.
Beim nächsten Aufruf wird dann an diesen String wieder das neue Zeug 
angehängt.

Wie die anderen schon geschrieben haben: es gibt Beschreibungen der 
Funktionen im Netz. Ich will nicht so streng sein, da ich nicht 
verlangen möchte, dass man, bevor eine Frage gestellt wird, erst 
stundenlang selbst recherchiert. Dann wär's hier sehr ruhig ;-)

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.