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 :

error: 'basename' was not declared in this scope basename (argv[0])


Sujet :

C

  1. #1
    Membre très actif
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    172
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 172
    Par défaut error: 'basename' was not declared in this scope basename (argv[0])
    Bonjour tout le monde!

    je suis débutant en c++, j'essaye de compiler un code écrit en c++ qui est normalement correct,
    Alors après la configuration des librairies nécessaire, lorsque je compile le fichier .cpp le curseur se point sur l'instruction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* executable=basename(argv[0]);
    en indiquant une erreur (error: 'basename' was not declared in this scope) :
    J'ai pas compris cette instruction, et je sais pas comment je peux declarer ce basename

    qq'un peut m'aider stp !!

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 633
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 633
    Par défaut
    Salut,

    En deux mots, le compilateur se plaint de ne pas connaitre l'instruction "basename".

    Soit tu as oublié d'inclure le fichier d'en-tête dans lequel elle est déclarée, soit elle se trouve dans un espace de noms, et tu dois utiliser le nom pleinement qualifié.

    Mais il nous sera difficile de t'aider d'avantage tant que nous n'aurons pas plus d'informations:
    1. le contexte (dans quelle fonction fais tu appel à cette instruction, quel est le code de cette fonction )
    2. l'origine de cette instruction (ou se trouve-t-elle, quel est son but, ... )
    Ma boule de crystal est cassée, et comme le réparateur est en vacances, je ne peux donc pas m'en servir pour l'instant
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut !

    koala01 a bon, en C++, tu dois déclarer les fonctions dont tu as besoin en ajouter les fichiers d'en-êtes qui donnent leur définition.

    Sur quelle plateforme compiles-tu ? basename est une fonction du standard POSIX C. Mais attention, l'implémentation par défaut de glibc est différente de celle de la norme. Sous Unix, tu peux avoir cette fonction en ajoutant:

    Sa version C++ dans Visual Studio n'est pas standard non plus.


    Néanmoins, je te déconseille son usage très fortement. La confusion GNU/POSIX est bizarre et la version POSIX de glibc de cette fonction est bugguée.

    Heureusement, il est assez facile de l'implémenter soi-même. En C++ (proposition maison), avec un comportement un peu moins chiant que le standard (qui renvoie une chaîne vide s'il y a un slash à la fin de la chaine) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <string>
     
    namespace my_namespace {
    std::string basename(std::string const& input) {
      std::string cutted_slash = input.substr(0, input.size() - (('/' == input[input.size()-1])?1:0));
      size_t slash_pos = cutted_slash.find_last_of('/');
      return cutted_slash.substr(std::string::npos == slash_pos ? 0 : slash_pos+1);
    }
    }  // namespace my_namespace
    En en C :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *gnu_basename(char *path)
    {
        char *base = strrchr(path, '/');
        return base ? base+1 : path;
    }

    Autre remarque:

    Tu fais un basename sur argv[0], tu supposes donc que argv[0] contient un chemin complet, et j'en déduis que tu es sur Windows, puisque sous Unix, argv[0] ne contient que le nom de l'exécutable. J'ai bon ? Attention à la portabilité

  4. #4
    Membre très actif
    Enseignant Chercheur
    Inscrit en
    Décembre 2011
    Messages
    172
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 172
    Par défaut
    Bonjour
    comme j'ai dit, je suis débutant et je sais pas grand chose,
    cette instruction existe au début de fichier .h qui est un fichier initialisation, de plus la variable "executable" n'est utilise que dans 2 endroits au début et a la fin de fichier initialise.h et voilà comment:
    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
    void arg_parse(int argc, char** argv)
    {
    	int c;
    	char* executable = basename(argv[0]);
    	while((c = getopt (argc, argv, "hS:E:L:W:N:s:t:")) != -1)
    	switch(c) {
    		case 'S':
    ............
    ............
    break;
     
    		default:
    		fprintf(stderr, "error parsing arguments at -%c\n  Try '%s -h' for help.", c, executable );
    		abort();
    	}
    }
     
    #endif /*INITIALIZE_H_*/
    je suis sous Xindows xp, éditeur: code:blocks et compilateur:MinGW

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Hello

    comme j'ai dit, je suis débutant et je sais pas grand chose
    Pas de souci, mais il faut faire l'effort de comprendre, nous n'allons pas juste corriger le code à ta place . Je t'ai donné toutes les clés pour régler ton problème, qu'est ce qui bloque ?

    Remarque:
    Les fichiers *.h ne sont pas des "fichiers d'initialisation" mais une convention de nom de fichier pour ranger les déclarations. Dans ton cas, la fonction arg_parse est implémentée dans ton *.h, alors qu'idéalement, elle devrait seulement y être déclarée et être implémentée dans un fichier *.cpp séparé. Ce n'est sûrement pas de ta faute mais c'est bien de le savoir.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/12/2013, 18h13
  2. error : 'tr' was not declared in this scope
    Par jimaitou dans le forum Débuter
    Réponses: 3
    Dernier message: 13/05/2009, 13h54
  3. getaddrinfo was not declared in this scope ?
    Par dr.c0der_ dans le forum C
    Réponses: 2
    Dernier message: 30/04/2009, 02h14
  4. QFormLayout was not declared in this scope
    Par kronos85 dans le forum Débuter
    Réponses: 5
    Dernier message: 11/12/2008, 02h30
  5. Réponses: 3
    Dernier message: 03/06/2007, 15h29

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