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 :

Probléme de mémoire


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2007
    Messages : 22
    Par défaut Probléme de mémoire
    Bonjour à tous,

    J'ai créer une fonction trés banale permettant de calculer la distance entre 2 points:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    float calcul_distance(int a, int b, float **tableau, float **tableau_cluster) {
     
    	float d,abs,ord;
     
    	abs = (tableau[a][0] - tableau_cluster[b][0]);
    	ord = (tableau[a][1] - tableau_cluster[b][1]);
     
    	printf("\n %.1f, %.1f",abs,ord);
     
    	d = sqrt(carre(abs) + carre(ord));
    	return d;
    }

    Le 3eme et 4eme parametres sont deux tableaux dynamiques de dimension 2 déterminées dans la fonction main.
    Le probléme est que lorsque j'arrive dans la fonction, ces deux tableaux ne sont plus connus, ce qui me donne un Segfault et je ne comprend pas pourquoi.

    Même si je n'ai aucun doute sur la déclaration dynamique de mes deux tableaux, je prefere afficher ce que j'ai fait, on ne sait jamais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      float **travail.point_utilisateur;
     
    travail.point_utilisateur = malloc(sizeof(float*)*n);
    	 for (i = 0; i < n; ++i) {
    	 	travail.point_utilisateur[i] = malloc(sizeof(float)*2);
                  }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float **travail.points_Clusters ;
    travail.points_Clusters = malloc(sizeof(float*)*k);
    		 for (i = 0; i < n; ++i) {
    	 		travail.points_Clusters[i] = malloc(sizeof(float)*2); 
    		}
    et l'appel de ma fonction est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    		travail.distance = malloc(sizeof(float*)*n);
    		 for (i = 0; i < n; ++i) {
    	 		travail.distance[i] = malloc(sizeof(float)*k);
    		}
     
    		for (u=0;u<k;u++) {
    			for (v=0;v<n;v++) {
    				travail.distance[v][u] = calcul_distance(v,u,travail.point_utilisateur,travail.points_Clusters);
    				printf("\nDistance du point %d au Cluster %d  = %.1f",v+1,u+1,travail.distance[v][u]);
    			}
    		}

    Merci pour votre aide.

  2. #2
    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
    Ton code n'a pas l'air d'être du C++. Je ne parle pas seulement du style lui même (qui n'a rien de C++-èsque), mais ici même en terme de légalité du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     float **travail.point_utilisateur;  // Je prend cette ligne comme un commentaire
    // nous indiquant des choses, car elle ne constitue
    // un code correct ni en C, ni en C++.
     
    travail.point_utilisateur = malloc(sizeof(float*)*n);
    malloc retourne un void*, sans cast explicite, il n'est pas convertible en float**.

    Peut-être trouveras-tu donc plus d'informations dans le forum C ?
    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.

  3. #3
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Oui c'est clair...

    Pour une distance entre deux points, voici à quoi ressemblerai un code C++:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    float dist(const std::pair <int, int>& H, const std::pair <int, int>& point)
    {
    	float val =static_cast<float>( (((H.first - point.first)*(H.first - point.first) + (H.second - point.second)*(H.second - point.second))) );
    	return std::sqrt(val);
    }

Discussions similaires

  1. [WORD]Problème de mémoire
    Par Dnx dans le forum VBA Word
    Réponses: 17
    Dernier message: 05/10/2005, 14h48
  2. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57
  3. [Crystal Report]Problème de mémoire avec le moteur RDC
    Par sur_uix dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 26/05/2005, 09h09
  4. Problème de mémoire avec BDE
    Par Machuet dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 10h11
  5. Problème de mémoire Affichage images
    Par Repti dans le forum C++Builder
    Réponses: 6
    Dernier message: 29/03/2004, 20h06

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