itoa strcat kurze Frage

Gast #6374577
Hallo,

kurze Frage:

ist das ok so?
Geht um die immer wieder erneute Nutzung der var_convert

volatile char String_output[120] = "Initwert";
volatile char var_convert[2] = "00";

volatile uint8_t a = 0x10;
volatile uint8_t b = 0x20;
volatile uint8_t c = 0x30;

memset((void *) String_output, 0, 250);
strcpy(String_output,  "Variable a 0x");
strcat(String_output, itoa(a, *var_convert, 16));
strcat(String_output, " Variable b 0x");
strcat(String_output, itoa(b, *var_convert, 16));
strcat(String_output, " Variable c 0x");
strcat(String_output, itoa(c, *var_convert, 16));
strcat(String_output, "\r\n");

Vielen Dank
IC schrieb:
> ist das ok so?

Nein. Da sind Fehler drin.

> Geht um die immer wieder erneute Nutzung der var_convert

Die ist nicht das Problem.

> volatile char String_output[120] = "Initwert";
> volatile char var_convert[2] = "00";

Damit ist var_convert erst mal kein C-String, da kein Platz mehr für die 
Terminierung ist.

> volatile uint8_t a = 0x10;
> volatile uint8_t b = 0x20;
> volatile uint8_t c = 0x30;
>
> memset((void *) String_output, 0, 250);
> strcpy(String_output,  "Variable a 0x");
> strcat(String_output, itoa(a, *var_convert, 16));

Hier schreibst du über das Ende von var_convert hinaus, da drei Bytes 
Platz benötigt werden ('1', '0', '\0'), aber nur zwei zur Verfügung 
stehen. Das gleiche gilt für die weiteren itoa-Aufrufe.

Übrigens: Warum sind bei dir eigentlich alle Variablen volatile?
Gast
Nein.

An sich sollten beim kompilieren schon Fehlermeldungen und Warnungen 
ausgegeben werden.
Da siehst Du dann - teilweise -, was falsch ist.

Auch die Verwendung von memset solltest Du Dir nochmal ansehen.
Gast
Vielen Dank für die Antworten,

>Damit ist var_convert erst mal kein C-String, da kein Platz mehr für die
>Terminierung ist.
Ja, stimmt. Sollte var_convert[3] sein.

>Warum sind bei dir eigentlich alle Variablen volatile?
War nur für diesen (schnellen und leider mit Fehler geschriebenen) 
Beispiel.

>Auch die Verwendung von memset solltest Du Dir nochmal ansehen.
Kannst bitte auf die Sprünge helfen?
Mache das schon immer so und hatte bislang keine Probleme.

Eigentlich war die Frage, ob ich var_convert so immer wieder nutzen 
kann.
Rolf schrieb:
>Die ist nicht das Problem.
also ist ok so? :-)
Gast
IC schrieb:
> [...]
> War nur für diesen (schnellen und leider mit Fehler geschriebenen)
> Beispiel.
>
>>Auch die Verwendung von memset solltest Du Dir nochmal ansehen.
> Kannst bitte auf die Sprünge helfen?
> Mache das schon immer so und hatte bislang keine Probleme.
>
Dann machst Du es schon immer falsch. :-)
Ich neige dazu, in solchen Fällen keine direkte Antwort zu geben.
Und zwar, weil man, meiner Überzeugung nach, von Fehlern ziemlich viel 
lernt.

> Eigentlich war die Frage, ob ich var_convert so immer wieder nutzen
> kann.
> Rolf schrieb:
>>Die ist nicht das Problem.
> also ist ok so? :-)

Was ist Deine Annahme, aus der heraus Du das fragst? Warum sollte man 
nicht, Variablen beliebig oft neu setzen?

Auch deswegen hielte ich es für gut, wenn Du den Code einfach mal 
kompilierst und laufen lässt.

Ich weiß: Lehrer und die sich dafür halten, sind die Pest am A... :-)
IC schrieb:
>>Kannst bitte auf die Sprünge helfen?
> Habe gesehen, was Du meinst.
> War wieder ein Übertragungsfehler :-)

Deshalb sind solche magischen Zahlen keine gute Idee. Wenn man sie 
ändert, kann man schnell mal vergessen, das überall zu tun.

eine Zeile schrieb:
> nimm doch einfach sprintf/snprintf

Kann halt auf nem kleinen µC ziemlich teuer sein im Vergleich.
IC schrieb:
>>Auch die Verwendung von memset solltest Du Dir nochmal ansehen.
> Kannst bitte auf die Sprünge helfen?
> Mache das schon immer so und hatte bislang keine Probleme.

Strings muß man nicht löschen. Sobald Du etwas reinschreibst, wird mit 
einer '\0' abgeschlosssen.
Gast
>Genau. Diesen ganzen Wust an Code kannst Du bequem mit einem einzigen
>snprintf erschlagen.

Leute, das war doch nur ein Beispiel.
snprintf ist mir natürlich bekannt und hätte es in diesem Fall auch 
benutzt.

>Strings muß man nicht löschen. Sobald Du etwas reinschreibst, wird mit
>einer '\0' abgeschlosssen.

Genau das wollte ich wissen, darum auch die Frage wegen var_convert, 
weil ich die immer wieder nutze, aber nicht lösche.

Hatte einen Bug drin, und war mir bloß nicht sicher, ob das an der 
Nutzung der Variable liegt, ohne dass die gelöscht wird.

Bug ist gefunden, der Fehler war woanders.

Ich schätze dieses Forum, aber manchmal kommen die Lehrer und antworten 
auf falsche Fragen.

Vielen Dank, Hilfe war ja da :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.