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++Builder Discussion :

Inversion de listes


Sujet :

C++Builder

  1. #1
    Membre extrêmement actif
    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
    Par défaut Inversion de listes
    Bonjour,

    Je travaille avec Bcb pour traiter du source en langage naturel.
    J'utilise des listes pour stocker les différents états du texte
    J'avais un produit qui fonctionnait( il existe encore sous forme de sauvegarde)
    Je l'étend pour pouvoir traiter plusieurs textes en même temps.
    Depuis peu je ressort des textes du traitement des proposition et il est propre dans le traitement, mais quand on le regarde dans le traitement appelant il est inversé. La variable qui porte la liste n'est pas modifié entre l'appelant et l'appelée
    Je donne les points clefs du passage de paramètres
    L'appel de la procédure en cause: la phrase est portée par pSegment et interface porte aussi incidemment l'identifiant du document
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ErrorCode = objProposition.ExtractQPCA( pSegment, iIdDoc);
    à la fin de la procédure qui traite les proposition j'ai mis un espion qui permet de voire ce qu'on a fait dans la procédure:
    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
     
       iSize = pSegment->pLinguisticSegment->ListProposition.size();
       wsProposition = L"";
       itProposition = pSegment->pLinguisticSegment->ListProposition.begin();
       while( itProposition != pSegment->pLinguisticSegment->ListProposition.end())
       {
          pProposition = *itProposition;
          iSize = pProposition->ListChunk.size();
          itChunk = pProposition->ListChunk.begin();
          while( itChunk != pProposition->ListChunk.end())
          {
             pChunk = *itChunk;
             itWord = pChunk->ListWord.begin();
             while( itWord != pChunk->ListWord.end())
             {
                pWord = *itWord;
                wsProposition += pWord->wsWord;
                wsProposition += L" ";
                itWord++;
             }
             itChunk++;
          }
          itProposition++;
       }
       return( ErrorCode);
    } //0
    à ce niveau la liste portée par pSegment est propre et le texte dans wsProposition est correct. On passe dans le return et on attaque le code de post traitement dans l'appelant et là les syntagmes qui sont portés par pChunk sont ressortie dans l'ordre inverse, comme si au passage de paramètre on ait inversé la ListProposition sans pour autant toucher aux différentes ListChunk
    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
    43
    44
    45
    46
     
                                  iSize = pSegment->pLinguisticSegment->ListProposition.size();
                                  itProposition = pSegment->pLinguisticSegment->ListProposition.begin();
                                  while( itProposition != pSegment->pLinguisticSegment->ListProposition.end())
                                  {
                                     wsProposition = L"";
                                     pProposition = *itProposition;
                                     itChunk = pProposition->ListChunk.begin();
                                     while( itChunk != pSegment->pLinguisticSegment->ListChunk.end() && (int)pChunk > 0x4EF7000)
                                     {
                                        pChunk = *itChunk;
                                        if( (int)pChunk > 0x4EF7000)
                                        {
                                           itWord = pChunk->ListWord.begin();
                                           while( itWord != pChunk->ListWord.end())
                                           {
                                              pWord = *itWord++;
                                              wsProposition += pWord->wsWord;
                                              wsProposition += L" ";
                                           }
                                        }
                                        itChunk++;
                                     }
                                     pProposition->idElement = 0;
                                     pProposition->idParagraph = iNum;
                                     if( pProposition->TypeElement == ELEMENT_OTHER)
                                        pProposition->TypeElement = ELEMENT_QUALIFICATEUR;
                                     if( wsActualUnivers.size() == 0)
                                     {
                                        pProposition->Univers.wsName = wsNextUnivers;
                                     }
                                     else
                                     {
                                       pProposition->Univers.wsName = wsActualUnivers;
                                     }
                                     if( bTitle == true)
                                     {
                                        pProposition->Univers.wsName = wsProposition;
                                        pProposition->TypeElement = ELEMENT_TITLE;
                                        if( iNum > 0)
                                           pProposition->Univers.idParagraph = iNum;
                                        else
                                           pProposition->Univers.idParagraph = 0;
                                     }
                                     itProposition++;
                                  }
    Je voudrais savoir si quelqu'un a déjà observé cela et si il existe une parade ou une explication.

  2. #2
    Membre extrêmement actif
    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
    Par défaut Reverse sans effet
    J'ai utilise la fonction reverse sans observer de changement dans l'ordre des éléments. En outre quand on demande la reversion de la ListChunk( celle qui est pervertie) il y a un plantage de la procédure dans le code de windows
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    inline void swap(_Tp& __a, _Tp& __b) {
      _Tp __tmp = __a;
      __a = __b;
      __b = __tmp;
    }

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 062
    Par défaut
    Tu pourrais fournir un code complet reproductible, ton code est trop vaste et nécessite un contexte d’exécution complexe

    Pense aussi que la STL n'est pas le réflexe habituel en C++Builder qui recommande l'utilisation de la TList et TObjectList fournies par la RTL\VCL

    Tu utilises des pointeurs de vector ou list, vérifie qu'il n'y a de pas libération dans un autre code ?
    Tu n'utilises pas de smart_ptr ?

    Pourquoi if( bTitle == true) et non simplement if( bTitle) ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( iNum > 0)
      pProposition->Univers.idParagraph = iNum;
    else
      pProposition->Univers.idParagraph = 0;
    Pourquoi ne pas écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pProposition->Univers.idParagraph = Math::Max(iNum, 0); // Math.hpp
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    pProposition->Univers.idParagraph = iNum > 0 ? iNum : 0;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre extrêmement actif
    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
    Par défaut Solution de contournement apportée
    Bonjour

    Je suis parti de l'historique des changements.
    La régression est apparu lorsque j'ai voulu ajouter un niveau de traitements.
    J'ai donc réorganisé les traitements en supprimant le niveau de l'appel et en le descendant d'un step.
    J'utilise des règles de programmations explicites je préfère écrire if (bool bxxx == true) que if( bool bxxx) parce que c'est plus lisible.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 062
    Par défaut
    C'est juste à l'encontre de la philosophie du C et C++ qui permet un if sur un entier ou même sur un pointeur, en tant qu'ancien développeur Delphi, je trouve fort pratique de plus devoir caster un entier en LongBool ou d'utiliser Assigned dans un if

    Et c'est encore plus à l'encontre du type booléen qui est dédié à une utilisation directe sans == true.
    Il a été inventé pour cela !

    Sinon, il est a savoir que tester l'égalité à zéro est plus rapide, ainsi comparer == true, cela compare à 1 puis effectue un JNZ
    l'utilisation directe d'un boolean, inverse le test et génère un code qui compare à Zéro puis effectue un JZ !
    C'est vrai, c'est jouer sur 1/10e de cycle à peine !

    Je pense qu'il ne faut pas confondre "code explicite" et "code surérogatoire"
    surtout qu'avec la notation b devant bTitle on sait que sait déjà que c'est un bool !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Inverser une liste
    Par m@tix dans le forum Ada
    Réponses: 6
    Dernier message: 02/06/2009, 19h43
  2. [Débutant] Inverser une liste
    Par guillaume07 dans le forum Prolog
    Réponses: 7
    Dernier message: 17/05/2009, 19h02
  3. Inverser une liste
    Par Pika-73 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/05/2008, 21h05
  4. Inverser une liste
    Par ulysse031 dans le forum Langage
    Réponses: 6
    Dernier message: 16/04/2007, 00h36
  5. inverser une liste chainee
    Par aimad41 dans le forum C
    Réponses: 5
    Dernier message: 08/01/2007, 23h30

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