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 :

Dll et tableaux de données


Sujet :

Delphi

  1. #1
    Membre habitué
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Points : 174
    Points
    174
    Par défaut Dll et tableaux de données
    Salut,
    Je dois transmettre à ma librairie de traitement du signal des tableaux de données. Auparavant j'ai créé un contrôle ActiveX, mais à l'exécution il s'avère être beaucoup trop lent à cause du type OleVariant utilisé pour les tableaux dynamiques.
    Donc la solution dll me parait la meilleure en termes de performances, sauf que j'ai un pb dès les 1ers tests : les tableaux à transmettre peuvent être de taille variable et souvent assez grosse, j'ai donc prévu de passer en paramètre :
    1. un pointeur sur l'adresse du tableau
    2. sa taille
    ...plutôt que le tableau entier. Mais dans la dll je n'arrive pas à libérer le pointeur sur le tableau dynamique, j'ai une exception EInvalidPointer sur la ligne Dispose ci-dessous qd elle est activée ; sinon ça marche mais évidemment la mémoire utilisée augmente à chaque exécution de la fonction...

    Code de la dll :
    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
    library MaDll;
     
    (...)
     
    type
      PSingleDynArray = ^TSingleDynArray;
     
    function SetSignal(const SignalAdress: Pointer; SignalSize: Integer): Single;
    var
      pTab: PSingleDynArray;     // pointeur sur mon tableau "local"
      siTemp: Single;
      I: Integer;
    begin
      New(pTab);
      SetLength(pTab^, SignalSize);
     
      try
        pTab:= SignalAdress;       // "positionnement" à l'adresse transmise
        siTemp := 0;
     
        // un traitement bidon
        for I := 0 to High(pTab^) do
          siTemp := siTemp + pTab^[I];
     
        Result := siTemp;
      finally
        //Dispose(pTab);          // exception EInvalidPointer
        pTab:= nil;
      end;
    end;
     
    (...)
    Code de l'application test :
    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Data: TSingleDynArray;
      I: Integer;
      ptTemp: Pointer;
    begin
      SetLength(Data, 100000);
     
      // Remplissage valeurs bidon
      for I := 0 to High(Data) do
        Data[I] := I + 1;
     
      ptTemp := @Data;
      Label1.Caption := FloatToStr(SetSignal(ptTemp, Length(Data)));  
    end;
    En l'ocurrence à chaque clic sur mon bouton la mém. utilisée augmente de 100000 * 4 (taille Single) = 400000 octets
    Comment faire pour libérer cette mémoire svp ?
    Merci !

  2. #2
    Membre éclairé
    Avatar de denokan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2002
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2002
    Messages : 434
    Points : 746
    Points
    746
    Par défaut
    pourquoi ne pas vider la mémoire dans le Button1Click ?
    Donnez un poisson à un homme et il mangera pendant un jour... Apprenez-lui à pêcher et il s'assiéra dans une barque et boira de la bière toute la journée

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    il me semble que les instructions suivantes sont totalement inutiles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    New(pTab);
    SetLength(pTab^, SignalSize);
    ainsi que :
    Accessoirement, définir tab comme Tsingle dinarray et pour l'affectation de ptab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab:= TsingleDinarray(SignalAdress^);
    et ensuite utiliser tab au lieu de ptab^.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Membre habitué
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par denokan
    pourquoi ne pas vider la mémoire dans le Button1Click ?
    en fait c'est pTab^ qu'il faut libérer, et c'est une variable locale de la méthode SetSignal de la dll

  5. #5
    Membre habitué
    Développeur .NET
    Inscrit en
    Juin 2002
    Messages
    274
    Détails du profil
    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juin 2002
    Messages : 274
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par Graffito
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tab:= TsingleDinarray(SignalAdress^);
    C'est cette ligne là qu'il me fallait, j'aurais pas eu l'idée du transtypage !
    Merci Graffito

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

Discussions similaires

  1. [Tableaux] les données de la table en lien
    Par afrodje dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2007, 15h13
  2. Réponses: 2
    Dernier message: 22/01/2007, 10h41
  3. [Tableaux] inscrire donnée das un tableau unique
    Par manciaux dans le forum Langage
    Réponses: 9
    Dernier message: 01/09/2006, 10h37
  4. [Tableaux] Afficher donnée
    Par covin85 dans le forum Langage
    Réponses: 39
    Dernier message: 29/04/2006, 00h57
  5. [Tableaux] floatval() donne toujours 0 :(
    Par Torpedox dans le forum Langage
    Réponses: 1
    Dernier message: 30/12/2005, 17h28

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