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 :

encore des warings


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut encore des warings
    Bonjour, j'ai encore des warnings lors de la compilation que je n'arrive pas à enlever.
    Voici mon premier warning :

    ../source/mysource/species.c:274: attention : passage de l'argument n°2 de « NumbersAtoms » a une largeur différente en raison du prototype
    et voici le code en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s->atoms->C=NumbersAtoms(s->name,'C');
    Voici le prototype de ma fonction NumbersAtoms :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned int NumbersAtoms(char *,char);
    J'ai un second warning :

    ../source/mysource/randompulling.c:52: attention : cast does not match function type
    voici le code en question

    où j'avais fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define RAND ((double) rand())/((double) RAND_MAX)
    Voici mes options de compilation (que j'ai chopées sur ce forum) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CFLAGS=-Wall -O3 -Wchar-subscripts -Wcomment -Wformat=2 -Wimplicit-int -Werror-implicit-function-declaration -Wmain -Wparentheses -Wsequence-point -Wreturn-type -Wswitch -Wtrigraphs -Wunused -Wuninitialized -Wunknown-pragmas  -Wfloat-equal -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wwrite-strings -Wconversion -Wsign-compare -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wmissing-noreturn -Wformat -Wmissing-format-attribute -Wno-deprecated-declarations -Wpacked -Wredundant-decls -Wnested-externs -Winline -Wlong-long
    Pouvez-vous me passer un petit coup de main ?
    Merci

  2. #2
    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 pense que le premier warning est dû au fait que tu aies une fonction dont l'un des paramètres est d'un type d'une largeur inférieure à int.
    Ça veut dire que s'il n'y avait pas le prototype, le char serait promu en int.

    Pour le second warning, je ne vois pas.
    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.

  3. #3
    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 salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned int NumbersAtoms(char *,char);
    ../source/mysource/species.c:274: attention : passage de l'argument n°2 de « NumbersAtoms » a une largeur différente en raison du prototype
    Il te dit en gros que le type char sera converti en une autre taille. Je conseille d'utiliser diretement le type int. Un paramètre de type char, ça ne sert à rien et ça ne fait qu'ajouter du code de conversion supplémentaire et inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned int NumbersAtoms (char *, int);
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define RAND ((double) rand())/((double) RAND_MAX)
    ../source/mysource/randompulling.c:52: attention : cast does not match function type
    Il te dit en gros que rand() ne retourne pas un double et que tu castes en double. Je pense que le cast est inutile. Le type de r suffit à faire le cast automatiquement.
    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define RAND (rand())/((double) RAND_MAX)

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    OK, merci. Je n'ai plus mes warnings. J'avais fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define RAND ((double) rand())/((double) RAND_MAX)
    pour avoir une division de double (et non de int). Mais il est vrai que le (double) RAND_MAX m'assure que j'effectue bien une division de double.

    J'ai encore deux autres warnings qui m'intriguent énormément :

    voici le premier

    ../source/mysource/functions.c:233: attention : passage de l'argument n°1 de « calloc » a une largeur différente en raison du prototype
    et voici le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d->name=strdup(id->pdf);
    où d->name et id->pdf sont des char *

    et mon second warning est :

    ../source/mysource/mechanism.c:468: attention : passage de l'argument n°2 de « fgets » a une largeur différente en raison du prototype
    où le code est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while((fgets(line,sizeof line,file)!=NULL) && (strstr(line,"END")==NULL) )
    où j'ai fait :

    Depuis que je compile avec toutes ces options, je pleure devant tous mes warning...

    Merci encore.

  5. #5
    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 salseropom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    d->name=strdup(id->pdf);
    ../source/mysource/functions.c:233: attention : passage de l'argument n°1 de « calloc » a une largeur différente en raison du prototype
    où d->name et id->pdf sont des char *
    C'est plutôt étrange.

    Déjà, il semble que strdup() soit une macro ou une fonction inline implémentée avec calloc(), ce qui est une drôle d'idée...
    Ensuite, il doit y avoir un cast bizarre dans cette implémentation...

    C'est quelle version de gcc ? Je vais essayer de reproduire le défaut chez moi...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while((fgets(line,sizeof line,file)!=NULL) && (strstr(line,"END")==NULL) )
    ../source/mysource/mechanism.c:468: attention : passage de l'argument n°2 de « fgets » a une largeur différente en raison du prototype
    Ce warning est normal. Il montre un bug dans la conception de fgets(). Le type du 2 ème paramètre aurait du être size_t, or il est int, ce qui n'est pas adapté. a part une cast (int), je ne vois pas comment corriger ça...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    while((fgets(line,(int)sizeof line,file)!=NULL) && (strstr(line,"END")==NULL) )
    Nota : la conditiopn ne fonctionnera que si la dernière ligne est incomplète et contient "END". Dans le cas général, il faut penser à netoyer la ligne avant de la tester... (p.e. avec clean(), maintes fois cité...)
    Depuis que je compile avec toutes ces options, je pleure devant tous mes warning...
    C'est normal, c'est fait pour une surveillance du code extrèmement sévère...

    Ce ne sont pas des options de débutants... Je les avais signalées à titre indicatif, mais je ne recommande pas ça à des débutants...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -Wall -Wextra -Wwrite-strings -O2
    est largement suffisant pour commencer.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut Emmanuel, merci de tes explications.
    J'utilise la version gcc 3.3.5

    Ce ne sont pas des options de débutants... Je les avais signalées à titre indicatif, mais je ne recommande pas ça à des débutants...
    J'espère avoir dépassé le niveau débutant... en sachant que je suis encore loin du niveau expert...

    C'est normal, c'est fait pour une surveillance du code extrèmement sévère...
    Bon ça me rassure. Mis à part les warning dûs aux fgets, calloc et strncpy je n'en ai plus d'autres. J'espère que mon code est "bien écrit".

  7. #7
    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 salseropom
    Salut Emmanuel, merci de tes explications.
    J'utilise la version gcc 3.3.5



    J'espère avoir dépassé le niveau débutant... en sachant que je suis encore loin du niveau expert...



    Bon ça me rassure. Mis à part les warning dûs aux fgets, calloc et strncpy je n'en ai plus d'autres. J'espère que mon code est "bien écrit".
    Il peut subsister des warnings (le moins possible, car ça pollue), du moment qu'on sait expliquer qu'ils ne signalent pas un danger.

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

Discussions similaires

  1. Encore des problèmes avec le BDE
    Par Flint dans le forum C++Builder
    Réponses: 19
    Dernier message: 31/12/2007, 23h26
  2. encore des menu popup
    Par meli0207 dans le forum MFC
    Réponses: 8
    Dernier message: 03/06/2005, 15h57
  3. Réponses: 8
    Dernier message: 10/08/2004, 11h49
  4. probleme de date (toujours et encore des dates)
    Par Yannesco dans le forum SQL
    Réponses: 3
    Dernier message: 02/02/2004, 19h04

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