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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 dans mon programme. Ell vient de 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
     
    float * RaisedCosineSQRT(float nb_periodes,float nb_points,float roll_off)
    {
     
    /*------déclaration et initialisation des variables------*/
     int i,n;
     float t;
     float N=nb_periodes;
     float D=nb_points;
     float e=roll_off;
     float *w=NULL;
     float racineD,x,oneplus,oneminus,den; 
     
     w=(float *)malloc(sizeof(float) * (N*D)); /*Allocation en mémoire*/
     
     racineD = sqrt(D);
     
     for(i=0;i<N*D;i++)	  
      { w[i]=0;              /*vecteur de 0*/
      }
     
     for(n=0;N*D;n++)
    { t=n-N*D/2-1;
       if(t==0)
        {
         w[n]=(4*e/3.1416+1-e)/ racineD;
        }
       x=t/D; 
       if(e==0)
        {
         w[n]=racineD*sin(3.1416*x)/(3.1416*t);
        }
       oneplus=(1.0+e)*3.1416/D;
       oneminus=(1.0-e)*3.1416/D;
     
       den=t*t*16*e*e-D*D;
       if(den==0)
       { 
        w[n]=(D*racineD/(8*e*3.1416*t))*(oneplus*sin(oneplus*t)-(oneminus*D/(4*e*t))*cos(oneminus*t)+(D/(4*e*t*t))*sin(oneminus*t));
       }
       w[n]=(4*e/(3.1416*racineD))*(cos(oneplus*t)+sin(oneminus*t)/(x*4*e))/(1.0-16*e*e*x*x);
     
     }
     
      for(i=0;i<N*D;i++)	  
      { printf("\nw[i]=%f",w[i]);              /*vecteur de 0*/
      }
     
      return(w);
    }

    Si quelqu'un pouvait m'aider. Merci.

  2. #2
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Au fait, "double" est le type naturel pour faire des calculs, pas "float"

  4. #4
    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
    Il n'y a plus d'erreur de segmentation. Cepedant, j'ai un sousis lorsque N=16. En effet, dans le résultat j'ai 'nan' au lieu d'avoir la valeur 0.3825. Lorsque N=16, t=0,je ne comprens pourquoi j'ai 'nan' alors qu'on rentre bien dans la boucle if(t==0.00)

    Si quelqu'un pouvait m'aider. Merci.

  5. #5
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Si j'ai bien suivi JMB, si N*D correspond à un entier qui est grand, alors tu risques d'avoir des problemes lorsque tu testes "i < N*D"
    Enfin ça depend si c'est "i" qui est casté en float ou N*D qui est casté en int... ça chais pas

  6. #6
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Gruik
    Enfin ça depend si c'est "i" qui est casté en float ou N*D qui est casté en int... ça chais pas
    Normalement, i est casté en float.

  7. #7
    Membre chevronné
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Par défaut
    Hello,

    Citation Envoyé par sandball22
    Il n'y a plus d'erreur de segmentation. Cepedant, j'ai un sousis lorsque N=16. En effet, dans le résultat j'ai 'nan' au lieu d'avoir la valeur 0.3825. Lorsque N=16, t=0,je ne comprens pourquoi j'ai 'nan' alors qu'on rentre bien dans la boucle if(t==0.00)

    Si quelqu'un pouvait m'aider. Merci.
    Pourquoi tes variables N, D et t sont-elles typées en float ? Je ne pense pas que tu traites des demi-périodes et encore moins des demi-points (ca ressemble à un filtre de Nyquist utilisé en télécoms). Il faut donc utiliser des entiers en lieu et place.

    Tu ne rentres pas dans une boucle mais dans un bloc d'expression conditionnelle avec ton if (t==0.0), façon affreuse et très mauvaise de comparer 2 flottants. Mais de toute façon ton t doit être un entier.

    Ton t peut valoir 0, il y a donc des divisons par zéro dans ton code à corriger.

    A+

  8. #8
    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 sandball22
    Il n'y a plus d'erreur de segmentation. Cepedant, j'ai un sousis lorsque N=16. En effet, dans le résultat j'ai 'nan' au lieu d'avoir la valeur 0.3825. Lorsque N=16, t=0,je ne comprens pourquoi j'ai 'nan' alors qu'on rentre bien dans la boucle if(t==0.00)
    on ne peut pas utiliser == avec les flottants (quoique que pour 0., ça devrait aller).

  9. #9
    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 sandball22
    Bonjour, j'ai une erreur de segmentation dans mon programme. Ell vient de la fonction suivante:
    Ca fout la trouille ...
    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
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `RaisedCosineSQRT':
    main.c:11: error: `NULL' undeclared (first use in this function)
    main.c:11: error: (Each undeclared identifier is reported only once
    main.c:11: error: for each function it appears in.)
    main.c:14: warning: implicit declaration of function `malloc'
    main.c:16: warning: implicit declaration of function `sqrt'
    main.c:31: warning: implicit declaration of function `sin'
    main.c:39: warning: implicit declaration of function `cos'
    main.c:46: warning: implicit declaration of function `printf'
    Process terminated with status 1 (0 minutes, 4 seconds)
    3 errors, 5 warnings
    On pourrait avoir la version qui compile ?

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

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