Forum: PC-Programmierung [C++]2D String-Array und Funktionen


von DesNachbarsKleinesKätzchen (Gast)


Lesenswert?

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

von Programmierer (Gast)


Lesenswert?

DesNachbarsKleinesKätzchen schrieb:
> std::string** FelderSchwarz;

So bitte auf keinen Fall in C++! Du kannst
1
std::vector FelderSchwarz (8, std::vector<std::string> (4));

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

von DesNachbarsKleinesKätzchen (Gast)


Lesenswert?

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^^

von Rolf M. (rmagnus)


Lesenswert?

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.

von DesNachbarsKleinesKätzchen (Gast)


Lesenswert?

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 ?

von Rolf M. (rmagnus)


Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

von M.K. B. (mkbit)


Lesenswert?

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.

: Bearbeitet durch User
von DesNachbarsKleinesKätzchen (Gast)


Lesenswert?

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 ^^

von mh (Gast)


Lesenswert?

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.

von DesNachbarsKleinesKätzchen (Gast)


Lesenswert?

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^^

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.