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
> 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).
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* !
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
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.
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.