www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik globaler String


Autor: will wissen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco G. (stan)
Datum:

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

Autor: will wissen (Gast)
Datum:

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

Autor: Togger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: will wissen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die schnelle hilfe

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: OhJa (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
laßt uns wieder mal über die beste programmiersprache
streiten

http://www2.informatik.unihalle.de/lehre/pascal/sp...

Autor: oups - nochmal (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OhJa, der Link geht nicht.

Autor: KoF (Gast)
Datum:

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

Autor: Micheal M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.