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 :

besoin d'aide sur des warnings


Sujet :

C

  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 besoin d'aide sur des warnings
    Bonjour, j'ai le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char seed[50];
    /* ici, dans une sous-fonction je copie dans seed une string */
     
    /* initialisation of the pseudo-random numbers generator seed */
      unsigned seed_=(!strcmp(seed,"TIME")) ? (unsigned) time(NULL) : strtol(seed,&seed,10);
    j'ai le warning suivant :

    ../Sources/Mysources/main.c:454: warning: passing arg 2 of `strtol' from incompatible pointer type
    pourtant j'ai bien mis un

    autre warning : dès que je fais un strdup() j'ai le warning suivant

    ../Sources/Mysources/main.c:520: warning: passing arg 1 of `calloc' with different width due to prototype
    je sais que dans un strdup il y a un malloc (ou plutôt un calloc vu le warning), mais comment puis-je l'enlever ?

    Voici mes options de compil (chopées sur la page d'Emmanuel Delahaye)

    ED_PARANOIA=-O2 -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 \
    -Wunreachable-code
    merci beaucoup.

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Un tableau de char est implicitement convertible en char*, mais n'est pas un vrai char*. Tu ne peux donc pas passer son adresse à une fonction qui demande un pointeur vers un char*.
    Tu dois créer une seconde variable, de type char* celle-ci, et passer son adresse à strtol().
    Ou passer NULL à la place, si tu ne l'utilises 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
    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
    Citation Envoyé par Médinoc Voir le message
    Un tableau de char est implicitement convertible en char*, mais n'est pas un vrai char*. Tu ne peux donc pas passer son adresse à une fonction qui demande un pointeur vers un char*.
    Tu dois créer une seconde variable, de type char* celle-ci, et passer son adresse à strtol().
    Ou passer NULL à la place, si tu ne l'utilises pas.
    OK, merci, c'est réglé. Et pour le second warning, quelqu'un aurait-il une idée ?

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Vu que je ne vois pas l'appel, ce n'est pas évident.
    Et regarde si strdup() n'est pas une macro ou une fonction inline...
    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.

  5. #5
    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
    Voici qq passages lorsque j'utilise strdup()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * p=strstr(line,"COMPEGR ");
    p+=8; /* 8 = strlen("COMPEGR ") */
    id->egr->comp=strdup(p);
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NameFileOutput[N+5]=strdup("Turbulence.txt");

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    OK, ça a l'air correct.
    Épluche un peu les en-têtes...
    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.

  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 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char seed[50];
    /* ici, dans une sous-fonction je copie dans seed une string */
     
    /* initialisation of the pseudo-random numbers generator seed */
      unsigned seed_=(!strcmp(seed,"TIME")) ? (unsigned) time(NULL) : strtol(seed,&seed,10);
    Normal. le 2ème paramètre de strtol() attends l'adresse d'un pointeur sur char et non l'adresse d'un tableau de 50 char.

    Il faut donc lui fournir un pointeur sur char :
    et lui passer son adresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       strtol (seed, &pend, 10);
    en admettant que tu l'utilises par la suite. Si c'est pour ne pas l'utiliser, passer NULL directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       strtol (seed, NULL, 10);
    Rien de tout cel ne tombe du ciel, mais est expliqué dans le doc de strtol()...

  8. #8
    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
    Re,
    man strdup() me donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     char * strdup (const char *s);
    j'avoue que je ne vois pas trop où est le problème. Mais le problème est dans l'appel de calloc() par strdup(). A croire que cette fonction est "mal appelée"...

  9. #9
    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 Voir le message
    Voici qq passages lorsque j'utilise strdup()
    strdup() n'est pas standard. Tu as inclus ce qu'il faut pour ton compilateur ? (en principe <string.h>)

    Vérifie qu'il n'y a pas une macro 'strdup' parasite définie dans un de tes headers d'application ou 'maison'...

  10. #10
    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
    Citation Envoyé par Emmanuel Delahaye Voir le message
    strdup() n'est pas standard. Tu as inclus ce qu'il faut pour ton compilateur (en principe <string.h>)

    Vérifie qu'il n'y a pas une macro 'strdup' parasite définie dans un de tes headers d'application ou 'maison'...
    oui

    dans /usr/include/string.h j'ai

    #if defined __USE_SVID || defined __USE_BSD || defined __USE_XOPEN_EXTENDED
    /* Duplicate S, returning an identical malloc'd string. */
    extern char *strdup (__const char *__s)
    __THROW __attribute_malloc__ __nonnull ((1));
    #endif
    et dans /opt/dietlibc/include/string.h j'ai

    char *strdup(const char *s) __THROW __attribute_malloc__ ;
    j'ai fait un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    find / -name string.h

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    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 397
    Par défaut
    Apparemment, c'est plutôt du côté d'une macro ou fonction inline qu'il faut chercher.

    Fais un grep avec "strdup" sur tous les fichiers d'en-tête standard + les fichiers des bibliothèques utilisées ou de ton programme, etc.

    Voire même, passe directement ton code au préprocesseur (cpp) et fais un grep strdup dessus...
    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.

  12. #12
    Expert confirmé

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par salseropom Voir le message
    Voici qq passages lorsque j'utilise strdup()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char * p=strstr(line,"COMPEGR ");
    p+=8; /* 8 = strlen("COMPEGR ") */
    id->egr->comp=strdup(p);
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NameFileOutput[N+5]=strdup("Turbulence.txt");
    Dans le 2ième passage, ton tableau NameFileOutput est un tableau de char * ??
    (char **Name.. suivi d'un alloc, ou bien char *Name...[50], mais PAS char *Name.. suivi d'un alloc, ou char Name..[50] ? )

    Parce que si c'est un tableau de char, tu veux stocker un char* dans un char...

  13. #13
    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
    Citation Envoyé par souviron34 Voir le message
    Dans le 2ième passage, ton tableau NameFileOutput est un tableau de char * ??
    (char **Name.. suivi d'un alloc, ou bien char *Name...[50], mais PAS char *Name.. suivi d'un alloc, ou char Name..[50] ? )

    Parce que si c'est un tableau de char, tu veux stocker un char* dans un char...
    salut,
    j'ai fait ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char * NameFileOutput[nbfile];
    et ensuite je fais des

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NameFileOutput[i]=strdup("blabla");
    puis je fais (à la fin)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    free(NameFileOutput[i]), NameFileOutput[i]=NULL; (pour 0 <= i < nbfile)

Discussions similaires

  1. Besoin d'aide sur des images
    Par Kro86 dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 13/06/2008, 11h11
  2. Réponses: 3
    Dernier message: 09/04/2008, 14h24
  3. Besoin d'aide sur des requetes
    Par lamorkytu dans le forum Langage SQL
    Réponses: 5
    Dernier message: 25/01/2008, 05h31
  4. Achat pc desktop, besoin d'aide sur le choix des composants
    Par Matalobos dans le forum Ordinateurs
    Réponses: 29
    Dernier message: 25/08/2007, 23h16
  5. [Regex] besoin d'aide sur des motifs
    Par Oluha dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/11/2005, 11h23

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