IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

la distance euclidienne en c++ avec les classes


Sujet :

C++

  1. #1
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut la distance euclidienne en c++ avec les classes
    salut, je veux programmer la m�thode de classification hi�rarchique ascendente , alors je commence avec calculer la matrice distance d'un fichier texte qui contient une matrice de 6 ligne et 2 colonne.
    le probl�me c'est au d�but c'est dans la fonction

    j'utilise une classe calcule et appeler ces m�thodes dans le main .
    la classe calcule.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    #include "Calcule.h"
    #include <iostream>
    #include<fstream>
    #include<math.h>
     
     
     
    using namespace std;
     
     
     
    Calcule::Calcule(char *fileName)
    {
     
    ifstream file(fileName);   //ouverture de fichier 
     
    if (!file.is_open())
     
    	    cout << "IMPOSSIBLE D'OUVRIRE LE FICHIER !" << endl;
     
        else
     
    	   { 
    		   file>>nbl;
    		   file>>nbc;
     
    		 /* Allocation dynamique de la matrice  */
        data = new float* [nbl];
        for (int i=0; i < nbl; i++)
        data[i] = new float[ nbc ];
     
    	      /* lire la matrice depuis le fichier */ 
    		 float tmp;
    		for(int i=0;i<nbl;i++){
    		 for(int j=0;j<nbc;j++){
    			file>>tmp;
    		    data[i][j]= tmp;
    					}
    		       }
    		/////////////////////
    		//*afficher la matrice ////
    		for(int i=0;i<nbl;i++){
    		   for(int j=0;j<nbc;j++)
    		            {
                   cout << data [i][j]  << " " ;
    		            }
    		           cout << endl;
    		          }
    }
    }
    ///////////////////////////////////////////////////////////////////////////////
    void Calcule::Afficher( float **mat){
    	for(int i=0;i<nbl;i++){
    		   for(int j=0;j<nbc;j++)
    		            {
                   cout << mat [i][j]  << " " ;
    		            }
    		           cout << endl;
    		          }
    }
    /////////////////////////////////////////////////////////////////////////
    float Calcule:: calcule_dis(float **data){
    	 /* Allocation dynamique de la matrice  */
    	float ** dist = new float* [nbl];
        for (int i=0; i < nbl; i++)
        dist[i] = new float [ nbc ];
    	/////////////////////
    	for( int i=0;i<nbl;i++ ){
         for (int j=0; j<nbl ; j++){
          for (int k=0; k <nbc; k++){ 
     
                dist[i][j]=(float)pow(data[i][k]-data[j][k], 2 ); 
              } } }
     for( int i=0;i<nbl;i++ ){
     for (int j=0; j<nbl ; j++){ 
      return dist[i][j]= sqrt(dist[i][j]); 
    } } 
     
     
    }	
    //////////////////////////////////////////////
    Calcule::~Calcule(){
    	delete []data;
    }

    calcule.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    #include<fstream>
     
    #pragma once
    class Calcule
    {
     
    		float  **data;
    		float **dist;
    		int nbl, nbc;
     
     
    public:
    	Calcule(char *fileName);
         void Afficher(float ** mat);
        float calcule_dis(float **data);
     
     
     
    	~Calcule();
    };


    le main


    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    #include<iostream>
    #include "Calcule.h"
    #include<vector>
    #include<math.h>
     
        using namespace std;
    	float  **data;
    	float **dist;
     
     
    int main(  ){
     
    Calcule *C=new Calcule("val.txt");  //creer un objet de la classe Calcule 
     
    C->calcule_dis(data);
    C->Afficher(dist);
     
     
    C->~Calcule();//destruire l'objet
     
    system("pause");
    return 0;
    }
    il y'a pas des erreurs mais sa !!!!

    Nom : bb.PNG
Affichages : 876
Taille : 69,8 Ko

  2. #2
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    la table dist est cr��e comme [nbl][nbc] est est utilis�e comme une matrice carr�e [nbl][nbl].

  3. #3
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Bonjour,

    Dans ton module d�finissant main(), data est une variable globale. Il n'en existe qu'une seule instance lors de l'ex�cution du programme. Tu l'utilises sans l'initialiser. C'est probablement ce qui a entra�n� le crash de ton programme.
    Dans ta classe Calcule, il y a un membre qui s'appelle data, mais le compilateur se moque qu'elle porte le m�me nom que ta variable globale, car elle n'a rien � voir. Au cours de l'ex�cution du programme, � chaque instant, il existe autant d'instances de Calcule::data que d'objets Calcule.

    A part �a, il y a aussi �norm�ment d'autres probl�mes dans ce code.
    En voici une liste incompl�te :
    • Ton code n'est pas indent�.
    • Tu devrais cr�er une classe qui s'appelle Matrice. Ensuite, ta fonction qui calcule une distance avec une autre matrice devrait prendre en param�tre un const Matrice & plut�t qu'un float**.
    • Ta fonction Calcule::Afficher a acc�s � une matrice � travers tes membres Calcule::nbl, Calcule::nbc et Calcule::data. Elle prend en compte les deux premiers mais ignore le 3e au profit d'un param�tre float ** mat. Ce n'est pas coh�rent.
    • Ta fonction Calcule::calcule_dis n'a aucun sens.
    • Ton destructeur Calcule::~Calcule ne lib�re pas correctement la m�moire. Avant de faire un delete[] sur data, il faut aussi en faire un sur chaque data[i]. Ou alors, tu peux laisser ton destructeur ainsi si tu corrige le probl�me ci-dessous.
    • Quand tu construis la matrice, tu appelles new autant de fois que le nombre de lignes + 1. Ce n'est pas performant. Il vaut mieux allouer d'un coup un tableau de taille nbLignes x nbColonnes. Par exemple, tout coefficient (i, j) sera l'�l�ment num�ro i + j x nbLignes de ton tableau (si la num�rotation commence � 0). D'ailleurs, ce n'est qu'� cette condition que, dans ton destructeur, tu peux n'appeler qu'une seule fois delete[] sans provoquer de fuite m�moire.


    Il reste beaucoup � dire, mais je m'arr�te l� pour l'instant.

  4. #4
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut
    Citation Envoy� par dalfab Voir le message
    Bonjour,

    la table dist est cr��e comme [nbl][nbc] est est utilis�e comme une matrice carr�e [nbl][nbl].


    merci pour votre r�ponse, j'ai pas r�ussi a utiliser la matrice dist

  5. #5
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut
    Citation Envoy� par Pyramidev Voir le message
    Bonjour,

    Dans ton module d�finissant main(), data est une variable globale. Il n'en existe qu'une seule instance lors de l'ex�cution du programme. Tu l'utilises sans l'initialiser. C'est probablement ce qui a entra�n� le crash de ton programme.
    Dans ta classe Calcule, il y a un membre qui s'appelle data, mais le compilateur se moque qu'elle porte le m�me nom que ta variable globale, car elle n'a rien � voir. Au cours de l'ex�cution du programme, � chaque instant, il existe autant d'instances de Calcule::data que d'objets Calcule.

    A part �a, il y a aussi �norm�ment d'autres probl�mes dans ce code.
    En voici une liste incompl�te :
    • Ton code n'est pas indent�.
    • Tu devrais cr�er une classe qui s'appelle Matrice. Ensuite, ta fonction qui calcule une distance avec une autre matrice devrait prendre en param�tre un const Matrice & plut�t qu'un float**.
    • Ta fonction Calcule::Afficher a acc�s � une matrice � travers tes membres Calcule::nbl, Calcule::nbc et Calcule::data. Elle prend en compte les deux premiers mais ignore le 3e au profit d'un param�tre float ** mat. Ce n'est pas coh�rent.
    • Ta fonction Calcule::calcule_dis n'a aucun sens.
    • Ton destructeur Calcule::~Calcule ne lib�re pas correctement la m�moire. Avant de faire un delete[] sur data, il faut aussi en faire un sur chaque data[i]. Ou alors, tu peux laisser ton destructeur ainsi si tu corrige le probl�me ci-dessous.
    • Quand tu construis la matrice, tu appelles new autant de fois que le nombre de lignes + 1. Ce n'est pas performant. Il vaut mieux allouer d'un coup un tableau de taille nbLignes x nbColonnes. Par exemple, tout coefficient (i, j) sera l'�l�ment num�ro i + j x nbLignes de ton tableau (si la num�rotation commence � 0). D'ailleurs, ce n'est qu'� cette condition que, dans ton destructeur, tu peux n'appeler qu'une seule fois delete[] sans provoquer de fuite m�moire.


    Il reste beaucoup � dire, mais je m'arr�te l� pour l'instant.


    merci pour votre r�ponse , je suis une d�butante en c++

  6. #6
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par d�faut
    Salut!

    J'ajouterais que plut�t que faire des tableaux dynamiques � la C, utilise les std::vector, �a marche bien, et �a �vite 1) les new/delete, 2) les memory leaks en cas d'exception.
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  7. #7
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Je plussoie la r�ponse pr�c�dente, d'autant plus si tu es d�butante : Oublie les tableaux � la C, les pointeurs, les pointeurs de pointeurs... et utilise les vector, c'est plus simple, et plus robuste, et en g�n�ral, si tu compiles dans un mode debug, ils font des v�rifications suppl�mentaires qui te permettent de d�tecter tout un tas de petites erreurs b�tes, comme par exemple un d�bordement d'indice de tableau, et qui autrement sont tr�s difficiles � trouver.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  8. #8
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut
    Citation Envoy� par dragonjoker59 Voir le message
    Salut!

    J'ajouterais que plut�t que faire des tableaux dynamiques � la C, utilise les std::vector, �a marche bien, et �a �vite 1) les new/delete, 2) les memory leaks en cas d'exception.

    d'accord je vais essayer les vectors , merci

  9. #9
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    Je plussoie la r�ponse pr�c�dente, d'autant plus si tu es d�butante : Oublie les tableaux � la C, les pointeurs, les pointeurs de pointeurs... et utilise les vector, c'est plus simple, et plus robuste, et en g�n�ral, si tu compiles dans un mode debug, ils font des v�rifications suppl�mentaires qui te permettent de d�tecter tout un tas de petites erreurs b�tes, comme par exemple un d�bordement d'indice de tableau, et qui autrement sont tr�s difficiles � trouver.
    ok ! merci

  10. #10
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    @dragonjoker59 et JolyLoic :
    Oui, mais on ne sait pas si elle a d�j� vu en cours le cas o� un membre d'une classe est un objet (en l'occurrence un objet de type std::vector<float>) et pas un entier, bool�en, flottant ou pointeur.
    Sans parler du fait que std::vector est un template.

  11. #11
    Expert confirm�

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 033
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activit� : Software Developer
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 033
    Billets dans le blog
    12
    Par d�faut
    using FloatArray = std::vector< float >; // Et hop! N'a plus template!

    Et je ne vois pas en quoi le fait que le membre soit un objet plut�t qu'un type de base change quoi que ce soit...
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert � rien, mais qu'il est joli (des fois) : ProceduralGenerator (G�n�ration proc�durale d'images, et post-processing).

  12. #12
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Citation Envoy� par dragonjoker59 Voir le message
    Et je ne vois pas en quoi le fait que le membre soit un objet plut�t qu'un type de base change quoi que ce soit...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Matrice
    {
    public:
        Matrice(unsigned nbLignes, unsigned nbColonnes);
        ~Matrice();
        // ...
    private:
        unsigned           m_nbLignes;
        unsigned           m_nbColonnes;
        std::vector<float> m_data;
    };
    Ce qui change, c'est que le constructeur de m_data sera forc�ment appel� juste avant le corps du constructeur de Matrice et que le destructeur de m_data sera forc�ment appel� juste apr�s le corps du destructeur de Matrice.
    Pour faire du code que l'on comprend soit-m�me, cela demande un peu plus de connaissances qu'avec les types comme les entiers et les pointeurs.

  13. #13
    Membre habitu� Avatar de stotoro
    Femme Profil pro
    �tudiant
    Inscrit en
    Mars 2016
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Autre

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Mars 2016
    Messages : 12
    Par d�faut
    est ce que tout mon code est erron� !!!! il y'a pas de solution ?

  14. #14
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    Par d�faut
    Je pense que, dans ton cas, dans un premier temps, le plus important est que tu puisses analyser comment se comporte un bout de code C++ sur lequel du travailles.

    Par exemple, dans ton main, quand tu appelles :
    Voici comment se comporte l'appel de ta fonction :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    float Calcule::calcule_dis(float **data){
        // On a appelé C->calcule_dis(data)
        // Le paramètre formel "data" est une copie du paramètre effectif "data" (celui de "C->calcule_dis(data)")
        // qui est une variable globale du module qui définit "main()".
        // Comme cette variable globale n'était pas initialisée, elle contient une valeur indéterminée
        // et produira probablement un crash du programme.
     
        // A part ça, comme le paramètre formel de cette fonction s'appelle "data",
        // alors "data" ne correspond pas à "Calcule::data", mais au paramètre formel de la fonction.
     
        float ** dist = new float* [nbl];
        for (int i=0; i < nbl; i++)
            dist[i] = new float [ nbc ];
        // Dans les lignes ci-dessus, on crée une variable "dist" locale à cette fonction
        // qui n'a rien à voir avec la variable globale "dist" du module qui définit "main()".
        // On alloue nbl tableaux de taille nbc. "dist" représente alors une matrice.
     
        for( int i=0;i<nbl;i++ ){
            for (int j=0; j<nbl ; j++){
                for (int k=0; k <nbc; k++){
                    dist[i][j]=(float)pow(data[i][k]-data[j][k], 2 );
                    // La ligne ci-dessus suppose que dist a nbl lignes et nbl colonnes
                    // (faux : dist a nbc colonnes)
                    // et que data a nbl lignes et nbc colonnes.
                }
                // Dans la boucle ci-dessus, on écrit nbc fois dans dist[i][j], donc
                // c'est la dernière itération qui détermine la valeur de dist[i][j].
                // S'il n'y avait pas eu de crash, le code précédent équivalait à :
                // dist[i][j]=(float)pow(data[i][nbc-1]-data[j][nbc-1], 2 );
            }
        }
     
        for( int i=0;i<nbl;i++ ){
            for (int j=0; j<nbl ; j++){ 
                return dist[i][j]= sqrt(dist[i][j]);
                // A la première itération, on remplace dist[0][0] par sa racine carrée.
                // Ensuite, on retourne le contenu de dist[0][0].
                // Au final, c'est comme si on avait retourné
                // sqrt((float)pow(data[0][nbc-1]-data[0][nbc-1], 2 ))
                // c'est à dire 0.
                // Comme on a utilisé "return", les itérations suivantes ne seront jamais exécutées.
            }
        }
     
        // Le contenu de la matrice dist n'a pas été libéré donc, en plus, on a une fuite mémoire.
    }
    En apprenant les r�gles du C++ (du moins celles qui concernent les fonctionnalit�s du C++ que tu utilises) puis en t'entra�nant � ex�cuter pas � pas dans ta t�te le code que tu �cris, tu pourras corriger plein de probl�mes de mani�re autonome.
    �a demande surtout du temps et du travail. Bon courage.

  15. #15
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par Pyramidev Voir le message
    Ce qui change, c'est que le constructeur de m_data sera forc�ment appel� juste avant le corps du constructeur de Matrice et que le destructeur de m_data sera forc�ment appel� juste apr�s le corps du destructeur de Matrice.
    Et ? Qu'est-ce que �a apporte de fondamental � la compr�hension du code ? Tout ce qui compte, c'est que vector est un tableau � taille variable, et qu'il faut oublier les float[], reliques d'un temps r�volu. Comme toute donn�e membre d'une classe, sa dur�e de vie est la m�me que celle de la classe, pas besoin d'aller au del� pour l'utiliser � pleine puissance.

    Citation Envoy� par Pyramidev Voir le message
    Pour faire du code que l'on comprend soit-m�me, cela demande un peu plus de connaissances qu'avec les types comme les entiers et les pointeurs.
    �a d�pend de ce qu'on appelle comprendre. Si pour toi comprendre, c'est avoir une bonne vision de ce que le compilateur va g�n�rer comme code dans ton dos, certes, �a demande plus de boulot. Beaucoup plus. Et m�me comprendre comment marche une multiplication peut devenir non trivial dans ce contexte...

    Mais si c'est comprendre comment marche ton code, ton algorithme, comprendre que vector est un tableau de taille variable et que tu n'as pas � te pr�occuper d'autre chose, pas de soucis. Tu n'as m�me pas vraiment besoin de la notion de constructeur/destructeur ni m�me d'allocation m�moire pour utiliser pleinement vector en comprenant ce que tu fais.

    Apr�s, � un moment, ces notions deviendront n�cessaires pour progresser. Mais mon exp�rience est que la courbe d'apprentissage est plus douce, et le rapport r�compense/effort bien plus int�ressant quand tu commences � utiliser vector comme un type opaque "magique", et que tu ne soul�ves le capot que plus tard.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  16. #16
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    Citation Envoy� par Pyramidev Voir le message
    Ce qui change, c'est que le constructeur de m_data sera forc�ment appel� juste avant le corps du constructeur de Matrice et que le destructeur de m_data sera forc�ment appel� juste apr�s le corps du destructeur de Matrice.
    Et vu que ce constructeur et destructeur ne font pas grand chose qui nous int�resse, ne risquent pas de g�n�rer exception ou fuite m�moire : on s'en moque.
    Un d�butant, qu'il manipule un int, une string ou un vector, c'est kifkif.
    S'il commence � s'amuser � mettre des pointeurs dans son vector, on est d�j� une �tape au-dessus. Et encore, tu fous un vector de unique_ptr et basta : tu t'en soucies pas plus.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  17. #17
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    Apr�s avoir plussot� � certains, je ne peux m'emp�cher d'intervenir pour confirmer ce qu'ils ont d�j� dit : la gestion manuelle de la m�moire (� coup de new et de delete) N'EST PAS UNE NOTION ADAPTEE AUX DEBUTANTS.

    Et, les non d�butants pr�f�reront toujours ou bien carr�ment �viter d'y avoir recours, ou bien utiliser des techniques (pointeurs intellegents entre autres) qui permettront d'�viter ou de contourner la plupart des probl�mes que ce ph�nom�ne peut occasionner.

    La classe std::vector (et bien d'autres) nous permettent de prendre en charge tout l'aspect relatif � la gestion dynamique de la m�moire sans que le d�veloppeur n'ait � s'en inqui�ter; et mieux encore : ces classes s'en occupent particuli�rement bien.

    Tant que l'on a la garantie que std::vector correspond � la notion "tableau de donn�es" et que ces donn�es sont bel et bien contig�es en m�moire, il n'est ABSOLUMENT PAS NECESSAIRE d'aller plus loin dans la compr�hension (du moins au d�but). Et il se fait que l'on a cette garantie, que la classe vector est, justement, une collection dont le fonctionnement est pr�vu pour garantir la contigu�t� des donn�es en m�moire.

    Je ne nie, bien sur, absolument pas tout l'aspect formateur qu'il peut y avoir � s'int�resser � la gestion de la m�moire, mais, je rejoins pleinement jolyloic pour dire que cet aspect particulier ne devrait �tre abord� qu'une fois que l'�tudiant a atteint un certain niveau, qu'il a acquis un minimum de bouteille pour se rendre compte de tous les pi�ges qu'il peut y avoir � l'utiliser, et, surtout, pour qu'il ne commence � l'utiliser que lorsqu'il n'a d�finitivement pas d'autre choix, et, tant qu'� faire, qu'il apprenne � y avoir recours en s'entourant des pr�cautions susceptibles d'�viter les catastrophes (encore une fois, je parle des pointeurs intelligents).
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

Discussions similaires

  1. [POO] PHP5 : Probl�me avec les classes
    Par fleur_de_rose dans le forum Langage
    R�ponses: 9
    Dernier message: 06/05/2006, 19h09
  2. [POO] Problème avec les classes
    Par peypey dans le forum Langage
    R�ponses: 8
    Dernier message: 03/05/2006, 15h05
  3. R�ponses: 3
    Dernier message: 18/04/2006, 22h49
  4. R�ponses: 3
    Dernier message: 30/08/2005, 12h25
  5. R�ponses: 7
    Dernier message: 05/10/2004, 13h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo