Bonjour,
Redimensionner une variable tableau dans une boucle où je manipule des variables T(i) et T(i+1).
la déclaration dim T() as double puis redim T(i) me bloque par une erreur OutOfBoundsException.
Bonjour,
Redimensionner une variable tableau dans une boucle où je manipule des variables T(i) et T(i+1).
la déclaration dim T() as double puis redim T(i) me bloque par une erreur OutOfBoundsException.
[quote=176288:@Djamel AIT AMRANE]Bonjour,
Redimensionner une variable tableau dans une boucle où je manipule des variables T(i) et T(i+1).
la déclaration dim T() as double puis redim T(i) me bloque par une erreur OutOfBoundsException.[/quote]
Je parie que vous avez une boucle du genre for i = 0 to myvar.ubound
Ubound est en base 1 alors que le tableau est en base zéro, il faut donc entrer for i = 0 to myvar.ubound-1
Sinon, postez le code pour voir ce qui peut bloquer le Redim.
La boucle est plus longue, j’ai mis seulement la partie qui pose problme.
//a marche avec tableau fixe, Lx(999) as double, sinon ...
S12=6762.722
Dk=300
Ds=Floor(S12/Dk)
For i=0 to Ds
L(i) = Trigo.Mod_Lng(Lng1 + s * i)
dsi(i) = (Dk/60)*trigo.rad
Lx(i) = asin(sin(Lf) * cos(i*dsi(i)) + cos(Lf)* cos( Cini) * sin(i * dsi(i)))
L(i)=acos((cos( i *dsi(i)) - sin(Lf) * sin(Lx(i)))/(cos(Lf) * cos(Lx(i))))*Trigo.deg
Lx(i+1)= asin(sin(Lf) * cos((i + 1)*dsi(i)) + cos(Lf )* cos( Cini) * sin((i+1) * dsi(i)))
L(i+1)=acos((cos((i +1)*dsi(i)) - sin(Lf) * sin(Lx(i+1)))/(cos(Lf) * cos(Lx(i+1))))*Trigo.deg
Next
Il est plus efficace de calculer cette valeur hors de la boucle:
LastCell = myvar.ubound-1
puis:
for i = 0 to LastCell
Lisez donc Performance considerations.
Djamel,
Il me semble que tu essayes de remplir des positions dans le tableau qui n’existent pas (parce que le dimensionement n’est pas correct).
Il y a deux choses a considerer dans ton code: Le nombre de valeurs de i dans la boucle ser Ds+1, et en plus tu essayes de mettre une valeur dans la position i+1 du tableau. Elle existe, cette position?
Si il n’y pas d’erreur quand t’utilises une dimension fixe c’est probablement parce la dimension fixe que tu as choisi est beaucoup trop grande pour tes donnees.
Julen
Julen,
Je dois reflechir un peu plus a l’algorithme.
J’ai essay la solution prconise par Emile, maintenant tu me fais penser l’algo.
Ds est le nombre de segments a calculer, c’est tout simplement unes distance/par une longeur choisie de chaque segment.
La boucle consiste a balayer et a affecter a i une valeur de 0 a Ds step 1.
[/url][/img]
Julen,
Je dois reflechir un peu plus a l’algorithme.
J’ai essay la solution prconise par Emile, maintenant tu me fais penser l’algo.
Ds est le nombre de segments a calculer, c’est tout simplement unes distance/par une longeur choisie de chaque segment.
La boucle consiste a balayer et a affecter a i une valeur de 0 a Ds step 1.
Bonjour,
N’ayant pas trouv de solution, j’ai fait des tests avec des variables T(999), dans tous les cas a marche.
Cela a t il une incidence sur le programme ?
[quote=176530:@Djamel AIT AMRANE]N’ayant pas trouvé de solution, j’ai fait des tests avec des variables T(999), dans tous les cas ça marche.
Cela a t il une incidence sur le programme ?[/quote]
J’allais vous suggérer de simplement surdimensionner le tableau pour éviter une exception hors limites (out of bounds). Tout ce que cela fait est de consommer quelques octets en plus, ce qui est négligeable avec l’énorme quantité de mémoire disponible aujourd’hui. Ce n’est pas très élégant mais cela devrait vous permettre de fonctionner.
je vais donc m’y rsoudre a augmenter la taille du tableau qui a donn des rsultats correctes pour les cas extrmes.
Je dois revoir l’algorithme, peut tre en le rcrivant d’une autre manire a rsoudra le problme.
Merci a tous.
Bonjour,
J’ai repris un autre algorithme qui n’utilise pas la rcurrence T(i+1) , tjrs le problme avec redim !
Quelle est la valeur de N au moment de l’erreur?
Et la dimension de S_1()?
Dans ce cas N = floor(6129.12/100), soit 61.
pour S_1(61) limite du nombre d’iterations, S_1(60) -> out of bound.
Comme j’ai mis tout a T(999) je risque rien, mais pourquoi a marche pas avec redim ?
au blocage i = 1.
Tu peux isoler le probleme et poster le code qui ne marche pas?
60 / 61: cela sent le 0-based / 1-based !
Vérifie que ta boucle commence bien à 0, la boucle doit correspondre à: For xxx = 0 to MaxVal
où xxx est ton indice de boucle et MaxVal
la valeur maximale.
Dans ce cas, tu passeras en revue les cellules 0 à 60 de ton tableau (0 à 60 = 61 cellules).
Lorsque je baisse ma garde, j’ai aussi tendence à me faire avoir avec çà !
Bonjour Julen,
j’ai enlev tout ce qui n’est pas ncessaire a la mise en vidence du problme.
dim lat1, lat2, lng1, lng2,dist, cini,lf ,d_Lng,x as double
dim DS , Dk , i , s as integer
const deg2rad as double = 0.017453292519943
const rad2deg as double = 57.29577951308232
lat1 = -33.88833333
lng1 = -18.385
lat2= 40.451666666
lng2 = 73.82333333
Dk = 300
Lf = Lat1 * deg2rad
Dim Lx(999), dsi(999) as double
//dist= GeoNav.gcDist(lat1,Lng1,lat2,lng2)
//Cini = GeoNav.gcCourse(lat1,Lng1,Lat2,Lng2)
dist = 6762.722
cini = 304.482 * deg2rad
Ds = Floor(dist/Dk)
For i= 0 to DS
dsi(i) = (Dk/60)* deg2rad
Lx(i) = asin(sin(Lf) * cos( i *dsi(i)) + cos(Lf )* cos( Cini) * sin(i * dsi(i)))
Lx(i+1)= asin(sin(Lf) * cos(( i + 1)*dsi(i)) + cos(Lf )* cos( Cini) * sin((i+1) * dsi(i)))
system.debuglog "Lat : " + str(Lx(i)*rad2deg) + " Lat suivant : " + str( Lx(i+1)*rad2deg)
Next
Changez la ligne
Dim Lx(999), dsi(999) as double
par
Dim Lx(-1), dsi(-1) as double
puis, l’intrieur de la boucle, changez
dsi(i) = (Dk/60)* deg2rad
par
dsi.append( (Dk/60)* deg2rad)
aussi les lignes
Lx(i) et Lx(i+1)
par
Lx.append( asin(lf) … etc)
Lx.append(asin etc)
a devrait fonctionner car ainsi vous n’avez pas vous inquiter de la dimension des tableaux.
Tout a fait, Gilles.
a marche parfaitement, le problme des tableaux dynamiques est rgl.
Merci a tous ceux qui on particip, merci au forum Xojo.
Oups…
comme le tableau Lx augmente de 2 alors que la boucle n’augmente que de 1 chaque tour, il faudrait changer le system.debuglog:
changez Lx(i) par Lx(Lx.ubound-1) et Lx(i+1) par Lx(lx.ubound), ce qui correspond respectivement l’avant-dernire et la dernire valeur de Lx.
Merci Gilles de votre prcieuse contribution.