none
le passage de paramètre se fait mal RRS feed

  • Question

  • bonjour, j'ai un problème d'intégrité de données.

    erc  CWfStream::getline( FILE* pFile, System::String^ sLine)
    {
       int len;
       wchar_t sTemp[80];
    	try
    	{
    	   std::fgetws( sTemp, 80, pFile);
    	   sLine = gcnew String( sTemp);
    	   len = sLine->Length;
    	   if( len > 0)
    	   {
    		   return( 0);
    	   }
    	   else
    	   {
    		   if( CWfStream::eof() != false)
    			   return( 1);
    		   else
    			   return( -1);
    	   }
    	}
    	catch(...)
    	{
    		//throw Doc_exception("erreur dans le getline", 0);
    	}
    }

    dans cette méthode la valeur de sline est "[ServerInformation]", ce qui est consistent

    mais au retour dans l'appelant la valeur est "";

    Comment ce fait il qu'un handler System::String^ ne vive pas au delà de la méthode


    Jean Noël Martin

    vendredi 30 octobre 2015 10:43

Réponses

  • J'ai résolue ce problème en changeant l'interface. Au lieu de passer un  System::String^ dont le gcnew a une durée de vie incontrôlable, J'ai passé en paramètre un char sTemp[80], en mettant le gcnew au dessus quand il est nécessaire.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 2 novembre 2015 08:40
    lundi 2 novembre 2015 08:40

Toutes les réponses

  • Bonjour Jean-Noël,

    Pouvez-vous nous envoyer la ligne de l'appelant ?

    Comme ^ designe un handle je pense qu'il suffit de passer un pointer sur cet handle.

    Simplement en rajoutant * dans le parametre et rajouté un * devant sLine.

    CWfStream::getline( FILE* pFile, System::String^ *sLine)
    {
       int len;
       wchar_t sTemp[80];
    	try
    	{
    	   std::fgetws( sTemp, 80, pFile);
    	   *sLine = gcnew String( sTemp);
    

    et pour appeler.

    System::String^ Ret ;

    getline(&Ret);

    Par contre je ne sais pas si c'est une méthode recommandée.

    Cordialement

    Joël

    vendredi 30 octobre 2015 13:34
  • merci de ta réponse;

    C'est du code managé et donc les pointeurs devant un handel est une une méthode non recommandé

    je te passe le code de l’appelant :

    //A variable to hold the fetched line in wstring format
        System::String^ sLine;
        //A variable to hold the position of the searched character
        unsigned int iPos;
        bool b_noMoreLine = false;
        bool b1,b2;
    	sLine = gcnew System::String("");
        //If the INI file is not open then return FAILURE
        if (!CWfStream::is_open())
        {
          return FAILURE;
        }
        //Move the file pointer to the beginning of the file
        CWfStream::seekg(0);
        //Loop till the end of the file
        b1 = CWfStream::eof() != true;
        b2 = b_noMoreLine != true;
        while( b1 && b2)
        {
    		size_t len;
    		int iStatus;
    		//Get a line from the file
    		iStatus = CWfStream::getline( pFile, sLine);
    		const wchar_t* chars = (const wchar_t*)(Marshal::StringToHGlobalUni( sLine)).ToPointer();
    		wchar_t* tmp = (wchar_t*)chars;
    		Marshal::FreeHGlobal( IntPtr( (void*)chars));
    

    c'est la méthode getline qui ne renvoi pas le paramètre sLine.


    Jean Noël Martin

    vendredi 30 octobre 2015 15:28
  • Bonjour,

    Dans ca cas moi je ferrais l'inserve pour la fonction getline.

    Je retournerais la string et je passerais le status comme parametre

    System::String^ getline(FILE* pFile, int *pStatus)
    {
        int len;
        wchar_t sTemp[80];
        System::String ^sLine;
        try
        {
            std::fgetws(sTemp, 80, pFile);
          sLine = gcnew String(sTemp);
    
        }
        //........
        *pStatus = 1; // return Error status
      return sLine;
    }
    


    et pour 'appelant

     System::String ^Ret;
    
        int Error = 0;
        Ret = getline(pFile, &Error);

    Cordialement,

    Joël

    lundi 2 novembre 2015 07:33
  • J'ai résolue ce problème en changeant l'interface. Au lieu de passer un  System::String^ dont le gcnew a une durée de vie incontrôlable, J'ai passé en paramètre un char sTemp[80], en mettant le gcnew au dessus quand il est nécessaire.

    Jean Noël Martin

    • Marqué comme réponse JeanNoel53 lundi 2 novembre 2015 08:40
    lundi 2 novembre 2015 08:40