mikrocontroller.net

Forum: Compiler & IDEs Konstant Sting


Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich habe folgenden Beitrag im Forum gefunden:
http://www.mikrocontroller.net/forum/read-4-45518.html#73154

Da steht, dass
char* myString="0000000";
eine Konstante im flash bereitstellt. Und eine änderung fehlschlagen
würde. Wiso denn das ???
Man kann doch ohne probleme auf den Flash (über den pointer)
zugreifen.

wiso ist es eigentlich in WINAVR zulässig variablen zu deklarieren /
initialisieren mit einem initialisierungswert. normal ist sowas in C
doch garnicht zulässig !

MfG Achim

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Man kann doch ohne probleme auf den Flash (über den pointer)
> zugreifen.
Nur lesend.

> normal ist sowas in C doch garnicht zulässig !
Variablen bei der Definition zu initialisieren? Aber natürlich ist das
zulässig.

char* p = "0000";
Hier wird "0000" AFAIK im RAM abgelegt, auch bei avrgcc. Allerdings
ist es dem Compiler (zumindest bei C++, weiß nicht ob es bei C auch so
ist) gestattet, solche Strings zu vereinigen. Nehmen wir folgenden
Code:
char* foo = "Hello World!";
char* bar = "!";
Der Compiler darf AFAIK eine Zeichenkette "Hello World!"
bereitstellen. foo zeigt auf den Beginn dieses Strings, bar auf den
selben String, aber eben auf das Ausrufezeichen.

Wenn du einen String verändern willst, ist es besser ihn so zu
deklarieren:
char p[] = "blub";
Dann kann nichts schiefgehen.
Wenn du einen String nicht verändern willst, deklarier ihn als const
char* (und außerdem mit diesen PROGMEM-Makros, damit der String im ROM
landet).

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wiso denn ??????
wenn ich

char* myString="0000000";

schreib, wird ein zeiger erstellt der auf die speicherstelle
"0000000" auch wenn "0000000" ein string ist.
An die Adresse kann ich auch schreiben ! Wiso denn auch nicht ?? Ausser
Die CPU befindet sich im Protected mode !

Und wenns mir spass macht kann ich auch noch den zeiger später noch auf
ne andere adresse zeigen lassen !

Kann mir jemand sagen wiso das nicht zulässig ein soll ??? Ich mache
hier KEIN const char* !

Autor: ElMachel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus,

>Wiso denn ??????
>wenn ich
>char* myString="0000000";
>schreib, wird ein zeiger erstellt der auf die speicherstelle
>"0000000" auch wenn "0000000" ein string ist.

also,dein obiger Zeiger zeigt auf den Anfang der Adresse wo dein String

"0000000" abgelegt wurde, diese Adresse bestimmt der Compiler, das
hat mit Strings nichts zu tun.

Lies dir bitte den Artikel und ein Zeigerkapitel eines C-Buchs nochmal
durch.

Außerdem verwendest du ziemlich viel "!", find ich persönlich
irgendwie agressiv.

mfg
Christian

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sollte die Stringkonstante im Flash-ROM stehen (was sie nur tut, wenn
bei AVR-GCC prog_mem als storage specifier davor steht), dann ist ein
Schreibzugriff zwar theoretisch möglich, zeigt aber keinerlei
Auswirkungen, da das ROM so nicht umprogrammiert werden kann.

Empfehlenswert: Kernighan & Ritchie, "Programmieren in C", zweite*
Auflage, Hanser Verlag

Solche Feinheiten wie prog_mem sind darin allerdings nicht beschrieben,
da das implementierungsspezifische Details des C-Compilers sind.

*) die erste Auflage scheint maschinell übersetzt zu sein und schildert
das sogenannte K&R-C, das noch keine Prototypen und so gut wie keine
Typprüfung kennt. Die zweite Auflage, die Anfang der 90er Jahre
erschien, beschreibt hingegen ANSI-C und ist hervorragend ins Deutsche
übersetzt.

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.