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

VBA Discussion :

[difficile] parser une chaine type langage C


Sujet :

VBA

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut [difficile] parser une chaine type langage C
    bonjour,

    En langage C, j'ai déclaré un tableau comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char tab [] = "\x31" "\x04\x01\x06" "\x12""Salut mec" "x54" // bla bla bla ....
    "\x32" "\x02\x06\x03" "\x10""coucou" "x51" // bla bla bla ....
    "\0";
    J'ai récupéré tout ce qu'il y a après le égal dans une variable vba de type String (les retours à la ligne sont le caractère vbLf).
    => Comment faire pour créer un tableau vba de Integer qui contienne la valeur numérique de chaque case de mon tableau C



    Donc cette chaine à plusieurs propriétés :
    - elle est sur plusieurs lignes => j'utilise vbLf pour les sauts de ligne
    - tout ce qui est après "//" doit être ignoré (jusqu'a la fin de la ligne uniquement) => ces deux caractères équivaut au caractère ' en vba (commentaire)
    - lorsqu'on a "\x31", ça signifie : valeur hexadecimale de 31
    - la chaine "\x01" "\x02\x03""\x04meuh" équivaut à "\x01\x02\x03\x04meuh" => on peut concaténer tous les champs
    - le caractère ";" délimite la fin de la ligne
    - le caractère " dans une chaine s'écrit \"

    Si vous n'avez pas tout compris n'hésitez pas à me poser des questions

    merci d'avance

  2. #2
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    Salut,
    Je ne comprends pas ce que tu veux faire.
    Tu as un tableau de string, genre vtab(1)="abcd" vtab(2)="trs"
    Et tu veux un tableau de type
    vtab(1,1)=1
    vtab(1,2)=2
    vtab(1,3)=3
    vtab(1,4)=4.
    etc..?

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    non ce n'est pas ça.

    J'ai créer un classeur excel dans lequel je génère (en fonction de divers paramètres) une chaine de caractères qui correspond à l'initialisation d'un tableau en langage C. Ex :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // code C :
    char tab[] = "salut" " ça va ?";
     
    // c'est la meme chose que   :
    char tab[] = "salut ça va ?";


    Donc en vba j'ai dans une variable le contenu de ma chaine qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ' code vba
    Dim tab As String = """salut ça va ?"""
    Ce que je voudrais, c'est crée une variable type tableau (sous vba) avec les valeurs de chaque caractères de ma chaine : ceci me permettra par la suite de calculer un CRC de cette chaine

    Ce qui est difficile c'est d'arrivé à parser : les lignes multiples, les guillements, le valeurs hexa "\x??" et les commentaire (j'avoue ne pas avoir de grosses connaissance en vba)

  4. #4
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    alors déja en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' code vba
    Dim tab As String = """salut ça va ?"""
    ne fonctionne pas et ne fonctionnera jamais.
    Tu devras imperativement écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' code vba
    Dim tab As String
    tab = """salut ça va ?"""
    En suite je n'ai pas du tout compris. Je dois être un peu... rouillé en C

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par EvaristeGaloisBis Voir le message
    alors déja en VBA
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ' code vba
    Dim tab As String = """salut ça va ?"""
    ne fonctionne pas et ne fonctionnera jamais.
    Tu devras imperativement écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ' code vba
    Dim tab As String
    tab = """salut ça va ?"""
    Désolé, comme dit précédemment je n'ai pas de grosses connaissances en vba


    Donc si je prend la chaine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     tab = """salut ça va ?"""
    La première étape serait d'avoir le tableau suivant
    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
     
    ' recuperation en valeurs numériques
    ' => quel type utiliser pour ce tableau ?
    tab(1) = Chr("""")
    tab(2) = Chr("s")
    tab(3) = Chr("a")
    tab(4) = Chr("l")
    tab(5) = Chr("u")
    tab(6) = Chr("t")
    tab(7) = Chr(" ")
    tab(8) = Chr("ç")
    tab(9) = Chr("a")
    tab(10) = Chr(" ")
    tab(11) = Chr("v")
    tab(12) = Chr("a")
    tab(13) = Chr(" ")
    tab(14) = Chr("?")
    tab(15) = Chr("""")
     
    ' exemple de calcul de CRC simplifié
    for i=1 to i=Ubound(tab)
         crc = crc + tab(i)
    next i
    => après là où ça devient compliqué c'est d'arriver a :
    - concaténer les différents éléments de ma chaine : """salut"" "" ça va """"?""" => """salut ça va ?"""
    - supprimer les commentaires C : """salut ça va ?""" // mon commentaire en fin de ligne" => """salut ça va ?"""
    - supprimer les retours à la ligne """salut""" + vbLf + """ ça va ?""" => """salut ça va ?"""
    - supprimer le caractère ";" en fin de chaine : """salut ça va ?"";" => """salut ça va ?"""
    - convertir les valeur hexa (je suis pas sure que c'est cette fonction qu'il faut utiliser) : """\x51""" => """" + asc(&H51) + """"

  6. #6
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    résolvons d'abord le probleme simple.
    Mettre un string dans un tableau de char. Ce n'est pas implicite comme en C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = """salut ça va ?"""
    je te propose la fonction suivante :
    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
    Function ConvertString2Tab(stMyString As String) As Integer()
    Dim itabRes() As Integer
    Dim iMaxChar As Long
    Dim iChar As Long
     
      iMaxChar = Strings.Len(stMyString)
     
      'it's for empty string case
      If iMaxChar = 0 Then Exit Function
     
      ReDim itabRes(1 To iMaxChar)
     
      For iChar = 1 To iMaxChar
        itabRes(iChar) = Strings.Asc(Strings.Mid$(stMyString, iChar, 1))
      Next
     
      ConvertString2Tab = itabRes
     
    End Function
    Après pour certaines suppressions, c'est trivial comme la concaténation de chaine. Il te suffit de faire un replace de """ """, par "", de VbLf par "".
    Par contre pour la suppression des commentaires en C je crois que tu te frottes a quelque chose de très technique. tu dois gérer les /* et */, les // etc... Bref, là ce qui bloque ce n'est pas le langage mais l'algorithme.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    ok merci

    Citation Envoyé par EvaristeGaloisBis Voir le message
    Après pour certaines suppressions, c'est trivial comme la concaténation de chaine. Il te suffit de faire un replace de """ """, par ""
    Ce n'est malheureusement pas si simple car par exemple si j'ai """salut mec\"" """ je dois avoir comme résultat "salut mec\"" " car guillemet précédé de \ en C, ça veut dire qu'il faut écrire le caractère " : \" en C équivaut à "" en vba.


    Citation Envoyé par EvaristeGaloisBis Voir le message
    tu dois gérer les /* et */
    Je n'ai pas besoin de gérer les /* */, il n'y en aura pas (je n'aurais que les //)

    je vais essayer de faire le bon algo...

  8. #8
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    Bien vu pour le contre exemple !
    Je te laisse trouver le bon algo ! Par curiosité d'esprit, fait le nous parvenir. J'aimerai bien voir quelle ça peut avoir.
    Aussi peux tu nous dire pourquoi tu dois faire ça? En effet, il pourrait exister une meilleur solution qui ne nécessite pas autant de dev subtile et péilleux.

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    Citation Envoyé par EvaristeGaloisBis Voir le message
    Aussi peux tu nous dire pourquoi tu dois faire ça?
    J'utilise un classeur excel pour définir les valeurs que doit avoir un tableau (à base de liste déroulante et de valeur de cellule) => une fois la chaine générée, je dois aussi calculer le CRC de cette chaine car un module l'envoie à un autre module : c'est pourquoi j'ai besoin de vérifier la validité de la trame.
    => mon module pourrais calculer à la volé le CRC mais je fais ça pour qu'il est moins de calculs à faire

  10. #10
    Membre actif
    Profil pro
    chomeur
    Inscrit en
    Août 2006
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Août 2006
    Messages : 343
    Points : 246
    Points
    246
    Par défaut
    Qu'est ce que le CRC?

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 821
    Points : 979
    Points
    979
    Par défaut
    c'est ça :
    http://fr.wikipedia.org/wiki/Contr%C...dance_cyclique
    => permet de vérifier l'intégrité des données

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

Discussions similaires

  1. Parser une chaine de caractère
    Par Nasky dans le forum C++
    Réponses: 7
    Dernier message: 04/12/2006, 19h37
  2. Parser une chaine de doubles
    Par Ange44 dans le forum C++
    Réponses: 9
    Dernier message: 28/06/2006, 13h12
  3. Réponses: 9
    Dernier message: 30/11/2005, 18h18
  4. Parser une chaine
    Par TieumB dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/01/2005, 11h20
  5. Parser une chaine en shell script
    Par Gogoye dans le forum Linux
    Réponses: 10
    Dernier message: 19/07/2004, 17h49

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