Tableau dynamique

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.