Gambas France BETA


Pas de compte ? Incription

Tableau et boucle

12
AuteurMessages
LanoueC#1 Posté le 11/5/2010 à 17:23:00
Bonjour

J'ai un soucis d'erreur "out of boud" que je ne comprend pas et n'arrive pas à résoudre
Si quelqu'un savait m'expliquer

TBL as new string[]
'**********************
FOR EACH TBL[L] IN TBL
IF TBL[L] = "blabla" THEN TBL.Remove(L) : Erreur out of bounds à cette ligne
INC L
NEXT
'***********************

OU bien :

'**********************
FOR L = 0 TO TBL.Max
IF TBL[L] = "blabla" THEN TBL.Remove(L) : : Erreur out of bouds à cette ligne
NEXT
'***********************

je ne vois pas en quoi je sors des limites
j'ai utilisé ces deux méthodes avec TBL.add("blabla") et cela fonctionne

merci d'avance aux esprits agiles

LanoueC
jeanyvon#2 Posté le 12/5/2010 à 07:25:00
Gambas? Ma! Et gustoSalut,
As tu dimensionné : tbl[10] par exemple?
c'est une hypothèse!
a+
jy
Vieillir? On peut retarder mais pas y échapper!
LanoueC#3 Posté le 12/5/2010 à 13:08:00
JYvon
Non j'ai juste fait une déclaration : TBL as new string[]

en fait , peut être cela a t'il son importance !

cette boucle est à l'intérieur d'une autre boucle

*********************************
For a = -11 to 10

FOR EACH TBL[L] IN TBL
IF TBL[L] = "blabla" THEN TBL.Remove(L) : Erreur out of bounds à cette ligne
INC L
NEXT

next
**********************************
a correspondant a une variable qui évolue dans TBL
-----------------------------------------------------------

merci
LanoueC
jeanyvon#4 Posté le 12/5/2010 à 13:42:00
Gambas? Ma! Et gustoRe!
Je viens d'essayer ton code:
mais j'ai mis en entête
1
PUBLIC tbl AS string[]


et dans form_open
1
TBL= NEW string[]


ensuite j'ai copié/collé le code. Bien sur j'ai dimensionné "L".Je n'ai pas ton erreur mais je n'ai rien dans le tableau alors ça ne veut rien dire.
Comme tu ne donne que ta boucle ou se produit ton erreur c'est assez difficile de voir d'où elle vient.
Je ne sais pas quoi dire :scratch:
A+
JY
Vieillir? On peut retarder mais pas y échapper!
micio#5 Posté le 12/5/2010 à 16:33:00
Peut-être une piste


PUBLIC SUB Form_Open()
DIM tb AS NEW String[]
DIM i AS Integer

FOR i = 0 TO 9
tb.Add(Str(i))
NEXT
END
LanoueC#6 Posté le 12/5/2010 à 21:42:00
Bonsoir
en premier Merci de votre aide

OUi je pense que je dois utiliser une variable à mauvais escient
voici la partie du code incriminée

1
FOR a = -10 TO 10FOR L=0 TO TBL.Max IF TBL[L] = "*" AND i <> 0 THEN produit = (produit * Val(TBL[L + 1])) TBL[L] = produit TBL.Remove(L + 1) ELSE IF TBL[L] = "*" AND i = 0 THEN produit = Val(TBL[L - 1]) * Val(TBL[L + 1]) TBL[L] = produit TBL.Remove(L - 1) TBL.Remove(L + 1) INC i ENDIF ENDIFNEXTNEXT


i=0 étant le premier passage dans la boucle
Bonne soirée
LanoueC
spheris#7 Posté le 12/5/2010 à 22:14:00
Lanouec,
out of bound veut dire que tu as dépassé la capacité de ton tableau (les champs) de 1 ou + .
N'oublie pas que le 0 comme tu dis est un passage dans la boucle !
donc un tableau de 10 va de 0 à 9 soit 10 items
;)
micio#8 Posté le 13/5/2010 à 09:50:00
peut-être :

DIM tbl AS NEW String[10]


ATTENTION .Remove(...) supprime un (plusieurs) élément du tableau
la dimension est réduite d'autant.

1
PUBLIC SUB Form_Open() DIM tb AS NEW STRING[10] DIM l AS INTEGER PRINT tb.Count ' donne 10tb.Remove(5) PRINT tb.Count ' donne 9END
gambix#9 Posté le 16/5/2010 à 17:06:00
Faire simple !
TBL as new string[]
'**********************
FOR EACH TBL[L] IN TBL
IF TBL[L] = "blabla" THEN TBL.Remove(L) : Erreur out of bounds à cette ligne
INC L
NEXT
'***********************

OU bien :

'**********************
FOR L = 0 TO TBL.Max
IF TBL[L] = "blabla" THEN TBL.Remove(L) : : Erreur out of bouds à cette ligne
NEXT



Déja la déclaration

For each TBL[L] in TBL

NEXT

C'est quoi ce truc ???

dim s as string
dim tbl as new string[]

For each s in tbl

next

Bon Maintenant tu veut virer des donnée d'un tableau via une boucle ..

Voici la solution :

Dim aTbl as new string[]
Dim aIndex as new Integer[]
Dim i as Integer

For i = 0 to aTbl.Max

if aTbl = "blabla" then aIndex.Add(i)

Next

For each i in aIndex

aTbl.Remove(i)

Next


Voila

Alors comment ça marche ?

D'abord on scan le tableau de chaines pour trouver les lignes a enlever ... car on ne peu pas vérifier et enlever, car le retrait change l'indexation du tableau (ce n'est pas une collection avec des clé uniques). Et on enregistre les index des lignes a virer dans un tableau d'entier.

Ensuite on parcour le tableau d'entier et on enlève les lignes concerné dans le tableau de chaines
Moins de texte dans une signature c'est agrandir son espace.
LanoueC#10 Posté le 16/5/2010 à 17:34:00
oui
merci Gambix c'est bien ce à quoi je suis arrivé pour résoudre le soucis d'indexation du tableau !!!
mais d'une manière différente


1
FOR L = 0 TO TBLproduit.MaxIF TBLproduit[L] <> "out" THEN TBLproduitnet.Add(TBLproduit[L]) NEXT 'on vide TBLproduitTBLproduit.Clear'on re remplit TBLproduit avec TBLproduitnetFOR L1 = 0 TO TBLproduitnet.MaxTBLproduit.Add(TBLproduitnet[L1])NEXT


je pensais pouvoir économiser l'emploi d'un tableau supplémentaire mais ce n'est pas possible !
j'ai bien essayé ce code ci dessous mais cela ne fonctionne pas non plus!

dim Remax as intger
Remax= TBL.Max

For L=0 to ReMax
if TBL[L]= "blabla" then
TBL.Remove(L)
Remax=Remax-1
endif
Next


Bonne fin de Dimanche
Merci à tous
gambix#11 Posté le 16/5/2010 à 18:57:00
Faire simple !
'on re remplit TBLproduit avec TBLproduitnet
FOR L1 = 0 TO TBLproduitnet.Max
TBLproduit.Add(TBLproduitnet[L1])
NEXT



ça sert a rien ... tu réassigne le nouveau tableau... il faut concevoir un tableau comme une chose physique certe mais sans réelle identité ... c'est juste un index donc :

TBLproduit = TBLproduitnet

Va changer l'identifiant de tableau contenu dans la variable TBLProduit... Et oui une variable tableau ne contien pas le tableau mais une adresse ver celui-ci. Le faite d'assigner l'adresse de tblproduitnet va faire pointé tblproduit vers le nouveau tableau... et comme l'ancien tableau n'a plus personne qui fait référence a lui ... l'interpréteur va simplement le détruire...

tout objet n'ayant aucun référencement est détruit automatiquement
par exemple :

Private hClass as new CMyClass

si je fait

hClass =Null

alors l'instance de CMyClass est détruite
d'ou pour résumer


d'ou pour résumer


Code:

FOR L = 0 TO TBLproduit.Max
IF TBLproduit[L] <> "out" THEN TBLproduitnet.Add(TBLproduit[L])
NEXT

TBLProduit = TBLProduitnet
Moins de texte dans une signature c'est agrandir son espace.
LanoueC#12 Posté le 16/5/2010 à 20:36:00
OK Gambix
Donc

si j'ai besoin d'un xièm tableau qui soit égal à TBLproduit


1
FOR L = 0 TO TBLproduit.MaxIF TBLproduit[L] <> "out" THEN TBLproduitnet.Add(TBLproduit[L])NEXTTBLproduit.ClearTBLproduit = TBLproduitnet


TBLxiem=TBLproduit : NON car TBLproduit n'existe plus : si j'ai bien compris
OU
TBLxiem= TBLproduitnet : OUI car il pointe vers TBLproduitnet qui existe donc prend sa valeur quand nécessaire?

est ce bien ce raisonnement?

Merci
gambix#13 Posté le 16/5/2010 à 23:04:00
Faire simple !non c'est tblproduit qui devient le nouveau tableau

lit bien le code

et rappelle toi bien que la variable ne contien pas un tableau mais un identifiant vers celui-ci
Moins de texte dans une signature c'est agrandir son espace.
micio#14 Posté le 17/5/2010 à 19:18:00
Pour supprimer des éléments d'un tableau


1
PUBLIC SUB Form_Open() DIM tb AS NEW String[] DIM i AS INTEGER tb.Add("noir") tb.Add("vert") tb.Add("maron") tb.Add("rouge") tb.Add("vert") tb.Add("orange") tb.Add("jaune") tb.Add("vert") tb.Add("vert") tb.Add("bleu") tb.Add("violet") tb.Add("gris") tb.Add("blanc") tb.Add("vert") DO IF tb[i] = "vert" THEN tb.Remove(i) ELSE i += 1 ENDIF LOOP UNTIL tb.Max < iEND
gambix#15 Posté le 17/5/2010 à 20:00:00
Faire simple !oui c'est une autre solution en effet.. comme .maxest testé a chaque boucle c'est bon

en fait FOR stocke la valeur de TO... doncc'est pour ça que çaplantait
Moins de texte dans une signature c'est agrandir son espace.
12