Hallo Forum,
ich bin gerade dabei eine Funktion für eine Klasse zu erstellen, die ein
2D-String-Array als Rückgabewert haben soll. Mir wurde auch schon
geholfen bei der Erstellung der Funktion, aber es konnte mir nicht alle
Fragen beantwortet werden. Ich konnte auch im Internet keine Antwort
dazu finden.
Funktion(die geht):
1
std::string** Schachbrett::getFelderSchwarz()
2
{
3
std::string** FelderSchwarz;
4
int z = 0;
5
FelderSchwarz = new std::string* [8];
6
for (int y = 0; y < 8; y++)
7
{
8
FelderSchwarz[y] = new std::string [4];
9
if (y != 1 && (y % 2 == 1 || y == 0))
10
{
11
for (int x = 0; x < 8; x += 2)
12
{
13
FelderSchwarz[y][z] = Spielbrett[y][x];
14
z++;
15
}
16
z = 0;
17
}
18
else
19
{
20
for (int x = 1; x < 8; x += 2)
21
{
22
FelderSchwarz[y][z] = Spielbrett[y][x];
23
z++;
24
}
25
z = 0;
26
}
27
}
28
29
return FelderSchwarz;
30
}
Aufruf(geht):
1
Schachbrett test;
2
std::string** Feld;
3
Feld = test.getFelderSchwarz();
Aufruf(Fehler: Ausdruck muss ein veränderbarer lvalue sein):
1
Schachbrett test;
2
std::string Feld[8][4];
3
Feld = test.getFelderSchwarz();
Meine Frage ist warum, außderdem was genau diese Zeilen machen:
1
FelderSchwarz = new std::string* [8];
2
FelderSchwarz[y] = new std::string [4];
Ich danke euch schonmal für eure Hilfe ^^
P.S.
Ich lerne C++ in Eigenarbeit
verwenden, dadurch entfällt das "new" und "delete" komplett (das sollte
man in modernem C++ fast nie verwenden) und du kannst es normal
zurückgeben und zuweisen. Ich habe jetzt keine Zeit es detailliert
auszuführen, aber "std::vector" sollte ein gutes Such-Stichwort sein.
DesNachbarsKleinesKätzchen schrieb:> P.S.> Ich lerne C++ in Eigenarbeit
C++ ist sehr komplex, es ist dringend zu empfehlen ein gutes, aktuelles
(!) Buch zu lesen:
https://stackoverflow.com/a/388282/4730685
Hallo Programmierer ^^
Programmierer schrieb:> Ich habe jetzt keine Zeit es detailliert> auszuführen, aber "std::vector" sollte ein gutes Such-Stichwort sein.
Alles klar, dann werde ich mich mal darüber schlau machen, was es damit
auf sich hat.
Programmierer schrieb:> C++ ist sehr komplex, es ist dringend zu empfehlen ein gutes, aktuelles> (!) Buch zu lesen:
Dachte ich könnte das nur mit frei verfügbaren Internetseiten lernen(ich
habe davor schon gewusst, dass C++ komplex ist), aber gut, dann werde
ich auch nach Büchern ausschau halten.
Ich danke dir^^
DesNachbarsKleinesKätzchen schrieb:> Aufruf(Fehler: Ausdruck muss ein veränderbarer lvalue sein):> Schachbrett test;> std::string Feld[8][4];> Feld = test.getFelderSchwarz();>> Meine Frage ist warum,
Weil ein Array nicht das selbe ist wie ein Zeiger, und weil man einem
Array nichts zuweisen kann.
> außderdem was genau diese Zeilen machen:> FelderSchwarz = new std::string* [8];
Das erzeugt ein Array aus 8 Zeigern auf std::string und schreibt die
Adresse des erste Element davon nach FelderSchwarz.
> FelderSchwarz[y] = new std::string [4];
Das erzeugt ein Array aus 4 std::string und schreibt die Adresse des
ersten davon in das Element mit Index y im Array aus der ersten Zeile.
Programmierer schrieb:> DesNachbarsKleinesKätzchen schrieb:>> std::string** FelderSchwarz;>> So bitte auf keinen Fall in C++! Du kannst> std::vector FelderSchwarz (8, std::vector<std::string> (4));
Alternativ ginge auch std::array, solange die Zahl der Elemente fix
ist.
Hallo Rolf ^^
Rolf M. schrieb:> Das erzeugt ein Array aus 8 Zeigern auf std::string und schreibt die> Adresse des erste Element davon nach FelderSchwarz.Rolf M. schrieb:> Das erzeugt ein Array aus 4 std::string und schreibt die Adresse des> ersten davon in das Element mit Index y im Array aus der ersten Zeile.
Das beudetet aber auch, ich müsste diese Zeiger auch wieder löschen oder
nicht?
Rolf M. schrieb:> DesNachbarsKleinesKätzchen schrieb:>> Aufruf(Fehler: Ausdruck muss ein veränderbarer lvalue sein):>> Schachbrett test;>> std::string Feld[8][4];>> Feld = test.getFelderSchwarz();>>>> Meine Frage ist warum,>> Weil ein Array nicht das selbe ist wie ein Zeiger, und weil man einem> Array nichts zuweisen kann.
Das bedeutet wiederum, ich müsste die Funktion so schreiben, dass ich
jedem Element vom Array Feld einen Wert direkt zuweise oder ?
DesNachbarsKleinesKätzchen schrieb:> Das beudetet aber auch, ich müsste diese Zeiger auch wieder löschen oder> nicht?
Ja. Deshalb ist std::vector oder std::array geschickter. Die kümmern
sich automatisch darum.
> Rolf M. schrieb:>> DesNachbarsKleinesKätzchen schrieb:>>> Aufruf(Fehler: Ausdruck muss ein veränderbarer lvalue sein):>>> Schachbrett test;>>> std::string Feld[8][4];>>> Feld = test.getFelderSchwarz();>>>>>> Meine Frage ist warum,>>>> Weil ein Array nicht das selbe ist wie ein Zeiger, und weil man einem>> Array nichts zuweisen kann.>> Das bedeutet wiederum, ich müsste die Funktion so schreiben, dass ich> jedem Element vom Array Feld einen Wert direkt zuweise oder ?
Ja. Auch hier wäre ein vector deutlich einfacher.
DesNachbarsKleinesKätzchen schrieb:> Ich lerne C++ in Eigenarbeit
Das ist löblich. Ganz ohne gutes Buch gehts aber nicht.
DesNachbarsKleinesKätzchen schrieb:> 2D-String-Array
Wie schon mehrfahc geschrieben wurde, wäre ein std::vector dafür das
Mittel der Wahl.
Due Fingerübung mit dem per new erzeugten 2-dimensionale Array schadet
aber nicht. Dabei wirst du einiges lernen, denn das ist weit weniger
trivial, als es aussieht.
DesNachbarsKleinesKätzchen schrieb:> Meine Frage ist warum, außderdem was genau diese Zeilen> machen:> FelderSchwarz = new std::string* [8];> FelderSchwarz[y] = new std::string [4];
Je nun, das ist genau die Stelle, wo der Frosch die Locken hat ;)
Das solltest du wirklich mal durchdenken, und versuchen zu verstehen.
Oliver
Programmierer schrieb:> C++ ist sehr komplex, es ist dringend zu empfehlen ein gutes, aktuelles> (!) Buch zu lesen:
Wichtig ist hier, dass es aktuell ist. Mit C++11 und späteren Standards
hat sich eine Menge getan. Gerade bei der automatischen
Speicherverwaltung (z.B. unique_ptr) und effizienten Weitergaben von
Objekten (move) hat sich viel getan.
In deinem Fall z.B. ist für den Aufrufer nicht klar, ob er den
erhaltenen Speicher freigeben muss oder ob er den Pointer nur zum
anschauen bekommt.
Beim Lernen kannst du in C++ meiner Meinung nach zwei Richtungen
verfolgen:
1) Verwendung der Bausteine, die die Sprache und die Standardbibliothek
dir geben. In deinem Fall wäre das z.B. "Ich möchte eine Liste von
Strings."
Wobei es in C++ einen Unterschied zwischen Liste und Vector gibt, wie
diese im Speicher angeordnet sind. Damit lernst du die Bausteine zu
verwenden und löst damit deine Probleme oder erstellst dir eigene
Bausteine.
2) Verständnis der zugrundeliegenden Funktionsweise. Wie funktioniert
Speicherverwaltung mit Pointern auf dem Heap und Stack. Das geht dann
aber mehr in Richtung C und Systemverständnis.
Ich denke man muss beide Wege beschreiten. An deinem Beispiel sieht man
aber, das dir bei 1) noch einiges nicht bekannt ist, was dir die Lösung
deines Problems einfacher macht, weil es dir z.B. Speicherverwaltung
abnimmt.
Hallo zusammen,
basierend auf eure Antworten werde ich mir mal die Vektoren anschauen,
aber davor nochmal genauer, was Pointer machen.
Denn ich habe wohl ganz offensichtlich Pointer noch nicht ganz
verstanden.
Jetzt habe ich aber eine Frage zu den Büchern. Programmierer hat
natürlich schon einen Link von Stackoverflow gepostet zu einer
Auflistung von Büchern.
Die sind aber alle auf Englisch, gibt es auch Bücher auf Deutsch, die
sich lohnen? (Ich kann Englisch, aber manches verstehe ich doch besser,
wenn es auf Deutsch erklärt wird)
Ich danke euch nochmal für eure Antworten ^^
DesNachbarsKleinesKätzchen schrieb:> Die sind aber alle auf Englisch, gibt es auch Bücher auf Deutsch, die> sich lohnen? (Ich kann Englisch, aber manches verstehe ich doch besser,> wenn es auf Deutsch erklärt wird)
Der C++ Programmierer von Ulrich Breymann.
Hallo mh ^^,
mh schrieb:> Der C++ Programmierer von Ulrich Breymann.
Das sieht wirklich nach einem guten Buch aus, welches ich mir zulegen
werde.
Ich danke dir^^