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 :

Erreur de segmentation


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut Erreur de segmentation
    Bonjour, j'ai une erreur de segmentation. Je pense avoir identifié où elle se trouve.
    Elle se trouve dans la fonction suivante:

    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
     
    void FrequencyTransposition(double *signal_reel, float tk, int N)
    {
      int i;
      float fp;
     
       double signal_re[N];
      double cosinus[N];
      double sinus[N];
      double signal_re_transpose[N];
      double signal_im_transpose[N];
     
     
     
     
      FILE * FicSortie;
      printf("\nN=%d",N);
      printf("\ntk=%f",tk);
     
      for(i=0;i<N;i++)
      { 
    	signal_re[i]=signal_reel[i];      /*Récupération du signal partie réelle*/ 
      }	
     
     
      printf("\n\nFréquence de la porteuse en MHz :");   
      scanf("%f",&fp);
     
      printf("\n\nSignal partie réelle transposé par une porteuse de %lf MHz :",fp);       
     
    /*Partie reelle*/
      for(i=0;i<N;i++)
      {
       cosinus[i] = cos(2*3.1416*fp*i*tk);                      
    	signal_re_transpose[i]=signal_re[i]*cosinus[i];            /*Multiplication du signal reel par cos(2*pi*fp*tk)*/
     }
     
     
    /*Partie imaginaire*/
     for(i=0;i<N;i++)
      {
        sinus[i] = sin(2*3.1416*fp*i*tk);                      
    	signal_im_transpose[i]=signal_re[i]*sinus[i];            /*Multiplication du signal  par sin(2*pi*fp*tk)*/
     }
     
     
     
     
     
     
     
     
    FicSortie= fopen("F:/Users/garnier/Matlab/imag.txt","w");
     
     for (i=0;i<N;++i)
     {fprintf(FicSortie,"%lf\n ",signal_im_transpose[i]); 
      }
     fclose(FicSortie);
     
     
    FicSortie= fopen("F:/Users/garnier/Matlab/reel.txt","w");
     
     for (i=0;i<N;++i)
     {fprintf(FicSortie,"%lf\n ",signal_re_transpose[i]); 
      printf(" %lf ",signal_re_transpose[i]);
     }
     fclose(FicSortie);
     
      return;
    }
    Pouvez-vous m'aidez merci.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    Es tu sur que signal_reel a été alloué et si oui que ton N n'est pas trop grand et donc va taper a une mauvaise adresse

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Je ne sais pas. Comment peut-on le savoir?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    ca n'arrangera pas ton probleme mais pour faire une copie de chaine tu peux utiliser la fonction :
    char *strncpy (char *dest, const char *src, size_t n);
    char* est un pointeur vers ta chaine dest

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2007
    Messages : 62
    Par défaut
    au lieu d'utiliser un N fait un strlen() pour obtenir la taille et vérifie avant l('appel a la fonction que tu as alloué de la memoire chaine = (char*) malloc ( N*sizeof(char) )
    ou bien initalisé comme tableau chaine[N]
    tu peux utilisé un boolean lors de ton initialisation des qu'il est initilisé tu le passes a true et dans ta fonction tu test si c a true

  6. #6
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par sandball22
    Bonjour, j'ai une erreur de segmentation. Je pense avoir identifié où elle se trouve.
    Elle se trouve dans la fonction suivante:

    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
     
    FicSortie= fopen("F:/Users/garnier/Matlab/imag.txt","w");
     
     for (i=0;i<N;++i)
     {fprintf(FicSortie,"%lf\n ",signal_im_transpose[i]); 
      }
     fclose(FicSortie);
     
     
    FicSortie= fopen("F:/Users/garnier/Matlab/reel.txt","w");
     
     for (i=0;i<N;++i)
     {fprintf(FicSortie,"%lf\n ",signal_re_transpose[i]); 
      printf(" %lf ",signal_re_transpose[i]);
     }
     fclose(FicSortie);
    Pouvez-vous m'aidez merci.
    La fonction fopen peut planter. Il faut toujours vérifier son retour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        if ((ptr_file = fopen("nomFichier","w")) == NULL)
        {
            fprintf(stderr,"Impossible d'ouvrir le fichier !!!\n");
            exit(EXIT_FAILURE);
        }

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    Cela ne vient pas de la fonction fopen car je l'ai mise en commentaire.

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 342
    Par défaut
    J'ai fait des modifs dans mon code. Cela marche mieus mais quand j'augmente tk et N il y a toujours des erreurs de segmentation mais à des valeurs supérieurs ç celles ou cela ne fonctionnait pas.

    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
     
    void FrequencyTransposition(double *signal, float tk, int N)
    {
      int i;
      float fp;
     
    //  double signal_re[N];
      double signal_re_transpose[N];
      double signal_im_transpose[N];
     
     
     
     
    //  FILE * FicSortie;
      printf("\nN=%d",N);
      printf("\ntk=%f",tk);
     
    //  for(i=0;i<N;i++)
    //  { 
    //	signal_re[i]=signal_reel[i];      /*Récupération du signal partie réelle*/ 
    //  }	
     
     
      printf("\n\nFréquence de la porteuse en MHz :");   
      scanf("%f",&fp);
     
      printf("\n\nSignal partie réelle transposé par une porteuse de %lf MHz :",fp);       
     
    /*Partie reelle*/
      for(i=0;i<N;i++)
      {
      // cosinus[i] = cos(2*3.1416*fp*i*tk);                      
    	signal_re_transpose[i]=signal[i]*cos(2*3.1416*fp*i*tk);            /*Multiplication du signal reel par cos(2*pi*fp*tk)*/
     }
     
     
    /*Partie imaginaire*/
     for(i=0;i<N;i++)
      {
       // sinus[i] = sin(2*3.1416*fp*i*tk);                      
    	signal_im_transpose[i]=signal[i]*sin(2*3.1416*fp*i*tk);            /*Multiplication du signal  par sin(2*pi*fp*tk)*/
     }
     
     
     
     
     
     
    //  printf("\n\nSignal partie imaginaire transposé par une porteuse de %f MHz :",fp);        
    //  for(i=0;i<N;i++)
    //  {
    //    sinus[i] = sin(2*3.1416*fp*i*tk);    
    //	signal_im_transpose[i]=signal_im[i]*sinus[i];              /*Multiplication du signal imaginaire par sin(2*pi*fp*tk)*/
    //	printf("\n%d  %f ",i+1,signal_im_transpose[i]);	
    //  }
     
     
    //FicSortie= fopen("F:/Users/garnier/Matlab/imag.txt","w");
    //  
    // for (i=0;i<N;++i)
    // {fprintf(FicSortie,"%lf\n ",signal_im_transpose[i]); 
    //  }
    // fclose(FicSortie);
     
     
    //FicSortie= fopen("F:/Users/garnier/Matlab/reel.txt","w");
     
    // for (i=0;i<N;++i)
    // {fprintf(FicSortie,"%lf\n ",signal_re_transpose[i]); 
    //  printf(" %lf ",signal_re_transpose[i]);
    // }
    // fclose(FicSortie);
     
      return;
    }

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    410
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 410
    Par défaut
    question, ça marche ça en c99?

  10. #10
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par reptils
    question, ça marche ça en c99?
    Oui, c'est ce qui est appele Variable Length Array (VLA). Par contre ce n'est pas forcement correctement supporte par tout les compilateurs (aux dernieres nouvelles l'implementation des VLA de gcc n'est pas encore conforme)

  11. #11
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Tu pourrais peut-être envisager de remplacer la portion de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      double signal_re_transpose[N];
      double signal_im_transpose[N];
    par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      double * signal_re_transpose;
      double * signal_im_transpose;
      signal_re_transpose = malloc(N*sizeof(double));
      signal_im_transpose = malloc(N*sizeof(double));
    (pense à faire des free en fin d'exécution aussi)

    Je trouve ça déjà plus propre.


    Autre chose : es-tu certain que le la taille du contenu pointé par signal est toujours égale à N ?

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'ai fait des modifs dans mon code. Cela marche mieus mais quand j'augmente tk et N il y a toujours des erreurs de segmentation mais à des valeurs supérieurs ç celles ou cela ne fonctionnait pas
    Le problème peut venir de ces déclarations:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      double signal_re_transpose[N];
      double signal_im_transpose[N];
    qui réserve sur la pile 2N*sizeof(double) donc probablement qq chose comme 16*N octets. Or la place disponible sur la pile est limitée et pour des valeurs élevées de N le programme plantera.
    La solution est alors de créer ces variables sur le tas, c'est à dire par malloc comme suggéré par TheGzD

  13. #13
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Et si tu utilisais un debuggeur non ?

    Lui il te dirait où exactement ça plante.

    C'est bien plus pratique que des suppositions.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 131
    Par défaut
    Citation Envoyé par TheGzD
    Tu pourrais peut-être envisager de remplacer la portion de code suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      double signal_re_transpose[N];
      double signal_im_transpose[N];
    par celle-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      double * signal_re_transpose;
      double * signal_im_transpose;
      signal_re_transpose = malloc(N*sizeof(double));
      signal_im_transpose = malloc(N*sizeof(double));
    (pense à faire des free en fin d'exécution aussi)

    Je trouve ça déjà plus propre.


    Autre chose : es-tu certain que le la taille du contenu pointé par signal est toujours égale à N ?

    je ne vois pas en quoi un malloc est plus propore vu qu il connait deja la taille des tableaux

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par berg
    je ne vois pas en quoi un malloc est plus propore vu qu il connait deja la taille des tableaux
    Simple question de bon sens.

    Parce que la ressource 'mémoire automatique' est bien plus limitée que la ressource 'mémoire allouée'.

    De plus, la mémoire allouée est contrôlée. Si il a échec, on est prévenu (NULL). Avec la mémoire automatique, c'est l'inconnu...

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    De plus, la mémoire allouée est contrôlée. Si il a échec, on est prévenu (NULL). Avec la mémoire automatique, c'est l'inconnu...
    C'est d'ailleur, a mon avis, le principal defaut des VLA ce manque de controle sur le resultat de la reservation.

    Quoiqu'avec les gestionnaires de memoire "optimiste" qui, pour gagner du temps lors de l'allocation et considerant que la memoire n'est plus une ressource limitee, fournisse toujours une adresse valide et alloue reelement la memoire au moment de l'utilisation (avec les risques que ca comporte si il n'y a plus de memoire disponible a ce moment la) on peut avoir le meme manque de controle avec la memoire allouee.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gl
    Quoiqu'avec les gestionnaires de memoire "optimiste" qui, pour gagner du temps lors de l'allocation et considerant que la emoire n'est plus une ressource limitee, fournisse toujours une adresse valide et alloue reelement la memoire au moment de l'utilisation (avec les risques que ca comporte si il n'y a plus de memoire disponible a ce moment la) on peut avoir le meme manque de controle avec la memoire allouee.
    Oui, mais c'est alors un problème de système, pas de C. Ca doit pouvoir se configurer...

  18. #18
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Oui, mais c'est alors un problème de système, pas de C.
    Tout a fait.

Discussions similaires

  1. Erreurs de segmentation !
    Par anti-conformiste dans le forum Applications et environnements graphiques
    Réponses: 16
    Dernier message: 18/10/2005, 11h11
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

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