Forum: Mikrocontroller und Digitale Elektronik Pointer auf char UND const char?


von Martin H. (hebi19)


Lesenswert?

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??

von Dr. Sommer (Gast)


Lesenswert?

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...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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;

;-)

von Torsten R. (Firma: Torrox.de) (torstenrobitzki)


Lesenswert?

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.

von Martin H. (hebi19)


Lesenswert?

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 !!

von Dr. Sommer (Gast)


Lesenswert?

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;

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Martin H. schrieb:
> Ich habe jetzt das "const" sowohl bei der Stringdefinition wie auch beim
> Zeiger weggelassen.

Du solltest es stattdessen bei beiden hinschreiben.

von Thomas W. (goaty)


Lesenswert?

Wenn der Zeiger selbst nicht veränderbar sein sollte, dann wäre das:

const char const* aString;

von Martin H. (hebi19)


Lesenswert?

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
Noch kein Account? Hier anmelden.