Zum wieder reinkommen in die Mikrocontroller-Programmierung bin ich dabei für mein MSP430 launchpad mit dem G2553 einen Morsengenerator zu schreiben. Das funktioniert bisher ganz gut. Inzwischen kann das Programm einen string morsen, der als const char array definiert ist: const char Sdatum[] = {"Die Temperatur betraegt "}; Der Zugriff der morseroutine auf den string erfolgt über einen pointer: const char *string; // Pointer auf aktuelles Zeichen des zu sendenden strings Jetzt will ich aber auch einen "variablen String senden, also einen der im RAM hinterlegt wird - z.B. weil darin der ASCII-code einer Integer hinterlegt ist (Temperatur). Wenn ich dazu das const weglasse erfolgt bei der Zuweisung der Stringadresse in der Senderoutine string = &Sdatum[0] die eigentlich erwartete Fehlermeldung: "../main.c", line 130: warning #515-D: a value of type "const char *" cannot be assigned to an entity of type "char *" Meine Frage: ist es im MSP430 C++ möglich, einen Ponter zu definieren, der sowohl auf einen String im flash-Speicher (const) als auch im RAM zeigen kann??
Martin H. schrieb: > Wenn ich dazu das const weglasse Mach das doch einfach nicht. Ein "const char*" kann sowohl auf ein "const char[]" als auch auf ein "char[]" array zeigen. Mit anderen Worten: Ein "char*" Zeiger wird implizit nach "const char*" konvertiert. Warum auch nicht - modifizierbare Daten nicht zu modifizieren ist erlaubt...
Du kannst doch den Zeiger auf const char * belassen: das bedeutet ja nicht, dass du den Zeiger selbst nicht danach inkrementieren darfst sondern nur, dass du das, auf was er zeigt, nicht modifizieren darfst. Außerdem:
1 | string = &Sdatum[0]; |
Das ist lediglich eine außerordentlich umständliche Schreibweise von
1 | string = Sdatum; |
;-)
Martin H. schrieb: > Wenn ich dazu das const weglasse erfolgt bei der Zuweisung der > Stringadresse in der Senderoutine > > string = &Sdatum[0] auf welcher Seite hast Du das const weg gelassen? Ein Zeiger auf einen const char sollte man immer auch mit der Adresse eines nicht const char initialisieren können.
Ich habe jetzt das "const" sowohl bei der Stringdefinition wie auch beim Zeiger weggelassen. Damit gibt es keinen Fehler bei der Zuweisung der string-Adresse wie auch bei der Zuweisunge der Adresse eines RAM-Buffers: char Sdatum[] = {"Die Temperatur betraegt "}; char strbuf[4]; //Array zur Pufferung von Strings char *string; string = Sdatum; string = strbuf; wird also ohne Fehlermeldung compiliert und scheint wie gewollt zu funktionieren. VIELEN DANK !!
Martin H. schrieb: > Ich habe jetzt das "const" sowohl bei der Stringdefinition wie auch beim > Zeiger weggelassen. Bei der Stringdefinition solltest du es dran lassen, damit du nicht unnötig RAM verschwendest!
1 | const char Sdatum[] = {"Die Temperatur betraegt "}; |
2 | char strbuf[4]; |
3 | const char *string; |
4 | |
5 | string = Sdatum; |
6 | string = strbuf; |
Martin H. schrieb: > Ich habe jetzt das "const" sowohl bei der Stringdefinition wie auch beim > Zeiger weggelassen. Du solltest es stattdessen bei beiden hinschreiben.
Wenn der Zeiger selbst nicht veränderbar sein sollte, dann wäre das: const char const* aString;
ahhh....jetzt bin ich "auf der Rille". Jetzt habe ich den Effekt des const auch schön beim belegten RAM gesehen. Nochmal VIELEN DANK.
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.