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 :

warnings à la compilation


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Par défaut warnings à la compilation
    Bonjour.
    j'ai fait un petit programme qui est en fait un split. C'est très très basique mais c'était pour le plaisir
    Voici donc le code :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <vector>
    using namespace std;
     
    int main(int argc, char *argv[]) {
     
    	ifstream SOURCE("Fichier.txt", ios::in);
    	if(!SOURCE) {
    		cerr << "Impossible d'ouvrir le fichier !" << endl;
    		exit(1);
    	}
     
    	string s;
    	vector<string> mots;
     
    	while(getline(SOURCE, s)) {
    		bool done = false;
    		while(!done) {
    			int emplacement = s.find(" ");
    			if(emplacement == string::npos) {
    				done = true;
    			}
    			else {
    				string mot = s.substr(0, emplacement);
    				mots.push_back(mot);
    				s = s.substr(emplacement+1, s.size());
    			}
    		}
    	}
     
    	for(size_t i = 0; i < mots.size(); ++i)
    		cout << mots[i] << endl;
     
    	mots.clear();
     
    	(void) argc;
    	(void) argv;
     
    	return 0;
    }
    Mon soucis c'est qu'à la compilation j'ai ce warning :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g++ -Wall -W -pedantic -ansi split.cpp -o split
    split.cpp: In function ‘int main(int, char**)’:
    split.cpp:22: attention : comparaison entre des expressions entières signée et non signée
    J'aimerai bien éviter de l'avoir mais ... je ne sais pas comment modifier mon code pour le plus avoir ceci

    [edit] Je viens de trouver une solution mais je ne sais pas si c'est vraiment super. J'ai modifier la ligne pour avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(emplacement == (int) string::npos) {
    Y a t il une meilleure solution ?

  2. #2
    Membre éprouvé Avatar de BoudBoulMan
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par défaut
    Le compilateur t'indique que tu compares deux variables de types différents (un int et un unsigned int). La solution est donc bien de caster l'une des deux variables dans le type de l'autre variable, ce que tu as fait en mettant (int)string::npos.
    Tu aurais pu caster la variable 'emplacement' mais cela ne donne aucun avantage par rapport au cast que tu as fait.

    Je ne pense pas qu'il y ait d'autres solutions.

  3. #3
    Membre confirmé Avatar de babar63
    Homme Profil pro
    Développeur jeux vidéos/3d Temps réel
    Inscrit en
    Septembre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur jeux vidéos/3d Temps réel

    Informations forums :
    Inscription : Septembre 2005
    Messages : 241
    Par défaut
    Dans ton cas emplacement ne prends pas de valeurs négatives je suppose? Si c'est le cas alors il est préférable de le déclarer directement en unsigned int, cela t'évitera aussi le cast par la même occasion...

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Par défaut
    Bonjour,

    attention, string::find et string::pos renvoient tous les deux un size_t (généralement un typedef sur unsigned int).

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il faut juste utiliser le type correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    std::string::size_type emplacement = s.find(" ");
    if(emplacement == string::npos) {
      done = true;
    }
    ...
    MAT.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Bonjour,

    attention, string::find et string::pos renvoient tous les deux un size_t (généralement un typedef sur unsigned int).
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Il faut juste utiliser le type correct :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    std::string::size_type emplacement = s.find(" ");
    if(emplacement == string::npos) {
      done = true;
    }
    ...
    MAT.
    Exact, il faut mettre un size_t emplacement
    Merci

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par ChipsterJulien Voir le message
    Exact, il faut mettre un size_t emplacement
    Techniquement c'est un std::string::size_type, mais bon oui en pratique derrière tout ça c'est des unsigned int.

    MAT.

  8. #8
    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
    Ou plutôt des size_t, non?
    (ce n'est pas forcément la même chose quand tu passes en 64 bits)
    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 Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Ou plutôt des size_t, non?
    Non non c'est bien des std::string::size_type, cf. par exemple http://cppreference.com/cppstring/find.html.

    MAT.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Non non c'est bien des std::string::size_type, cf. par exemple http://cppreference.com/cppstring/find.html.

    MAT.
    Ok, j'ai intérêt de faire attention alors car moi j'ai utilisé size_t donc je risquerai de faire des bourdes de programmations

  11. #11
    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 ne disais pas ça pour string_type, mais pour unsigned int.
    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 chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Non non c'est bien des std::string::size_type, cf. par exemple http://cppreference.com/cppstring/find.html.
    Allons plutôt à la source de l'information : C++ draft (N2451). Suivez le guide!

    Commençons par 21.2 String classes [string.classes] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef basic_string<char> string;
    défini par 21.3 Class template basic_string [basic.string] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
    class basic_string {
        typedef typename Allocator::size_type size_type;
    allons voir 20.6.1 The default allocator [default.allocator] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <class T> class allocator {
    public:
    typedef size_t size_type;
    Voilà : pas la peine de s'embarrasser avec une notation lourde, size_t est strictement équivalent à string::size_type.

    CQFD

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 126
    Par défaut
    Citation Envoyé par corrector Voir le message
    Allons plutôt à la source de l'information : C++ draft (N2451). Suivez le guide!

    Commençons par 21.2 String classes [string.classes] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef basic_string<char> string;
    défini par 21.3 Class template basic_string [basic.string] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class charT, class traits = char_traits<charT>,
    class Allocator = allocator<charT> >
    class basic_string {
        typedef typename Allocator::size_type size_type;
    allons voir 20.6.1 The default allocator [default.allocator] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <class T> class allocator {
    public:
    typedef size_t size_type;
    Voilà : pas la peine de s'embarrasser avec une notation lourde, size_t est strictement équivalent à string::size_type.

    CQFD
    Merci pour ces renseignements

  14. #14
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Ca va être chaud alors pour couper un ficher de 6Go dans un programme 32 bits !

    Moi qui croyais qu'une position dans un fichier était un fpos_t... soit... un unsigned __int64 qu'on soit sous 32 ou 64 bits.

  15. #15
    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
    Sous POSIX, il me semble que c'est un off_t ou (hélas) un ssize_t, mais donc rien qui fasse 64bits sous 32bits...

    À ma connaissance, il n'y a rien en standard pour ça, mais il y a des extensions sous certains systèmes (Windows propose fseek64() pour les fichier C)...
    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
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 439
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Ca va être chaud alors pour couper un ficher de 6Go dans un programme 32 bits !
    Je ne vois pas du tout le rapport.

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

Discussions similaires

  1. Enlever les warnings à la compilation
    Par piotrr dans le forum Général Java
    Réponses: 3
    Dernier message: 29/10/2007, 19h02
  2. [GCC] warning de compil
    Par AcidBurn37 dans le forum C
    Réponses: 2
    Dernier message: 22/10/2007, 13h11
  3. problème de warning en compilant win32 + directx
    Par madcode dans le forum VC++ .NET
    Réponses: 4
    Dernier message: 17/10/2006, 16h58
  4. Réponses: 8
    Dernier message: 23/08/2006, 18h40
  5. Petits warnings apres compilation sous Solaris
    Par Thordax dans le forum C++
    Réponses: 22
    Dernier message: 04/07/2006, 09h45

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