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 :

récupérer la memoire et tableau dynamique


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut récupérer la memoire et tableau dynamique
    voilà, j'ai une fonction récursive qui ressemble à ça:

    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
    function TForm1.Reflexion(tab:tab2DInt;profondeur,lejoueur,A,B,Prof:Integer;Passe,TypeReflexion:boolean;TempsSomme,TempsDifference:Single):Integer;
    var
      alpha,beta:integer;
      k,l,coup:integer;
      i,j:integer;
      res:integer;
      letab:tab2DInt;
      Listcoup:TList;
      ListVal:TList;
      LeTempsDif:single;
      LeTempsSom:single;
      LeTempsSomAncien:single;
    begin
        if (SortieReflexion) and ((meilleurcoup>=0) or (profondeur<>0)) then
              begin
              result:=-infinity+1;
              setlength(letab,0,0);
              exit;
              end;
        Application.ProcessMessages;
        NbCoupEtudie:=NbCoupEtudie+1;
     
      ...
     
         setlength(letab,0,0);
    end;
    Juste avant un exit (y'en a plusieurs dans la fonction), je fais appel à setlength(letab,0,0) pour récupérer la mémoire de mon tableau.
    Mais quand je lance mon programme (c'est un othello) et que je lance et que je fais jouer 2 ordis, la mémoire ne fais qu'augmenter et assez rapidement et le setlength(letab,0,0) n'a aucun effet.

    Qu'est ce qui ne fonctionne pas? J'ai essayé Finalize(letab) mais ça n'a aucun effet. Les variables locales sont bien détruites à la fin de la fonction ?
    Faut-il aussi vider les listes Listcoup et listval avant de quitter la fonction ?

  2. #2
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Difficile de réponder avec précision dans la mesure où une partie du code n'est pas connue. Juste quelques précisions:
    Lors de l'appel d'une fonction récursive, les arguments de celle-ci sont créés et empilés. Si la fonction est appellée un grand nombre de fois récursivement, la mémoire utilisée est forcément importante. C'est pour cette raison qu'en général la majorité des arguments sont passés par variable (var) et non par valeur. Ainsi, c'est la même variable qui est utilisée dans chaque appel. C'est particulièrement important lorsqu'un ou plusieurs arguments sont des tableaux (ou d'autres structures importantes). Dans ton cas, il faudrait voir si l'argument tab ne devrait pas être passé en var. C'est difficile à deviner...
    Il est tout à fait normal que l'utilisation de SetLength(letab, 0, 0) n'ai pas d'effet puisqu'il s'agit d'une variable locale qui est libérée lors de la sortie de la fonction. Peut importe que le tableau soit dimensionné ou pas dans ce cas là.
    Pour résumer, il faudrait regarder argument par argument ceux qui peuvent être passés par variable afin de limiter l'empilement des variables.

  3. #3
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    En fait ce n'est pas les tableaux qu'ils fallait libérer mais les TList. Les types Array Of et String sont librérés automatiquement à la fin de la procédure. Par contre les classes ne le sont pas. Dasn ton programme tu crées les classes avec un ListCoup:=TList.Create; Il faut alors forcément libérer les ressources avec un ListCoup.Free. De plus il est conseillé de protéger cette libération avec un Try Finally End;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      ListCoup:=TList.Create;
      Try
        //...
        //...
      Finally
        ListCoup.Free;
      End;
    Il n'est pas utile de faire un .Free si tu sorts avec Exit entre le Try et le Finally :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      ListCoup:=TList.Create;
      Try
        //...
        If Condition Then Exit;
        //...
      Finally
        // Est exécuté même en cas de Exit
        ListCoup.Free;
      End;
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Merci pour les réponses, je vais regarder tout ça.

    une précision:
    Quand je passe un tableau en paramètre, logiquement, il ne passe que le pointeur du tableau, non ?. Pour moi, un tableau est toujour passé en paramètre par référence.

  5. #5
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 101
    Points
    19 101
    Par défaut
    Non, plus maintenant. Donc si tu veux que ton tableau soit modifié passe le explicitement par référence avec VAR.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  6. #6
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    je ne suis pas sûr car je n'ai jamais mis de "VAR" dans mes fonctions qui avait comme paramètres des tableaux, et je remplissais comme je le souhaitais les tableaux. Idem pour les listes
    ex: cette procédure me trie les listes passer en paramètres

    • procedure TForm1.Tri(LaList1,LaList2:TList;Element1,Element2ointer);
      var
      i:integer;
      begin
      i:=0;
      While i<LaList1.Count do
      begin
      if Integer(Element1)>Integer(LaList1[i]) then break;
      i:=i+1;
      end;
      LaList1.Insert(i,Element1);
      LaList2.Insert(i,Element2);

      end;


    Sinon, c'était bien le fait que je ne libérais pas la mémoire de mes listes (que j'avais créées avec TList.create.

  7. #7
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Une liste n'est pas un tableau...
    En fait les listes dont tu parles sont des classes TList alors que les tableaux sont des types structurés "simples". En Delphi un objet est un pointeur, il est donc normal que lors de l'appel d'une fonction les arguments de type classe soient passés par variable (c'est la valeur du pointeur qui est passée). Par contre je confirme que les tableaux sont passés par valeur (copie) ce qui peut être très lourd pour de gros tableaux.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/01/2010, 12h39
  2. Réponses: 3
    Dernier message: 01/09/2008, 13h46
  3. Réponses: 5
    Dernier message: 17/07/2008, 09h18
  4. [MySQL] Récupérer valeurs de tableau dynamique
    Par pdenervaud dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/08/2007, 17h51
  5. Comment récupérer la taille d'un tableau dynamique ?
    Par Tchaill39 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2005, 14h21

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