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 :

Re: dépassement de mémoire


Sujet :

C

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut Re: dépassement de mémoire
    Bon, j'ai toujours un pb de dépassement de mémoire, voici mon pb:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Matrice C, cm;
    ...
    C = Mat_Vandermonde (NL, &zm);
    cm = Mat_pseudoinvMat(C);
     
    	libererMatrice(C);
    	libererMatrice(Rm);
    	libererMatrice(cm);
    	libererMatrice(c);
    ...
    fin
    et les fonctions:

    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
     
    static Matrice allouerMatrice (int l, int c)
    {
       Matrice A = (Matrice)malloc (sizeof *A);
       A->n = l;
       A->m = c;
       A->P = (COMPLEX**)malloc (l * sizeof *A->P);
       {
          int i;
          for (i = 0; i < l; i++)
          {
             A->P[i] = (COMPLEX *)malloc (c * sizeof *A->P[i]);
          }
       }
       return A;
    } 
     
    void libererMatrice (Matrice A)
    {
       if (A != NULL)
       {
          if (A->P != NULL)
          {
             int i;
             for (i = 0; i < A->n; i++)
             {
                free (A->P[i]);
             }
          }
          free (A->P);
       }
       free (A);
    } 
    Matrice Mat_Vandermonde (int Mat_length, P_COMPLEX zm)
    {
    // D = [zm^n conj(zm)^n] , n=[0;NL-1]' 
    int i;
    COMPLEX zm_puiss;
    COMPLEX zm_conj_puiss;
    Matrice D;
     
    D=allouerMatrice(NL,2);
     
    	for (i = 0; i <= (Mat_length - 1); i++)
    	{
    		PuissComplex(&zm_puiss,zm,i);
    		ConjComplex(&zm_conj_puiss,zm);
    		PuissComplex(&zm_conj_puiss,&zm_conj_puiss,i);
    		//SetComplex(&C[i][0],zm_puiss.re,zm_puiss.im);
    		//SetComplex(&C[i][1],zm_conj_puiss.re,zm_conj_puiss.im);
    		D->P[i][0] = zm_puiss;
    		D->P[i][1] = zm_conj_puiss;
     
    	}
    	return D;
    	libererMatrice(D);
    }
    Matrice Mat_pseudoinvMat(Matrice A){/*renvoie la matrice pseudoinverse de A*/
         Matrice t_A,pseudoinv_A, dot_t_AA, inv_dot_t_AA;
         t_A = Mat_transpose(A);
    	 dot_t_AA = Mat_dot(t_A,A);
    	 inv_dot_t_AA = Mat_invMat(dot_t_AA);
         pseudoinv_A=Mat_dot(inv_dot_t_AA,t_A);
         return pseudoinv_A;
    	 libererMatrice(t_A);
    	 libererMatrice(dot_t_AA);
    	 libererMatrice(inv_dot_t_AA);
    	 libererMatrice(pseudoinv_A);
     
     }
    les fonctions Mat_transpose(A), Mat_dot(t_A,A), Mat_invMat(dot_t_AA) procèdent comme Mat_pseudoinvMat(Matrice A), j'alloue de la place pour chaque matrice que je libère à la fin de la fonction et après appel de celles-ci!... Pour les fonction contenant le mot complex, il n'y a pas de malloc.

    Mon pb donc se situe je pense fortement au niveau de la libération de mémoire, j'ai vérifié et pense libérer pourtant toute les matrices pour lesquelles j'ai atribué de la mémoire, je ne comprend pas, j'ai un dépassement de mémoire lors de l'execution du code qui compile bien.

  2. #2
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Si tu ne donnes pas tout le code, on auras du mal à répondre correctement...

    Bon, j'ai toujours un pb de dépassement de mémoire, voici mon pb:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Matrice C, cm;
    ...
    C = Mat_Vandermonde (NL, &zm);
    cm = Mat_pseudoinvMat(C);
     
       libererMatrice(C);
       libererMatrice(Rm);
       libererMatrice(cm);
       libererMatrice(c);
    ...
    fin
    A quel endroit, cela plante... Comment Rm, NL, zm et c ont-ils été allouées? Quel appel de libererMatrice fait un "segmentation fault"?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    Si tu ne donnes pas tout le code, on auras du mal à répondre correctement...
    Le code est trop long, j'ai mis l'essentiel pour comprendre.

    A quel endroit, cela plante... Comment Rm, NL, zm et c ont-ils été allouées? Quel appel de libererMatrice fait un "segmentation fault"?
    on peut enlever:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       libererMatrice(Rm);
       libererMatrice(c);
    zm n'est pas alloué, c'est un double *;

    Mon pb se situe surement au niveau de matrices qui ne sont pas libérée mais je ne comprend pas où?

    Merci à l'intrépide.

  4. #4
    Expert éminent sénior

    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 : 43
    Localisation : Etats-Unis

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

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Utilise un debugger pour voir où il plante ou fais:

    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
     
     
    printf("1\n");
    C = Mat_Vandermonde (NL, &zm);
    printf("2\n");
    cm = Mat_pseudoinvMat(C);
    printf("3\n");
       libererMatrice(C);
    printf("4\n");
       libererMatrice(Rm);
    printf("5\n");
       libererMatrice(cm);
    printf("6\n");
       libererMatrice(c); 
    printf("7\n");
    Il affiche quoi comme nombre?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    Il ne plante pas, ça tourne mais au bout d'un certain temps j'ai un message d'erreur comme quoi il m manque de mémoire vive.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    L'erreur venait du fait que la fonction llibererMatrice n'était pas executée après un return:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    return D;
    libererMatrice(D);

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par petdelascar
    L'erreur venait du fait que la fonction llibererMatrice n'était pas executée après un return:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    return D;
    libererMatrice(D);
    J'avais déjà corrigé ça, et tu l'avais même remarqué...

    http://www.developpez.net/forums/vie...417957#2417957
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Points : 83
    Points
    83
    Par défaut
    J'avais déjà corrigé ça, et tu l'avais même remarqué...
    J'avais pas compris que libererMatrice(D); n'était pas prise en compte à cause du return qui le précédait. Je pensait que tu l'avais déplacé pour libérer
    la matrice affectée par ce que retournait la fonction. Enfin bref, ça marche maintenant, j'ai compris mon erreur, et grace à toi, merci beaucoup, vraiment! Tu vaux ton grade de VIP même si ça fait con!

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par petdelascar
    Tu vaux ton grade de VIP même si ça fait con!
    Je n'ai rien demandé !
    Pas de Wi-Fi à la maison : CPL

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 13/11/2008, 23h15
  2. Dépassement de mémoire pour liste liées
    Par jpascal dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 03/04/2008, 21h37
  3. Réponses: 6
    Dernier message: 13/12/2007, 19h18
  4. dépassement de mémoire
    Par petdelascar dans le forum C
    Réponses: 5
    Dernier message: 05/12/2005, 15h13
  5. Qu'est-ce que "le dépassement de mémoire tampon"
    Par allex2108 dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 13/09/2005, 14h33

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