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 :

Pourquoi ça ne me renvoie pas d'erreurs ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut Pourquoi ça ne me renvoie pas d'erreurs ?
    Bonjour,

    Voici la partie du code qui ne devrait pas compiler :
    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
    typedef struct COORDONNEE
    {
    	int x;
    	int y;
    	int z;
    } COORDONNEE;
     
    void fct(COORDONNEE c);
     
    int main()
    {
    	fct((COORDONNEE){12, 25});
     
    	return 0;
    }
     
    void fct(COORDONNEE c)
    {
    	printf("%d, %d, %d", c.x, c.y, c.z);
    }
    En toute logique, lors de la compilation, la ligne 12 ne devrait-elle pas renvoyer une erreur ? Car {12, 25} n'est pas une COORDONNEE valide..
    Ou alors le compilateur s'arrange pour compléter la structure ?

    Merci.

  2. #2
    Membre averti
    Homme Profil pro
    Autodidacte
    Inscrit en
    Janvier 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autodidacte
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2013
    Messages : 30
    Par défaut
    Il n'y a aucune erreur, c'est juste que la variable z de la structure n'est pas initialisé elle sera donc initialisé par défaut avec la valeur déjà inscrite dans la RAM.
    C'est un peu comme si on écrivait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int valeur;
    printf("%d", valeur);

  3. #3
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par zizoufoot Voir le message
    ...
    En toute logique, lors de la compilation, la ligne 12 ne devrait-elle pas renvoyer une erreur ? Car {12, 25} n'est pas une COORDONNEE valide..
    Ou alors le compilateur s'arrange pour compléter la structure ?

    Merci.
    Bonjour,

    la logique c'est la norme qui la dicte
    La norme sur ce point dit que lors d'une initialisation incomplète les champs manquant sont initialisés suivant la règle d'initialisation statique : ici en l'occurence tout le membre z sera initialisé à 0.

    Citation Envoyé par Norme C99 §6.7.8.21
    If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
    Et on retrouve peu avant :
    Citation Envoyé par Norme C99 §6.7.8.10
    If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static storage duration is not initialized explicitly, then:
    — if it has pointer type, it is initialized to a null pointer;
    if it has arithmetic type, it is initialized to (positive or unsigned) zero;
    — if it is an aggregate, every member is initialized (recursively) according to these rules;
    — if it is a union, the first named member is initialized (recursively) according to these
    rules.

  4. #4
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Merci pour vos deux réponses. Et un grand merci à kwariz pour son explication très précise.
    Je sais maintenant comment il complète les champs manquants
    Je trouve ça tout de même intriguant qu'aucun warning ou erreur ne soit affiché. Par ex, lorsqu'une variable manque dans un printf, le compilateur le dit.

    (Sinon, je tiens à dire que je n'ai pas mis de "pouce rouge". Je ne sais pas qui en a mis à tous les post..Je pense que la question et les réponses qui ont été fournies ne le justifient pas)

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Citation Envoyé par zizoufoot Voir le message
    Merci pour vos deux réponses. Et un grand merci à kwariz pour son explication très précise.
    Je sais maintenant comment il complète les champs manquants
    Je trouve ça tout de même intriguant qu'aucun warning ou erreur ne soit affiché. Par ex, lorsqu'une variable manque dans un printf, le compilateur le dit.
    En fait ça ne peut être une erreur car c'est un comportement définit par la norme. Tu peux suivant les compilateurs afficher des warnings pour ce genre d'idiome, par exemple avec gcc tu as l'option -Wmissing-field-initializers. Une pas trop mauvaise pratique consiste, avec gcc, d'utiliser les options -Wall -Wextra qui feront émettre plus de warnings à la compilation. Dans ton cas par exemple on obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    test.c: In function ‘main’:
    test.c:12:3: warning: missing initializer [-Wmissing-field-initializers]
    test.c:12:3: warning: (near initialization for(anonymous).z’) [-Wmissing-field-initializers]
    Comme c'est un comportement définit par la norme, certains sources comptent là-dessus et recevraient une tonne de messages ... donc par défaut ce n'est pas activé.
    Cette option ne fera émettre des warnings uniquement sur les struct et union, et pas dans le cas int tab[100]={0}; qui est encore plus répandu dans les sources bien que dans cet exemple il «manque» 99 valeurs ...

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 128
    Par défaut
    Un grand merci. C'est une option que je ne connaissais pas.
    Je l'utiliserais dorénavant

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'adore ce genre de neuneus qui mettent des -1 partout. Zavez de la chance, la charte m'oblige à rester poli

    Pour la précision sur la valeur du champ manquant, kwariz m'a devancé... Je pense que compiler avec les options -Wall -Wextra devrait être systématique, au moins une fois que le projet entier pour remonter toutes les erreurs potentielles et s'assurer qu'on sait pourquoi les warnings sont là. On pourra alors réduire la voilure en activant des options plus "précises".

    Quand au fait de se reposer sur la norme pour mettre à zéro les champs manquants, je suis un peu mitigé. Pour les tableaux, OK. Pour les strucutres je pense que c'est bien uniquement s'il y a peu de champs ; dans le cas du PO, je trouve que ça n'apporte rien en lisibilité, je trouve ça même moins bien. On n'est pas à quelques frappes en plus au clavier

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/05/2013, 12h18
  2. [MySQL] Une requête update qui ne renvoie pas d'erreur mais qui n'update pas
    Par Marc22 dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 16/06/2010, 17h59
  3. Pourquoi un onglet ne renvoie pas une sous sélection ?
    Par Vincent Heude dans le forum 4D
    Réponses: 0
    Dernier message: 03/08/2009, 17h49
  4. [PHP 5.2] mon serveur ne renvoie pas les erreurs pHp
    Par cipic dans le forum Langage
    Réponses: 4
    Dernier message: 25/04/2009, 20h07
  5. MySQL ne renvoie pas d'erreur alors que la chaine est fausse
    Par repié dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 07/11/2007, 12h18

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