OVH Cloud OVH Cloud

Passer un tableau à une fonction ?

7 réponses
Avatar
Macadam
Bonsoir à tous !

Je ne me souviens plus comment on passe un tableau a une fonction.
Dans l'exemple en dessous une fonction prend le tableau et
retourne un tableau modifié.
Je pense que cet exemple ne fonctionne pas puisque MonTB est dimensionné
et contient des valeurs ???


Form1
Sub Main

Dim MonTB(16) as bytes
Dim rtFN as long

MonTB(0) = 77
MonTB(1) = 32
MonTB(2) = 55
MonTB(3) = FF
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long

Dim LocalTB() as bytes

MaFunc = 0
LocalTB = rtTB
...
'Traitement, MaFunc = 1
...
rtTB = LocalTB
MaFunc = 2

End Function

7 réponses

Avatar
JLuc
Macadam a présenté l'énoncé suivant :
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long



Perso je procède comme ceci :

rtFN = Module1.MaFunc(MonTB)
...
End Sub

Function MaFunc(ByRef rtTB)
...

--
____
( O | O )
--
_oooO_ JLuc _Oooo_

O-O
Avatar
Driss HANIB
bonjour macadam

Si ton principe de passage de tableau dimensionné au départ fonctionne.
1 - As tu vraiment une erreur ? et quelle est-elle ? A quelle ligne
2 - Pourquoi initialise tu dès le début ' MaFunc = 0 ? est-ce là le
problème
car de toute façon ta fonction renverra au minimum 0

Driss

"Macadam" a écrit dans le message de
news:%
Bonsoir à tous !

Je ne me souviens plus comment on passe un tableau a une fonction.
Dans l'exemple en dessous une fonction prend le tableau et
retourne un tableau modifié.
Je pense que cet exemple ne fonctionne pas puisque MonTB est dimensionné
et contient des valeurs ???


Form1
Sub Main

Dim MonTB(16) as bytes
Dim rtFN as long

MonTB(0) = 77
MonTB(1) = 32
MonTB(2) = 55
MonTB(3) = FF
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long

Dim LocalTB() as bytes

MaFunc = 0
LocalTB = rtTB
...
'Traitement, MaFunc = 1
...
rtTB = LocalTB
MaFunc = 2

End Function


Avatar
Macadam
Salut Driss !

Voici un exemple qui exprime plus clairement mon problème.
Le résultat: Type Incompatible

Private Function FnTest(ByRef MyTB() As Byte)
Dim locTB() As Byte
Dim i As Long

locTB = MyTB

For i = 0 To UBound(locTB)
locTB(i) = locTB(i) Xor 2
locTB(i) = locTB(i) And (locTB(i) - 4)
locTB(i) = locTB(i) Xor &HFF
Next i

MyTB = locTB
End Function

Private Sub Command2_Click()
Dim rtTB(2) As Byte

rtTB(0) = &HFF
rtTB(1) = &HF
rtTB(2) = &HF0
Call FnTest(rtTB)

MsgBox rtTB(0)
End Sub







Driss HANIB a écrit :
bonjour macadam

Si ton principe de passage de tableau dimensionné au départ fonctionne.
1 - As tu vraiment une erreur ? et quelle est-elle ? A quelle ligne
2 - Pourquoi initialise tu dès le début ' MaFunc = 0 ? est-ce là le
problème
car de toute façon ta fonction renverra au minimum 0

Driss

"Macadam" a écrit dans le message de
news:%
Bonsoir à tous !

Je ne me souviens plus comment on passe un tableau a une fonction.
Dans l'exemple en dessous une fonction prend le tableau et
retourne un tableau modifié.
Je pense que cet exemple ne fonctionne pas puisque MonTB est dimensionné
et contient des valeurs ???


Form1
Sub Main

Dim MonTB(16) as bytes
Dim rtFN as long

MonTB(0) = 77
MonTB(1) = 32
MonTB(2) = 55
MonTB(3) = FF
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long

Dim LocalTB() as bytes

MaFunc = 0
LocalTB = rtTB
...
'Traitement, MaFunc = 1
...
rtTB = LocalTB
MaFunc = 2

End Function






Avatar
JLuc
De cette façon, ça marche :

Private Function FnTest(ByRef MyTB() As Byte)
Dim i As Long
On Error GoTo erreur

For i = 0 To UBound(MyTB)
MyTB(i) = MyTB(i) Xor 2
MyTB(i) = MyTB(i) And (MyTB(i) - 4)
MyTB(i) = MyTB(i) Xor &HFF
Next i
FnTest = 0
Exit Function
erreur:
FnTest = -1
End Function

Private Sub test()'à la place de Command2_Click
Dim rtTB(2) As Byte

rtTB(0) = &HFF
rtTB(1) = &HF
rtTB(2) = &HF0
retour = FnTest(rtTB)

MsgBox rtTB(0)
End Sub




Après mure réflexion, Macadam a écrit :
Salut Driss !

Voici un exemple qui exprime plus clairement mon problème.
Le résultat: Type Incompatible

Private Function FnTest(ByRef MyTB() As Byte)
Dim locTB() As Byte
Dim i As Long

locTB = MyTB

For i = 0 To UBound(locTB)
locTB(i) = locTB(i) Xor 2
locTB(i) = locTB(i) And (locTB(i) - 4)
locTB(i) = locTB(i) Xor &HFF
Next i

MyTB = locTB
End Function

Private Sub Command2_Click()
Dim rtTB(2) As Byte

rtTB(0) = &HFF
rtTB(1) = &HF
rtTB(2) = &HF0
Call FnTest(rtTB)

MsgBox rtTB(0)
End Sub







Driss HANIB a écrit :
bonjour macadam

Si ton principe de passage de tableau dimensionné au départ fonctionne.
1 - As tu vraiment une erreur ? et quelle est-elle ? A quelle ligne
2 - Pourquoi initialise tu dès le début ' MaFunc = 0 ? est-ce là le
problème
car de toute façon ta fonction renverra au minimum 0

Driss

"Macadam" a écrit dans le message de
news:%
Bonsoir à tous !

Je ne me souviens plus comment on passe un tableau a une fonction.
Dans l'exemple en dessous une fonction prend le tableau et
retourne un tableau modifié.
Je pense que cet exemple ne fonctionne pas puisque MonTB est dimensionné
et contient des valeurs ???


Form1
Sub Main

Dim MonTB(16) as bytes
Dim rtFN as long

MonTB(0) = 77
MonTB(1) = 32
MonTB(2) = 55
MonTB(3) = FF
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long

Dim LocalTB() as bytes

MaFunc = 0
LocalTB = rtTB
...
'Traitement, MaFunc = 1
...
rtTB = LocalTB
MaFunc = 2

End Function









--
____
( O | O )
--
_oooO_ JLuc _Oooo_

O-O
Avatar
Macadam
Merci Jean Luc.

Cependant je ne trouve pas très sain de provoquer indirectement une
erreur (on error...).

De plus en entrée de la fonction FnTest() dans MyTB(0) j'ai 255.
En sortie dans mon sub Test() je devrais avoir 253.

Donc ca ne fonctionne pas !
Il m'affiche toujours 255, il y a un problème de portée.
Je ne comprend toujours pas de quelle facon je dois proceder...


> JLuc a écrit sans faire de test ^^:
De cette façon, ça marche :

Private Function FnTest(ByRef MyTB() As Byte)
Dim i As Long
On Error GoTo erreur

For i = 0 To UBound(MyTB)
MyTB(i) = MyTB(i) Xor 2
MyTB(i) = MyTB(i) And (MyTB(i) - 4)
MyTB(i) = MyTB(i) Xor &HFF
Next i
FnTest = 0
Exit Function
erreur:
FnTest = -1
End Function

Private Sub test()'à la place de Command2_Click
Dim rtTB(2) As Byte

rtTB(0) = &HFF
rtTB(1) = &HF
rtTB(2) = &HF0
retour = FnTest(rtTB)

MsgBox rtTB(0)
End Sub




Après mure réflexion, Macadam a écrit :
Salut Driss !

Voici un exemple qui exprime plus clairement mon problème.
Le résultat: Type Incompatible

Private Function FnTest(ByRef MyTB() As Byte)
Dim locTB() As Byte
Dim i As Long

locTB = MyTB

For i = 0 To UBound(locTB)
locTB(i) = locTB(i) Xor 2
locTB(i) = locTB(i) And (locTB(i) - 4)
locTB(i) = locTB(i) Xor &HFF
Next i

MyTB = locTB
End Function

Private Sub Command2_Click()
Dim rtTB(2) As Byte

rtTB(0) = &HFF
rtTB(1) = &HF
rtTB(2) = &HF0
Call FnTest(rtTB)

MsgBox rtTB(0)
End Sub







Driss HANIB a écrit :
bonjour macadam

Si ton principe de passage de tableau dimensionné au départ fonctionne.
1 - As tu vraiment une erreur ? et quelle est-elle ? A quelle ligne
2 - Pourquoi initialise tu dès le début ' MaFunc = 0 ? est-ce là le
problème
car de toute façon ta fonction renverra au minimum 0

Driss

"Macadam" a écrit dans le message de
news:%
Bonsoir à tous !

Je ne me souviens plus comment on passe un tableau a une fonction.
Dans l'exemple en dessous une fonction prend le tableau et
retourne un tableau modifié.
Je pense que cet exemple ne fonctionne pas puisque MonTB est
dimensionné
et contient des valeurs ???


Form1
Sub Main

Dim MonTB(16) as bytes
Dim rtFN as long

MonTB(0) = 77
MonTB(1) = 32
MonTB(2) = 55
MonTB(3) = FF
rtFN = Module1.MaFunc(MonTB())

End Sub


Module1
Function MaFunc(rtTB() as bytes) as long

Dim LocalTB() as bytes

MaFunc = 0
LocalTB = rtTB
...
'Traitement, MaFunc = 1
...
rtTB = LocalTB
MaFunc = 2

End Function











Avatar
Jacques93
Bnjour Macadam,
Macadam a écrit :

[...]
De plus en entrée de la fonction FnTest() dans MyTB(0) j'ai 255.
En sortie dans mon sub Test() je devrais avoir 253.

Donc ca ne fonctionne pas !
Il m'affiche toujours 255, il y a un problème de portée.
Je ne comprend toujours pas de quelle facon je dois proceder...


> JLuc a écrit sans faire de test ^^:
De cette façon, ça marche :

Private Function FnTest(ByRef MyTB() As Byte)
Dim i As Long
On Error GoTo erreur

For i = 0 To UBound(MyTB)
MyTB(i) = MyTB(i) Xor 2
MyTB(i) = MyTB(i) And (MyTB(i) - 4)
MyTB(i) = MyTB(i) Xor &HFF
Next i
FnTest = 0
Exit Function
erreur:
FnTest = -1
End Function






J'ai l'impression que tu pars sur une hypothèse erronée. Si la valeur en
entrée est 255, le résultat sera 6, et non pas 253 :

MyTB(i) = MyTB(i) Xor 2
1 1 1 1 1 1 1 1 - FF (255)
0 0 0 0 0 0 1 0 - 02
-----------------------------------------
1 1 1 1 1 1 0 1 - FD (253) = FF Xor 02


MyTB(i) = MyTB(i) And (MyTB(i) - 4)
1 1 1 1 1 1 0 1 - FD (253)
1 1 1 1 1 0 0 1 - F9 (249 = 253 - 4)
-----------------------------------------------------
1 1 1 1 1 0 0 1 - F9 (249) = FD (253) And F9 (249)


MyTB(i) = MyTB(i) Xor &HFF
1 1 1 1 1 0 0 1 - F9 (249)
1 1 1 1 1 1 1 1 - FF (255)
----------------------------------------------------
0 0 0 0 0 1 1 0 - 06 (06) = F9 (249) Xor FF (255)

--
Cordialement,

Jacques.
Avatar
Macadam
Bonjour Jacques93,

Merci, tes aides sont excellentes !
Super niveau et très clair.

Il faut vraiment que je révise mon binaire, je fait pitié :)

To XOR OR Not AND... WHAT IS THE QUESTION/ ? ^^

Merci et bonne fête, c'est demain.



> Jacques93 a écrit :
Bnjour Macadam,
Macadam a écrit :

[...]
De plus en entrée de la fonction FnTest() dans MyTB(0) j'ai 255.
En sortie dans mon sub Test() je devrais avoir 253.

Donc ca ne fonctionne pas !
Il m'affiche toujours 255, il y a un problème de portée.
Je ne comprend toujours pas de quelle facon je dois proceder...


> JLuc a écrit sans faire de test ^^:
De cette façon, ça marche :

Private Function FnTest(ByRef MyTB() As Byte)
Dim i As Long
On Error GoTo erreur

For i = 0 To UBound(MyTB)
MyTB(i) = MyTB(i) Xor 2
MyTB(i) = MyTB(i) And (MyTB(i) - 4)
MyTB(i) = MyTB(i) Xor &HFF
Next i
FnTest = 0
Exit Function
erreur:
FnTest = -1
End Function






J'ai l'impression que tu pars sur une hypothèse erronée. Si la valeur en
entrée est 255, le résultat sera 6, et non pas 253 :

MyTB(i) = MyTB(i) Xor 2
1 1 1 1 1 1 1 1 - FF (255)
0 0 0 0 0 0 1 0 - 02
-----------------------------------------
1 1 1 1 1 1 0 1 - FD (253) = FF Xor 02


MyTB(i) = MyTB(i) And (MyTB(i) - 4)
1 1 1 1 1 1 0 1 - FD (253)
1 1 1 1 1 0 0 1 - F9 (249 = 253 - 4)
-----------------------------------------------------
1 1 1 1 1 0 0 1 - F9 (249) = FD (253) And F9 (249)


MyTB(i) = MyTB(i) Xor &HFF
1 1 1 1 1 0 0 1 - F9 (249)
1 1 1 1 1 1 1 1 - FF (255)
----------------------------------------------------
0 0 0 0 0 1 1 0 - 06 (06) = F9 (249) Xor FF (255)