Forum: Mikrocontroller und Digitale Elektronik globaler String


von will wissen (Gast)


Lesenswert?

Hallo,
ich habe einen String Global deklariert.

zB.: char STRING[100]= "HALLO";
geht ja auch so.

wenn ich zur laufzeit den String ändern möchte wie geht das?
zB.: STRING[]= "HALLO HILFE";=> syntax error
danke an die C spezialisten

von Marco G. (stan)


Lesenswert?

in der string.h müsste es eine Funktion strcopy() oder so ähnlich
geben...

von will wissen (Gast)


Lesenswert?

ah, danke
aber warum ist in C denn keine einfache zuweisung von Strings möglich?
warum geht das nur bei der Initialisierung?

von Togger (Gast)


Lesenswert?

Bin zwar kein C-Spezialist mehr, aber wenn "STRING" mal kein
reserviertes Wort ist!!!???
Wie wärs z.b. mit "S_1" "S_Text1" "S_tralala" oder sowas!?
hmh und dann...direkt zuweisen geht bei C auch nicht, soweit ich mich
erinnere, also mußt strcopy verwenden, wie Marco schon schrieb.
Tja das ist halt C, in Basic geht´s einfach so: S_1 = "Hallo"
und in Pascal ähnlich einfach.
Auch ein Grund nix mehr in C zu machen lol

lg Ralf

von Rolf Magnus (Gast)


Lesenswert?

> zB.: char STRING[100]= "HALLO";

> zB.: STRING[]= "HALLO HILFE";=> syntax error

const char* STRING = "HALLO";

...

STRING = "HALLO HILFE";


> aber warum ist in C denn keine einfache zuweisung von Strings
> möglich?

Weil es in C keinen Datentyp für Strings gibt. Man kann nur entweder
mit Arrays aus char arbeiten oder mit Zeigern auf char. Und Arrays kann
man sowieso nicht zuweisen.

> warum geht das nur bei der Initialisierung?

Weil es eben eine Initialisierung und keine Zuweisung ist.

von will wissen (Gast)


Lesenswert?

danke für die schnelle hilfe

von Rolf Magnus (Gast)


Lesenswert?

> Bin zwar kein C-Spezialist mehr, aber wenn "STRING" mal kein
> reserviertes Wort ist!!!???

Ist es nicht. Allerdings werden Identifier, die nur aus Großbuchataben
bestehen nach Konvention normalerweise nur für Makros verwendet. string
wäre aber ein reserviertes Wort.

> Wie wärs z.b. mit "S_1" "S_Text1" "S_tralala" oder sowas!?

Sieht hässlich aus, finde ich. Ist aber Geschmackssache.

> Auch ein Grund nix mehr in C zu machen lol

Oder ein Grund, sich in C besser einzuarbeiten, um es zu verstehen.

PS: Deine !- und ?-Tasten scheinen manchmal zu prellen.

von OhJa (Gast)


Lesenswert?

laßt uns wieder mal über die beste programmiersprache
streiten

http://www2.informatik.unihalle.de/lehre/pascal/sprache/humor_ix.html

von oups - nochmal (Gast)


Lesenswert?


von Jens (Gast)


Lesenswert?

OhJa, der Link geht nicht.

von KoF (Gast)


Lesenswert?

<offtopic>
ich will mit streiten :-)
http://www.bernd-leitenberger.de/echte-programmierer.html
</offtopic>

von Micheal M. (Gast)


Lesenswert?

Frage zum Beispiel von Rolf Magnus:

"
const char* STRING = "HALLO";

...

STRING = "HALLO HILFE";
"

Wenn ich das richtig verstehe, wird ein Pointer statt eines char-Arrays
deklariert/definiert. Somit brauch man nicht strcpy() oder so. Warum
steht "const" davor? Wie stelle ich (oder der Compiler) sicher, daß
der String "HALLO HILFE" nicht andere Variablen überschreibt, er
hätte ja vom UART kommen (siehe Bsp. unten) können mit unbekannter
Textlänge zur compilezeit? Legt AVR-gcc "const char* STRING =
"HALLO";" in den RAM oder FLASH?

Bsp.
...
char c;
While( (c=hole_zeichen_von_UART()) != '\n' )
  *STRING++ = c;
...

Danke - Michael

von Peter Dannegger (Gast)


Lesenswert?

@Michael,

Du mußt Dir unbedingt nochmal den Unterschied zwischen Pointer und
Array klarmachen.

const char* STRING = "HALLO";

legt ein Array an, wo "HALLO" reinpaßt, d.h. das 6 Byte groß ist.
Und dann den Pointer STRING und setzt ihn auf das Array.

"const" sagt dann nur noch, daß Schreibzugriffe verboten sind, d.h.
"*STRING++ = c;" ergibt gnadenlos ne Fehlermeldung.

Abgesehen davon ist STRING++ sehr gefährlich, da damit die eigentliche
Startadresse des Arrays verloren geht. Ist aber durchaus möglich, wenn
das Array während der gesamten Laufzeit nur ein einziges mal benötigt
wird.


Peter

von Rolf Magnus (Gast)


Lesenswert?

> Warum steht "const" davor?

Weil das, worauf er zeigt, nach C-Norm konstant ist und nicht
beschrieben werden darf.

> Wie stelle ich (oder der Compiler) sicher, daß der String "HALLO
> HILFE" nicht andere Variablen überschreibt, er hätte ja vom UART
> kommen (siehe Bsp. unten) können mit unbekannter Textlänge zur
> compilezeit?

Wenn du ihn explizit in den Source Code schreibst, hätte er nicht vom
UART kommen können. Wenn du einen String vom UART lesen willst, mußt du
es anders machen. String-Handling ist nicht gerade eine Stärke von C.
Bei unbekannter Textlänge müßtest du z.B. ein Array anlegen, das groß
genug ist, damit der Text reinpasst.

> Legt AVR-gcc "const char* STRING =
> "HALLO";" in den RAM oder FLASH?

Den Zeiger legt er im RAM ab.
Was das Stringliteral, auf das er zeigt, angeht, hängt es primär von
der Architektur ab. Im Prinzip würde Flash reichen, denn der Text ist
ja eh nur lesbar. Aber bei Harvard-Architekturen wie z.B AVR, bei denen
RAM und Flash unterschiedlich angesprochen werden, geht das so nicht.
Einerseits muß das "HALLO" beim Einschalten irgendwo herkommen (also
Flash), andererseits kann ein normaler Zeiger nicht auf den Flash
zeigen. Also wird beim Start das "HALLO" ins RAM kopiert.

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.