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 :

switch : où est l'erreur ?


Sujet :

C

  1. #21
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    je suis vraiment content et reconnaissant concernant ces réponses toutefois pour ne pas vous mentir je n'ai vraiment pas compris les deux derniers posts
    J'ai lu les deux post dont tu parles et je ne vois pas ce qui est difficile à comprendre... excepté peut-être ces deux lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ret = scanf ("%ld", &temp);
          scanf ("%*[^\n]"), getchar ();
    Bon, la première ligne permet de faire saisir un nombre. Classique. Mais que se passe-t-il si l'utilisateur tape "12qsdqsd" suivi du "<return>" qui valide la saisie ??? La fonction "scanf()" récupère alors tout ce qui correspond au format attendu "%ld" donc le "12" mais laisse dans le périphérique représentant le clavier tout ce qui reste, c'est à dire "qsdqsd<return>". Et là, tu arrives sur un problème => si plus tard dans ton code tu fais saisir un nom (par exemple), ben ton programme, au lieu d'attendre sagement que tu tapes le nom, ira récupérer ce qui reste c.a.d. "qsdqsd".
    Donc pour éviter ce problème, il faut purger le clavier d'où le scanf("%*[^\n]") qui signifie "j'attends du clavier toute chaîne sauf "\n" (qui représente le "<return>").
    A ce moment là, le scanf() récupère et supprime du clavier tout ce qui correspond au modèle (soit "qsdqsd") et il ne reste que le "<return>" qu'on supprime avec le "getchar()". Simple non ???

    Citation Envoyé par abdelilah Voir le message
    j'essaie toujours d'utiliser le code le plus facile quitte à ce qu'il soit classique.
    Comme tout le monde

    Citation Envoyé par abdelilah Voir le message
    puisque toute fonction renvoie une valeur.

    sous linux c'est echo $? , si ça renvoie un zéro ça marche .
    ATTENTION ATTENTION aux analogies. Faut pas confondre "valeur renvoyée par une fonction" et "code d'état d'une commande Unix".
    En C, toute fonction renvoie une valeur. Cette valeur représente le "résultat" de la fonction. Ce résultat peut donc être n'importe quoi (un calcul, une chaîne, etc).
    En shell Unix, un programme (et aussi une fonction car ça marche pareil) ne renvoie qu'un état. Cet état est compris entre 0 et 255. On ne peut donc pas se servir de cet état pour représenter un résultat car on peut pas représenter un résultat plus grand que 255.
    Cet état n'est utilisé que pour détecter si le programme (ou si la fonction) s'est bien déroulé ou pas mais ne pourra jamais être utilisé comme résultat.
    La méthode pour utiliser une commande Unix comme résultat est d'utiliser les backquottes ( => `commande`) qui permettent de récupérer ce que la commande affiche. Cet affichage peut donc être utilisé comme résultat dans un code plus vaste.

    Exemple:
    carré d'un nombre en C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned long carre(long nb)
    {
        return nb * nb;       // Ce "return" signifie "renvoi du résultat attendu"
    }
    main()
    {
        printf("Carré de 5: %lu\n", carre(5));
    }
    carré d'un nombre en shell
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
    carre()
    {
        expr $1 \* $1    # => Simple affichage à l'écran (qui pourra être utilisé ailleurs comme résultat)
        return 0          # => Ce "return" signifie "traitement ok" et non "résultat"
    }
    echo "Carré de 5:" `carre 5`   # => Récupération de l'affichage ici - Et on ne se sert pas de "$?" car on n'en n'a pas besoin
    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]

  2. #22
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    ATTENTION ATTENTION aux analogies. Faut pas confondre "valeur renvoyée par une fonction" et "code d'état d'une commande Unix".
    En C, toute fonction renvoie une valeur. Cette valeur représente le "résultat" de la fonction. Ce résultat peut donc être n'importe quoi (un calcul, une chaîne, etc).


    ATTENTION ATTENTION aux réponses quand on n'est pas bien réveillé .

    En C, certaines fonctions renvoient des valeurs. D'autres ne retournent rien (void).

    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #23
    Membre régulier
    Inscrit en
    Décembre 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 165
    Points : 76
    Points
    76
    Par défaut
    bonsoir

    merci tout le monde pour ces réponses ou plutôt ces explications (Sve@r ça n'est pas un hasard qu'on te surnomme Membre éclairé ).

    il me faut un long chemin pour arriver à votre niveau mais il faut y croire.

    en tout cas ce forum est vraiment utile.

  4. #24
    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 DavidDeharbe Voir le message
    D'autre part valgrind est mon ami...
    Il sait repérer les fichiers non fermés ?
    Pas de Wi-Fi à la maison : CPL

  5. #25
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    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 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par abdelilah Voir le message
    en tout cas ce forum est vraiment utile.
    Ouais !!! Ici on retrouve tous les déjantés de la prog
    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]

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 13
    Dernier message: 30/01/2006, 14h21
  2. Où est l'erreur?
    Par Paulinho dans le forum C++
    Réponses: 3
    Dernier message: 26/10/2005, 09h48
  3. [VB.NET] Pagination DataGrid (où est l'erreur?)
    Par franculo_caoulene dans le forum ASP.NET
    Réponses: 2
    Dernier message: 25/10/2004, 11h46
  4. Ou est l'erreur ?
    Par Antoine NSG dans le forum Langage SQL
    Réponses: 6
    Dernier message: 08/09/2004, 10h56
  5. [Erreur] Quel est cette erreur?
    Par netah25 dans le forum C++Builder
    Réponses: 3
    Dernier message: 11/08/2004, 10h16

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