2011-01-14 3 views
1

Hier sind wir wieder einmal gute Leute im Internet.Eine Variable scheint den Zugriff aufzuheben, wenn ich sie in einem dynamischen Array (C++) verwende.

Dies ist der Code Ich verwende:

//This is what is in the header file 
int *myArr[]; // A two-dimensional array representing holding the matrix data 

//This is what is in the definition file 
Matrix::Matrix(int n, int m) 
{ 
    myRows = n; 
    myColumns = m; 
    initialize(); 
} 

void Matrix::initialize() 
{ 
    *myArr = new int[myRows]; 

    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy 
    { 
     myArr[i] = new int[myColumns]; 
    } 
} 

Aus irgendeinem Grund, wenn ich myRows Variable verwenden, um die myArr Array zu erstellen, scheint es nur um den Wert zu stoppen verweisen sie auf, bevor zeigt wurde.

Zum Beispiel gebe ich ihm den Wert 3 und nachdem der * myArr = new int [myRows] ausgeführt wurde ändert es den Wert von myRows zu 9834496, was ich nicht verstehe.

Stimmt die "neue" Variable oder etwas davon ab? Oder mache ich etwas falsch?

Oh, und da dies ein Schulpraxisprojekt ist (also werde ich dich nicht beschuldigen, wenn du nicht antwortest), würde ich eine Antwort lieber über Arbeitscode bevorzugen, damit ich wissen könnte, was ich falsch für zukünftige Projekte gemacht habe.

+0

Also ist die myArr-Variable ein Array von int *? – ThePragmatist

+0

Der einfache, schwierig zu stopfende Ansatz besteht darin, einen Vektor von Vektoren zu verwenden. Es ist immer noch ein bisschen hässlich, aber viel, viel besser. –

+0

Wie ich verstehe, ist myArr ein Zeiger von Zeigern. Aber ich könnte falsch liegen. – Siemsen

Antwort

2
int *myArr[]; 

Das ist falsch! Sie müssen dem Compiler auch die Größe Ihres Zeigerarrays mitteilen. Wie wäre es, wenn Sie int a[] deklarieren. Sie weisen den Compiler an, ein Array von int unbekannter Größe zu erstellen, das in C++ nicht erlaubt ist. Deshalb können Sie das nicht tun.

Ich würde vorschlagen, Sie, dies zu tun:

int **myArr; 

void Matrix::initialize() 
{ 
    myArr = new int*[myRows]; //note int* here! 

    for (int i=0; i < myRows; i++) 
    { 
     myArr[i] = new int[myColumns]; 
    } 
} 

Das jetzt funktionieren sollte.

+0

Ich denke, das ist auch falsch ... speziell, 'myArr = new int [myRows];' erstellt eine Zeile von 'int', und das kann oder kann nicht groß genug sein, um die' int * 'Werte zu speichern, die Sie dort brauchen . –

+0

Ok, ich habe das zur Arbeit gebracht. Obwohl ich nicht genau verstehe, warum int * myArr []; ist falsch, deklariere ich die Größe nicht mit * myArr = new int [myRows]; ? – Siemsen

+1

@Tony: Wovon redest du?Bitte lesen Sie meinen Code sorgfältig, bevor Sie ihn kommentieren. :-) – Nawaz

2

Sie sollten std :: vector <> verwenden. Es befasst sich mit allen Problemen der Speicherzuweisung und Freigabe. Und das ohne Bugs.

Und dann konzentrieren Sie sich auf die wirklichen Ziele Ihres Algorithmus. Nicht auf Speicherverwaltung :-)

typedef std::vector<int> Ints; 
typedef std::vector<Ints> Matrix; 
Matrix myArray; 
+0

Da es sich um ein Schulprojekt handelt, darf er/Umhüllen bestehender Container. Lernen und all das :) – genpfault

+0

Ja, aber ich denke nicht, dass es gut ist, bei Multilevel-Pointer-Magie gut zu sein. Aus meiner Sicht. Und Vektor ist immerhin ein Teil der C++ - Standardbibliothek ;-) –

+1

Ich hatte ein ähnliches Projekt mit Vektoren gemacht, aber dieses Projekt ist genau so, wie genpfault sagt. Muss dynamische Multi-Arrays verwenden – Siemsen

2

Versuchen Sie ersetzen:

*myArr = new int[myRows]; 

von

myArr = new int*[myRows]; 
+1

Das ist nicht genug. Seine Erklärung von "myArr" ist falsch, mit zu beginnen! – Nawaz

0

Ich bin mir nicht sicher, ob Sie Projekt sind erfordert, dass Sie Multi-Level-Zeiger zu verwenden, Wenn Sie sich diesem Problem nicht anders nähern können, behandeln Sie einfach das mehrdimensionale Array als ein großes, flaches Array.

Das bedeutet, wenn Sie das Ende einer Zeile erreichen, wäre der Index danach das erste Element der nächsten Zeile. So könnte der Code aussehen:

// In this approach the double pointer int** 
// is replaced with just a simple int* 
int *myArr; 

// Here's your Matrix ctor. Note the use of the initializer list 
Matrix::Matrix(int n, int m) : myRows(n), myColumns(m) 
{ 
    initialize(); 
} 

void Matrix::initialize() 
{ 
    myArr = new int[myRows * myColumns]; 

    /* This loop is no longer needed since we're allocating 
     one big chunk at once. 
    for (int i=0; i < 3; i++)//Only set to 3 since myRows is acting crazy 
    { 
     myArr[i] = new int[myColumns]; 
    } 
    */ 
} 

// To retrieve stuff from your array 
// you would do something like this: 
int Matrix::operator() (const int x, const int y) 
{ 
    return myArr[x * myRows + y]; 
} 
Verwandte Themen