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 de syntaxe


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut Probleme de syntaxe
    Bonjour tout le monde je voudrais juste savoir une chose
    je travaille avec Dev-C++ et quand je fais ces instructions j'ai pas erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       int i;
       scanf("%d",i);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       int i;
       scanf("%d",&i);
    je voudrais savoir pourquoi pour le premier code le compilateur n'affiche pas d'erreur ni d'aileurs pour le 2eme, je pense que c'est la 2eme qui est la bonne

    Quelle est la differnce entre les 2 codes
    Merci pour les reponses.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    le & devant i permet de donner l'adresse de la variable. Alors que i seul est le contenu.

  3. #3
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    merci pour la reponse mais ça je sais ma question est comment le compilateur traite les 2 codes, lequel et des 2 codes est le bon a adopter

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Prototype: int scanf(char *format, ...);

    donc la deuxieme ecriture est bonne dans la plupart des cas. Là raison, pour laquelle, le & n'est pas obligatoire tout le temps, je laisse quelqu'un d'autre te l'expliquer car je ne serais pas exact dans mes termes et je risque de t'embrouiller.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i;
    scanf("%d",&i);
    Edit: http://c.developpez.com/faq/c/?page=...EN_scanf_fgets

  5. #5
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    je pense que c'est la 2eme qui est la bonne
    Prototype: int scanf(char *format, ...);

    donc la deuxieme ecriture est bonne.
    ça aussi je sais ,je re-precise ma question
    pourquoi le compilateur n'affiche pas d'erreur concernant le premier code?

  6. #6
    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 theshark85
    Prototype: int scanf(char *format, ...);
    Ce qui ne démontre absolument rien, vu que c'est une fonction 'variadic'.

    Tout dépend de la définition de fonction telle qu'elle est donnée par la documentation (la norme, ou tout autre document suffisamment neutre).

    http://www.cplusplus.com/reference/clibrary/cstdio/

    (J'en vois qui vont crier à l'hérésie, mais c'est pas grave, la bibliothèque standard du C est reprise par le C++.)

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par krachik
    je voudrais savoir pourquoi pour le premier code le compilateur n'affiche pas d'erreur ni d'aileurs pour le 2eme,
    scanf est une fonction a nombre variable d'arguments; il n'est donc pas possible de verifier les types des arguments supplementaires. Mais g++ (et il me semble que devC++ utilise g++) est capable de parser la premiere chaine et d'en deduire les arguments demande et de donner des avertissements (ce ne sont pas des erreurs) s'il y a un probleme.

    je pense que c'est la 2eme qui est la bonne

    Quelle est la differnce entre les 2 codes
    Dans le premier cas on passe la valeur contenue dans i a scanf, dans le second l'adresse de i. A cause du %d scanf attend l'adresse d'un entier, donc la deuxieme est bien la bonne.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    scanf est une fonction a nombre variable d'arguments; il n'est donc pas possible de verifier les types des arguments supplementaires. Mais g++ (et il me semble que devC++ utilise g++) est capable de parser la premiere chaine et d'en deduire les arguments demande et de donner des avertissements (ce ne sont pas des erreurs) s'il y a un probleme.



    Dans le premier cas on passe la valeur contenue dans i a scanf, dans le second l'adresse de i. A cause du %d scanf attend l'adresse d'un entier, donc la deuxieme est bien la bonne.
    Mais le & n'est pas forcement obligatoire selon le type de notre variable. J'ai pas d'exemple sous la main. C'est aussi une explication au fait que le compilo ne dise rien s'il n'y a pas de & devant la variable.

  9. #9
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par theshark85
    Mais le & n'est pas forcement obligatoire selon le type de notre variable. J'ai pas d'exemple sous la main. C'est aussi une explication au fait que le compilo ne dise rien s'il n'y a pas de & devant la variable.
    Si la variable est un pointeur ou equivaut a un pointeur, on envoit bien une adresse sans utiliser &. C'est un peu evident, non ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Oui c'est évident mais j'arrivais pas à le dire de façon claire. En tout cas, voici la réponse à la question de krachik.

  11. #11
    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 theshark85
    Mais le & n'est pas forcement obligatoire selon le type de notre variable. J'ai pas d'exemple sous la main. C'est aussi une explication au fait que le compilo ne dise rien s'il n'y a pas de & devant la variable.
    scanf() attend toujours une adresse. Le nom d'un tableau est une adresse. Il a la valeur et le type de l'adresse de son 1er élément :

    tab == tab + 0 == &tab[0]

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        int tab[3];
        puts("entrer 3 entiers");
        scanf ("%d%d%d", tab, tab+1, tab+2);
    Dans le cas d'une chaine ("%s"), scanf() attend l'adresse du premier d'un tableau de char suffisamment grand pour recevoir les caractères saisies, y compris le 0 final. Attention au risque de débordement...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char chaine[10];
       scanf("%s", chaine);
    Dans ces deux cas, pas de &.

    Par contre, si c'est une variable simple (caractère, entier, flottant), oui, il faut un &, car on doit passer l'adresse de cette variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       char c;
       int i;
       float f;   
       double d;
     
       scanf ("%c%d%f%lf", &c, &i, &f, &d);
    Détails ici :

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

  12. #12
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Merci pour les reponses
    Donc ce n'est pas un probleme de syntaxe mais de bonne programmation(code 1)
    Dans le premier cas on passe la valeur contenue dans i a scanf, dans le second l'adresse de i. A cause du %d scanf attend l'adresse d'un entier, donc la deuxieme est bien la bonne.
    Mais si on lit un entier avec le premier code il n'affiche pas la valeur lue mais une autre valeur ,pourquoi

  13. #13
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Si la variable est un pointeur ou equivaut a un pointeur, on envoit bien une adresse sans utiliser &. C'est un peu evident, non ?
    Tout a fait d'accord

  14. #14
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Citation Envoyé par krachik
    Merci pour les reponses
    Donc ce n'est pas un probleme de syntaxe mais de bonne programmation(code 1)

    Mais si on lit un entier avec le premier code il n'affiche pas la valeur lue mais une autre valeur ,pourquoi?

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Déjà tu as de la chance que tu es passé ton scanf sans encombre, la plupart du temps le programme plante.

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Je dirais plutôt qu'il n'a pas de chance.

    S'il avait eu de la chance, le programme aurait planté et il aurait vu tout de suite son erreur.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Citation Envoyé par Médinoc
    Je dirais plutôt qu'il n'a pas de chance.

    S'il avait eu de la chance, le programme aurait planté et il aurait vu tout de suite son erreur.
    Oui, c'est sûre. Et d'ailleurs, comment se fait-il que ça n'a pas planté? Car je viens de tester chez moi, et ça ne passe pas. Ce qui me paraît logique.

  18. #18
    Membre Expert
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Par défaut
    Code :
    int i;
    scanf("%d",i);

    Mais si on lit un entier avec le premier code il n'affiche pas la valeur lue mais une autre valeur ,pourquoi?

  19. #19
    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 krachik
    Bonjour tout le monde je voudrais juste savoir une chose
    je travaille avec Dev-C++ et quand je fais ces instructions j'ai pas erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       int i;
       scanf("%d",i);
    C'est parce que ton compilateur est mal configuré :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo

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

Discussions similaires

  1. probleme de syntaxe sql dans VB
    Par njac dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 20/05/2005, 14h41
  2. [VB.NET] Probleme de syntaxe
    Par microthib dans le forum Windows Forms
    Réponses: 4
    Dernier message: 17/03/2005, 13h49
  3. probleme fonction syntaxe
    Par gIch dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/02/2005, 09h52
  4. [Débutante] Problèmes de syntaxe
    Par new_wave dans le forum Prolog
    Réponses: 4
    Dernier message: 02/11/2004, 18h39
  5. Problemes de syntaxe
    Par maahta dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 01/10/2003, 13h40

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