matteli
Messages postés38Date d'inscriptionjeudi 23 novembre 2000StatutMembreDernière intervention14 mars 2007
-
6 mars 2007 à 17:48
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 2014
-
21 mars 2007 à 09:50
Salut,
J'utilise le code classique suivant :
For i = 1 to Ubound (tableau)
...
next i
J'ai une erreur (normal) si le tableau est dynamique et qu'il n'a pas été dimensionné.
Quelle commande permet de savoir si un tableau dynamique a été dimensionné ?
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 6 mars 2007 à 18:31
Salut,
Perso je fais un redim tableau(0 to 0) pour l'intialiser (ou le vider).
Et je fais comme toi, je fais partir mes vrai données à partir de
l'indice 1. Comme ça, avec un For i = 1 to Ubound (tableau) sur un
tableau vide, on entre pas dans la boucle vu que ça fait For i = 1 to 0.
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201849 6 mars 2007 à 21:27
dans le fonctionnement un peu plus détaillé, çà fait appel au pointeur de la dimention lbound (si elle existe)
comme avec VarPtrArray en fait
je saurai pas trop t'en dire plus...
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 mars 2007 à 21:51
je ne pense pas que ce soit une faille de VB
seulement une technique trouvée par moi, je la revendique
retourne le même pointeur que VarPtrArray
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private Sub Command1_Click()
Dim SafeArray As SAFEARRAY1D
Dim PointerToPointer As Long
Dim PointerToSafeArray As Long
Dim Pointer As Long
Dim Tableau() As Integer
If Not (Not Tableau) = False Then
MsgBox "vide"
End If
ReDim Tableau(10)
If Not (Not Tableau) = True Then
MsgBox "non vide"
End If
PCPT
Messages postés13280Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201849 6 mars 2007 à 22:03
"faille VB", Renfield n'as pas dû lire ma réponse (je suppose)
quand au snippet, j'avais lu la réponse sur le forum (sans doute de toi en effet) il y a un moment.
j'ai encore le fichier.txt qui traine, je cite les sources, désolé pour les réponses en forum, on s'en sort plus sinon....
au moins c'est clarifié et matteli a 3 méthodes ;)
++
<hr size="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202171 6 mars 2007 à 22:32
quand je parle de faille, je veux dire qu'en fait, y'a pas de raison pour que l'on ne puisse faire un Not sur un tableau (dejà) alors pourquoi deux Not l'un après l'autre nous sorte le pData du tableau...
y'a une raison physique, bien entendu !
mais c'est conceptuellement non désiré, je pense ^^
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 6 mars 2007 à 22:33
Bah merci tout le monde pour ce début d'explication.
N'empèche que not tableau qui renvoie la négation de l'adresse du
tableau... C'est quand même original. Z'auraient balancer une erreur à
la compile que s'aurait été plus dans l'esprit de VB je trouve.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 mars 2007 à 22:40
effectivement avec le List1.Visible ça marche mais pourquoi ?
en fait Tableau contient le pointeur (en Long) mais on ne peut pas l'avoir directement (type mismatch)
alors que Not Tableau marche (VB est trompé)
il faut bien rajouter un deuxième Not pour l'avoir direct
mais c'est pas obligaoire, seulement plus pratique:
Not Tableau donne -1 si Tableau vide
le Not -1 donne 0 donc False.
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 mars 2007 à 23:16
en fait c'est pas vraiment vrai,
tu peux très bien faire Redim par défaut à zéro (pour Lbound) et l'utiliser à partir de 1
c'est que je fais en général
ce qui permet d'utiliser le zéro pour autre, par l'exemple tester si le tableau est vide
Dim Tableau() As Integer
ReDim Tableau(0) 'tout de suite
If UBound(Tableau) = 0 Then
MsgBox "vide"
End If
- - - - - - - - - - - - - - -
ReDim Tableau(10)
If UBound(Tableau) > 0 Then
MsgBox "non vide"
End If
Gobillot
Messages postés3140Date d'inscriptionvendredi 14 mai 2004StatutMembreDernière intervention11 mars 201934 6 mars 2007 à 23:34
ah oui c'est vrai j'avais pas vu, de même milles excuses
on ne peut pas utiliser le tableau quand il n'est pas initialisé, le pointeur est à zéro
et il n'y a pas de SafeArray, donc pas de Lbound, Ubound, etc ... donc plantage
il y a que le Not qui marche (à part le Redim, Erase ou ... je sais pas)
PS: on peut trés bien ne pas mettre de Dim et l'initialiser au Redim
le Dim ne sert qu'à lui donner un type, ce qui peut être fait dans le Redim
Redim Tableau(10) As Long