Besoin d'aide urgente sur vb

Résolu
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006
-
       Bonjour,


 voilà, je suis en train de faire un petit programme en vb pour
calculer l'empreinte numérique d'un texte avec l'algo SHA-1, pour ce
faire j'ai besoin de variables qui font références à d'autres variables
et je n'arrive pas à les enchaîner.

Par exemple, j'ai la possibilité d'avoir x mots(MotCount(i)) qui sonts eux mêmes divisés en 16 (W0->W16), voici ce que je pensais qu'il fallait écrire :


For i 0 To i MotCounter

MotCount(i).W0 = Mid(text, 1, 4)

MotCount(i).W1 = Mid(text, 5, 4)

MotCount(i).W2 = Mid(text, 9, 4)      

                     .

                     .

                     .

    Mais lorsque je veux exécuter j'ai une erreur de compilation : Qualificateur incorrect.


Si quelqu'un pouvait me dire comment faire ça serait sympa.


Merci, ccmf.

13 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Oui, donc, au vu de ton code, MotCount n'est dimensionné que comme un tableau de type String.
Normal qu'il refuse cette syntaxe, MotCount et W0 n'ont aucun lien.
Il faut que tu définisse W comme une structure :
Structure typeDesW
   
Dim W0
As
String
   Dim W1
As
String
   Dim W2
As
String
   Dim W3
As
String
   Dim W4
As
String
   Dim W5
As
String
   Dim W6
As
String
   Dim W7
As
String
   Dim W8
As
String
   Dim W9
As
String
   Dim W10
As
String
   Dim W11
As
String
   Dim W12
As
String
   Dim W13
As
String
   Dim W14
As
String
   Dim W15
As
String
End
Structure
Et que tu définisses MotCount comme un ensemble ressemblant à cette sutruture :
Dim MotCount()
As typeDesW

Ensuite, tu as encore du pain sur la planche :
- 16 variables de 4 Bytes, pour moi, ça fait 64 bytes, pas 32 !   à éclaircir avant de continuer
- Tu recherches le nombre de mots nécessaires. Pourquoi ces signes - dans la syntaxe ?
- "Mid(text, 1, 4)" te renverra toujours la même chaine puisée parmi les 4 premiers caractères du texte contenu dans "text"
   Tu ne gères pas du tout le décalage du découpage du mot
   Tu devrais avoir un truc du genre :
For i = 0 To MotCounter
   Décalage = i * 8
   MotCount(i).W0 = Mid(text, 1 + Décalage, 4)
   MotCount(i).W1 = Mid(text, 5 + Décalage, 4)

Quand tu auras tout résolu, il pourras voir que tu peux aussi indexer tes variables W : ça t'évitera les répétitions de code (modif de la structure + nouveau For (avec la syntaxe "Step") à l'intérieur du premier ...

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
Donc c'est bien cà : il te faut créer un type, et MotCount doit être un tableau de ce type, car tes instructions sont illégales :
MotCount(i).W0 = Mid(text, 1, 4)
MotCount(i).W1 = Mid(text, 5, 4)
MotCount(i).W2 = Mid(text, 9, 4)
MotCount(i).W3 = Mid(text, 13, 4)
MotCount(i).W4 = Mid(text, 17, 4)
MotCount(i).W5 = Mid(text, 21, 4)
MotCount(i).W6 = Mid(text, 25, 4)
MotCount(i).W7 = Mid(text, 29, 4)
MotCount(i).W8 = Mid(text, 33, 4)
MotCount(i).W9 = Mid(text, 37, 4)
MotCount(i).W10 = Mid(text, 41, 4)
MotCount(i).W11 = Mid(text, 45, 4)
MotCount(i).W12 = Mid(text, 49, 4)
MotCount(i).W13 = Mid(text, 53, 4)
MotCount(i).W14 = Mid(text, 57, 4) MotCount(i).W15 Mid(text, 61, 4)> A remplacer par :
Public Type typCounts
    W1 As String
    W2 As String
    W3 As String

    W4 As String

    W5 As String

    W6 As String

    W7 As String

    W8 As String

    W9 As String

    W10 As String

    W11 As String

    W12 As String

    W13 As String

    W14 As String

    W15 As String

    W16 As String
 End Type

Ou encore mieux :
Public Type typCount
    W(16) As String
End Type

public MotCount() As typCount

Et ensuite, dans ton code :
MotCount(i).W(0) = Mid(text, 1, 4)
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
bah tout dépend, tes MotCount c'est un tableau de type ?

Sinon, évite ce genre de titre pour tes messages, ca n'attirera pas plus de personnes, bien au contraire, crois moi !

Un bon titre est un titre qui décrit le problème brièvement, là ceux qui s'y connaissent viennent t'aider, mais un titre URGENT, ou A L'AIDE, ca donne pas vraiment envie de lire le post !
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Mes MotCount dépendent du nombre de caractères dans le texte à traiter,
un mot peut contenir 64 caractères pour chaque 64 caractères en plus
j'ai un MotCount de plus, chacun divisé en 16 variables (W0->W15)

Dans mon code je récupère une valeur texte, j'affecte ensuite des
paquets de 4 caractères à mes variables Wx, donc si j'ai moins de 64
caractères j'aurais uniquement

MotCount(1).W0 = "abcd"

MotCount(1).W1 = "abcd"

jusqu'à

MotCount(1).W15 = "abcd"

Au delà de 64 caractères j'aurais

MotCount(2).W1 = "abcd"

.

.

.

Merci.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Combien vaut ta variable "i" quand le défaut apparait ?
0 : Tu n'as pas défini le tableau MotCount
10 : Idem, tu n'as pas prévu assez de lignes dans ton tableau

Sinon, comme le dis Dark (tu me permets de t'appeler Dark, Dark ?), vérifie sous quel type de varaiable est défini W0 (ici, "As String" puisque tu lui colles du texte)
Si tu as défini W0 "As Long" par exemple, tu utilises alors la conversion implicite des types de variable (Chaine -> numérique).
C'est pratique que VB s'en occupe seul, mais quand on lui envoie des données de type incompatible (autre chose que des chiffres), ça peut donner ce genre d'erreur.
Alors vérifie ce qu'il y a dans "Mid(text, 1, 4)"

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accro
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
For i = 0 To i = MotCounter
C'est autorisé en VB.Net, ça ?
plutôt ça, non ? ---> For i = 0 To MotCounter
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

L'erreur se produit au moment de la compil, pour ce qui est de la
déclaration de mes varaibles elle sont en string et je fais un Redim
MotCount en fonction de mon i.


ccmf.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Là, dans ton exemple de code, tu ranges dans un tableau "MotCounter fois" les portions du mot "text", c'est à dire pleins de tableaux identiques ....
A quoi correspond MotCounter ?
Si tu veux indexer la lecture du mot à décomposer, il faut bien sûr indexer le "text" renfermant le mot à traiter. Ici, c'est toujours le même.
Alors :
- Soit tu nous montres tout ton code (parce que Redim seul réinitialise le tableau, c'est encore un autre bug possible)
- Soit tu expliques avec des exemples clairs ce que tu veux faire, parce que je ne pense pas que ce soit une histoire de syntaxe, mais d'organisation.
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
133
ok pour dark jack si tu me permet de t'appeler jack, jack ? ;)

Sinon, moi ce qui me choque c'est les MotCount(i).W0
Tu n'as le droit de faire cà que si MotCount est un tableau de type ou d'objet ! Donc déjà, est-ce bien le cas ?
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

voici le code :


Option Explicit


Public data As String

Public W0 As String

Public W1 As String

Public W2 As String

Public W3 As String

Public W4 As String

Public W5 As String

Public W6 As String

Public W7 As String

Public W8 As String

Public W9 As String

Public W10 As String

Public W11 As String

Public W12 As String

Public W13 As String

Public W14 As String

Public W15 As String


Public text As String

Public L As Long

Public i As Long

Public X As Integer

Public T() As String

Public ascii() As String

Public ValDec As Double


Public DataByte As Variant

Public DataByterot As String

Public compvalue As Double

Public Toto As Integer


Public Bit() As Variant

Public Bitrot() As String

Public BitNumber As Integer

Public MotCounter As Integer

Public MotCount() As String

Public BlocCount As String

Public GrandTour As String

Public Metoile As Long

Public MotBitCounter As String


Public Function main()

BlocCount = 0

ValDec = 0

'data = UserForm1.TextBox1.Value

text = "Salut à toi"


L = Len(text)

MotBitCounter = L * 8


'Calcul du nombre de mots de 32bits nécessaires pour le codage du texte

MotCounter = -Int(-L / 8)

i = MotCounter

ReDim MotCount(i)


For i = 0 To MotCounter


MotCount(i).W0 = Mid(text, 1, 4)

MotCount(i).W1 = Mid(text, 5, 4)

MotCount(i).W2 = Mid(text, 9, 4)

MotCount(i).W3 = Mid(text, 13, 4)

MotCount(i).W4 = Mid(text, 17, 4)

MotCount(i).W5 = Mid(text, 21, 4)

MotCount(i).W6 = Mid(text, 25, 4)

MotCount(i).W7 = Mid(text, 29, 4)

MotCount(i).W8 = Mid(text, 33, 4)

MotCount(i).W9 = Mid(text, 37, 4)

MotCount(i).W10 = Mid(text, 41, 4)

MotCount(i).W11 = Mid(text, 45, 4)

MotCount(i).W12 = Mid(text, 49, 4)

MotCount(i).W13 = Mid(text, 53, 4)

MotCount(i).W14 = Mid(text, 57, 4)

MotCount(i).W15 = Mid(text, 61, 4)


Next i


End Function


Merci
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
81
Dark : n'un autre côté, il est sous .Net, donc les syntaxes farfelues seraient piégées dès la saisie (soulignés).
En VB6, on aurait pu faire ceci, mais je crois que .Net refuse les références éloignées dans le dimensionnement :
Private Type typeMesChaines
   W(0 To 15) As String
End Type
Dim MotCount(0 To ???) As typeMesChaines
et donc, indexer aussi les sous-champs

Et la syntaxe du For : Je viens de faire l'essai.Cette syntaxe "For i 0 To i 32", bien que acceptée, ne donne pas du tout le même résultat que "For i = 0 To 32"
A revoir aussi ...
Messages postés
256
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
6 novembre 2009
1
Hello,
Pour mettre mon grain de sel.
Es tu sur d'avoir bien compris l'algo de départ ?
Es-ce que tu ne serai pas en train de traduire l'algo d'un autre langage ?
Es ce qu'il n'y a pas déjà une classe qui fait tout ca trés bien ?

Jcbé[^]

La meilleure réponse à une question est souvent... LA bonne question.
Messages postés
5
Date d'inscription
jeudi 18 mai 2006
Statut
Membre
Dernière intervention
3 septembre 2006

Merci à tous pour vos réponses, elles m'ont été d'une grande utilité.
Mon problème initial est résolu. Il est vrai que certaines valeurs ne
sont pas bonnes mais je fais des essais et j'essaye plusieurs
paramètres.

Pour répondre à Jcbé, je pense avoir compris l'algo et devant faire un
projet de math pour mes études par mes propres moyens (n'ayant jamais
pris de cours d'informatique) je programme comme je peux.


    Encore merci pour vos aides.


    ccmf.