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 gcc: core dumped


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut erreur gcc: core dumped
    Salut à tous,

    Voila j'aimerais en savoir plus sur l'erreur de segmentation avec gcc sur ce code.

    Voici le code (il n'est pas de moi mais d'un livre) , son but est de vous faire rentré 10 valeurs numériques entières (ou moins taper 0 pour finir) puis d'afficher la plus grande.

    Je suis sous linux au cas ou ça marcherai sur un autre OS

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    #define MAX 10
     
    int tab[MAX+1], count;
     
    int largest(int x[]);
     
     
    int main()
    {	
    	for(count=0; count<MAX; count++)
    	{
    		printf("entrer une valeur entière: ");
    		scanf("%d", &tab[count]);
     
    		if(tab[count]==0)
    		count=MAX;
    	}
     
    	tab[MAX]=0;
     
    	printf("\n\nla valeur la plus grande est: %d\n", largest(tab) );
     
    	exit(EXIT_SUCCESS);
    }
     
     
    int largest(int x[])
    {
    	int count,  biggest=x[0];
     
    	for(count=1; count != 0; count++)
    	{
    		if(x[count]>biggest)
    		biggest = x[count];
    	}
     
    	return biggest;
    }

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Le probleme vient d'une simple erreur de frappe dans la boucle "for" de la fonction largest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(count=1; count != 0; count++)
    Tu commences a 1, et tu fais +1 tant que count n'est pas egal a 0.


    Sinon, ce code est tout pourri.... Je ne sais pas dans quel livre tu l'as recopié, mais je crains que ca ne soit pas un livre très rigoureux.

    Quelques remarques en vrac :
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #define MAX 10
     
    int tab[MAX+1], count; /* Pourquoi declarer des variables globales ?? */
     
    int largest(int x[]);
     
     
    int main() /* Pas un prototype standard. int main(void) */
    {	
    	for(count=0; count<MAX; count++)
    	{
    		printf("entrer une valeur entière: ");
    		scanf("%d", &tab[count]); /* Pas une entree securisee. Plante si on rentre une chaine de caracteres par exemple */
     
    		if(tab[count]==0)  /* Il y a une instruction pour ca : break */
    		count=MAX;
    	}
     
    	tab[MAX]=0;
     
    	printf("\n\nla valeur la plus grande est: %d\n", largest(tab) );
     
    	exit(EXIT_SUCCESS); /* return eut suffit */
    }
     
     
    int largest(int x[])
    {
    	int count,  biggest=x[0]; /* Il y a une legere redefinition de count.... */
     
    	for(count=1; count != 0; count++)
    	{
    		if(x[count]>biggest)
    		biggest = x[count];
    	}
     
    	return biggest;
    }
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Le probleme vient d'une simple erreur de frappe dans la boucle "for" de la fonction largest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(count=1; count != 0; count++)
    Tu commences a 1, et tu fais +1 tant que count n'est pas egal a 0.
    Bonjour
    Dans l'absolu ça ne devrait pas provoquer d'erreur et même fonctionner car à un moment donné count deviendra bien égal à 0 mais je sens que ce n'était pas là les intentions de l'auteur du livre...

    Citation Envoyé par gangsoleil Voir le message
    Sinon, ce code est tout pourri.... Je ne sais pas dans quel livre tu l'as recopié, mais je crains que ca ne soit pas un livre très rigoureux.
    Affirmatif
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut
    je confirme c'est bien à cause du 1 dans la boucle "for" mais c'est de ma faute

    j'avoue quand même que cette édition (Le Langage C: Édition mise à jour avec la norme C11 par Peter Aitken et Bradley L. Jones) est bourré de faute et c'est franchement pas rigolo de corriger les erreurs quand on débute.

    Après pour la syntaxe je ne peux pas me permettre de jugé je commence à peine à comprendre les pointeurs

    Je pense sérieusement à en changer mais bon ça c'est une autre histoire.

    Par contre gangsoleil c'est quoi une redéfinition? Tu veux dire qu'il vaut mieux éviter d'utiliser deux fois le même nom de variable?

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par pouic13 Voir le message
    je confirme c'est bien à cause du 1 dans la boucle "for" mais c'est de ma faute
    Comme le dit Sve@r, ce n'est techniquement pas un soucis, car le comportement devrait etre le suivant :
    • count = 1
    • puis tu fais count++ jusqu'a la valeur max, c'est a dire INT_MAX, qui vaut au moins 32767
    • Tu continues a faire +1, ce qui fait INT_MIN, c'est a dire au moins -32767
    • Puis tu continues a faire count++
    • Ce qui va finir par faire 0

    Neanmoins, ce n'est probablement pas ce que tu voulais faire

    j'avoue quand même que cette édition (Le Langage C: Édition mise à jour avec la norme C11 par Peter Aitken et Bradley L. Jones) est bourré de faute et c'est franchement pas rigolo de corriger les erreurs quand on débute.

    Je pense sérieusement à en changer mais bon ça c'est une autre histoire.
    Oui et non. Un livre, comme un tutoriel, est cense etre exempt de bug car les gens ont, a tort ou a raison, tendance a suivre ce qui est dit dedans.
    Dans ton cas, c'est encore plus grave car comme tu debutes, tu dois sans cesse remettre en question l'existant ; or un livre ou un tutoriel doit t'apporter des reponses aux questions que tu te poses, pas te faire poser des questions sur la veracite de ce qui est dedans (ce qui serait un livre de philosophie, pas de C).

    Par contre gangsoleil c'est quoi une redéfinition? Tu veux dire qu'il vaut mieux éviter d'utiliser deux fois le même nom de variable?
    Au debut du programme, tu declares une variable count de type int. C'est ce qu'on appelle une variable globale, c'est a dire qu'elle est accessible par tout le monde en permanence, sans restriction. Cela est souvent dangeureux, et donc souvent deconseille.

    Par la suite, dans la fonction largest, tu declares une nouvelle variable count : meme nom, mais la portee (c'est a dire la duree de vie de la variable) est limitee a la fonction.
    Donc en gros, tu demandes au programme d'avoir deux variables, une qui s'appelle count et qui a la duree de vie du programme, et une qui s'appelle count et qui a la duree de vie de la fonction largest.
    Sauf erreur de ma part (ce qui est toujours possible), les deux se marchent sur les pieds car dans la fonction largest, tu as deux variables qui s'appellent count : la globale et la locale. Or il n'existe absolument aucun mecanisme dans le C pour differencier les deux [par contre ce genre de choses existent en C++, mais c'est encore autre chose, et tu as aussi des cas interdits].
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par gangsoleil Voir le message
    Par la suite, dans la fonction largest, tu declares une nouvelle variable count : meme nom, mais la portee (c'est a dire la duree de vie de la variable) est limitee a la fonction.
    Donc en gros, tu demandes au programme d'avoir deux variables, une qui s'appelle count et qui a la duree de vie du programme, et une qui s'appelle count et qui a la duree de vie de la fonction largest.
    Attention, dans ce cas on ne parle pas de "durée de vie" mais de "visibilité".
    La durée de vie c'est la pérennité d'une variable. Une variable globale ou une variable static resteront en l'état tant que durera le programme, Une variable locale (sous-entendu "local à un bloc") et en même temps non static restera en l'état tant que durera le bloc.

    La visibilité c'est l'endroit où est accessible une variable. Une variable globale sera accessible depuis n'importe quel endroit du programme, une variable locale (encore une fois "à un bloc") sera accessible depuis n'importe quel endroit du bloc.

    Citation Envoyé par gangsoleil Voir le message
    Sauf erreur de ma part (ce qui est toujours possible), les deux se marchent sur les pieds car dans la fonction largest, tu as deux variables qui s'appellent count : la globale et la locale. Or il n'existe absolument aucun mecanisme dans le C pour differencier les deux
    Non non, petite erreur. La seconde variable (celle qui est locale au bloc de fonction) a priorité sur la globale. Donc en fait, dans cette partie du code, la variable globale est inaccessible puisque toute référence à "count" sera traduite par "référence à la locale count".

    Ceci dit, tu as tout à fait raison: les variables globales ne sont pas à proscrire (elles ont parfois une utilité nécessaire) mais sont à éviter autant que faire se peut...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Par défaut
    Merci pour vos explications.

    Après ce que tu viens de me dire je m’aperçois que ce bouquin me fou dans les choux.

    Je l'ai lu déjà une foie, j'ai abandonné croyant que s'été moi qui ne comprennais rien mais le code que j’ai mis ressemble beaucoup à tous ce du livre (je parle de leur structure) sans parlé des premier codes ou il manque des bibliothèques...

    Enfin c'était mon petit coup de gueule perso

    Merci encore.

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

Discussions similaires

  1. Erreur de segmentation (core dumped)
    Par benja507 dans le forum Débuter
    Réponses: 11
    Dernier message: 14/05/2008, 17h37
  2. Erreur de segmentation (core dumped)
    Par mansour67 dans le forum wxWidgets
    Réponses: 3
    Dernier message: 05/03/2008, 18h11
  3. Réponses: 6
    Dernier message: 14/01/2008, 16h47
  4. erreur de segmentation core dumped
    Par panganino dans le forum Langage
    Réponses: 2
    Dernier message: 03/01/2008, 12h45
  5. Réponses: 5
    Dernier message: 04/11/2007, 13h39

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