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 :

[Gestion mémoire] SetLength sur TDoubleDynArray


Sujet :

Langage Delphi

  1. #1
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut [Gestion mémoire] SetLength sur TDoubleDynArray
    Est-ce que vous voyez une différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TC_Differentielle.clone(source : TDoubleDynArray;var destination : TDoubleDynArray);
      var i : integer;
    begin
      SetLength(destination,0); //Effecement de la liste
      SetLength(destination,length(source)); //Réallocation
      for i:=0 to length(source)-1 do
        destination[i] := source[i]; //Affectation
    end;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TC_Differentielle.clone(source : TDoubleDynArray;var destination : TDoubleDynArray);
      var i : integer;
    begin
      SetLength(destination,0); //Effacement de la liste
      for i:=0 to length(source)-1 do
        begin
          SetLength(destination,length(destination)+1);//Réallocation progressive
          destination[i] := source[i];//Affectation
       end;
    end;
    Hormis bien sûr le fait que la deuxième solution est plus lente et un petit peu stupide.

    Car en fait, si j'utilise la deuxième solution, j'ai des affectations foireuseuses. A la sortie, je me retrouve avec la liste qui contient n'importe quoi.

    Est-ce normal ?
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  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
    A priori non. Il ne devrait pas y avoir de différence au niveau du résultat. A moins que SetLength ne préserve pas le contenu du tableau mais il me semble bien qu'il est censé le faire.
    Il me vient quand même une idée. Fais un essai en désactivant l'option d'optimisation du code. Je ne serais pas étonné que cela vienne de là.

  3. #3
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Alors le SetLength préserve bien le contenu du tableau, ça c'est bon.
    En enlevant l'optimisation de code, je n'ai aucun changement.

    Je comprend vraiment pas ce qui le gène. : : :
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  4. #4
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Bon, après un bon paquet de recherches, je pense devoir me passer de TDoubleDynArray et me rabattre sur TList.

    Si quelqu'un a déjà utilisé [allocation et désallocation multiples] avec succès les TDoubleDynArray, je suis intéressé, parce que le TList est plus lourd à gérer.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  5. #5
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    ce ne serait pas plutôt

    SetLength(destination,length(destination[0])+1);//Réallocation progressive

    pour augmenter la taille de la 2ème dimension se ton tableau ?

  6. #6
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    C'est un tableau à une seule dimension
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  7. #7
    bjl
    bjl est déconnecté
    Membre averti Avatar de bjl
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    263
    Détails du profil
    Informations personnelles :
    Localisation : Brésil

    Informations forums :
    Inscription : Décembre 2002
    Messages : 263
    Points : 338
    Points
    338
    Par défaut
    Citation Envoyé par MD Software
    C'est un tableau à une seule dimension
    pardon... pas bien réveillé

  8. #8
    Membre actif
    Profil pro
    ----
    Inscrit en
    Mai 2004
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : ----

    Informations forums :
    Inscription : Mai 2004
    Messages : 185
    Points : 245
    Points
    245
    Par défaut
    Si ça peut t'aider...
    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
    39
    40
    41
    42
    43
    44
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Types;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i : integer;
      D : Double;
      source,
      destination : TDoubleDynArray;
    begin
      SetLength(Source, 100);
      D := 1;
      For I := 0 to 99 do Begin Source[I] := D; D := D + 1;End;
      SetLength(destination,0); //Effacement de la liste
      for i:=0 to length(source)-1 do
        begin
          SetLength(destination,length(destination)+1);//Réallocation progressive
          destination[i] := source[i];//Affectation
       end;
    end;
     
    end.
    Ce code est fonctionelle
    De toutes les choses que j'ai perdue,
    Celle qui me manque le plus...
    c'est mon esprit !

  9. #9
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    En fait, mon problème se pose surtout quand j'ai beaucoup de TDoubleDynArray dans ma classe. J'ai une classe qui en compte beaucoup, et si j'utilise la réallocation progressive, je perd des données.

    Je comprend vriament pas ce phénomène.
    Ja vais me rabattre sur les TList, tant pis, mais merci quand même.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  10. #10
    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
    Tu dois avoir un problème ailleurs. SetLength conserve les données existantes. Peut-être un débordement ailleurs...

  11. #11
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    C'est en effet ce que je pense, mais malheureusement, mes recherches sont restées vaines.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  12. #12
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai déjà eu un problème similaire avec SetLength; Je n'ai toujours pas réussi à comprendre pourquoi... Lorsque j'ajoutais un élément à mon tableau et que je redimensionnais celui-ci, je perdais mes enregistrements précédents et mon tableau conservait un peu n'importe quoi. Il me semble qu'il s'agit de ce code :
    http://www.developpez.net/forums/vie...609357#1609357
    De retour parmis vous après 10 ans!!

  13. #13
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    Merci, je vais regarder de près.
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

  14. #14
    Expert confirmé
    Avatar de Sub0
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2002
    Messages
    3 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 573
    Points : 4 219
    Points
    4 219
    Par défaut
    J'ai peut-être une idée du problème en fin de compte. Il semblerait que SetLength sature lorsqu'on lui demande d'allouer un trop grand nombre d'élément en mémoire...
    La procédure SetLength effectue une demande de mémoire et non pas une véritable allocation de mémoire. Elle réserve l'espace mémoire demandé pour une utilisation future sans utiliser effectivement la mémoire. Cette technique est fondée sur une fonctionnalité des systèmes d'exploitation Windows et est utilisée par Delphi pour toutes les allocations dynamiques de mémoire. Lorsque, par exemple, on demande un très grand tableau, sa mémoire est réservée mais pas allouée.
    S'il n'y a pas de mémoire suffisante pour réallouer la variable, SetLength déclenche une exception EOutOfMemory.
    De retour parmis vous après 10 ans!!

  15. #15
    Membre éclairé
    Avatar de MD Software
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 613
    Points : 680
    Points
    680
    Par défaut
    AAAAAAAAAAAAAAAAAAAAAAA

    tout s'explique

    Je manipule en effet des tableaux de très grands volumes.

    Bon, ben, tout se confirme, je passe sous TList, au moins je ferai moi même l'allocation, et je serai sûr que ça marchera.

    Merci à tous !
    MD Software
    ---------------------------
    F.A.Q. Delphi - Cours Delphi - Composants Delphi - Sources Delphi

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

Discussions similaires

  1. [SuSE] questions sur la gestion mémoire
    Par jhfra dans le forum Linux
    Réponses: 2
    Dernier message: 02/12/2013, 11h39
  2. Réponses: 4
    Dernier message: 28/10/2010, 10h21
  3. gestion mémoire sur plusieurs malloc
    Par contremaitre dans le forum C
    Réponses: 39
    Dernier message: 27/03/2008, 13h51
  4. Question sur la gestion mémoire
    Par rem02 dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2007, 22h06
  5. Gestion mémoire des Meshes (LPD3DXMESH)
    Par [Hideki] dans le forum DirectX
    Réponses: 1
    Dernier message: 08/07/2003, 20h34

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