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

WinDev Discussion :

Délimiteur Caract(0) et fonctions TableauVersChaîne, ChaîneVersTableau [WD12]


Sujet :

WinDev

  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut Délimiteur Caract(0) et fonctions TableauVersChaîne, ChaîneVersTableau
    Bonjour,

    Je voulais vous signaler que les fonctions TableauVersChaîne() et ChaîneVersTableau() ne gèrent pas correctement le délimiteur quand il s'agit d'une chaîne de caractères composée du seul caractère dont le code ASCII est 0.

    Dans les outils des débogage ou de trace, ce caractère est présenté sous la forme: <0>.

    Par exemple, avec ChaîneVersTableau(), pour la chaîne de caractères "ABC<0>123<0>XYZ":
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    t est un tableau de 0 chaîne
    ChaîneVersTableau("ABC" + Caract(0) + "123" + Caract(0) + "XYZ", t, Caract(0))
    Le code ci-dessus remplit le tableau t avec une seule entrée pour la chaîne "ABC".
    En principe, le tableau t devrait contenir 3 chaînes: [ "ABC", "123", "XYZ" ].

    Autre exemple, cette fois avec TableauVersChaîne():
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    s est une chaîne
    t est un tableau de 0 chaîne = ["ABC", "123", "XYZ"]
     
    s = TableauVersChaîne(t, Caract(0))
    Le code ci-dessus affecte à la variable s la chaîne de caractères "ABC123XYZ".
    En principe, la valeur correcte devrait être la chaîne de caractères "ABC<0>123<0>XYZ".

    Donc, je suis obligé de contourner le problème en utilisant une boucle pour effectuer le découpage ou la concaténation.
    Par exemple:
    Code WLangage : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    POUR TOUTE CHAINE sItem DE s SEPAREE PAR Caract(0)
        TableauAjoute(t, sItem)
    FIN

    Constatez-vous ce comportement dans WinDev 14 ?
    _

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Petite précision, le problème existe sitôt que le délimiteur contient au moins un caractère dont le code ASCII est 0.

    Puisque je suis allé au bout de la question autant en faire profiter ceux que ça intéresserait.

    J'ai codé 2 procédures qui prennent le relais des fonctions habituelles dans le cas du délimiteur avec caractère <0>.
    Elles s'utilisent de la même manière que les fonctions natives TableauVersChaîne() et ChaîneVersTableau().
    Le paramètre t désigne le tableau à traiter.

    Limitation: ces procédures ne permettent de travailler qu'avec un tableau à une dimension, basé sur un type simple (pas de structure, ni de classe).
    En option, il est possible d'ignorer les chaînes vides.

    Code WLangage : 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
     
    PROCEDURE ChaîneVersTableauEx(s est une chaîne, t, sDélimiteur est une chaîne=RC, bConserverVide est un booléen = Vrai)
    sItem est une chaîne
    nPos est un entier = Position(sDélimiteur, Caract(0), 1, DepuisDébut)
     
    SI nPos = 0 ET bConserverVide ALORS
        // si le délimiteur ne contient pas <0> et si on conserve les sous-chaînes vides
        ChaîneVersTableau(s, t, sDélimiteur)
     
    SINON
        TableauSupprimeTout(t)
     
        POUR TOUTE CHAINE sItem DE s SEPAREE PAR sDélimiteur
            SI bConserverVide = Faux _ET_ sItem ~= "" ALORS
                // ne pas ajouter une chaîne vide
            SINON                
                TableauAjoute(t, sItem)
            FIN
        FIN
    FIN

    Code WLangage : 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
     
    PROCEDURE TableauVersChaîneEx(t, sDélimiteur est une chaîne=RC, bConserverVide est un booléen = Vrai)    // chaîne
    s, sItem, sDélim est une chaîne
    i est un entier
    nPos est un entier = Position(sDélimiteur, Caract(0), 1, DepuisDébut)
     
    SI nPos = 0 ET bConserverVide ALORS
        // si le délimiteur ne contient pas <0> et si on conserve les sous-chaînes vides
        RENVOYER TableauVersChaîne(t, sDélimiteur)
     
    SINON
        sDélim = ""
        POUR i = 1 _A_ t..Occurrence
            // forcer la conversion comme chaîne de caractères
            sItem = "" + t[i]
     
            SI bConserverVide = Faux _ET_ sItem ~= "" ALORS
                // ignorer les entrées contenant une chaîne vide
            SINON                
                s += sDélim + sItem
                sDélim = sDélimiteur
            FIN    
        FIN
     
        RENVOYER s    
    FIN


    _ Personne n'a d'information concernant ces fonctions dans WinDev 14 ?
    _

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    il me semble que le caractère <0> est la fin de chaine en C
    A mon avis si c'est le cas c'est lié.

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour c.langlet,

    Citation Envoyé par c.langlet Voir le message
    il me semble que le caractère <0> est la fin de chaine en C
    A mon avis si c'est le cas c'est lié.
    Effectivement, je comprendrai cette limitation s'il s'agissait du type Chaîne ASCIIZ.

    Mais, je travaille sur des "chaînes de caractères WinDev" qui sont censées pouvoir contenir tout type de caractères.
    Par exemple, on peut lire un fichier "externe" binaire et placer son contenu dans un buffer ou dans une chaîne de caractères, sans que cela ne pose de problème.
    Pour cette raison, je trouve que ces fonctions natives ne sont pas cohérentes avec l'utilisation théoriquement possible d'une "chaîne de caractères WinDev", en ce qui concerne le caractère <0>.
    D'ailleurs, pour s'en convaincre, il suffit de constater que l'instruction «POUR TOUTE CHAINE sItem DE s SEPAREE PAR sDélimiteur» sait gérer un délimiteur contenant <0>.

    Les procédures que j'ai codées montrent ce que j'estime être (modestement ) l'implémentation correcte de cette fonctionnalité de découpage/recomposition Chaîne/Tableau.

    _

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 05/12/2007, 14h13
  2. Réponses: 4
    Dernier message: 14/11/2007, 15h55
  3. [RegEx] PB délimiteur dans la fonction "preg_replace"
    Par tiliut dans le forum Langage
    Réponses: 3
    Dernier message: 02/08/2007, 16h42
  4. [VBA] Délimiteur {tab} import fichier ou fonction split
    Par quanou dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/05/2007, 22h42
  5. [SQL ] Fonction pour remplacer caract. speciaux et accentué
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 3
    Dernier message: 31/01/2006, 15h16

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