2016-09-28 5 views
0

Mon programme se compose de deux classes. Le premier crée un tableau 2D et le remplit avec une entrée utilisateur. La première classe fonctionne correctement, et quand je l'appelle en main, elle est capable de créer et d'imprimer un tableau 2D. Cependant, j'essaye de passer un pointeur à ce tableau 2D à la deuxième fonction pour calculer le déterminant de la matrice. Cependant, mon programme continue à s'écraser après l'appel de la fonction déterminante. Pourquoi suis-je incapable de multiplier, ajouter ou soustraire ces éléments de tableau?Calcul du déterminant d'un pointeur sur un tableau 2D en C++

Voici le fichier de mise en œuvre de la classe déterminant:

#include <iostream> 
#include "det.hpp" 

using std::cout; 
using std::endl; 

Det::Det() { 

}; 
int Det::determinant(int **pointerToArray, int arraySize) { 
    int determinant; 
    cout << "Calculating the determinant..." << endl; 
    if (arraySize == 2) { 
     determinant = (pointerToArray[0][0] * pointerToArray[1][1]) - 
         (pointerToArray[1][0] * pointerToArray[1][0]); 
    } else if (arraySize == 3) { 
     determinant = (pointerToArray[0][0] * ((pointerToArray[1][1] * pointerToArray[2][2]) - 
         (pointerToArray[1][2] * pointerToArray[2][1]))) - 
         (pointerToArray[0][1] * ((pointerToArray[1][0] * pointerToArray[1][1]) - 
         (pointerToArray[1][2] * pointerToArray[2][0]))) + 
         (pointerToArray[0][2] * ((pointerToArray[1][0] * (pointerToArray[2][1]) - 
         (pointerToArray[1][1] * pointerToArray[2][0]))); 
    } else { 
     return determinant; 
    }; 
}; 

Voici comment est la partie de la principale que je fais appel à la fonction:

//this is the original object 
Matrix* point = new Matrix(); 
    //this is where I retrieve the data from the first function 
    int * tempPoint = point->readMatrix(newArray, squareSize); 
    /*this is where I call the determinant with 
    a pointer to the original array as a parameter*/ 
    calculate.determinant(&tempPoint, squareSize); 
+0

Pourquoi? Perdre la classe et transformer 'determinant' en une [fonction libre] (http://stackoverflow.com/questions/4861914/what-is-the-meaning-of-the-term-free-function-in-c). Moins de bruit, moins de bruit et moins de frais généraux. Sur repenser, pourquoi ne pas déplacer déterminant dans la classe Matrix? Cela ressemble à une opération logique à effectuer sur une matrice. – user4581301

+0

C'était ma première pensée en fait. C'est une tâche scolaire et les exigences spécifient deux fichiers d'en-tête, deux fichiers d'implémentation, ainsi qu'un fichier principal. – csdavido

+0

Intéressant. Vous pourriez vouloir en parler avec l'instructeur.Ils pourraient avoir quelque chose de sournois à l'esprit, mais ils pourraient aussi vous apprendre à écrire du code comme un idiot. Soyez bon de savoir lequel vous pouvez donc ajuster vos attentes d'apprentissage et le style de codage en conséquence. – user4581301

Répondre

0

Après avoir appelé

int * tempPoint = point->readMatrix(newArray, squareSize); 

tempPoint pointe vers un tableau 1D de int s

calculate.determinant(&tempPoint, squareSize); 

prend alors l'adresse de ce pointeur vers un tableau 1D et utilise à l'intérieur comme si elle était un pointeur vers un tableau 2D. Regardez-le comme ceci: Dites que vous avez un tableau à l'adresse 1000. tempPoint contient cette adresse. Vous pourriez dire que tempPoint == 1000.

tempPoint se trouve dans le stockage automatique, très probablement la pile, et a une adresse de son propre que le programme puisse trouver, dire 1000000. Cela signifie &tempPoint est 1000000, donc à l'intérieur Det::determinantpointerToArray est l'adresse 1000000, et qui est nulle part près du tableau de données assis à l'adresse 1000. Det::determinant se déchaîne dans la mauvaise mémoire et personne ne sait ce qui va se passer. Dans votre cas, le programme va boum et meurt, mais il pourrait aussi boiter sur cracher cracher les mauvais résultats pendant des semaines. Crom nous aider si c'est dans un système de contrôle du trafic aérien.

Comment résoudre ce problème:

a besoin de retourner un tableau 2D qui Det::determinant peut utiliser.

Mais ... La façon dont ce programme est structuré n'est pas très bien pensée. Matrix devrait contenir et contrôler ses données, ne pas les transmettre aveuglément à quiconque le demande. Si quelqu'un veut calculer un déterminant, il doit appeler une méthode Matrix::determinant qui renvoie le déterminant.

Crack ouvrir votre texte et relire la section sur l'encapsulation. Si vous n'avez pas de texte ou si le texte est incompréhensible, lisez et lisez l'un des livres pour débutants de The Definitive C++ Book Guide and List. Croyez-moi, cela vous fera économiser une tonne de temps à long terme. Pourquoi s'embêter avec une classe qui n'a pas d'état (variables membres)?