globaler String

Gast #223093
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
Gast #223094
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.
Gast #223096
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.
Gast #223101
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
Gast #223102
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
Gast #223103
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren