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

  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,
    [/CODE]
    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
    7
     
      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
    6
     
    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); 
    		}
    e 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
    12
     
    		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
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    [QUOTE=Mikolay]

    - On préfére cette facon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float **travail.point_utilisateur;
     
    travail.point_utilisateur = malloc(sizeof(*(travail.point_utilisateur))*n);
    for (i = 0; i < n; ++i) {
     	travail.point_utilisateur[i] = malloc(sizeof(**(travail.point_utilisateur))*2);
    }
    - Ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    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); 
    		}
    Est-ce normale que ta 1ère dimension soit allouée utilisant k ? Je pense que cela doit être n ...

    - Où sont les tests des retours des malloc ?

    - Enfin, inverse tes boucles, ce n'est pas bon de parcourir par colonne surtout qu'il n'y a pas de dépendances qui t'oblige à faire cet ordre de parcours.

    Jc

  3. #3
    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
    La 1er dimension de travail.points_Clusters doit bien être k (l'utilisateur doit rentrer K points ou chacun des points comprend 2 parametres)

    Etant débutant dans la construction dynamaique de tableau, je ne sais pas tester le retour des mallocs ? . J'ai juste verfié pour chaque tableau dynamique construit que je pouvais attribuer une valeur, comme à travail.points_Clusters[k-1][0] , ce qui marcha puisque je n'ai eu aucun crash du programme (et le printf mis juste aprés me donna la valeur que j'avais entré)

    Dans ta derniere suggestion, il est mieux de parcourir les lignes d'abord si je te comprend bien?

    Merci de ta réponse

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    d'abord, quand tu fais des calculs, il est beaucoup mieux de prendre des doubles, pour 2 raisons :

    1) le type utilisé par C est double.. Quand tu appelles une fonction, le compilateur fait automatiquement le cast en double, et le refait en sens inverse à la sortie.. D'où
    a) travail inutile
    b) erreurs (stockages différents)

    2) les fonctions de maths (sqrt) utilisent des doubles.

    Ici le plus important est le point 1-b.

    Transforme en double....

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par fearyourself
    - On préfére cette facon de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float **travail.point_utilisateur;
     
    travail.point_utilisateur = malloc(sizeof(*(travail.point_utilisateur))*n);
    for (i = 0; i < n; ++i) {
     	travail.point_utilisateur[i] = malloc(sizeof(**(travail.point_utilisateur))*2);
    }
    La syntaxe de déclaration de travail.point_utilisateur correspond-t'elle vraiment à une sytaxe valide en C? De quel type est travail et quelle est la définition de ce type?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par mujigka
    La syntaxe de déclaration de travail.point_utilisateur correspond-t'elle vraiment à une sytaxe valide en C? De quel type est travail et quelle est la définition de ce type?

    Thierry
    Je pense que Mikolay donnait le type seulement, cela doit être une variable dans une structure...

    Jc

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