INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
const qualifier??
09.02.2020, 23:31
Beitrag #1
const qualifier??
Hallo,

zu meiner Verwunderung zeigt das folgende Programm alle 2 s die drei Texte an. Eigentlich hätte doch der Compiler eine Fehlermeldung ausgeben müssen, weil ich der const-Variablen "MeinText" einen Wert zuweisen möchte.

Ohne const geht es auch.

Hat jemand eine Erklärung?

Gruß
GuaAck

Code:
#include <avr/pgmspace.h>
const  char TxText1[ ]       PROGMEM = "Text1";
const  char TxText2[ ]       PROGMEM = "Text2";
const  char TxText3[ ]       PROGMEM = "Text3";

const char* MeinText;

void pprint (const char* addr, bool mitCR)
{
  char c;
  while (c = pgm_read_byte (addr++)) Serial.print(c);
  if (mitCR) Serial.println();
}
void setup()
{
  Serial.begin(115200);
}

void loop()
{
  pprint(TxText1, true);
  MeinText = TxText2;
  pprint(MeinText, true);
  MeinText = TxText3;
  pprint(MeinText, true);
  delay(2000);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.02.2020, 09:43 (Dieser Beitrag wurde zuletzt bearbeitet: 10.02.2020 10:28 von RolandF.)
Beitrag #2
RE: const qualifier??
(09.02.2020 23:31)GuaAck schrieb:  Hallo,

zu meiner Verwunderung zeigt das folgende Programm alle 2 s die drei Texte an. Eigentlich hätte doch der Compiler eine Fehlermeldung ausgeben müssen, weil ich der const-Variablen "MeinText" einen Wert zuweisen möchte.

Ohne const geht es auch.

Hat jemand eine Erklärung?

Gruß
GuaAck

Code:
#include <avr/pgmspace.h>
const  char TxText1[ ]       PROGMEM = "Text1";
const  char TxText2[ ]       PROGMEM = "Text2";
const  char TxText3[ ]       PROGMEM = "Text3";

const char* MeinText;

void pprint (const char* addr, bool mitCR)
{
  char c;
  while (c = pgm_read_byte (addr++)) Serial.print(c);
  if (mitCR) Serial.println();
}
void setup()
{
  Serial.begin(115200);
}

void loop()
{
  pprint(TxText1, true);
  MeinText = TxText2;
  pprint(MeinText, true);
  MeinText = TxText3;
  pprint(MeinText, true);
  delay(2000);
}
ich würde mal sagen, dass der Zeiger veränderbar ist der Inhalt aber nicht.
Anders sieht es aus mit :
Code:
const char MeinText1[] = "Nicht veränderbar;
char MeinText2[] = "Veränderbar";

Da kann ich über strcpy MeinText1 nicht überschrieben, MeinText2 aber schon.

In Deinem Fall würde daher folgendes auch nicht funktionieren
Code:
strcpy(TxText2,MeinText);
ohne const vor MeinText würde das strcpy funktionieren(aber nicht sinnvoll da nicht klar ist wo der zeiger hinzeigt,es sei den es wird Speicher an der Stelle allockiert).

Grüße
Roland
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.02.2020, 11:55 (Dieser Beitrag wurde zuletzt bearbeitet: 10.02.2020 12:14 von Tommy56.)
Beitrag #3
RE: const qualifier??
(09.02.2020 23:31)GuaAck schrieb:  Eigentlich hätte doch der Compiler eine Fehlermeldung ausgeben müssen, weil ich der const-Variablen "MeinText" einen Wert zuweisen möchte.
Du hast nichts zugewiesen.

Du hast die const Variable im Zuge ihrer Deklaration initialisiert. Das sieht zwar wie eine Zuweisung aus, ist aber keine. Genau an dieser einen Stelle kannst Du einmalig den Wert festlegen.

Gruß Tommy

Edit: Wenn Dir die Verwechslungsgefahr mit der Zuweisung zu groß ist, kannst Du es auch so schreiben:
[code]const char TxText1[ ] PROGMEM {"Text1"};

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 09:43
Beitrag #4
RE: const qualifier??
Hallo,

ich verstehe beide Antworten nicht so ganz. Hier nochmal mein Code kompakt:

Code:
const  char TxText2[ ]       PROGMEM = "Text2";
const  char TxText3[ ]       PROGMEM = "Text3";
const char* MeinText;

void loop()
{
  MeinText = TxText2;
  pprint(MeinText, true); //pprint druckt Text aus
  MeinText = TxText3;
  pprint(MeinText, true);
..
}
Da weise ich doch in der Loop der Variablen "MeinText" zunächst den Zeiger auf TxText2 zu und dann den Zeiger auf TxText3. Der eigentlich Text ist ohnehin nicht zu ändern, er er ist ja per PROGMEM im Flash gespeichert (jedenfalls bei meinem UNO). Ich ändere also den Inhalt von MeinText,... trotz const???

Viele Grüße
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 11:06 (Dieser Beitrag wurde zuletzt bearbeitet: 11.02.2020 11:08 von MicroBahner.)
Beitrag #5
RE: const qualifier??
Hallo
dein
Code:
const char* MeinText;
ist ein (veränderlicher) Pointer auf einen festen (const char ) Text.
Würdest Du versuchen, da die Adresse eines nicht als const deklarierten Textbuffers zuzuweisen, bekämst Du eine warning wegen einer ungültigen Konvertierung.

Wenn Du auch nicht willst, dass sich die Adresse in dem Pointer ändern lässt, musst Du schreiben:
Code:
const char *const MeinText = TxText2;
Jetzt musst Du den Pointer auch direkt initialisieren, denn eine nachträglich Zuweisung ist nicht möglich.

mit
Code:
char TxtBuf[20];
char* const MeinText = TxtBuf;
bekommst Du einen unveränderlichen Zeiger auf einen veränderlichen Puffer

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 11:23
Beitrag #6
Wink RE: const qualifier??
Danke,

jetzt habe ich es verstanden!

Gruß
GuaAck
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.02.2020, 13:33
Beitrag #7
RE: const qualifier??
Dabei zeigt sich auch wieder, dass die weit verbreitete Schreibweise ( ich nehme mich da nicht aus ) den Pointer-Stern direkt hinter den Typ zu schreiben, nicht der Sichtweise des Compilers entspricht. Für den Compiler gehört das Pointer-Symbol zur Variable selbst ( also dem Variablennamen ).
Schreibt man:
Code:
const char  *MeinText;
ist schon etwas besser ersichtlich, dass sich das const rein auf den Typ bezieht, auf den der Pointer zeigt. Und nicht auf den Pointer selbst.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
12.02.2020, 22:58
Beitrag #8
RE: const qualifier??
Danke, sehr guter Beitrag.

Es ist ja nicht so, dass ich den Pointer nicht verändern will, im Gegenteil, ich war verwundert, dass ich ihn ohne Protest des Compilers verändern konnte!

Gruß GuaAck,
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Ein als "const" deklariertes Array übergeben Retian 5 1.726 08.11.2016 18:39
Letzter Beitrag: Tommy56
  invalid conversion from 'const char*' to 'char' toto1975 8 10.994 31.03.2016 12:49
Letzter Beitrag: hotsystems
  #define vs. const Mathias 3 3.003 23.11.2015 12:52
Letzter Beitrag: Bitklopfer

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste