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];
Glaube ich nicht, der meckert bei dem Code über was ganz anders. Ansonsten löst "const char*" das Problem. Oliver
1 | char * cDay[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"}; |
2 | std::cout << cDay[0] << std::endl; |
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.
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]);
?
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 ...)
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 | }
|
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.