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++/CLI Discussion :

warning C4800 :Conversion forcée de char* en bool!


Sujet :

C++/CLI

  1. #1
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut warning C4800 :Conversion forcée de char* en bool!
    Bonjour
    Je n'arrive pas à comprendre pourquoi quand je compile :
    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
    void enregistrementErreur ( int compte, ... )
    {
    	va_list liste;
    	va_start( liste, compte);
    	char* text;
     
    	DateTime^ DateEtHeure = gcnew DateTime;
    	DateEtHeure = DateTime::Now;
     
    	//Ouverture du fichier journal
    	String^ path = Directory::GetCurrentDirectory() + "\\EnregistrementErreurs.txt";
     
    	StreamWriter^ sw = File::AppendText ( path );
    	sw->WriteLine( DateEtHeure );
     
    	for ( int i = 0; i < compte; i++ )
    	{
    		text = va_arg ( liste, char* ); //ICI text = "test" par exemple
    		sw->Write ( "essai" );
    		sw->Write ( text );   //warning C4800 ICI!!! ????
    	}
    	sw->WriteLine();
     
    	//Cloture du fichier journal
    	if ( sw )
    		delete (IDisposable^)sw;
     
    	va_end( liste );
     
    }
    le compilateur me dit :
    .\Annexes.cpp(312) : warning C4800: 'char *': valeur forcée à la valeur booléenne 'true' ou 'false' (avertissement sur les performances)
    Là je ne comprends pas ce qu'il se passe!

    Mais pourquoi donc, la variable, char* text, est elle convertie en bool à l'éxécution de sw->Write ( text );alors que sw->Write ( "essai" ); ecrit bien "essai" dans le fichier journal?

    J'ai essayé de remplacer char* text; par wchar_t text; ... là ça plante à l"éxécution! A la ligne text = va_arg ( liste, wchar_t ); j'ai :
    Une exception non gérée du type 'System.InvalidCastException' s'est produite dans essai.exe
    Informations supplémentaires*: Le cast spécifié n'est pas valide.


    Merci de m'aider

  2. #2
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut J'ai contourné le problème :
    Salut,
    J'ai préféré refaire ma fonction en c++natif et ça marche :
    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
    void enregistrementErreur ( int compte, ... )
    {
    	va_list liste;
    	char dateStr [9];
    	char timeStr [9];
    	char* fichier = "EnregistrementErreurs.txt";
     
    	_strdate_s( dateStr );
    	_strtime_s( timeStr );
     
    	//Ouverture du fichier journal
    	std::ofstream journal ( fichier, std::ios_base::app );
     
    	//Date et heure de l'évennement
    	journal << dateStr << " " << timeStr << std::endl;
     
    	//Envoi de la liste d"arguments dans le fichier journal
    	va_start( liste, compte);
    	for ( int i = 0; i < compte; i++ )
    	{
    		journal << va_arg ( liste, char* );
    	}
    	journal << std::endl;
     
    	//Cloture du fichier journal
    	journal.close();
     
    	va_end( liste );
    }
    Le problème est contourné...

    ...Mais j'aimerai comprendre pourquoi, dans la première version ( en c++/cli ) j'ai une conversion forcée de char* en bool.
    Si quelqu'un peut m'expliquer? Merci.

  3. #3
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut char ,exception bool
    bonjour ,
    Doc msdn lib fournit ceci en ce qui concerne le tableau des equivalences de type entre c++ et c++ managed(c++/cli):
    c++ : signed char -> c++/cli System.SByte (entier signe 8 bits)
    c++ : unsigned char -> c++/cli System.Byte (entier non signe 8 byte)

    c++ : wchar_t -> c++/cli System.Char(un caractere unicode-2octets ).

    il faudrait donc ecrire :
    ------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char   texte [12] ;//ici un tableau de System.Byte
    pour imprimer il faudrait convertir en caractere unicode(wide byte)

    quand à :
    ---------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sw->Write ( "essai" );  /il est interprete comme un string
    comme si tu ecris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string^   texte="essai"
    sw->Write ( texte );
    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
     
    / appCliChar.cpp*: fichier projet principal.
     
    #include "stdafx.h"
     
    using namespace System;
     
    int main(array<System::String ^> ^args)
    {
    	/*ici exemple tableau directemement initialise*/
    	/*char monTexte[5] = {'a', 'b', "cd"};*/
    	char monTexte[5];
    	String^ texto="essai";
    	for( int i=0 ;i<5;i++)
    	{
    	//notez les guillemets simples pour un carcatere-pas une chaine
    	monTexte[i]='a';
                 }
     
        Console::WriteLine(L"conversion");
        Console::WriteLine(texto);
     
        for( int i=0 ;i<5;i++)
    	{
    	//convertir char en chaine unicode
    	  Console::WriteLine((wchar_t) monTexte[i]);
    	 }
    	Console::WriteLine(L"termine");
        return 0;
    }
    bon code ....

  4. #4
    Membre éclairé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Points : 827
    Points
    827
    Par défaut
    Merci,
    C'était tout simple, avec la réponse de MABROUKI, j'ai eu l'idée d'aller voir là : http://dotnet.developpez.com/faq/cpp...n#chartostring et la solution en C++/CLI devient évidente :
    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
    void enregistrementErreur ( int compte, ... )
    {
    	va_list liste;
    	va_start( liste, compte);
    	char* text;
     
    	DateTime^ DateEtHeure = gcnew DateTime;
    	DateEtHeure = DateTime::Now;
     
    	//Ouverture du fichier journal
    	String^ path = Directory::GetCurrentDirectory() + "\\EnregistrementErreurs.txt";
     
    	StreamWriter^ sw = File::AppendText ( path );
    	sw->WriteLine( DateEtHeure );
     
    	for ( int i = 0; i < compte; i++ )
    	{
    		text = va_arg ( liste, char* ); //ICI text = "test" par exemple
    		String^ text_convert = gcnew String ( text );
    		sw->Write ( "essai" );
    		sw->Write ( text_convert );   //conversion forcée éliminée!!
    	}
    	sw->WriteLine();
     
    	//Cloture du fichier journal
    	if ( sw )
    		delete (IDisposable^)sw;
     
    	va_end( liste );
    }
    @MABROUKI :
    Ton code m'a aidé à trouver la solution mais je ne comprends pas l'intéret de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for( int i=0 ;i<5;i++)
    	{
    	//notez les guillemets simples pour un carcatere-pas une chaine
    	monTexte[i]='a';
                 }
    dans ta réponse...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/03/2014, 12h16
  2. Réponses: 3
    Dernier message: 04/05/2010, 08h58
  3. Réponses: 2
    Dernier message: 08/12/2009, 12h57
  4. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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