Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changement de valeurs non voulue (suite)

    14 février 2019 à 16:33:44

    Je continues mon sujet : https://openclassrooms.com/forum/sujet/changement-de-valeurs-non-voulue

    j'ai décidé de reprendre plus ou moins au début. Pour commencer je ne lis plus mon fichier dans une fonction (je devrais le faire, mais pour le moment on essaie d'y aller doucement).

    Donc juste pour lire le fichier je suis arrivé à ça :

    int main(){
    	double*x0;
    	double*A;
    	double*b;
    	int n;
    	ifstream datos("jacobi.txt");
    	string d,a,bb,xx; // servent à récuperer les parties inutiles au programme
    	//On récupère n (la dimension des vecteurs)
    	datos>>d>> n>>a;
    	
    	A=new double[n*n];
    	b= new double [n];
    	x0=new double [n];
    	//On rentre les termes de la matrices dans  A
    	for(int i=0;i<n;i++){
    		for (int j=0;j<n;j++){
    			datos>>A[i*n+j];
    		}
    	}
    	datos>>bb;
    	//On récupère b
    	for(int i=0;i<n;i++){
    		datos>>b[i];
    	}
    	datos>>xx;
    	//On récupère x0
    	for(int i=0;i<n;i++){
    		datos>>x0[i];
    	}
    	datos.close();
    	//On vérifie A
    	for(int i=0;i<n;i++){
    		for (int j=0;j<n;j++){
    			cout<<A[i*n+j]<<" ";
    	}
    	cout<<endl;
    	}
    	//On vérifie b
    	for(int i=0;i<n;i++){
    		cout<<b[i]<<" , ";
    	}
    	cout<<endl;
    	//On vérifie x0
    	for(int i=0;i<n;i++){
    		cout<<x0[i]<<" , ";
    	}
    	delete A;
    	delete b;
    	delete x0;
    }

    Pour le moment je ne fais que lire et afficher ce que j'ai lu.

    Pour le moment j'obtiens un résultat correct, mais est-ce que le code est correct ?

    • Partager sur Facebook
    • Partager sur Twitter
      14 février 2019 à 16:43:46

      Hello ! :)

      Ca me semble déjà un peu plus propre que tout à l'heure, en prenant en compte les restrictions imposées par ton prof. :D D'ailleurs au final je n'ai pas compris si tu as droit aux vector ou pas.

      En tout cas voilà quelques remarques (positives / négatives) :

      • Pour l'ouverture du fichier, un petit test is_open() et un petit message d'erreur + arrêt du programme en cas d'échec ne serait pas de refus. :)
      • C'est bien d'avoir passé ta matrice en tableau 1D, plus optimisé. ;)
      • Par contre attention, tes delete ne sont pas bons ! delete[] pour un new[] !! La dessus ça serait ptet bien d'avoir une petite classe qui te fait le new dans le constructeur et le delete approprié dans le destructeur comme expliqué par gbdivers précédemment. :) Surtout que tu as 3 tableaux !

      -
      Edité par Maluna34 14 février 2019 à 16:44:01

      • Partager sur Facebook
      • Partager sur Twitter
        14 février 2019 à 16:45:52

        Lu'!

        Note à ceux qui passeraient sur le sujet, en particulier les débutants : n'utilisez pas new et delete comme ça en C++, c'est trop compliqué, et présente trop de risque d'erreur. Utilisez le type vector de la bibliothèque standard.

        Tu devrais simplifier ton code quelques peu. Pour le rendre un peu moins foutraque, la première idée c'est de séparer un peu tout ça dans des fonctions qui font un job simple. Par exemple :

        //renvoyer un vecteur de taille n alloué
        int* vector(int n){
          // code
        }
        
        //renvoyer une matrice n x n allouée:
        int** matric(int n){
          // code
        }
        

        Et bien sûr, même chose pour tes libérations, tes chargements de fichiers etc. Ensuite, pour se simplifier un peu la vie au niveau de la matrice et éviter de manipuler trop de pointeurs, on peut passer sur une linéarisation et des fonctions pour accéder aux cases et se faire une structure pour éviter de faire des accès hors bornes :

        struct sqmatrix {
          int* content ;
          int  size ;
        };
        
        sqmatrix create_sqmatrix(int n){
          assert(n > 0);
          sqmatrix result ;
          result.content = new int [ n * n ];
          result.size = n ;
          return result ;
        }
        
        int sqmatrix_get_value(sqmatrix m, int row, int col){
          assert(0 <= row && row < m.size);
          assert(0 <= col && col < m.size);
          return m.content[row * m.size + col];
        }
        
        void sqmatrix_set_value(sqmatrix m, int row, int col, int value){
          assert(0 <= row && row < m.size);
          assert(0 <= col && col < m.size);
          m.content[row * m.size + col] = value;
        }
        
        void destroy_sqmatrix(sqmatrix m){
          delete[] m.content ;
        }

        C'est pas parfait, et ça peut sembler gros, mais en fait ça te permet d'avoir pas mal de contrôles pour éviter d'accéder à des endroits invalides de la matrice. Comme ça, si tu fais une erreur, ça te le sera signalé. Et après, pour accéder à ta matrice, tu te contentes de n'utiliser que ces fonctions. Comme ça, tu évites de trop manipuler des pointeurs et ça va t'éviter des déconvenues.

        -
        Edité par Ksass`Peuk 14 février 2019 à 16:46:29

        • Partager sur Facebook
        • Partager sur Twitter

        Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

          14 février 2019 à 17:03:14

          Merci à tous les deux.

          @Ksass`Peuk, c'est malheureusement la méthode employée par mon prof. Par exemple dans mon cours j'ai ça :

          // Fichero : ej_new_delete . cpp
           // ejemplo del memoria dinamica en C++ ( new y delete )
           # include <iostream >
           using std :: cout ;
           using std :: endl ;
           using std :: cin;
          
           int main ()
           {
           int i,n;
           int * p;
           cout << " Cuantos numeros quieres introducir ? ";
           cin >> i;
           p= new int[i];
           if (p == 0) cout << " Error : no se puede reservar memoria ";
           else
           {
           for (n =0; n<i; n++)
           {
           cout << " Introduzca un numero : ";
           cin >> p[n];
           }
           cout << " Los numeros que ha introducido son : ";
           for (n =0; n<i; n++)
           cout << p[n] << ", ";
           cout << endl ;
           delete [] p;
           }
           return 0; }

          (Là dessus je ne peux m'en vouloir qu'à moi même pour le delete[].

          Donc pour ce qui est des vector j'en doute fort. En fait je les ai utilisé pour un exo déjà rendu parce que qu'il nous imposait pas encore vraiment les pointeurs, mais il ne nous en a jamais parlé. (et n'il pas rendu mon travail donc je sais pas si ça passe ou non).

          J'ai deux problèmes à présent.

          Le premier est de bien utiliser ces pointeurs : je dois faire la fonction jacobi de deux manières différentes :

          - Implémenter la méthode de Jacobi en interchangeant le contenu des pointeurs

          -Implémenter la méthode de Jacobi en interchangeant des pointeurs.

          Le second problème est que cette lecture de fichier doit être faite dans une fonction et non dans le main. Or je ne vois pas comment je pourrais réserver la bonne taille de mémoire pour mes vecteurs avant de lire leur dimension dans le fichier

          • Partager sur Facebook
          • Partager sur Twitter

          Changement de valeurs non voulue (suite)

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown