shudrummer
Messages postés58Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention22 août 2007 21 oct. 2005 à 14:19
! J'ai trouvé !
Alors InStr ne marchant pas sur VB5, j'ai finté :
'Tout d'abord nous avons notre chemin :
Const Origine = "C:\Windows\Etc"
'La variable Place contiendra l'endroit ou se trouve le dernier " \ ":
Dim Place As Long
'Nous allons donc tester tout au long du mot:
For a = 1 To Len(Origine)
'Si il y a un "" après la position indiqué, nous notons cet emplacement sans Place,
'Cette action permet d'enregistrer la position du dernier ""
If InStr(a, Origine, "", 0) > 0 Then Place = InStr(a, Origine, "", 0)
Next a
'Variable Mot qui contiendra le dernier mot de notre chemin
Dim Mot As String
'Une fois que nous avons la position du dernier "", il nous reste plus
'qu'à prendre le mot qui se trouve à droite de cette position
'Len(Origine) - Place car on prend que le dernier mot, et comme on
'commence de la droite, il nous faut la position 'inverse' de notre ""
Mot = Right(Origine, Len(Origine) - Place)
'On affiche notre mot !
MsgBox Mot
Et voilà ! Merci à tous, vous m'avez permis de découvrir InStr en Len, qui m'ont servi à faire ma fonction version VB5 !!!
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 21 oct. 2005 à 13:32
ps : Aieeeuuuu -> Split est très pratique, mais surtout pour les grandes chaînes...
il est beaucoup plus lourd, c'est préférable de l'éviter pour les si petits traitements
shudrummer
Messages postés58Date d'inscriptionmardi 30 décembre 2003StatutMembreDernière intervention22 août 2007 21 oct. 2005 à 14:01
Euh ...
InStrRev ne marche pas sur VB5 ... Il n'y a que InStr qui fonctionne ...
Comme InStr ne rend que le premier caractère reconnu, InStrRev doit donner le dernier, mais il ne fonctionne pas sur VB5 ...
Il faut trouver autre chose, je planche dessus ...
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 21 oct. 2005 à 17:02
Pas trop d'accord avec toi pcpt car, que fait instr sinon parcourrir la chaine depuis le début pour trouver d'abord la position de départ indiquée puis comparer jusqu'au caractère cherché et si pas trouvé comparer tous les caractères jusqu'à la fin ? Donc beaucoup plus de "passages" que mes 4.
Enfin, pour une chaîne si courte, la différence doit être minime.
Au final, une question qui devrait intéresser les amateurs de perf d'instructions.
-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 21 oct. 2005 à 17:43
re,
désolé, mais je maintiens^^
3 boutons, chacun le notre (pas de jaloux comme çà)
Private Sub Command1_Click() '[ShuDrummer]
Const Origine = "C:\Windows\Etc"
Dim Place As Long
For a = 1 To Len (Origine)
If InStr(a, Origine, "", 0) > 0 Then Place = InStr(a, Origine, "", 0)
Next a
Dim Mot As String
Mot = Right (Origine, Len(Origine) - Place)
' MsgBox Mot
Debug.Print "[ShuDrummer] -> " & a - 1 & " passages en boucle"
End Sub
'
'
'
'
'
Private Sub Command2_Click() '[PCPT]
Const sPath As String = "C:\Windows\Etc"
Dim Pos1 As Integer, Pos2 As Integer
Dim a As Integer: a = 1
Pos1 InStr (sPath, ""): Pos2 1
Do While Pos1 <> 0
a = a + 1
Pos2 = Pos1
Pos1 = InStr (Pos2 + 1, sPath, "")
Loop
' If po2 <> 1 Then
' MsgBox Right(sPath, Len(sPath) - Pos2), 32
' Else
' MsgBox "ya aucun slash", 32
' End If
Debug.Print "[PCPT] -> " & a - 1 & " passages en boucle"
End Sub
'
'
'
'
'
Private Sub Command3_Click() '[CanisLupus]
Dim Origine As String, Mot As String
Dim a As Integer
Dim b As Integer: b = 1
Origine = "c:\windows\etc"
'On parcourre la chaine à partir de la fin
For a = Len (Origine) To 1 Step -1
b = b + 1
If Mid(Origine, a, 1) = "" Then
Mot = Mid(Origine, a + 1): Exit For
End If
Next a
' MsgBox Mot
Debug.Print "[CanisLupus] -> " & b - 1 & " passages en boucle"
End Sub
cs_CanisLupus
Messages postés3757Date d'inscriptionmardi 23 septembre 2003StatutMembreDernière intervention13 mars 200621 21 oct. 2005 à 18:30
Arf, pcpt, ce n'est pas comme ça qu'il faut le calculer mais en nombre d'instructions processeur (voire en temps d'utilisation) et pas en nombre de fois qu'on passe dans une boucle si on veut vraiment comparer car ça dépend des instructions qui sont dans la boucle. Certaines sont plus gourmandes que d'autres.
Cela dit, notre discussion, bien qu'intéressante, n'a plus grand chose à voir avec la question de départ. A moins que ça intéresse aussi shudrummer.
-------------------------------------------------
Dresseur de puces, .... normal pour un loup !?
voici les performances en ms. j'ai pas de moyen de vérifier en ressources RAM précises
les boucles ont chacunes tourné 1000 fois pour avoir une moyenne acceptable.
et la boucle est faite dans un timer, pour ne pas interférer en ressources process.
Timer dispo dans mes sources ;)
<HR>
IDE : [ShuDrummer]
Nombre de Test : 1000
Vitesse min = 0,0494ms
Vitesse max = 1,2259ms
moyenne = 0,058ms
EXE : [ShuDrummer]
Nombre de Test : 1000
Vitesse min = 0,0324ms
Vitesse max = 0,1447ms
moyenne = 0,0366ms
<HR>
IDE : [PCPT]
Nombre de Test : 1000
Vitesse min = 0,0441ms
Vitesse max = 1,0999ms
moyenne = 0,0527ms
EXE : [PCPT]
Nombre de Test : 1000
Vitesse min = 0,0299ms
Vitesse max = 0,4808ms
moyenne = 0,0355ms
<HR>
IDE : [CanisLupus]
Nombre de Test : 1000
Vitesse min = 0,0483ms
Vitesse max = 1,6429ms
moyenne = 0,0594ms
EXE : [CanisLupus]
Nombre de Test : 1000
Vitesse min = 0,0335ms
Vitesse max = 0,3917ms
moyenne = 0,0378ms
<HR>
j'aurais pensé que la première méthode aurait pris beaucoup plus de temps, mais non ;)
il ne faut pas oublier que c'est un calcul simple...
bref, voilà, à vous d'en tirer vos conclusions.
ps : çà ne fait que donner une idée. chiffres variables selon les applis qui tournent déjà, et les performances propres à chaque poste.