Foreach, deleteelement et tests : sauts imprévus

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Foreach, deleteelement et tests : sauts imprévus

Message par Golfy »

Bonjour,

je me fais piéger par une structure identique à celle ci-dessous (simplifiée). Ma question est : quel est le moyen le plus simple pour éviter le saut de valeur (et donc de test) ?
J'ai pensé à
1) changer la valeur de l'élément à une valeur inutilisable (hors du test). Inconvénient la liste repasse entièrement (pas optimum)
2) ne pas utiliser foreach
3) qu'un forumeur aurait une meilleure idée que moi

A noter : un deletelement(test(),0) ne change rien (ce n'est pas lié au flag d'option)

Code : Tout sélectionner

Structure z
	a.a
	b.i
EndStructure

NewList test.z()

For t=1 To 9
	AddElement(test())
	test()\a = t
	test()\b = 9
Next t

Debug ListSize(test())

trame$="012-3-5-7-89-6"

t = 1
Repeat
	c = Val(Mid(trame$,t,1))
	Debug "---- "+Str(c)
	a$=""
	ForEach test()
		a$=a$+Str(test()\a)+" "
	Next
	Debug "filtre = "+a$
	ForEach test()
		Debug "Test sur element "+Str(test()\a)
		If test()\a = c
			Debug "Trouvé "+Str(test()\a)+" (et effacé)"
			DeleteElement(test(),1)
			Debug "courant "+Str(test()\a)
			PreviousElement(test())
			PreviousElement(test())
			Debug "prochain "+Str(test()\a)
		EndIf
	Next
	t + 1
	
Until ListSize(test()) = 0 Or t>Len(trame$)
Merci pour vos idées. :|
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Golfy
Messages : 423
Inscription : mer. 25/août/2004 15:14
Localisation : Grenoble
Contact :

Re: Foreach, deleteelement et tests : sauts imprévus

Message par Golfy »

Voici un exemple qui fonctionne (sans ForEach... Next)

Code : Tout sélectionner

Structure z
	a.a
	b.i
EndStructure

NewList test.z()

For t=1 To 9
	AddElement(test())
	test()\a = t
	test()\b = 9
Next t

Debug ListSize(test())

trame$="012-3-5-7-89-6"

t = 1
Repeat
	c = Val(Mid(trame$,t,1))
	Debug "---- "+Str(c)
	a$=""
	ForEach test()
		a$=a$+Str(test()\a)+" "
	Next
	Debug "filtre = "+a$
	count = 0
	Repeat
		SelectElement(test(),count)
		Debug "Test sur element "+Str(test()\a)
		If test()\a = c
			Debug "Trouvé "+Str(test()\a)+" (et effacé)"
			DeleteElement(test(),1)
			Debug "courant "+Str(test()\a)
			count - 1
			Debug "prochain "+Str(test()\a)
		EndIf
		count + 1
	Until count => ListSize(test())
	t + 1
	
Until ListSize(test()) = 0 Or t>Len(trame$)
Purebasic 5.30 full sous Windows XP (x86) et Win7 (64 bits), Linux Debian. Orientation réseaux, domotique
http://golfy.olympe.in/Teo-Tea/
Répondre