Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Cookiezzz

Frischling

Beiträge: 91

Wohnort: Deutschland

Beruf: Schüler

  • Private Nachricht senden

11

29.04.2014, 15:30

Man kann diese Warnungen definitiv unterdrücken, was man auch tun sollte, wenn der Code portabel sein soll.

12

29.04.2014, 15:34

Zitat

Also bei mir gibt es da keinen Fehler.
Möglicherweise ist da aktiviert, das Warnungen als Fehler behandelt werden oder Ähnliche

Wie ich oben bereits geschrieben habe - seit VC2013 wird das Nutzen des deprecateten strcpy als Buildfehler behandelt.

Abgesehen davon, sind die zwei grundlegenden Fehler des OP bereits genannt worden. Die Diskussion über die richtige Verwendung von char arrays oder string ist ein anderes Thema, isn't it? ;)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

13

29.04.2014, 18:25

Hi,
dank der vielen Antworten habe ich auch alle mir vorgeschlagenen Möglichkeiten ausprobiert und es funktionierte nur die Möglichkeit, bei der ich den string verwende. Bei allen anderen Möglichkeiten bekam ich nur Fehlermeldungen. Meine Frage ist jetzt, da ich noch Neuling bin, erstens warum ich nicht einfach

C-/C++-Quelltext

1
Karte[0][1].Name = "Berg";
(oder halt mit nur einem Anführungsstrich) schreiben kann, da der Code "übersetzt" doch einfach bedeutet: Der Wert der Stelle [0][1] des Karten-Arrays bekommt einen Name, und zwar "Berg". Wo genau verstehe ich dort etwas falsch? Und zweitens was genau ist string für ein Datentyp?

MFG

14

29.04.2014, 19:00

C-/C++-Quelltext

1
Karte[0][1].Name = "Berg";

Typemismatch.
Der Ausdruck "Berg" erstellt einen neuen konstanten Pointer auf ein Char-Array (const char*). Du versuchst nun einer Variable vom Typ char[30], welche auch als pointer auf ein Char-Array fester Größe verstanden werden kann, diesen konstanten Pointer Wert zu geben.
Da der Speicherinhalt für deine Variable bereits reserviert und initialisiert wurde, müsste jetzt folgendes passieren:
1. Dein alter Speicherbereich muss geleert werden, da der String den zu zuweisen möchtest, von anderer Länge sein kann, bzw. ist.
2. Ein neuer Speicherbereich, der der Länge deines Strings entspricht muss reserviert werden
3. Die Daten des Speicherbereichs, auf den dein konstanter char*-Pointer zeigt (also dein String) muss in die Variable kopiert werden.

C/C++ kann das nicht von Haus aus, daher müsstest du das manuell machen. Da du als Programmierer weißt, dass dein String initialisiert länger ist, als dein zu übergebener String, reicht in deinem Fall strcpy() aus (Schritt 3).

Nutzt du hingegen std::string, machen das alles die Funktionen der Standard Library automatisch, sicher und mit effizienten Methoden.
string ist dabei eine sog. Template-Klasse.
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

15

29.04.2014, 19:06

Dann machst du irgendwas falsch, gehen müssten sie alle.

"std::string" ist ein Datentyp aus der STL für weitere Informationen siehe hier: http://en.cppreference.com/w/cpp/string/basic_string
Ausgehend von deiner Grundfragestellung gehe ich mal davon aus, das du noch nicht viel Erfahrung mit C++ gesammelt hast.
Bevor du "std::string" wirklich verstehen kannst, musst du also möglicherweise noch mehr Erfahrung mit C++ sammeln. Solange musst du dich mehr oder weniger damit zurechtfinden das es so ist wie es ist. ;)

Das "Problem" an einem String ist, das er eine beliebige Länge haben kann. Ein Zeichen, zwei Zeichen, tausend Zeichen oder mehrere Millionen. Das unterscheidet ihm von den anderen Typen die du bisher wahrscheinlich kennen gelernt hast. Mit Visual Studio 32 Bit Build zb: "char" ≙ 1 Byte, "int" ≙ 4 Bytes, "char const*" ≙ 4 Bytes"...
Ein String hingegen lässt sich eben keine feste Größe zuordnen, was ihn technisch wesentlich komplizierter macht.
Es gibt daher prinzipiell mehrere Möglichkeiten einen String zu repräsentieren. Wenn du einen normalen festen String zb "Berg" verwendest, wird die Bytefolge des Textes irgendwo in der Exe hinterlegt und du arbeitest normalerweise immer mit einen Zeiger auf diese Stelle in der Exe. (Vereinfacht gesagt) Ein normaler String ist also nicht mehr als ein Zeiger. Die einfachste Möglichkeit einen statischen String zu verwenden ist also nicht die Stringdaten selbst zu kopieren oder rumzuschieben, sondern nur den Zeiger auf die Daten die fest in der Exe stehen. Das entspricht der Lösung die DeKugelschieber und ich vorgeschlagen haben.
Sobald du den String allerdings nicht bloß fest speichern wolltest, sondern auch seinen Inhalt verändern, müssen die Stringdaten natürlich kopiert werden. Die "festen Bytes" in der Exe können nicht verändert werden und sind vom Betriebssystem geschützt.
Eine theoretische Möglichkeit wäre es, ein eigenes Array von Zeichen anzulegen und von Hand zu kopieren.
Um die Daten jetzt zu kopieren, müsste jedes einzelne Zeichen kopiert werden. Wie du schon wissen solltest, sind auch das feste Array(zb. deines im initialen Beispiel) aber mehr oder weniger auch nur Zeiger. Mit einem "=" würde also versucht werden einen Zeiger zuzuweisen was natürlich nicht geht und auch keinen Sinn machen würde. Um jetzt das zu machen was du wirklich willst, nämlich jedes einzellne Zeichen kopieren, gibt es bereits eine fertige Funktion die "strcpy" heißt. Damit kannst du den String in dein Array kopieren.
Das Problem:
Die Länge ist begrenzt. Zb. in deinem anfänglichen Beispiel auf 30 Zeichen. Außerdem kann die Verwendung bei komplexeren Aufgabenstellungen auch recht unhandlich werden. Beides ist in der Regel nicht erwünscht, deshalb hat man in C++ in der STL "std::string" erfunden, das das alles für dich im Hintergrund macht und verwaltet.

16

29.04.2014, 21:23

@ Spiele Programmierer
Mhmm, ich glaube so grob habe ich das verstanden, und ja du hast recht ich bin noch absoluter Neuling, weswegen mir leider auch die Zeiger noch nichts sagen, aber ich arbeite dran ;)

17

03.05.2014, 13:35

Hallo hpxkrass,

Der Fehler sollte denkbar einfach sein.
Du schreibst:

Karte[0][1].Name = 'Berg';

So sollte es funktionieren:

cin.ignore();
cin.get (Karte[0][1].Name, 29);

So kannst du auch den Namen im Programm festlegen, nicht schon beim schreiben des Codes.
Die 29 sollte klar sein (Stichwort "\0")

Ich bin auch noch recht Neu in C++, vermute aber, das der Fehler darin liegt das der Compiler nicht weiß welchen Typ du ihm da gerade zuweist. da 'Berg' ja ein string ist und kein char

Werbeanzeige