IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Erreur aléatoire avec un tableau


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé Avatar de defluc
    Homme Profil pro
    Architecte
    Inscrit en
    Mai 2002
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 383
    Points : 1 199
    Points
    1 199
    Par défaut Erreur aléatoire avec un tableau
    Bonsoir à tous,

    Cela fait plus d'une semaine que je cherche à contrecarrer une erreur aléatoire qui se produit parfois à la première exécution d'une commande, mais pas toujours. L'erreur se produit plus souvent quand je réexécute la commande sans sortir du programme mais sans que cela soit systématique.

    Bizarrement, il suffit d'ajouter une instruction affichant des variables à tester pour que l'erreur ne survienne plus.

    Quand l'erreur se produit, je constate que le programme tente d'accéder à une valeur de tableau qui va au delà des limites de celui-ci.

    Voici un fragment de ma source
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Function AddNearestPolygFromRoad(Pnt : MapWinGis_Tlb.Point; Position : Integer;
                      Dx, Dy : Double; InList : TList;  RefSf : ShapeFile): TList;
    Var
      Ext : Extents;
      X, Y, IncX, IncY, Incr : Extended;
      i, j, NoPolyg : Integer;
      Polyg : MapWinGis_Tlb.Shape;
      PolygList : OleVariant;
      TmpPolygList : Array of Integer;
      PolygExist, Condition : Boolean;
    begin
      Incr := 1;
      if Dx = 0 then IncX := Incr else IncX := 0;
      if Dy = 0 then IncY := Incr else IncY := 0;
      X := Pnt.x; Y := Pnt.Y;
      PolygExist := False;
      Ext := RefSf.Extents as Extents;
      Condition := False;
     
      While Not Condition do  //  construction de l'extents minimum comportant
      begin                   //  un polygone
        Dx := Dx + IncX;      //  incrémentation des dimensions de l'extent
        Dy := Dy + IncY;
        Ext.SetBounds(X - Dx, y - Dy, 0, X + Dx, y + Dy, 0);
        PolygExist := RefSf.SelectShapes(Ext, 0, Intersection, PolygList);
        if Not PolygExist then Continue;
        TmpPolygList := PolygList;
        For i := 0 to Length(TmpPolygList) -1 do
        begin
          Polyg := CoShape.Create;
          Polyg := RefSf.Shape[TmpPolygList[i]];
          For j := 1 to Polyg.numPoints - 1 do
          begin
          ...
          ...
        end;
      end;
    end;
    Il suffit que j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if i > Length(TmpPolygList) - 1 then
    begin
    ShowMessage('Probable error : i > Length(TmpPolygList) - 1');
    end;
    pour que l'erreur ne se produise plus.

    Une hypothèse : l'impossibilité de libérer TList.

    Si vous en avez une autre, je suis preneur.

    Merci pour vos suggestions

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 710
    Points : 25 593
    Points
    25 593
    Par défaut
    Evite les Objets en retour de fonction, ce n'est pas un problème en soit, c'est juste que l'appel n'est pas toujours très beau, et cela complique la libération de l'objet en cas d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Function AddNearestPolygFromRoad(Pnt : MapWinGis_Tlb.Point; Position : Integer; Dx, Dy : Double; InList : TList; OutList : TList;  RefSf : ShapeFile): Boolean;
    Ensuite, une erreur aléatoire avec un tableau, je connais, j'en ai eu une récemment, en fait, l'erreur ne se produit pas à l'endroit que tu le crois !
    Dans ton code, tu as un moment, où tu écris quelque part où il ne fallait pas, genre dans une boucle de tableau, tu as oublié le -1 ... et cet endroit était ton tableau ou un objet et quand tu l'utilise, ça casse !

    je te conseille de remplacer, je trouve cela plus pratique, plus lisible

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i := 0 to Length(TmpPolygList) -1 do
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i := Low(TmpPolygList) to High(TmpPolygList) do
    ensuite, je trouve le code suivant étrange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Polyg := CoShape.Create;
    Polyg := RefSf.Shape[TmpPolygList[i]];
    tu affecte Polyg deux fois, tu perds la première instance ...

Discussions similaires

  1. Erreur "OutOfBoundsException" avec un tableau
    Par astran dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 20/01/2013, 19h17
  2. [XL-2007] Erreur 1004 avec variable tableau
    Par amelyfred dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/03/2012, 15h34
  3. [.net 2.0] Erreur aléatoire avec le databinding
    Par bossun dans le forum ASP.NET
    Réponses: 2
    Dernier message: 04/05/2011, 11h01
  4. Erreur aléatoire avec SqlDataReader
    Par flodu dans le forum ASP.NET
    Réponses: 0
    Dernier message: 16/12/2009, 17h30
  5. [FTP] erreur aléatoire avec ftp_login
    Par biggief dans le forum Langage
    Réponses: 1
    Dernier message: 14/11/2006, 20h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo