Forum: PC-Programmierung Mehrdimensionales Array code unklar


von helpme91 (Gast)


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

: Verschoben durch Admin
von Andras H. (kyrk)


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.

von helpme91 (Gast)


Lesenswert?

Wie wäre es dann richtig?

von mikroBe (Gast)


Lesenswert?

helpme91 schrieb:
> Wie wäre es dann richtig?

Das ist schon vollkommen richtig so.
Ein Pointer auf ein Array ist immer nur ein Pointer auf das erste 
Element des Arrays. Zumindest nach der Initialisierung - wenn man ihn 
hochzählt, natürlich nicht mehr.

von helpme91 (Gast)


Lesenswert?

Dann stimmt mein Code so?

Ich weiß nicht, ob ich int Zeilen und int Spalten richtig im Code 
eingesetzt habe?

von mikroBe (Gast)


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

von mikroBe (Gast)


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 ;)

von mh (Gast)


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
};

von helpme91 (Gast)


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!

von A. S. (Gast)


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.

von Jonas B. (jibi)


Lesenswert?


von Dirk B. (dirkb2)


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

von Oliver S. (oliverso)


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

: Bearbeitet durch User
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.