warning: ISO C++ forbids converting a string constant to 'char*'

OP #6076240
Lesenswert?

Hallo wie man an der Überschrift erkennen kann habe ich ein Warning 
Problem und wollte wissen wie man das besser macht.

 char   cDay[] = 
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
;

und versuch es so zu verarbeiten

geht zwar aber das warning stört doch sehr
  char * pBuffer = cDay[Day];
#6076343
Lesenswert?

Martin M. schrieb:
> char   cDay[]

ist ein einfaches char-Array, dessen Größe bei der Initialisierung 
festgelegt wird. Da passt ein String rein.

Da du aber mehrere Strings ablegen möchtest, brauchst du entweder ein 
2D-Array oder ein Array aus Zeigern auf char. Das wäre char * cDay[]
Wobei es egal ist, ob der * beim char, beim cDay oder frei dazwischen 
steht.
Gast #6076494
Lesenswert?

String Literale sind nur lesbar und liegen in der Regel im Text-Segment. 
Das Setzen eines schreib/lese-Zeigers (hier: char*) würde die 
"Konstantheit" aushebeln, deswegen meckert der Compiler zu Recht.
Selbst wenn der Compiler das kompiliert (in C, nicht in C++) muss der 
Compiler erst extra Code zum Umkopieren erzeugen, um die eigentlich 
konstanten Strings in einen (beschreibbaren) RAM-Bereich zu kopieren.
Das kann man sich aber ersparen.

Lange Rede - kurzer Sinn: Deklariere das ganze als Array von 
nur-lese-Zeigern auf konstante Stringliterale:
1
#include <iostream>
2

3
const char* const cDay[] = 
4
{
5
    "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"
6
};
7

8
int main()
9
{
10
    for(auto const& c: cDay)
11
    {
12
        std::cout << c << std::endl;
13
    }
14
}
OP #6076534
Lesenswert?

Danke für die Antworten, habe ich alle schon probiert gehabt, da gibt es 
kein Warning sondern Errors

const char* cDay[] = 
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
;

error: invalid conversion from 'const char*' to 'char*' [-fpermissive]

const char* const cDay[] = 
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
;
invalid conversion from 'const char*' to 'char*' [-fpermissive]

bei
  char* const cDay[] = 
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
;
                                                                                                 ^
lib\ILI_StatusBar4Time\src\StatusBar4Time.cpp:5:97: warning: ISO C++ 
forbids converting a string constant to 'char*' [-Wwrite-strings]
lib\ILI_StatusBar4Time\src\StatusBar4Time.cpp:5:97: warning: ISO C++ 
forbids converting a string constant to 'char*' [-Wwrite-strings]

Any clue guys
#6076537
Lesenswert?

wolpino schrieb:
> Selbst wenn der Compiler das kompiliert (in C, nicht in C++) muss der
> Compiler erst extra Code zum Umkopieren erzeugen, um die eigentlich
> konstanten Strings in einen (beschreibbaren) RAM-Bereich zu kopieren.

Nein, sowas macht er nicht. Sowohl in C, als auch in C++ ist ein 
Stringliteral const. Es verboten, es zu beschreiben.
Der Unterschied zwischen C und C++ ist, dass C die Konvertierung nach 
non-const char* trotzdem erlaubt, um alten Code aus der Zeit, bevor es 
const gab, weiter zu unterstützen. C++ ist da strikter.

Martin M. schrieb:
> Danke für die Antworten, habe ich alle schon probiert gehabt, da gibt es
> kein Warning sondern Errors
>
> const char* cDay[] =
> {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}
> ;
>
> error: invalid conversion from 'const char*' to 'char*' [-fpermissive]

Aber bestimmt nicht an der Stelle! Du musst das const natürlich 
weiterhin mitziehen, also wenn du irgendwo den Zeiger einem anderen 
zuweist, muss der auch ein const char* sein.

PS: Bitte benutze Code-Tags.
OP #6076809
Lesenswert?

Danke Rolf M. da war doch was mit C und C++.
Ich bastele an einem C++ Programm und dann mus es so sein

  char  cMonth[12][10] = 
{"January","February","March","April","May","June","July","August","Sept 
ember","October","November","December"};
  char  cDay[7][10] = 
{"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"} 
;

https://www.geeksforgeeks.org/array-strings-c-3-different-ways-create/
Super wieder was gelernt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren