Forum: Mikrocontroller und Digitale Elektronik itoa strcat kurze Frage


von IC (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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?

von Theor (Gast)


Lesenswert?

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.

von IC (Gast)


Lesenswert?

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? :-)

von IC (Gast)


Lesenswert?

>Kannst bitte auf die Sprünge helfen?
Habe gesehen, was Du meinst.
War wieder ein Übertragungsfehler :-)

von Theor (Gast)


Lesenswert?

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... :-)

von ? DPA ? (Gast)


Lesenswert?

IC schrieb:
> volatile char String_output[120] = "Initwert";
...
> memset((void *) String_output, 0, 250);

Da ist auch noch ein Overflow...

von Theor (Gast)


Lesenswert?

? DPA ? schrieb:
> IC schrieb:
>> volatile char String_output[120] = "Initwert";
> ...
>> memset((void *) String_output, 0, 250);
>
> Da ist auch noch ein Overflow...

Ja. Das ist schon klar. :-)

von eine Zeile (Gast)


Lesenswert?

nimm doch einfach sprintf/snprintf

von Rolf M. (rmagnus)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

eine Zeile schrieb:
> nimm doch einfach sprintf/snprintf

Genau. Diesen ganzen Wust an Code kannst Du bequem mit einem einzigen 
snprintf erschlagen.

von Peter D. (peda)


Lesenswert?

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.

von IC (Gast)


Lesenswert?

>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 :-)

von Danke Bitte (Gast)


Lesenswert?

IC schrieb:
> darum auch die Frage wegen var_convert,
> weil ich die immer wieder nutze

so?

IC schrieb:
> itoa(a, *var_convert, 16)

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.