Forum: PC-Programmierung warning: ISO C++ forbids converting a string constant to 'char*'


von Martin M. (ats3788)


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];

von Oliver S. (oliverso)


Lesenswert?

Glaube ich nicht, der meckert bei dem Code über was ganz anders.

Ansonsten löst "const char*" das Problem.

Oliver

von Reaadfgff (Gast)


Lesenswert?

1
 char *  cDay[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
2
std::cout << cDay[0] << std::endl;

von Dirk B. (dirkb2)


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.

von Jasson J. (jasson)


Lesenswert?

cDay[Day] dereferenziert doch das als Pointer zu betrachtende Array,
d.h.
>char * pBuffer = cDay[Day];
versucht einen konkreten Wert einem Pointer zu zu weisen.

Was sagt der Compiler zu
char * pBuffer = &(cDay[Day]);
?

von Dirk B. (dirkb2)


Lesenswert?

Jasson J. schrieb:
> Was sagt der Compiler zu

Das mag der Compiler akzeptieren, nur bekommst du dadurch nur verkürzte 
Ausgaben von "Sunday". ("nday" oder "ay" oder ...)

von wolpino (Gast)


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
}

von Martin M. (ats3788)


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

von Rolf M. (rmagnus)


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.

: Bearbeitet durch User
von Martin M. (ats3788)


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.

von Dirk B. (dirkb2)


Lesenswert?

Martin M. schrieb:
> Ich bastele an einem C++ Programm und dann mus es so sein

Nein. Muss es nicht.
Dein Fehler liegt nicht in der Definition der Strings, sondern in der 
Anwendung.

Aber wenn du schon C++ machst, warum nimmst du nicht std::string?

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.