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 :

Crash sur code qui demande l'age


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Crash sur code qui demande l'age
    Salut à tous, je m'appelle Emmanuel et je suis nul nul nul en informatique.

    Avant je ne connaissais rien, et en m'y mettant, je commence à trouver la programmation très intéressante.
    Mais je ne comprends pas ce qui arrive à mon ordi !

    J'ai fait un petit projet sous codeblocks-16.01mingw-setup.exe, système d'exploitation Windows 10.

    Ce que je ne comprends pas (et ça m'énerve, je ne peux plus continuer mes cours en ligne), est :

    pourquoi, après avoir tapé ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
        int age=0;
        printf("Ghislain Quel age as tu?");
        scanf("%d",age);
        printf("ah tu as donc %d ans ! je ne savais pas \n\n",age);
     
        return 0;
    }
    et appuyé sur F9, il m'affiche "problème etc ..." après avoir mis 21 + entrée Nom : pb1.PNG
Affichages : 554
Taille : 13,6 Ko

    Merci d'avance, je veux comprendre.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    Bienvenue sur le forum.

    Pour commencer, un code doit être mis en balise code (le # dans l'éditeur)

    Pour répondre à ta question, remplaces :
    par
    scanf attend une adresse de variable.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Bonjour et bienvenue,

    Merci d'avance, je veux comprendre.
    C'est la détermination qui caractérise tous les programmeurs. Tu vas beaucoup te plaire dans cette branche mais sache qu'elle est extrêmement chronophage et que cela ne se voit pas de prime abord. Prends garde à ce qu'elle n'accapare pas ta vie entière. ;-)

    Citation Envoyé par Emma2064 Voir le message
    Ce que je ne comprends pas (et ça m'énerve, je ne peux plus continuer mes cours en ligne), est :

    pourquoi, après avoir tapé ce code […] et appuyé sur F9, il m'affiche "problème etc ..." après avoir mis 21 + entrée […]
    chrtophe t'a donné la bonne réponse.

    Si tu veux aller plus loin, toutefois, sache que le C est une des « voies royales » de la programmation mais loin d'être la plus simple. En fait, quand tu travailles à ce niveau, ton compilateur va produire à partir de ton code source un exécutable en langage machine pour ainsi dire totalement autonome et indépendant de l'environnement de développement dans lequel tu l'as écrit. Ça veut dire aussi que la plupart des garde-fous vont être levés. Certes, les fonctions que tu mets en œuvre feront bien quelques contrôles mais ton application ne sera pas interprétée par un logiciel de plus haut niveau qui pourrait décider de s'arrêter en cas d'erreur et de t'expliquer pourquoi. En fait, le langage C sert, entre autre, à écrire précisément ces logiciels-là.

    Dans le cas qui t'intéresse, « scanf » est considérée par ton compilateur comme une fonction ordinaire et est traitée exactement de la même façon. Notamment, quand tu passes une variable en paramètre, c'est la valeur de cette variable qui sera transmise à la fonction.

    C'est effectivement ce que l'on souhaite la plupart du temps, que ce soit pour l'afficher avec « printf », ou pour faire des calculs dessus avec les fonctions mathématiques mais dans ton cas, la valeur de la variable ne sert à rien puisqu'on souhaite la renseigner. Et en C, cela se fait directement au plus « bas » niveau possible (comprendre par là : le plus proche de la machine) : étant donné qu'il n'est pas possible de définir explicitement une référence à une variable en C (c'est possible en C++), le programme va aller directement écrire en mémoire à l'endroit où la variable se trouve pour en modifier la valeur. Et à ce titre, le paramètre à transmettre doit être non pas la valeur de la variable mais l'adresse mémoire en question. Comme c'est une chose extrêmement fréquente en C, il existe un opérateur pour le faire. Un « & » passé en préfixe d'un identifiant renvoie l'adresse en mémoire de l'objet ainsi identifié et non le résultat de son évaluation. Attention au contexte : j'ai bien dit « en préfixe ». Le même « & » en tant qu'opérateur binaire sert à faire un ET logique bit-à-bit.

    Ceci nous amène à l'erreur que tu as rencontrée : il s'agit d'une segfault très courante. Concrètement, « scanf » est obligée de considérer que le paramètre que tu lui as passé est valable et correspond bien à l'adresse mémoire exacte de la variable que tu souhaites remplir, et rien ne lui permet de vérifier si c'est bien le cas ou non (sauf cas triviaux comme une valeur nulle). Comme tu lui as donné la valeur de la variable à la place, la fonction risque d'aller écrire en mémoire à un endroit totalement indéfini et le comportement sera imprévisible. En fait, il est à craindre que ce simple programme aille écraser des informations importantes, voire même le code des autres logiciels, du tien ou même du système d'exploitation, donc de vraies petites bombes à retardement à court ou long terme.

    C'est un « problème » connu qui date de l'aube de l'informatique et qui est inhérent à la programmation en langage machine (il se passe la même chose en assembleur). Les programmeurs étaient habitués à cela et ont malgré tout développé des applications fiables pendant plus d'un demi-siècle mais malgré tout, avec la complexification des machines, leur démocratisation dans le grand public, et les problèmes de confidentialité commençant à se faire sentir, il a fallu mettre en place des sécurités contre les codes mal écrits. C'est ce qui a conduit au développement du mode protégé (appelé ainsi sur x86).

    Concrètement, il s'agit de mettre « grossièrement » en place un segment de mémoire alloué à un processus donné. Il est responsable de tout ce qui s'y trouve, mais a l'interdiction d'écrire en dehors. Cette « interdiction » est gérée électroniquement par le micro-processeur qui, lorsqu'un accès bus est effectué par une instruction, quelle qu'elle soit, refuse d'honorer cette instruction et déclenche à la place une interruption, prise en charge par le système d'exploitation. Le système d'exploitation identifie alors le processus fautif et y met fin. Note que cela n'empêche pas le processus de s'auto-détruire s'il le souhaite ou s'il est vraiment trop mal conçu, mais il ne pourra plus nuire à son entourage.

    Ceci explique le message laconique que tu as reçu : ton programme a planté pour une raison tout-à-fait classique mais le système d'exploitation, lui, est incapable de le savoir. Il ne fait que constater le crash de ton application et t'en informe, en t'indiquant éventuellement à quel endroit cela s'est produit (information qui n'est visiblement plus disponible, si on se fie à ta capture d'écran. Ce n'est pas bien grave, les debuggers te permettront toujours de le savoir).

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    Très bonne explication Obsidian, mais je pense trop haut niveau pour Emma2064.

    Mais Emma2064, je t'encourages à arriver à comprendre.

    Jettes un œil sur nos sources :

    http://c.developpez.com/cours/

    Je te recommandes le C en 20 heures.

    Quand tu auras digéré le chapitre sur les pointeurs, tu auras sauté un grand pas, c'est une des plus grandes difficultés du C quand on apprend, et tu comprendrais tout de suite ton erreur.

    Pour résumer, quand on utilise des fonctions fournies telles que printf, scanf, on leur fourni en général des variables. Quelque fois, comme dans le cas de scanf, il faut fournir l'adresse de la variable au lieu de celle-ci, ce que l'on fait avec le "&" devant son nom. La documentation indique les valeurs attendus et celle(s) retourné(s).

    Si tu regardes la documentation de scanf tu verras ceci en prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int scanf (const char *format, ...);
    Là tu verras un "*" et non pas "&", une nouvelle difficulté pour toi. Tu comprendras quand tu auras lu le chapitre sur les pointeurs.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    A noter que, normalement, ton compilateur a dû te prévenir avec un message tel que warning: format '%d' expects argument of type 'int *', but argument 2 has type 'int' [-Wformat=].

    Si ce n'est pas le cas, il faut activer les warnings dans Code Blocks. Google devrait t'aider. Exemple : http://forums.codeblocks.org/index.php?topic=134.0

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 446
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 446
    Points : 43 088
    Points
    43 088
    Par défaut
    Effectivement, vu que tu débutes, prends l'habitude de ne pas laisser de warning lors d'une compilation. Il est très rare de devoir laisser des warnings. C'est souvent annonciateur de bugs.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 7
    Points : 7
    Points
    7
    Par défaut Remerciement
    [B]Merci beaucoup les amis pour m'avoir aidé , je ne ferrais plus cette erreur , tellement ... bête
    je ne comprends pas comment je l'ai oublié ce " & " :/ . Bref , encore merciiiiiiiiii , je visiterais tout vos blogs .

    chrtophe Obsidian Bktero
    En , lisant vos réponses
    j'étais très content , Et j'avoue aussi que
    je me suis senti trop trop , petit et nul devant vous , surtout
    face à la leçon qu'Obsidian m'a donné olala !! Vraiment ,maiaiais ton speech était un peu trop complexe pour moi merci pour avoir tant écris pour moi c'est très gentil !!!
    VOUS ETES DES PROS

    Vos réponses me motivent et me donnent encore plus l'envie de continuer dans la programmation !!!
    mais je ne sais pas si j'arriverais a votre niveau non je pense pas bien , que maintenant j'aime , j'aime j'aime programmer !
    Vous êtes ma famille virtuel , avec vous je pense que je serais le meilleurs en informatique !
    mERCi
    Ici , c’est mieux que Facebook , il y' a de gens Sérieux !!!

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 369
    Points : 23 623
    Points
    23 623
    Par défaut
    Citation Envoyé par Emma2064 Voir le message
    je ne ferrais plus cette erreur , tellement ... bête
    je ne comprends pas comment je l'ai oublié ce " & " :/ . Bref , encore merciiiiiiiiii , je visiterais tout vos blogs .
    Ce n'est pas une erreur bête ! Ce genre de chose est en fait le lot de tous les programmeurs, spécialement en C. Même avec des années d'expérience, on se fait encore avoir parfois avec un point-virgule mal placé. Ça veut également dire que tu sais déjà qu'il faut utiliser « & » dans cette situation et à quoi il sert, ce qui est beaucoup !

    face à la leçon qu'Obsidian m'a donné olala !! Vraiment ,maiaiais ton speech était un peu trop complexe pour moi merci pour avoir tant écris pour moi c'est très gentil !!!
    Digérer le mode protégé en un seul commentaire, ça fait un peu lourd, mais ce petit laïus n'est pas aussi complexe qu'il en a l'air. Prend le temps de le lire à tête reposée (et, surtout, sans essayer de l'apprendre par cœur). Tu verras où je veux en venir.

    Vos réponses me motivent et me donnent encore plus l'envie de continuer dans la programmation !!!
    mais je ne sais pas si j'arriverais a votre niveau non je pense pas bien , que maintenant j'aime , j'aime j'aime programmer !
    Ce n'est pas encore dit, surtout si tu as la vocation. On en reparle dans trois mois seulement. Tu seras toi-même surpris de constater combien tu as progressé dans cette période.

    Bon courage et à bientôt.

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

Discussions similaires

  1. explorer.exe a cessé de fonctionner
    Par Sylvain245 dans le forum Windows 7
    Réponses: 10
    Dernier message: 14/01/2010, 09h49
  2. Programme.exe a cessé de fonctionner
    Par mayyyyya dans le forum C
    Réponses: 1
    Dernier message: 04/06/2009, 12h51
  3. Rave.exe a cessé de fonctionner
    Par BaldeckJ dans le forum EDI
    Réponses: 5
    Dernier message: 11/09/2008, 01h13
  4. ''explorateur exe a cessé de fonctionner ''
    Par bibiou dans le forum Windows Vista
    Réponses: 6
    Dernier message: 05/07/2008, 15h16
  5. Réponses: 5
    Dernier message: 17/02/2008, 18h37

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