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 :

un comportement pas cohérent


Sujet :

C++/CLI

  1. #1
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut un comportement pas cohérent
    Bonjour
    J'ai un comportement qui n'est pas cohérent
    les variables son positionné dans une methode:
    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
    			vWord = sFlex.substr( 0, mpos);
    			LWord += "/NNP";
    			pNextWord = new stAnalysedWord();
    			pNextToken = (char*)LWord.c_str();
    			pNextWord->wsWord = L"/";
    			pNextWord->wsLemma = L"/";
    			pNextWord->POS = POS_MARK;
    			pNextWord->ulStart = *ulWordNumber;
    			pNextWord->ulLength = 1;
    			pNextWord->iExcluded = 0;
    			pNextWord->Gender = GENDER_NONE;
    			pNextWord->iNbr = NBR_NONE;
    			pNextWord->iPers = PERS_NONE;
    			pNext2Word = new stAnalysedWord();
    			s = CStrConv::ambstowcs((char*)vWord.c_str());
    			pNext2Word->wsWord = s;
    			pNext2Word->wsLemma = s;
    			CStrConv::StrFreeW( s);
    			pNext2Word->POS = POS_NAMED_ENTITY;
    			pNext2Word->ulStart = *ulWordNumber + 1;
    			pNext2Word->ulLength = 1;
    			pNext2Word->iExcluded = 4;
    			pNext2Word->Gender = GENDER_MASCULINE;
    			pNext2Word->iNbr = NBR_SING;
    			pNext2Word->iPers = PERS_NONE;
    			pNext3Word = new stAnalysedWord();
    			pNext3Word->wsWord = L".";
    			pNext3Word->wsLemma = L".";
    			pNext3Word->POS = POS_STOPMARK;
    			pNext3Word->ulStart = *ulWordNumber + 2;
    			pNext3Word->ulLength = 1;
    			pNext3Word->iExcluded = 1;
    			pNext3Word->Gender = GENDER_NONE;
    			pNext3Word->iNbr = NBR_NONE;
    			pNext3Word->iPers = PERS_NONE;
    Sous debugger les pointeurs sont mis non définis;
    Elles sont accédées dans la méthode appelante. Je vous met le code et mes commentaires
    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
    		if( pAnalysedWord != nullptr)
    		{
    			bIsAllocated = true;
    			pNextWord = pAnalysedWord;
    		}
    		if(pNext2Word != nullptr)
    		{
    			bDoubleAllocated = true;
    		}
    		if( pNext3Word != nullptr)
    		{
    			bTripleAllocated = true;
    		}
          *ulWordNumber = *ulWordNumber + 1;
    	  pAnalWord->push_back( pAnalysedWord);
    	  if( bIsAllocated == true)
    	  {
    		  *ulWordNumber = *ulWordNumber + 1;
    		  pAnalWord->push_back( pNextWord);
    		  bIsAllocated = false;
    	  }
    	  if( bDoubleAllocated == true)
    	  {
    		  *ulWordNumber = *ulWordNumber + 1;
    		  pAnalWord->push_back( pNext2Word);
    		  bDoubleAllocated = false;
    	  }
    	  if( bTripleAllocated == true)
    	  {
    		  *ulWordNumber ++;
    		  // il y a a mettre le point dans un chunk
    		  // en fait a ce point ce n'est pas nécéssaire
    		  pAnalWord->push_back( pNext3Word);
    		  bTripleAllocated = false;
    	  }
    Dans cette séquence on passe par le premier test
    mais on ne passe pas ni dans le second ni dans le troisième
    ce problème est bloquant.
    qui m'aidera sera

  2. #2
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Bonjour,

    Tu as 3 conditions. Si tu es sur que tu ne rentre jamais ni dans la deuxième ni dans la troisième, c'est forcement qu'au moment de l'évaluation de la condition, ces 2 variables (pNext2Word & pNext2Word) valent NULL.

    Je ne vois pas d'erreur directement dans ton code.
    • Teste le retour de tes new.
    • Vérifie qu'entre la création de ces variable et l'appel de la condition tu ne modifie pas les variables


    Par ailleurs tu devrais factoriser ton code, cela te donnerais un code plus maintenable et où tu trouverais plus facilement tes erreurs. Parce qu'actuellement ton code est vraiment sale. Essaye d'utiliser le moins possible new (préfère mon_objet(mes_valeurs_d_initialisation).

    Je vous met le code et mes commentaires

    [...]

    // il y a a mettre le point dans un chunk
    // en fait a ce point ce n'est pas nécéssaire
    Merci beaucoup pour tes commentaires, ils m'ont énormément aidé à comprendre ton code :p

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par emixam16 Voir le message
    Teste le retour de tes new.
    Ne sert à rien C'est un comportement venant du C, mais en C++ new jette une exception

    Page de l'opérateur new:

    The first version (1) throws bad_alloc if it fails to allocate storage.
    Otherwise, it throws no exceptions (no-throw guarantee).

  4. #4
    Membre chevronné
    Avatar de emixam16
    Homme Profil pro
    Chercheur en sécurité
    Inscrit en
    Juin 2013
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

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

    Informations forums :
    Inscription : Juin 2013
    Messages : 333
    Points : 1 828
    Points
    1 828
    Par défaut
    Au temps pour moi foetus, je devais pas être très attentif en répondant.
    Mais du coup ça simplifie ton problème! T'as plus qu'a regarder (en t'aidant du débogueur si tu veux) quand tes objets sont modifiés/supprimés.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    mais en C++ new jette une exception
    Ce comportement est modifiable en fonction des options de compilation.
    Mais bon, vous savez, avec @JeanNoel53, cherchez pas trop la petite bête, ces boulettes sont si énormes.

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par JeanNoel53 Voir le message
    pNextToken = (char*)LWord.c_str();
    Bzzt! Perdu!
    Merci d'avoir joué.


    Citation Envoyé par JeanNoel53 Voir le message
    s = CStrConv::ambstowcs((char*)vWord.c_str());
    Alors là, c'est encore plus absurde, parce que je suis absolument certain que ambstowcs n'a pas besoin d'un pointeur non-const (et si la fonction en nécessite incorrectement un, prendre une version correcte).


    Citation Envoyé par JeanNoel53 Voir le message
    Code erroné : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    *ulWordNumber = *ulWordNumber + 1;
    ...
    *ulWordNumber ++;
    Attention, la dernière ligne ne fait pas ce que tu crois.
    Le plus simple, ce serait de mettre ++(*ulWordNumber); partout.
    De plus, si cette variable est un pointeur, pourquoi n'est-elle pas préfixée de p comme les autres pointeurs? Si on utilise de la notation hongroise, on a intérêt à l'utiliser correctement.


    Citation Envoyé par JeanNoel53 Voir le message
    Code moyen : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    			s = CStrConv::ambstowcs((char*)vWord.c_str());
    			pNext2Word->wsWord = s;
    			pNext2Word->wsLemma = s;
    			CStrConv::StrFreeW( s);
    À part le cast, ce n'est pas à proprement parler mauvais, mais là aussi tu devrais te faire une fonction dédiée de conversion pour ne pas avoir à gérer le nettoyage dans le code utilisateur:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::wstring cppmbstowcs(char const *strA)
    {
    	wchar_t * strW = CStrConv::ambstowcs(strA);
    	std::wstring ret(strW);
    	CStrConv::StrFreeW(strW);
    	return ret;
    }
    Et remplacer ton code:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    			pNext2Word->wsWord = cppmbstowcs(vWord.c_str());
    			pNext2Word->wsLemma = pNext2Word->wsWord;
    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.

  7. #7
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut
    [*]Teste le retour de tes new.
    Je l'ai déja fait et j'ai non Initialisé sur toutes les valeurs

    [*]Vérifie qu'entre la création de ces variable et l'appel de la condition tu ne modifie pas les variables
    je les initialise sur la base de ce qu"elle doivent avoir

    Essaye d'utiliser le moins possible new (préfère mon_objet(mes_valeurs_d_initialisation)
    je ne sais pas comment faire

    mais j'ai essayé de passer par une liste( sans succès):
    la ListAnalysedWord n'est pas allouée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		pListAnalysedWord = new std::list<stAnalysedWord*>();
    j'ai essayé le conseil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pListAnalysedWord = mon_objet(mes_valeurs_d_initialisation);
    le compilateur m'a jeté:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    1>..\..\..\..\Linguistic\ParserManager\src\ParserManager.cpp(624): error C2065: 'mes_valeurs_d_initialisation'*: identificateur non déclaré
    1>..\..\..\..\Linguistic\ParserManager\src\ParserManager.cpp(624): error C3861: 'mon_objet'*: identificateur introuvable
    Je suis donc aller en arrière.

    le résultat de l'exécution de la liste est:pListAnalysedWord = <valeur non définie>

    je vous donne l'interface:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void CParserManager::BSplitTag( char* pNextToken, char* pWord, char* pPos, char* pFlex, std::list<stAnalysedWord*>* pListAnalysedWord, unsigned long* ulWordNumber)
    je vous donne une partie du code mis à jour:
    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
    	len = strlen( pNextToken);
    	std::string sWord = pNextToken;
    	int npos = sWord.find( "(");
    	if( npos != -1)
    	{
    		pListAnalysedWord = new std::list<stAnalysedWord*>();
    		LWord = "";
    		sFlex = "";
    		LWord = sWord.substr( 0, npos);
    		sFlex = sWord.substr( npos+1, len);
    		LWord += sFlex;
    		pNextToken = (char*)LWord.c_str();
    		// il reste à provisionner le résultat de la découpe : (
    		pNextWord = new stAnalysedWord();
    		pNextWord->wsWord = L"(";
    		pNextWord->wsLemma = L"(";
    		pNextWord->POS = POS_MARK;
    		pNextWord->ulStart = *ulWordNumber;
    		pNextWord->ulLength = 1;
    		pNextWord->iExcluded = 0;
    		pNextWord->Gender = GENDER_NONE;
    		pNextWord->iNbr = NBR_NONE;
    		pNextWord->iPers = PERS_NONE;
    		pListAnalysedWord->push_back( pNextWord);
    	}

  8. #8
    Débutant
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 022
    Points : 332
    Points
    332
    Par défaut La solution
    j'ai initialiser pListAnalysedWord dans la méthode appelant et ça a résolu le problème d'affectation des pointeurs

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/05/2009, 14h23
  2. heritage pas cohérent.
    Par pmithrandir dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 04/06/2008, 12h20
  3. perldb n'est pas cohérent
    Par Linschn dans le forum Langage
    Réponses: 5
    Dernier message: 20/04/2008, 18h53
  4. Erreur "La fenêtre ne comporte pas de barres de défilement"
    Par AlexPajon dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/10/2007, 09h35

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