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?
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.
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? :-)
>Kannst bitte auf die Sprünge helfen?
Habe gesehen, was Du meinst.
War wieder ein Übertragungsfehler :-)
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: > volatile char String_output[120] = "Initwert"; ... > memset((void *) String_output, 0, 250); Da ist auch noch ein Overflow...
? 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. :-)
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.
eine Zeile schrieb: > nimm doch einfach sprintf/snprintf Genau. Diesen ganzen Wust an Code kannst Du bequem mit einem einzigen snprintf erschlagen.
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.
>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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.