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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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
    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 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
    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 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 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.

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

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