cs_Worst
Messages postés19Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention13 décembre 2006
-
23 avril 2006 à 20:04
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012
-
25 janv. 2013 à 22:32
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012 23 janv. 2013 à 21:51
Mieux qu'andalo!est-ce possible?
Plaisanterie mise à part,a tu testé ton code djkarim?
Je me suis arrêté a vb6, mais même si c'est du .net, je ne pense pas que ça fonctionne.
Il y a mieux que ANDALO je pense .. on peut faire encore plus rapide (efficace), les itérations de sa première boucle à partir de l'indice de la valeur à supprimer jusqu'à la fin du tableau sont totalement inutiles, on peut remplacer la boucle pour par Tantque :
dim i as integer
dim j as integer
b as boolean
b:=false;
i:=1;
while (b=false) do
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
b:=true;
Next j
exit for
exit if
next i
Exit while
ReDim Preserve Tableau(UBound(Tableau()) - 1)
end.
wpjo1956
Messages postés14Date d'inscriptionjeudi 19 mai 2005StatutMembreDernière intervention22 novembre 2008 6 sept. 2010 à 15:51
On peut faire encore plus lent ?
the_little_big_man
Messages postés86Date d'inscriptionlundi 22 janvier 2007StatutMembreDernière intervention14 février 2011 17 août 2010 à 11:31
la solution de ANDALO est nickel... merci mec
andalo
Messages postés102Date d'inscriptionlundi 23 avril 2007StatutMembreDernière intervention20 octobre 2012 13 janv. 2010 à 13:41
Arrêtez moi si je me trompe mais il me semble qu'il y a bien plus simple, et en une seule boucle :
soit un tableau deja rempli, appelons le Tableau
dim i as integer
dim j as integer
For i = 0 To UBound(Tableau())
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
Next
ReDim Preserve Tableau(UBound(Tableau()) - 1)
Exit For
End If
Next i
cs_Worst
Messages postés19Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention13 décembre 2006 16 nov. 2007 à 18:00
Je voyais le truc tout simple : créer un 2ème tableau avec directement la bonne taille (max - 1), et mettre dedans les valeurs au fur et à mesure. Mais effectivement, à la fin faut le remettre dans le 1er tableau, et là on est comme des flans.
Y'a bien l'option "on crée une fonction qui retourne le nouveau tableau", mais là ça doit être VB qui crée une copie du tableau avant de le retourner...
Public Function array_remove(ByRef t() As String, ByVal val As String)
Dim max As Integer ' Taille de l'ancien tableau
max = UBound(t)
Dim cur_val As String ' Valeur lue dans l'ancien tableau
Dim ind_anc As Integer ' Indice de déplacement dans l'ancien tableau
Dim ind_nouv As Integer ' Indice de déplacement dans le nouveau tableau
Dim nouv_tab() As String ' Nouveau tableau
ReDim Preserve nouv_tab(max - 1)
ind_nouv = 0
For ind_anc = 0 To max
cur_val = t(ind_anc)
If cur_val <> val Then
nouv_tab(ind_nouv) = cur_val
ind_nouv = ind_nouv + 1
End If
Next ind_anc
array_remove = nouv_tab
End Function
'''''''' Exemple ''''''''
Dim t(10) As String
For i = 0 To 10
t(i) = i
Next i
nouv_t = array_remove(t, 5)
Dim val As Variant
For Each val In nouv_t
Debug.Print val
Next
Donc, finalement je suis d'accord, y'a 2 parcours. J'ai dit des bêtises. Au temps pour moi.
Par contre, juste : pourquoi tu mets plein de UBound() dans tes boucles for() ? Ca serait pas plus efficace de récupérer la taille une première fois avant d'entrer dans la boucle, plutôt que de le recalculer à chaque fois ??
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 16 nov. 2007 à 12:18
Oups... et donc je code de Simboy n'est pas si mauvais que ça. Mais je peux me tromper..
peug
Messages postés232Date d'inscriptionmercredi 25 octobre 2000StatutMembreDernière intervention 5 octobre 2012 16 nov. 2007 à 12:14
Worst, je suis un peu d'accord mais dans ton idée il faut bien renvoyé le tableau sans l'item. Comment vois-tu la chose ?
zieut ca :
Dim i As Integer
Dim k As Integer
'Creation du tableau temporaire
Dim tbTemp() As String 'doit être idem que tb :(
ReDim tbTemp(UBound(Tabl))
For i = 0 To UBound(Tabl)
If i <> item Then
'on copie dans le nouveau tableau sauf l'item a effacer
tbTemp(k) = Tabl(i)
k = k + 1
End If
Next
'on refait le tableau de base
ReDim Tabl(UBound(tbTemp))
For i = 0 To UBound(tbTemp)
Tabl(i) = tbTemp(i)
Next
floppeur
Messages postés6Date d'inscriptionmardi 8 avril 2003StatutMembreDernière intervention16 avril 2007 7 mai 2007 à 12:24
Bonjour,
Je trouve que même si la source de simboy n'est pas optimiser (comme dit Worst), elle fait appel a une structure de donnée orienté objet que je trouve très intéressante. Comme par exemple pour la gestion d'un panier de produits...
Alors Merci bien..
Sanyohan13: Tu es dans la mauvais rubrique, mais pour ton probléme block avec maxlength...
sanyohan13
Messages postés7Date d'inscriptionmardi 2 mai 2006StatutMembreDernière intervention23 mars 2009 8 juin 2006 à 11:48
salut
je débute et je voudrais savoir comment faire pour écrire seulement "1234567890ABCDEF" et que les autres caractères ne s'écrivent pas m^me si on appuie dessus...
merci
cs_Worst
Messages postés19Date d'inscriptionvendredi 22 février 2002StatutMembreDernière intervention13 décembre 2006 23 avril 2006 à 20:04
Bonjour,
Je voulais juste dire que je ne suis pas tout à fait d'accord avec la solution proposée. Cette méthode nécessite 2 parcours du tableau.
En effet, la méthode 'Redim Preserve' crée un nouveau tableau et recopie dedans les éléments de l'ancien. En aucun cas il agrandit le tableau existant...
25 janv. 2013 à 22:32
25 janv. 2013 à 18:46
23 janv. 2013 à 21:51
Plaisanterie mise à part,a tu testé ton code djkarim?
Je me suis arrêté a vb6, mais même si c'est du .net, je ne pense pas que ça fonctionne.
23 janv. 2013 à 18:14
dim i as integer
dim j as integer
b as boolean
b:=false;
i:=1;
while (b=false) do
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
b:=true;
Next j
exit for
exit if
next i
Exit while
ReDim Preserve Tableau(UBound(Tableau()) - 1)
end.
6 sept. 2010 à 15:51
17 août 2010 à 11:31
13 janv. 2010 à 13:41
soit un tableau deja rempli, appelons le Tableau
dim i as integer
dim j as integer
For i = 0 To UBound(Tableau())
If Tableau(i) = LaValeurASupprimmer Then
For j = i To UBound(Tableau()-1)
Tableau(j) = Tableau(j + 1)
Next
ReDim Preserve Tableau(UBound(Tableau()) - 1)
Exit For
End If
Next i
16 nov. 2007 à 18:00
Y'a bien l'option "on crée une fonction qui retourne le nouveau tableau", mais là ça doit être VB qui crée une copie du tableau avant de le retourner...
Public Function array_remove(ByRef t() As String, ByVal val As String)
Dim max As Integer ' Taille de l'ancien tableau
max = UBound(t)
Dim cur_val As String ' Valeur lue dans l'ancien tableau
Dim ind_anc As Integer ' Indice de déplacement dans l'ancien tableau
Dim ind_nouv As Integer ' Indice de déplacement dans le nouveau tableau
Dim nouv_tab() As String ' Nouveau tableau
ReDim Preserve nouv_tab(max - 1)
ind_nouv = 0
For ind_anc = 0 To max
cur_val = t(ind_anc)
If cur_val <> val Then
nouv_tab(ind_nouv) = cur_val
ind_nouv = ind_nouv + 1
End If
Next ind_anc
array_remove = nouv_tab
End Function
'''''''' Exemple ''''''''
Dim t(10) As String
For i = 0 To 10
t(i) = i
Next i
nouv_t = array_remove(t, 5)
Dim val As Variant
For Each val In nouv_t
Debug.Print val
Next
Donc, finalement je suis d'accord, y'a 2 parcours. J'ai dit des bêtises. Au temps pour moi.
Par contre, juste : pourquoi tu mets plein de UBound() dans tes boucles for() ? Ca serait pas plus efficace de récupérer la taille une première fois avant d'entrer dans la boucle, plutôt que de le recalculer à chaque fois ??
16 nov. 2007 à 12:18
16 nov. 2007 à 12:14
zieut ca :
Dim i As Integer
Dim k As Integer
'Creation du tableau temporaire
Dim tbTemp() As String 'doit être idem que tb :(
ReDim tbTemp(UBound(Tabl))
For i = 0 To UBound(Tabl)
If i <> item Then
'on copie dans le nouveau tableau sauf l'item a effacer
tbTemp(k) = Tabl(i)
k = k + 1
End If
Next
'on refait le tableau de base
ReDim Tabl(UBound(tbTemp))
For i = 0 To UBound(tbTemp)
Tabl(i) = tbTemp(i)
Next
7 mai 2007 à 12:24
Je trouve que même si la source de simboy n'est pas optimiser (comme dit Worst), elle fait appel a une structure de donnée orienté objet que je trouve très intéressante. Comme par exemple pour la gestion d'un panier de produits...
Alors Merci bien..
Sanyohan13: Tu es dans la mauvais rubrique, mais pour ton probléme block avec maxlength...
8 juin 2006 à 11:48
je débute et je voudrais savoir comment faire pour écrire seulement "1234567890ABCDEF" et que les autres caractères ne s'écrivent pas m^me si on appuie dessus...
merci
23 avril 2006 à 20:04
Je voulais juste dire que je ne suis pas tout à fait d'accord avec la solution proposée. Cette méthode nécessite 2 parcours du tableau.
En effet, la méthode 'Redim Preserve' crée un nouveau tableau et recopie dedans les éléments de l'ancien. En aucun cas il agrandit le tableau existant...
Tiré de MSDN :
http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/vblr7/html/vastmredim.asp
"Si vous incluez le mot clé Preserve, Visual Basic copie les éléments à partir du tableau existant dans le nouveau tableau."
Je pense qu'il est donc plus efficace de recréer un nouveau tableau en écrivant dedans juste les éléments qui nous intéressent.