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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 875
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 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

  4. #4
    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.

  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 : 50
    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 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

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

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. [Eclipse] [VE] Créer des menus avec les classes SWT de VE
    Par jbcorens dans le forum SWT/JFace
    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