2015-08-26 1 views
-1

J'essaie d'écrire une fonction de déterminant de matrice en C++. Cependant mon code ne compile pas et ne sait pas pourquoi (j'utilise un compîler en ligne C++, et les messages d'erreur iget est "* Erreur dans` /var/www/service/usercode/519646917/a.out ' : libre(): non valide, taille suivante (rapide): 0x00000000019c1180 * "). Il semble que le problème provient de la fonction Free.Détermination de matrice C++/allocation de mémoire

S'il vous plaît quelqu'un peut-il me dire ce qui ne va pas dans mon code?

Merci à l'avance Cordialement

#include <iostream> 
    #include <cmath> 
    #include <fstream> 
    #include <vector> 
    #include <numeric> 
    #include <iterator> 
    #include <map> 
    #include <string> 

    //C++ clang 

    using namespace std; 

    void Free(double** a, unsigned int n) 
    { 
     if (a!=NULL) 
     { 
      for (unsigned int j=0 ; j<n ; j++) 
      { 
       delete[] a[j]; 
      } 
      delete[] a; 
     } 
    } 

    double mDeterminant(double** a, unsigned int n) 
    { 
    if (n==1) 
    { 
     return a[0][0]; 
    } 
    else if(n==2) 
    { 
     return a[0][0]*a[1][1]-a[0][1]*a[1][0]; 
    } 
    else 
    { 
     double res=0.0; 
     for (unsigned int i=0 ; i<n ; i++) 
     { 


      double** A=new double*[n-1]; 
      for (unsigned int j=0 ; j<n-1 ; j++) 
      { 
       A[j]=new double[n-1]; 
      } 

      for (unsigned int j=1 ; j<n ; j++) 
      { 
       unsigned int g=0; 
       for (unsigned int k=0 ; k<n ; k++) 
       { 
        if (k!=i) 
        { 
         A[j-1][g]=a[j][k]; g++; 
        } 
       } 
      } 

      res+=a[0][i]*pow(-1, i)*mDeterminant(A, n-1); 
      Free(A,n-1); 
     } 
     return res; 
    } 

    } 

    int main() 
    { 
     unsigned int N=4; 
     double** a=new double*[N]; 
     for (unsigned int i=0 ; i<N ; i++) 
     { 
      a[i]=new double[N]; 
     } 

     for (unsigned int i=0 ; i < N ; i++) 
     { 
      for (unsigned int j=0 ; j < N ; j++) 
      { 
       a[i][j]=(1+i)*(2+j-i); 
       cout << a[i][j] << ";"; 
      } 
      cout << endl; 
     } 


     cout << "----------------------------------" << endl; 
     cout << "mDeterminant = " << mDeterminant(a, N) << endl; 

    } 
+1

Obtenir un compilateur où vous pouvez lire les messages d'erreur !!! Ce ne sera pas la dernière fois que vous devrez lire les messages d'erreur produits par votre compilateur. – user463035818

+1

Vous n'avez pas besoin d'utiliser 'new' et' delete' du tout ici, utilisez simplement 'vector >' et détendez-vous car il gère toute la mémoire pour vous. – Useless

+0

Il [compile] (http://ideone.com/YSBi0i) mais il y a une erreur d'exécution. Il semble que 'g' peut atteindre' n-1', ce qui est hors limites. (Même si vous ne trouvez pas un message lisible, vous pouvez probablement trouver à la fois copiable et pasteable.) – molbdnilo

Répondre

0

Je crois que la seule erreur que vous avez (autre que les dimensions du tableau 'a' dans main) est à l'endroit où vous définissez g. g doit être défini ici:

for (unsigned int j=1 ; j<n ; j++) 
{ 
     unsigned int g= 0; 
     for (unsigned int k=0 ; k<n ; k++) 
     { 
      if (k!=i) 
      { 
       A[j-1][g]=a[j][k]; g++; 
      } 
     } 
    } 

En ce qui concerne les autres n-1 Je comprends ce que vous vouliez dire avec eux et je pense qu'ils sont corrects

+0

oui! merci j'ai mis à jour avec le g. mais cela ne marche toujours pas:/ – JasBeck

+0

Tout fonctionne maintenant, je pensais que la valeur fournie par mDeterminant était fausse, mais maintenant vérifié et cela fonctionne. – JasBeck

+0

merci pour tout le monde !!!!!!! – JasBeck

0

Vous avez trop d'erreurs:

a[i]=new double; devrait être a[i]=new double[N];. double** A=new double*[n-1]; devrait être soit double** A=new double*[n]; ou boucles ci-dessous devrait être jusqu'à n-1. A[j]=new double[n-1]; devrait être soit A[j]=new double[n]; ou boucles ci-dessous devrait être jusqu'à n-1. Ici A[j-1][g]=a[j][k]; g++; votre g est hors de portée du tableau. Vous ne libérez pas non plus le tableau a. Je suppose qu'il est plus facile de réécrire votre code à partir de zéro, cette fois, pensez à ce que vous faites.

+0

J'ai corrigé pour le g et pour un [i] = nouveau double. – JasBeck

+0

le A devrait être de taille (n-1) * (n-1) car c'est un mineur de la matrice a qui est de taille n * n. Pour la boucle dans la fonction mDeterminant, je devrais boucler jusqu'à n-1 parce que je vérifie les valeurs à choisir dans un afin de construire mon A – JasBeck

+0

mon code mis à jour – JasBeck