Tableau dynamique 2 dimensions [Résolu]

Messages postés
177
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 avril 2013
- 4 oct. 2006 à 10:51 - Dernière réponse :
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Derniè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
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
4 oct. 2006 à 13:55
1
Merci
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

<small> Coloration
syntaxique automatique [AFCK] </small>
       

++

<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp

Merci PCPT 1

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 90 internautes ce mois-ci

Commenter la réponse de PCPT
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Dernière intervention
23 août 2018
4 oct. 2006 à 11:32
0
Merci
Si je ne me trompe pas, on ne peut redimensionner que la dernière "dimension" d'un tableau.

Soit Tableau(X,Y), on ne peut que REDIM(entionner) le Y

Soit Tableau(X,Y,Z), on ne peut que REDIM(entionner) le Z


Dans le cas d'un tableau à une dimension, on peut redimensionner l'index puisque c'est le dernier...

MPi
Commenter la réponse de cs_MPi
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
3 mars 2009
4 oct. 2006 à 13:12
0
Merci
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))...

Julien
Commenter la réponse de Julien237
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
4 oct. 2006 à 13:28
0
Merci
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" 

        Me.Print T_Nom(Ind).Col1 & "     " & T_Nom(Ind).Col2 

        Ind = Ind + 1 
    Loop 
End Sub

<small> Coloration
syntaxique automatique [AFCK] </small>
       

++

PCPT  [AFCK]
<hr size ="2" width="100%" />Prenez un instant pour répondre à ce sondage svp
Commenter la réponse de PCPT
Messages postés
177
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 avril 2013
4 oct. 2006 à 13:39
0
Merci
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.

Merci encore pour toute votre aide,
Commenter la réponse de cs_tulesais
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
3 mars 2009
4 oct. 2006 à 13:46
0
Merci
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...

Julien.
Commenter la réponse de Julien237
Messages postés
884
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
3 mars 2009
4 oct. 2006 à 13:51
0
Merci
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)

Julien.
Commenter la réponse de Julien237
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
4 oct. 2006 à 13:56
0
Merci
woups : tu peux virer Dim mCol As tCols qui ne sert à rien....
Commenter la réponse de PCPT
Messages postés
177
Date d'inscription
mercredi 2 juin 2004
Dernière intervention
11 avril 2013
4 oct. 2006 à 14:03
0
Merci
Superbe :-)


merci beaucoup pour cette réponse !!!


 


merci à toi aussi julien ... et vraiment désolé de n'avoir pas totalement compris ta réponse ...


ce soir j'y jeterai un oeil...

A bientôt et encore merci pcpt !!!
Commenter la réponse de cs_tulesais
Messages postés
13368
Date d'inscription
lundi 13 décembre 2004
Dernière intervention
3 février 2018
4 oct. 2006 à 14:20
0
Merci
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
Commenter la réponse de PCPT

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.