cs_tulesais
Messages postés175Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention11 avril 2013
-
4 oct. 2006 à 10:51
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 2018
-
4 oct. 2006 à 14:20
Bonjour,
je souhaiterais pouvoir utiliser un tableau à deux dimensions.
Malheureusement, j'ai un message d'erreur (indice en dehors de plage) lors de son utilisation.
Pourriez vous m'indiquer où se trouve l'erreur dans mon code ???
Merci d'avance pour votre aide,
public T_Nom() as string
...
ReDim T_Nom(0,0)
ind_1 = 0
ind_2 = 0
do until ...
ind_1 = ind_1 +1
do until ...
ind_2 = ind_2 + 1
ReDim Preserve T_Nom(ind_1,ind_2)
T_Nom(ind_1,ind_2) = "arf"
loop
loop
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2006 à 13:55
je sais pas si çà peut t'aider....
ajoute une listbox
Option Explicit
'
Private Type tCols
Cols() As String
End Type
'
Private T_Nom() As tCols
'
'
Private Sub Form_Load()
List1.Clear
Dim Ind1&, Ind2&
Dim mCol As tCols
Ind1 = 0: Ind2 = 0
Do Until Ind1 > 9
ReDim Preserve T_Nom(Ind1)
ReDim Preserve T_Nom(Ind1).Cols(Ind1)
Do Until Ind2 > Ind1
T_Nom(Ind1).Cols(Ind2) = Ind1 & ": arf Cols(" & Ind2 & ")"
List1.AddItem T_Nom(Ind1).Cols(Ind2)
Ind2 = Ind2 + 1
Loop
List1.AddItem "-----------"
Ind2 = 0
Ind1 = Ind1 + 1
Loop
End Sub
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 4 oct. 2006 à 13:12
Salut !
En effet tu ne peux redimensionner que la dernière dimension d'un tableau. Il y a plusieurs solutions à ton problème, la plus simple et plus légère à mon gout, est de faire un tableau à 1 dimension avec une fonction de conversion. Je t'explique :
Public Tab() as Integer, TabMax1 as Integer, TabMax2 as Integer
Sub Redimensionner(Dim1 as Integer, Dim2 as Integer)
TabMax1 = Dim1
TabMax2 = Dim2
'(Si tu veux en plus préserver tes valeurs dans les bonnes positions, tu peux faire
'un algo que je te laisse faire, ca doit pas être très compliqué :p)
Redim [Preserve] Tab((TabMax1 + 1) * (TabMax2 + 1))
End Sub
Function TwoDim(Dim1 as integer, Dim2 as integer) as integer
return Dim1 * (TabMax2 + 1) + Dim2
end Function
Et tu accède à ton tableau par : Tab(TwoDim(x, y))...
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2006 à 13:28
salut,
le type est là aussi pour çà
Option Explicit
'
Private Type tCols
Col1 As String
Col2 As String
End Type
'
Private T_Nom() As tCols
'
'
Private Sub Form_Load()
Me.AutoRedraw = True
Dim Ind As Long
Ind = 0
Do Until Ind > 9 'ta condition
ReDim Preserve T_Nom(Ind)
T_Nom(Ind).Col1 = Ind & ": arf Col1"
T_Nom(Ind).Col2 = Ind & ": arf Col2"
cs_tulesais
Messages postés175Date d'inscriptionmercredi 2 juin 2004StatutMembreDernière intervention11 avril 20132 4 oct. 2006 à 13:39
Merci à tous pour vos réponses !!!
par contre, je ne pense pas que cela réponde entièrement à mes attentes...
En ce qui concerne la solution de 'julien237', si j'ai bien tout compris :
si TabMax1 1 et TabMax2 2 --> l'indice du tableau vaut 6
si TabMax1 = 2 et TabMax2 = 1 --> l'indice du tableau vaut également 6
il y a donc un problème...
En ce qui concerne la solution de pcpt, bien étendu...si j'ai tout compris, mon premier indice peut aller jusqu'à l'infini par contre, mon second indice doit être déclaré (col2) alors que je n'ai aucune idée du nombre.
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 4 oct. 2006 à 13:46
Oui c'est bien exact !
Ou est le problème ?
TabMax1 1 et TabMax2 2
Ton tableau :
a1 a2
b1 b2
c1 c2
Le nombre d'éléments est bien = à 6 (Je compte les TabMax basé à 0)
TabMax1 2 et TabMax21
a1 a2 a3
b1 b2 b3
Il y a également 6 éléments
Le tout est de ne pas redimensionner le tableau entre la définition et la récupération d'éléments. A moins de faire l'algo de préservation...
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 4 oct. 2006 à 13:51
Si cela peut t'aider à comprendre, c'est le même principe que la définition des couleurs :
Une couleur est à trois dimensions (Red, green, blue) et pourtant elle se caractérise par un seul nombre. En sachant que les 3 composantes sont comprises entre 0-255, le calcul est réalisé comme suit :
Couleur = Red + 256 * Green + 256 * 256 * Blue
Et ainsi, on ne peut avoir 2 nombres pour une même couleur ou 2 couleurs pour un même nombre...
C'est le même principe dans le code que je t'ai fait :
IndiceDuTableau = Dim2 + Dim1 * (Maximum de Dim2)
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 4 oct. 2006 à 14:20
ok
ps : l'ordre des redim peut être choquant, dans le sens ou il est ici décalé (on connait déjà ind2)
pour suivre vraiment le redim dynamique il faudrait :
Do Until Ind1 > 9
ReDim Preserve T_Nom(Ind1)
Do Until Ind2 > Ind1
ReDim Preserve T_Nom(Ind1).Cols(Ind2)
...
2 parce que petite erreur dans le code précédent (on va parfois trop vite^^), mais surtout l'ordre qui change.
il va sans dire que cette manière agmentera sensiblement le temps d'execution, à se passer donc si tu connais ind2 avant d'entre dans le 2e loop (connaître = n'est pas modifié dans la 2e boucle)
++
Prenez un instant pour répondre à ce sondage svp