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 :

Pb lors de la compilation sur appel ftw()


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Bonjour à tous,

    Je préfère prévenir de suite : j'ai quelques notions en langage C mais sans plus.
    Je présente mon problème : suite à un changement de machine Unix, un programme permettant de faire des stats ne fonctionne plus correctement. Il a été développé il y a quelques années.
    J'ai tenté de le recompiler sur la nouvelle machine et j'ai ce message d'erreur (warning) :
    "statsMens.c", line 315: warning: argument #3 is incompatible with prototype:
    prototype: pointer to function(pointer to const char, pointer to const struct stat {unsigned long st_dev, array[3] of long st_pad1, unsigned long st_ino, unsigned long st_mode, unsigned long st_nlink, long st_uid, long st_gid, unsigned long st_rdev, array[2] of long st_pad2, long st_size, long st_pad3, struct timespec {..} st_atim, struct timespec {..} st_mtim, struct timespec {..} st_ctim, long st_blksize, long st_blocks, array[16] of char st_fstype, array[8] of long st_pad4}, int) returning int : "ftw.h", line 107
    argument : pointer to function(pointer to char, pointer to struct stat {unsigned long st_dev, array[3] of long st_pad1, unsigned long st_ino, unsigned long st_mode, unsigned long st_nlink, long st_uid, long st_gid, unsigned long st_rdev, array[2] of long st_pad2, long st_size, long st_pad3, struct timespec {..} st_atim, struct timespec {..} st_mtim, struct timespec {..} st_ctim, long st_blksize, long st_blocks, array[16] of char st_fstype, array[8] of long st_pad4}, int) returning int
    sur mon programme c, j'effectue l'appel suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftw(nomRepertoireStats, traiteFS, 10);
    Pouvez-vous m'aider ?
    N'hésitez pas à me demander plus d'infos si besoin.

  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
    Apparemment, tu as une fonction avec le prototype
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int NomFonction(char *, struct stat *, int);
    Que tu passes en troisième paramètre d'une fonction demandant un pointeur sur fonction.

    Tu dois modifier le prototype de ta fonction pour qu'il devienne ceci, et ça devrait compiler:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    int NomFonction(char const *, struct stat const *, int);

    PS: Par curiosité, quel est ton compilateur?
    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 averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Merci pour ce retour rapide.

    En effet, il s'agissait de la fonction traiteFS que j'ai donc modifiée :
    int traiteFS(char const * entreeRep, struct stat const * statFic, int type)

    Je n'ai plus l'erreur précédente mais de nouvelles erreurs liées certainement à cette modification.

    "statsMens.c", line 28: warning: argument #1 is incompatible with prototype:
    prototype: pointer to void : "/usr/include/iso/stdlib_iso.h", line 125
    argument : pointer to const char
    "statsMens.c", line 266: warning: argument #1 is incompatible with prototype:
    prototype: pointer to char : "statsMens.c", line 244
    argument : pointer to const char
    "statsMens.c", line 271: warning: argument #1 is incompatible with prototype:
    prototype: pointer to char : "statsMens.c", line 114
    argument : pointer to const char
    "statsMens.c", line 272: warning: argument #1 is incompatible with prototype:
    prototype: pointer to char : "statsMens.c", line 244
    argument : pointer to const char
    "statsMens.c", line 290: left operand must be modifiable lvalue: op "="
    cc: acomp failed for statsMens.c
    Pour les erreurs sur les lignes 266,270 et 271, j'ai corrigé en remplaçant les arguments des autres fonctions pour que l'on pointe sur un "const char" et non un char.

    Pour les lignes ci-dessous, je ne vois pas :
    Ligne 28 : free(nomSgiv); cette commande est appelée dans la fonction void sortie(int code)

    Ligne 290 : nomSgiv[0] = '\0';

    D'avance merci pour votre aide.

    PS : compilation avec SunStudio V11

  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
    On ne peut pas faire un free sur quelque chose de const, donc il faudrait que j'en sache plus sur la fonction en question.
    Pareil pour 290, où l'on tente apparemment de tronquer une chaîne const. Soit il y a une faille dans le design, soit je ne sais pas trop...

    Toujours est-il que ni la fonction passée en paramètre, ni les fonctions qu'elle appelle, n'ont désormais le droit de modifier la chaîne ou les données contenues dans la structure pointée.
    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 averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Est-il possible de modifier le header ftw.h plutôt que de modifier le programme ?
    C'est-à-dire de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int ftw(const char *, int (*)(const char *, const struct stat *, int),int);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int ftw(const char *, int (*)(char *, struct stat *, int),int);
    Y'a-t-il un risque ?

  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
    Je dirais qu'il y a toujours un risque à virer des const.
    Faire ça au niveau du header, c'est encore pire que la solution "sale" que j'envisageais.
    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
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Oups !! Je préfère passer pour un imbécile que faire une connerie

    Quelle est la solution "sale" ?

  8. #8
    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
    Mettre un cast "à la porc" dans la(les) fonction(s) qui a(ont) besoin de modifier la chaîne.

    Mais je le répète, modifier/détruire la chaîne dans le callback est-il vraiment nécessaire?
    Ne peux-tu absolument pas faire autrement? Car ce n'est, de toute évidence, pas la façon dont ftw() est supposée être utilisée.
    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.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Bonjour,

    J'ai retiré l'appel free qui semble-t-il ne sert pas (sauf cas extrême).

    Il me reste donc le problème sur la ligne nomSgiv[0] = '\0';
    La variable nomSgiv est déclaré précédemment de cette façon :
    nomSgiv = (char *)malloc(LG_REP * sizeof(char));

    Comment fonctionne le cast ?

  10. #10
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Il n'y a pas à discuter ici, le prototype de la fonction ftw() est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int ftw(const char *path, 
            int (*fn)(const char *, const struct stat *ptr, int flag), 
            int ndirs);
    le pointeur de fonction passé en paramètre doit respecté le prototype, point barre.

    Pour la fonction malloc(), la forme canonique est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type identifiant = malloc(nombre_element * sizeof *identifiant);
    ce qui donne dans ton cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * nomSgiv = malloc(LG_REP * sizeof *nomSgiv);
    Cordialement.

  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
    Peux-tu poster un code minimal et compilable (plus ou moins) qui reproduit la situation?

    Je voudrais comprendre exactement pourquoi l'on cherche à tronquer la chaîne dans la fonction callback plutôt qu'ailleurs...
    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
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Je voudrais comprendre exactement pourquoi l'on cherche à tronquer la chaîne dans la fonction callback plutôt qu'ailleurs...
    On ne peut pas la tronquer, la fonction ftw() n'est pas réentrante, la chaine dont tu parles est statique et représente successivement un objet dans le répertoire path.

  13. #13
    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
    Ce n'est pas à moi qu'il faut dire ça.
    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.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Bon, j'ai modifié la déclaration de la variable nomSgiv et à la compilation, je n'ai plus d'erreur.
    Mais le binaire génère un core à l'exécution !

    Je pense que c'est lié à l'allocation mémoire pour la variable nomSgiv qui n'est pas libérée.

    Comment la libérer ?

  15. #15
    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
    Poste ton code, s'il te plait.
    Il nous faut tout depuis la déclaration des variables jusqu'à la fin de leur durée de vie, en passant par l'appel à ftw(), la fonction passée en callback et toutes les fonctions qu'elle appelle et qui travaillent sur la chaîne.
    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.

  16. #16
    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
    C'est un nombre affreux de variables globales, ça.
    Enfin si j'en crois la doc de ftw(), on n'a pas trop le choix.

    J'examine le code d'un peu plus près...
    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 Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    C'est un nombre affreux de variables globales, ça.
    Enfin si j'en crois la doc de ftw(), on n'a pas trop le choix.
    Je suis d'accord avec toi, mais les variables devraient au moins être déclarés statiques. Le code est trop horrible pour que je me penche dessus, ça ne tiendrais qu'à moi je referai tout, je n'en ai ni le temps ni l'envie, bon courage.

  18. #18
    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
    Bon, j'ai réussi à faire compiler le code en C (pas pseudo-C++) sous mon visual sans ftw().

    Je n'avais pas pigé au début qu'on bossait sur des globales. Je vais voir si je peux comprendre ce code avec les globales préfixées de g_...
    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.

  19. #19
    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
    Je déclare officiellement ce thread mon liveblog du code de slm59.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char * getNom(char const * path)
    {
    	/* extrait le base name du path passe en parametre */
    	char * tmp = strdup(path);
    	char * res = tmp;
     
    	while (*tmp != '\0')
    		if(*tmp++ == '/') res=tmp;
    	return res;
    }
    Très joli. On cumule une réinvention de strrchr() et une fuite de mémoire.

    Aussi, je me demande pourquoi on se fatigue à allouer dynamiquement les buffers en variable globale; je vais les allouer statiquement à la place.
    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.

  20. #20
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 19
    Par défaut Pb lors de la compilation sur appel ftw()
    Pas de souci Nicolas.
    J'aimerais bien refaire le code mais avec le peu de connaissances que j'ai en C, ça risque d'être long, très long ...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Erreur lors de la compilation sur Mac OS X 10.8.2
    Par Battant dans le forum Débuter
    Réponses: 4
    Dernier message: 12/10/2012, 08h04
  2. Réponses: 8
    Dernier message: 06/12/2009, 23h00
  3. Appel de fichier lors de la compilation
    Par Pioupiou67 dans le forum Ada
    Réponses: 5
    Dernier message: 12/03/2008, 00h02
  4. Erreur sur make dep lors de la compilation du noyau
    Par jynxi dans le forum Administration système
    Réponses: 1
    Dernier message: 31/05/2007, 14h37
  5. Réponses: 4
    Dernier message: 25/09/2006, 10h24

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