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

  1. #21
    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++.)

  2. #22
    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/

  3. #23
    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
    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.
    C'est un comportement indéfini. Il ne faut pas chercher de 'logique'.

    http://emmanuel-delahaye.developpez.com/notes.htm#ub

    "Illogic, Captain"
    "-- Mr Spock in TOS"

  4. #24
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Le fait que le premier code (qui n'est pas juste) *semble* correct vient tout simplement du fait que le nombre de bits utilisés pour représenter une adresse mémoire peut - dans certains cas, et dans celui-ci en particulier - etre le meme que pour représenter d'autres types de base.

    Il se fait que, sous mingw, la "taille" d'un entier est de 4 caracteres... et que c'est aussi la taille utilisée pour le codage des adresses/ des pointeurs comme le démontre le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main()
    {
        int i;
        char *a=NULL;
        printf("%d\n%d",sizeof(i),sizeof(a));
    	return 0;
    }
    Avec les bons réglages du compilateur, tu devrais au minimum avoir un avertissement disant que tu n'utilise pas un pointeur, sous la forme de
    Citation Envoyé par compilateur
    warning: format argument is not a pointer (arg 2)
    mais, autrement, comme la taille d'un entier et celle d'un pointeur sont égales, quand tu utilises scanf qui demande un pointeur vers un élément, il peut tres bien considérer qu'un entier est d'une taille correcte... (ou faire une convertion implicite vers une taille correcte pour les autres types, d'une taille différente)

    Et c'est là que réside tout le problème: il y a en effet peut de chance que la valeur de ton entier (ou de n'importe quel autre type, d'ailleurs) corresponde, justement, à l'adresse à laquelle il se trouve...

    Si, à la compilation, ca semble (par malheur) passer, il est clair que, à l'exécution... ca coincera méchemment, tout comme ca coincera méchemment si tu fournis un pointeur qui n'a pas été correctement initialisé, vu que c'est exactement ce que tu fais
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #25
    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 encore a tout le monde la je clairement eclairé sur le sujet a
    Emmanuel Delahaye pour les liens c'est cool

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

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