2009-09-24 12 views
5

Ich mache ein C++ - Programm, das prüft, ob Array gegeben ist ein latin square. Ich muss ein dynamisches mehrdimensionales Array verwenden, das das angegebene lateinische Quadrat speichert. Aber ich kann das Array an eine Funktion, die die Prüfung durchführt ...Verwenden von dynamischen mehrdimensionalen Arrays in C++

Derzeit ich einen solchen Code haben für den Aufruf der Funktion:

int squaretest(int **p, int n, int sum) { 

    //some code 
}; 

Und dieser Code ist für die Erstellung der Array:

int main() { 

    //some code. n - length of one row, sum - sum of elements in one row. 
    int a; 
    int **lsquare; 
    lsquare = new int*[n]; 
    for (int i=0;i<=n-1;i++) for (int j=0;j<=n-1;j++) { 
     cin >>a; 
     lsquare[i][j] = a; 
    } 
    blocktest(lsquare,n,sum); 
    //some code 
}; 

Der Code kompiliert (ich benutze Geany IDE und G ++ Compiler) aber wenn ich es im Terminal ausführen, nach dem ersten Imput, der in Block [0] [0] gespeichert werden muss, bekomme ich Segmentierungsfehler Fehler. Was ist falsch an meinem Code und was ist die richtige Lösung?

+0

+1 für das lateinische Quadrat –

+2

Warum nicht ein std :: vector? – Yacoby

Antwort

7

Um in der Lage sein, das zu tun .. Sie tatsächlich dies tun müssen, um:

int *lsquare = new int[n*n]; 

for (int i=0; i<n; ++i) 
    for (int j=0; j<n; ++j) 
     cin >> lsquare[i + j*n]; 

blocktest(lsquare, n, sum); 
0

Sie haben ein Array von Zeigern in lsquare.

Sie möchten vielleicht nur wie etwas tun:

lsquare = new int[n * n]; 

Auf diese Weise können auf diesem Platz dann füllen kann, aber der Typ ist dann:

int *lsquare 
0

Was Sie ein Array tatsächlich zu schaffen von Arrays. Sie müssen nicht nur das Array von Arrays mit new zuweisen, sondern auch alle n Arrays zuweisen. Sie möchten, dass die äußere Schleife Ihrer geschachtelten for-Schleife jedes der n Sub-Arrays zuweist.

lsquare = new int*[n]; 
for (int i=0;i<=n-1;i++) 
{ 
    lsquare[i] = new int[n]; 
    for (int j = 0;j<=n-1;j++) 
    { 
    //... 
0

Sie haben sich einen Zeiger Zeiger, der als Matrix verwendet werden können, zugewiesen eine Zeile für sie, ging dann zu handeln, wie Sie eine ganze n * n-Matrix zugewiesen hatte. Sie werden in der Tat einen segfault bekommen, wenn Sie das ausführen.

Sie müssen genügend Platz für n * n Elemente zuweisen, nicht nur n von ihnen.

Eine weniger fehleranfällige Lösung könnte die Verwendung eines std :: vectors von std :: vectors sein.

0

Sie Platz für die zweite Dimension zuweisen müssen:

int **lsquare = new int*[n]; 

for (int i=0; i<n; ++i) 
    lquare[i] = new int[n]; 

for (int i=0; i<n; i++) 
    for (int j=0; j<n; j++) 
     cin >> lsquare[i][j]; 

blocktest(lsquare,n,sum); 

Je besser System zu tun wäre, Fügen Sie das auch hinzu, nachdem Sie lsquare zugewiesen haben:

for(int i = 0; i < n; ++i) 
{ 
    lsquare[i] = new int[n]; 
} 
2

Sie haben vergessen, Speicher für zweite Dimension der Matr zuzuordnen ix.

int **lsquare; 
lsquare = new int*[n]; 
for (int i=0; i<n; ++i){ 
    lsquare[i] = new int[n]; 
....} 

niemand schreibt

for (int i=0;i<=n-1;i++){...} 

Sie stattdessen

for (int i=0; i<n; ++i){...} 
Verwandte Themen