Hallo, aus Delphi bin ich gewohnt, einen String so zu erstellen un zu verwenden: var test: string; ... test := 'hallo'; test := 'welt'; ... Final steht also 'welt' in test. Wenn ich das jetzt in C machen will, ist mir nicht ganz klar, wie ich das am effektivsten lösen soll. char test[10] = 'hallo'; char test[10] = 'welt'; char *p_test = test; Muss ich da, wenn ich test verändern will, immer das char davorschreiben? Gruß Martin
// Initialisierung: // Double "Quotes" für Strings // Single 'Quotes' für einzelne Chars char test[10] = "hallo"; // String kopieren (zuweisen) // normalerweise in ANSI-C: strcpy(test, "welt"); // Für AVR-GCC, damit "welt" direkt aus dem FLASH // geladen wird und kein RAM verschwendet wird strcpy_P(test,PSTR("welt")); MfG Peter
Noch was: Wenn Du char davorschreibst, wird glaub stets ein neuer String deklariert. Mit single 'Quotes' wird soviel ich weiss, kein Stringend 0x00 am Schluss angehängt, mit double "Quotes" schon. Bin mir aber in beiden Punkten nicht ganz sicher, da ich auch noch kein C-Experte bin, wer es genauer weiss, soll mich doch bitte korrigieren falls ich einen Mist angegben habe! Gruss
Schon ganz gut. Soweit stimmt das. "..." bezeichnet immer einen String mit einer 0 am Ende. d.h. "Hallo" benötigt 6 bytes im flash. mit 'x' wird einem byte ein Wert zugewiesen, und zwar der ASCII-Code von x. Lässt sich mit der Funktion ASC(yyy) aus Basic vergleichen. PS: Es gibt noch die Fkt. strcat(*p1,*p2); womit man hinter den ersten string einen zweiten anhängt.
Gerade noch was aufgefallen. Bei der Anweisung char temp[5] = "Hallo"; sorgt der Compiler dafür, dass der String nicht länger als 5 Zeichen ist. Leider fehlt dann die Null.. Bis ich den Fehler mal lokalisiert habe. hehe Naja, die zweite, von mir vermutete, Variante wäre gewesen, wenn er einfach weiter geschrieben hätte im Speicher. Aber ich glaube das hätte die gleichen unvorhersehbaren Fehler verursacht.
Hmmmm.... Ich vermute, dass der Compiler die Null trotzdem beifügt, und einfach über den Speicher hinausschreibt! Gut möglich dass die nächste Variable im RAM undefiniert deklariert wird, und somit vom Compiler ebenfalls mit Null initialisiert wird.... Kann ganz schön Tricky werden, solche Fehler beim debuggen zu lokalisieren... ;o)) Gruss von mir!
Hm stimmt! Der Compiler schreibt sie über das Feld hinaus, aber der erste Buchstabe der nächsten String Konstante überschreibt die 0 wieder. Auch einleuchtend. Joo, schade eigentlich. Wenigstens HIER könnte der Compiler doch ma meckern, bezüglich überschrittene Feldgrössen :D
Ratet nicht. Wenn Du machst: char temp[5] = "Hallo"; Dann wird ein char Array der Laenge 5 angelegt, dass mit den Charactern 'H', 'a', 'l', 'l', 'o' gefuellt wird. Die abschliessende '\0' unterbleibt. Steht so im Standard und muss so sein. Wenn Du machst: char temp[5] = "Hallo World"; Dann meckert der Compiler, dass die Inititalisierung groesser ist als das Array. Also genau das was Du haben moechtest.
Würde auch bestätigen dass bei char temp[5]="Hallo" folgendes in der .lst datei stand: .ascii "Hallo" und bei char temp[6]="Hallo" stand dort .string "Hallo"
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.