Mehrdimensionales Array code unklar

Gast #6604970
Lesenswert?

Hallo zusammen,

ich bin gerade dabei, in C++ ein zwei Dimensionales Array zu erstellen 
mit Pointern. Der Benutzer soll die größe festlegen können.

Ich habe folgendes bis jetzt gemacht:
1
int zeilen = 0;
2
int spalten = 0;
3

4
// Einlesen der Zeilen und Spalten:
5
..... (das schreibe ich jetzt nicht extra auf.)
6

7
// 2D - Array erzeugen:
8
  
9
  int** twoDimArray = new int* [zeilen]; // Pointer - Array
10

11
  for (int i = 0; i < Zeilen; i++){
12
    twoDimArray[i] = new int[spalten];
13
  }
Es scheint zu funktionieren, aber so wirklich verstanden habe ich es 
nicht.
Kann man das so machen?

SG
#6604986
Lesenswert?

Hallo,

int** twoDimArray = new int* [zeilen];
ich bin kein Experte, aber ich meine, das kann zwar funktionieren, aber 
es ist nicht unbedingt richtig. Der Compiler weiß vermutlich von 
twoDimArray nicht dass es eigentlich ein pointer auf arrays von ints 
ist. Zum Glück ist der Pointer genau so groß. Macht kein unterschied. 
Wobei später könnte es probleme machen.
Gast #6605045
Lesenswert?

helpme91 schrieb:
> Dann stimmt mein Code so?
>
> Ich weiß nicht, ob ich int Zeilen und int Spalten richtig im Code
> eingesetzt habe?

Du kannst ja mal ein paar Werte in Dein Array schreiben und anschließend 
ausgeben, z.B.:
1
#include <iostream>
2

3
using namespace std;
4

5
int main()
6
{
7

8
    int zeilen = 5;
9
    int spalten = 10;
10

11
    int **twoDimArray;
12

13
    twoDimArray = new int*[zeilen];
14
    for(int i=0; i<zeilen; i++) {
15
        twoDimArray[i] = new int[spalten];
16
        for(int j=0; j<spalten; j++) {
17
            twoDimArray[i][j] = i*10 + j;
18
        }
19
    }
20

21
    cout << endl;
22
    for(int i=0;i<zeilen;i++) {
23
        for(int j=0; j<spalten; j++) {
24
            printf("[%02d]\t", twoDimArray[i][j]);
25
        }
26
        cout << endl;
27
    }
28

29
    return 0;
30
}
1
[00]  [01]  [02]  [03]  [04]  [05]  [06]  [07]  [08]  [09]  
2
[10]  [11]  [12]  [13]  [14]  [15]  [16]  [17]  [18]  [19]  
3
[20]  [21]  [22]  [23]  [24]  [25]  [26]  [27]  [28]  [29]  
4
[30]  [31]  [32]  [33]  [34]  [35]  [36]  [37]  [38]  [39]  
5
[40]  [41]  [42]  [43]  [44]  [45]  [46]  [47]  [48]  [49]

Die Zehnerstelle wäre in diesem Fall quasi die Zeilennummer, die 
Einerstelle die Spaltennummer.
Dann siehst Du auch Zeilen und Spalten...
Gast #6605048
Lesenswert?

helpme91 schrieb:
> Dann stimmt mein Code so?

Ja, mal abgesehen davon, dass Du in Deiner for-Schleife oben die 
Variable "Zeilen" verwendest (mit großem Z) und darüber "zeilen" 
deklariert hast (mit kleinem z).
Aber das dürfte in Deinem richtigen Code ja korrekt sein, sonst hättest 
Du ja nicht testen können ;)
Gast #6605052
Lesenswert?

helpme91 schrieb:
> Dann stimmt mein Code so?
>
> Ich weiß nicht, ob ich int Zeilen und int Spalten richtig im Code
> eingesetzt habe?

Das kommt drauf an, was du damit vorhast und ob in deinem echten 
Quelltext die richtige Schreibweise von Zeilen/zeilen genutzt wird. Wie 
du die Arrays deallokierst hast du ach nicht gezeigt.

Ich gehe davon aus, dass du sowas (sehr stark vereinfacht) nutzen 
solltest.
1
template <typename T>
2
struct Array2d {
3
  Array2d(int z, int s) : zeilen(z), spalten(s), daten(z*s) {
4

5
  }
6

7
  T& operator()(int zeile, int spalte) {
8
    return daten[zeile*spalten+spalte];
9
  }
10

11
  int zeilen;
12
  int spalten;
13
  std::vector<T> daten;
14
};
Gast #6605076
Lesenswert?

O.k., erstmals danke für die Hilfe.

Das funktioniert soweit auch alles.

Wasmir aber noch nicht so wirklich einleuchtet, wie werden hier die 
Zeilen und Spalten erzeugt.

Hier erzeuge ich ja nur mal ein Pointer-Array, das ist ja noch kein 
richtiges Array mit Daten:
1
int** twoDimArray = new int* [zeilen];

Hier geben ich ja schon mal die zeilen an, aber keine Spalten.

Die Spalten gebe ich erst hier an:
1
 
2
for (int i = 0; i < Zeilen; i++){
3
      twoDimArray[i] = new int[spalten];
4
}

Nur hier erzeuge ich ja das eigentliche Array.

Mich verwirrt das, weil ich ein klassisches Array immer nur so gemacht 
habe: array[i][j]

Kannst du mir den Code mal einfach erklären, momentan verstehe ich die 
erzeugung des Array noch nicht ganz?

Danke für die Hilfe!
Gast #6605091
Lesenswert?

helpme91 schrieb:
> Es scheint zu funktionieren,

Bei was? Wie greifst du zu?

helpme91 schrieb:
> ein zwei Dimensionales Array zu erstellen mit Pointern.

Wenn du "Array mit Pointern" meinst, dann erkläre, was Du darunter 
verstehst.

Wenn Du "Array" meinst, und die Pointer nur als Mittel zum Zweck siehst, 
.... Nein. Du erstellt kein zweidimensionalen Array von int.

Es kann aber zufällig sich so anfühlen, wenn aller Speicher nacheinander 
allokiert wird.
#6614893
Lesenswert?

Das ist kein 2D-Array - Ein Array in C (und das benutzt du) ist ein 
zusammenhängender Speicherbereich

Ein Pointer ist kein Array und ein Array ist kein Pointer.
Ein Array behält den Speicherplatz. Einen Pointer kann man verändern.

Der Name eines Arrays ergibt die Adresse des ersten Elements.

Name[i] ist dasselbe wie (*Name+i) (was dann auch dasselbe wie i[Name] 
ist)

Daraus solltest du die Ähnlichkeit im Zugriff von deinem 
(Doppel-)Pointer und beim (2S-)Array herleiten können.

Bei C++ nimmt man std::vector
#6614911
Lesenswert?

helpme91 schrieb:
> Nur hier erzeuge ich ja das eigentliche Array.
>
> Mich verwirrt das, weil ich ein klassisches Array immer nur so gemacht
> habe: array[i][j]

Deine Version erzeugt kein 2D-Array, sondern ein 1D-Array von Pointern, 
die jeweils auf einzelne 1D-Arrays mit den Werten zeigen. Diese einzelne 
Array müssen nicht hintereinander liegen, sondern können frei im 
Speicher verteilt sein, und müssen per delete wieder entsorgt werden..

array[i][j] erzeugt dagegen einen zusammenhängenden Speicherbereich, auf 
den dann mit i*Spaltenzahl+j zugegriffen wird.

Oliver

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren