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

Delphi Discussion :

Problème de libération de tableau dynamique


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 22
    Points : 19
    Points
    19
    Par défaut Problème de libération de tableau dynamique
    Bonjour à tous,
    J'utilise des tableaux dynamique pour initialiser les variables d'un algo de simulation.
    Avant de lancer une nouvelle simulation je reset mes variables.
    Tout se passe bien sauf pour 1 où delphi me génère une erreur EInvalidPointer.

    Je n'arrive pas à comprendre pourquoi ca bloque vu que je fais exactement la même chose pour les autres.

    En débug j'ai pisté l'adresse memoire de mon tableau dans le cas où elle changerait mais que nenni, de plus je vois bien le contenu de mon tableau.

    Cette erreur apparrait quelquesoit la methode Finalize(Tableau) et SetLength(Tableau,0).

    Si quelqu'un à une idée elle sera la bienvenue.

    Rustine

  2. #2
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Citation Envoyé par Rustine
    Bonjour à tous,
    J'utilise des tableaux dynamique pour initialiser les variables d'un algo de simulation.
    Avant de lancer une nouvelle simulation je reset mes variables.
    Tout se passe bien sauf pour 1 où delphi me génère une erreur EInvalidPointer.

    Je n'arrive pas à comprendre pourquoi ca bloque vu que je fais exactement la même chose pour les autres.

    En débug j'ai pisté l'adresse memoire de mon tableau dans le cas où elle changerait mais que nenni, de plus je vois bien le contenu de mon tableau.

    Cette erreur apparrait quelquesoit la methode Finalize(Tableau) et SetLength(Tableau,0).

    Si quelqu'un à une idée elle sera la bienvenue.

    Rustine
    Salut!

    Qu'est-ce que ce tableau contient au juste ? SetLength, normalement, ça ne libère que ce qu'occupe le tableau et non pas son contenu.

    Merci!

    -Slimjoe
    -Slimjoe

  3. #3
    Membre confirmé
    Avatar de Philippe Gormand
    Inscrit en
    Mars 2002
    Messages
    330
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 330
    Points : 647
    Points
    647
    Par défaut
    Bonsoir.

    SetLength ne libère rien du tout mais redéfinit le nombre d'éléments du tableau.
    Les indices du tableau (dynamique) sont de 0 à nombre déléments -1.

    Donne nous ton code, nous pourons nous faire une idée plus précise. Par ce que là...

    A+
    Rien n'est moins sur que l'incertain : Pierre DAC

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2004
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 32
    Points : 30
    Points
    30
    Par défaut
    Bonjour,
    J'ai exactement le même souci.

    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
     
    var
      tab1, tab2, tab3 : array of integer;
    begin
    setLength(tab1, list.count);
    setLength(tab2, list.count);
    setLength(tab3, list.count);
    for i := 0 to list.count - 1 do
    begin
      tab1[i] := 0;
      tab2[i] := 0;
      tab3[i] := 0;
    end;
    for i := 0 to list2.count - 1 do
    begin
      //list2 contient des objets référencé dans list
      Id := list2[i]^.ObjetContenuDansList^.id;
      inc(tab1[Id]);
      case n of
        -1 : inc(tab2[Id]);
        0 : inc(tab3[Id]);
      end;
    end;
    //Les setLength se déroulent correctement
    setLength(tab1,0);
    setLength(tab3,0);
    //sauf....
    setLength(tab2,0);
    //Pourquoi ???
    end;
    Si quelqu'un pouvait me donner une piste, ce serait super cool car je commence à desesperer...
    Merci à tous !

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Bonjour

    Personnellement j'utilise nil pour libérer mes tableaux. C'est l'une des méthodes préconisées par l'aide de Delphi.

    Pour libérer un tableau dynamique, affectez nil à une variable qui référence le tableau ou transmettez la variable à Finalize ; ces deux méthodes libèrent le tableau dans la mesure où il n'y a pas d'autres références le désignant. Les tableaux dynamiques sont automatiquement libérés lorsque leur compte de références atteint zéro. Les tableaux dynamiques de longueur 0 ont la valeur nil.
    Cependant l'erreur 'Pointeur invalide' peut être causée par une assignation de valeur au tableau en dehors de ses limites.

    un petit exemple pour l'illustrer: (Effectué avec Delphi 7)
    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
     
    var
      Form1: TForm1;
      Tab1: array of integer;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i: Byte;
    begin
      // Tableau de 9 éléments, indicé de 0 à 8.
      SetLength(Tab1, 9); 
      // Affectation de valeurs de 0 à 9
      for i := 0 to 9 do
        Tab1[i] := i;   // Pas d'erreur d'exécution !!
    end;
     
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Tab1 := nil;  // Erreur d'exécution (Invalid Pointeur)
    end;
     
    end.
    Voilà. Cela peut-être une des raisons.

    @+ Claudius.

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    c'est d'ailleur pour eviter les debordement qu'il existe des fonction high et low
    et que je preconisse toujours pour ce deplacer dans un tableau

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

Discussions similaires

  1. Réponses: 4
    Dernier message: 13/05/2014, 09h43
  2. Problème d'allocation de tableau dynamique
    Par DuffNut dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2011, 11h17
  3. [xsl-fo]Problème Mise en page tableau dynamique
    Par Little_flower dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/05/2007, 14h01
  4. Réponses: 7
    Dernier message: 24/11/2006, 09h56
  5. Problème de libération de tableau dynamique
    Par cali1983 dans le forum C++
    Réponses: 4
    Dernier message: 14/03/2006, 08h30

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