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 :

probleme segmentation fault


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut probleme segmentation fault
    bonjour je debute dans le C, et je sollicite votre aide car je n'arrive pas a resoudre un probleme depuis quelques temps.
    Lorsque je compile le programe suivant ca marche mais quand je l'execute il me retourne un segmentation fault
    Et ceci m'arrive seulement quand je rajoute la fonction tracer_graphique sans celle la le programme marche.
    merci d'avance

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    #include <stdio.h>
    #include <TPInfo/hasard.h>          
    #include <math.h>
    #include <unistd.h>
    #include <TPInfo/graphisme.h>
     
    void generer_tableau_entiers_aleatoire(int tab[],int nbre_elements,int borne_min,int borne_max)
    {
    int i;
    for (i=0;i<nbre_elements;i++)
       tab[i]=entier_aleatoire(borne_min,borne_max);
    }
     
     
    void afficher_tableau_entiers(int tab[],int nbre_elements)
    {
    int i;
    for (i=0;i<nbre_elements;i++)
       {printf("%d | ",tab[i]);}                                                  /*ajout des crochets pour mettre l'instruction revenir a la ligne ensuite*/
    printf("\n");
    }
     
     
    void minimum_tableau_entiers(int tab[],int nbre_elements)
    {
    int i,min=tab[0];
    for (i=0;i<nbre_elements;i++)
       if (min>tab[i])
         min=tab[i];
    printf("minimum du tableau = %d\n",min);
    }
     
     
    void maximum_tableau_entiers(int tab[],int nbre_elements)
    {
    int i,max=tab[0];
    for (i=0;i<nbre_elements;i++)
       if (max<tab[i])
         max=tab[i];
    printf("maximum du tableau = %d\n",max);
    }
     
     
    void echanger(int *a,int *b)
    {
    int c;
    c=*a;
    *a=*b;
    *b=c;
    }
     
     
    void trier_tableau_entiers(int tab[],int nbre_elements)
    {
    int i,j;
    for (j=0;j<nbre_elements;j++)
      for (i=0;i<nbre_elements-1;i++)
      {
      if (tab[i]>tab[i+1])
        echanger(&tab[i],&tab[i+1]);
      }
    }
     
     
    void tracer_graphique(int borne_max,int nbre_elements,int tab[],int borne_min)
    {
     int i;
     double xmin=0, xmax=nbre_elements;
     double ymin=borne_min, ymax=borne_max;
     int vert;
     vert=makecol(0,255,0);
     for(i=0;i<nbre_elements;i++)
       tracer_point(i,tab[i],vert,xmin,xmax,ymin,ymax);
    }
     
     
    int main(void)
    {
    int i,nbre_elements,borne_min,borne_max,tab[i];
    int hauteur,largeur;
    hauteur=400;
    largeur=500;
    printf("nbre elements???\n");
    scanf("%d",&nbre_elements);
    printf("borne min???\n");
    scanf("%d",&borne_min);
    printf("borne max???\n");
    scanf("%d",&borne_max);
    generer_tableau_entiers_aleatoire(tab,nbre_elements,borne_min,borne_max);
    afficher_tableau_entiers(tab,nbre_elements);
    ouvrir_fenetre_graphique(largeur,hauteur);
    tracer_graphique(borne_max,nbre_elements,tab,borne_min);
    sleep(10);
    trier_tableau_entiers(tab,nbre_elements);
    printf("nouveau tableau\n");
    afficher_tableau_entiers(tab,nbre_elements);
    minimum_tableau_entiers(tab,nbre_elements);
    maximum_tableau_entiers(tab,nbre_elements);
    fermer_fenetre_graphique();
    return 0;
    }
     
    END_OF_MAIN();

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int i,nbre_elements,borne_min,borne_max,tab[i];
    Bon déjà, déclarer un tableau en static, c'est toujours dangeureux, mieux vaut prendre ses précautions et le déclarer en dynamique avec des "malloc", mais bon passons.

    Dans la même ligne, tu déclares i (sans l'initialisé) puis un tableau de "i" entiers...
    Petite question à deux balles : Quel est la taille du tableau ?

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    la taille du tableau est definie par nbre_elements.
    il faut que je mette i=nbre_elements dans la fonction main??

  4. #4
    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 newbee33
    la taille du tableau est definie par nbre_elements.
    il faut que je mette i=nbre_elements dans la fonction main??
    Je crois surtout qu'il faut que tu apprennes les bases du C avant de te lancer dans un projet aussi complexe...

    et puis le code incomplet, on en veut 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
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums2\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:2:27: TPInfo/hasard.h: No such file or directory
    main.c:5:30: TPInfo/graphisme.h: No such file or directory
    main.c: In function `generer_tableau_entiers_aleatoire':
    main.c:11: warning: implicit declaration of function `entier_aleatoire'
    main.c: In function `tracer_graphique':
    main.c:71: warning: implicit declaration of function `makecol'
    main.c:73: warning: implicit declaration of function `tracer_point'
    main.c: In function `main':
    main.c:91: warning: implicit declaration of function `ouvrir_fenetre_graphique'
    main.c:93: warning: implicit declaration of function `sleep'
    main.c:99: warning: implicit declaration of function `fermer_fenetre_graphique'
    main.c: At top level:
    main.c:103: warning: type defaults to `int' in declaration of `END_OF_MAIN'
    main.c:103: warning: function declaration isn't a prototype
    main.c:103: warning: data definition has no type or storage class
    main.c: In function `main':
    main.c:79: warning: 'i' might be used uninitialized in this function
    Process terminated with status 1 (0 minutes, 4 seconds)
    2 errors, 10 warnings

  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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int main(void)
    {
    int i,nbre_elements,borne_min,borne_max,tab[i];
    int hauteur,largeur;
    hauteur=400;
    largeur=500;
    printf("nbre elements???\n");
    scanf("%d",&nbre_elements);
    printf("borne min???\n");
    scanf("%d",&borne_min);
    printf("borne max???\n");
    scanf("%d",&borne_max);
    generer_tableau_entiers_aleatoire(tab,nbre_elements,borne_min,borne_max);
    En regardant rapidement, je vois quelque chose d'étrange avec la définition de ta variable tab. Si tu désires allouer de la mémoire pour ton tableau tab, la syntaxe que tu as utilisée est incorrecte (tab[i]). En effet, la valeur de i n'est pas connue à la compilation, ni d'ailleurs au moment où tu passes tab à la fonction generer_tableau_entiers_aléatoire. Tu dois utiliser une expression constante pour définir la taille de ton tableau.

    Sinon, cela n'engage que moi, mais d'autres sur ce forum seront du même avis, la fonction scanf est réservée aux spécialistes, voir aux gourous (dont je ne fais pas partie). Pour des entrées sécurisées, l'utilisation du couple fgets et sscanf est une solution plus adaptée.

    Bonne chance

    Thierry

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par newbee33
    la taille du tableau est definie par nbre_elements.
    Non, quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int i,nbre_elements,borne_min,borne_max,tab[i];
    Tu définis la taille de tableau à "i". Le problème, c'est que "i" n'est pas initialisé, donc la taille de tableau va être la valeur contenu à l'emplacement de "i"... Autant dire qu'on ne peut pas prédire le comportement de ce code...

    Pour définir clairement ton tableau (si tu veux qu'il ait la taille "nbre_elements"), tu dois le faire dans cet ordre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int nbre_elements;
    printf("nbre elements???\n");
    scanf("%d",&nbre_elements); // !!!
    int tab[nbre_elements];
    Mais attention à "scanf" (je ne suis pas certain qu'on l'utilise comme cela), il vaut mieux utiliser d'autres fonctions comme fgets...

  7. #7
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    pour Emmanuel Delahaye:je suis obligé de faire ce projet c'est un exo que j'ai a faire en tp d'info.
    ensuite pour ce qui est de la compilation sur l'ordi ou je bosse il n'y a pas de probleme.

    pour mujigka:merci je vais tester ca que tu dis et pour scanf c'est dans mon fascicule et c'est la seul fonction que l'on nous a appris de ce type.

    pour Fabllot:merci aussi et meme remarque pour le scanf

    je vais essayer de voir si ca marche

  8. #8
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par Fabllot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int nbre_elements;
    printf("nbre elements???\n");
    scanf("%d",&nbre_elements); // !!!
    int tab[nbre_elements];
    Je ne sais pas si utiliser un tableau à longueur variable (comme introduit par C99) soit très judicieux ici. Le support de la norme C99 en ce qui concerne des compilateurs tels que gcc n'est pas encore 100% à l'heure actuelle [1]. Je ne pense pas qu'il a lieu dans le problème d'utiliser un VLA, donc nbre_elements doit être une expression constante.

    Si nbre_elements n'est pas connu à la compilation, j'utiliserais une allocation dynamique via la fonction standard malloc().

    Thierry

    [1] http://gcc.gnu.org/c99status.html

  9. #9
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    pour mujigka:merci je vais tester ca que tu dis et pour scanf c'est dans mon fascicule et c'est la seul fonction que l'on nous a appris de ce type.
    OK! Il faudrait un jour que certains enseignants changent leur habitudes... N'hésite pas à consulter le tutoriel suivant si tu veux être certain d'utiliser cette fonction correctement et sans trop de soucis:

    http://xrenault.developpez.com/tutoriels/c/scanf/

    Juste une question: ça sert à quoi la macro END_OF_MAIN() ?

    Bonne chance

    Thierry

  10. #10
    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 mujigka
    Si nbre_elements n'est pas connu à la compilation, j'utiliserais une allocation dynamique via la fonction standard malloc().

  11. #11
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    a la fin du fichier contenant la fonction main(),aprés cette fonction, on ajoutera la ligne END_OF_MAIN()
    cette ligne est une "ruse" utilisée par allegro pour recuperer le nom complet du programme.Ce genre de methode peu orthodoxe n'est generalement pas recommandé mais il est necessaire dans le cas present pour des raisons de compatibilité des versions.En cas d'oubli le compilateur signalera le manque d'une fonction nommée mangled_main
    voila ce que l'on a dans notre fascicule.
    Sinon ca serai cool une solution sans malloc() parce que bon les profs generalement aiment pas trop que l'on passe par des trucs qu'ils nous ont pas appris
    sinon je vais voir tout ca demain, j'ai pas de quoi faire ca chez moi...

  12. #12
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 705
    Points
    705
    Par défaut
    Citation Envoyé par mujigka
    Je ne sais pas si utiliser un tableau à longueur variable (comme introduit par C99) soit très judicieux ici. Le support de la norme C99 en ce qui concerne des compilateurs tels que gcc n'est pas encore 100% à l'heure actuelle [1]. Je ne pense pas qu'il a lieu dans le problème d'utiliser un VLA, donc nbre_elements doit être une expression constante.

    Si nbre_elements n'est pas connu à la compilation, j'utiliserais une allocation dynamique via la fonction standard malloc().
    C'est bien ce que je préconisais un peu plus haut ...

    Citation Envoyé par Fabllot
    Bon déjà, déclarer un tableau en static, c'est toujours dangeureux, mieux vaut prendre ses précautions et le déclarer en dynamique avec des "malloc", mais bon passons. [...]
    Mais étant passé très récemment par le système universitaire, je sais comment ça se passe, et j'ai réutilisé dans mon exemple, les fonctions données... Sinon ça perturbe tout le monde...

  13. #13
    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 : 47
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Sans VLA et sans malloc, je ne vois pas de solution. Personnellement, j'évite d'utiliser les tableaux à longueur variable pour des questions de portabilité. Je ne sais pas quelles sont les fonctions que tu as déjà rencontrées... mais c'est clair que si tu n'as pas encore vu malloc et que tu dois utilisé un tableau dont la taille n'est pas connu à la compilation... Je ne comprend pas tout-à-fait l'approche de ton prof, mais bon, je n'ai jamais fait de C à la fac.

    Salutations

    Thierry

  14. #14
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    en meme temps je ne suis meme pas sur que notre prof soit un prof d'info vu que je suis en licence d'eea et que notre prof c'est le directeur de la 3ieme année.

  15. #15
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    bon ben ca marche avec la methode de Fabllot.
    merci a tous

Discussions similaires

  1. aide sur ce le probleme de segmentation fault
    Par selmani300 dans le forum C++
    Réponses: 3
    Dernier message: 26/03/2009, 07h48
  2. Probleme segmentation fault
    Par miketidy dans le forum Débuter
    Réponses: 15
    Dernier message: 12/09/2008, 14h54
  3. Réponses: 2
    Dernier message: 15/01/2008, 12h09
  4. probleme segmentation fault
    Par eminem313 dans le forum Linux
    Réponses: 2
    Dernier message: 07/06/2007, 21h55
  5. Probleme de segmentation fault avec sprintf
    Par MathG dans le forum C++
    Réponses: 5
    Dernier message: 14/12/2006, 01h12

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