2009-09-24 9 views
5

Je crée un programme C++ qui vérifie si aray est un latin square. J'ai besoin d'utiliser un tableau multidimensionnel dynamique qui stocke un carré latin donné. Mais je ne peux pas passer le tableau à une fonction qui fait la vérification ...Utilisation de tableaux dynamiques multidimensionnels en C++

Actuellement, j'ai un tel code pour appeler la fonction:

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

    //some code 
}; 

Et ce code est pour la création du tableau:

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

Le code compile (j'utilise Geany IDE et G ++ compilateur) mais quand je l'exécute dans le terminal, après le premier imput, qui doit être stocké dans le bloc [0] [0] j'obtiens Segmentation fault erreur. Quel est le problème avec mon code et quelle est la bonne solution?

+0

+1 pour le carré latin –

+2

Pourquoi ne pas utiliser un std :: vector? – Yacoby

Répondre

7

Pour pouvoir faire cela .. Vous devez vraiment faire ceci:

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

Le meilleur système serait de faire:

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

Vous disposez d'un tableau de pointeurs dans lsquare.

Vous voudrez peut-être faire quelque chose comme:

lsquare = new int[n * n]; 

De cette façon, vous pouvez remplir cette place, mais le type est alors:

int *lsquare 
0

Qu'est-ce que vous créez en fait un tableau des tableaux. Non seulement vous devez allouer le tableau de tableaux en utilisant new, mais vous devez également allouer tous les tableaux n. Vous voulez que la boucle externe de votre boucle for imbriquée alloue chacun des n sous-tableaux.

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

Vous vous faites un pointeur de pointeur qui peut être utilisé comme une matrice, alloué une ligne pour elle, a ensuite agir comme vous aviez prévu une somme matrice n * n entier. Vous obtiendrez en effet un segfault si vous exécutez cela.

Vous devez allouer suffisamment d'espace pour les éléments n * n, pas seulement n éléments.

Une solution moins sujette aux erreurs pourrait être d'utiliser un vecteur std :: de std :: vectors.

0

Vous devez allouer de l'espace pour la deuxième dimension aussi, ajoutez ceci après avoir alloué lsquare:

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

Vous avez oublié d'allouer de la mémoire pour la deuxième dimension de la matrice ix.

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

personne écrit

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

faire à la place

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