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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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 éclairé
    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
    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 chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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 éclairé
    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
    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 chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 855
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 855
    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 éclairé
    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
    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.

+ 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