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 :

Remplir TByteArray (Buffer)


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut Remplir TByteArray (Buffer)
    Bonjour tout le monde,

    est-ce que quelqu'un a une méthode propre pour remplir au fur et à mesure de la venue des données un tableau de byte dynamique (TByteArray)

    Je sais juste pour le moment le remplir une première fois, après j'ai du mal à savoir récupérer la dernière valeur du tableau pour continuer à le remplir comme il faut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    move(t_typeMsg.c_getDataZone[GetRepInfoList.dw_getAddressBuff], GetRepInfoList.aby_getDataZone[GetRepInfoList.dw_getAddressBuff], dw_sizePackBuffer);
    GetRepInfoList.dw_getAddressBuff = à l'adresse de départ, qui augmente de 64 byte à chaque itération
    dw_sizePackBuffer = 64

    J'espère être assez clair et merci pour votre soutient.

  2. #2
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    En plus simple cela fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
    ByteBuffer: array of Byte;
    Buffer: PAnsiChar;
    begin
    SetLength(ByteBuffer, ByteLengthOfData);
    Move(Buffer[0], ByteBuffer[0], ByteLengthOfData);
    Sauf que moi la variable Buffer se remplit au fur et à mesure, donc je pense qu'il faut que je passe la fin de mon tableau de byte mais sans effacer ce qu'il y a comme données.

    Help

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Vu que ça à l'air de parler à personne, je me demandais si je devais pas partir plutôt sur un TMemoryStream style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure test(data: PAnsiChar);
    begin
      ms_DataStream := TMemoryStream.Create();
      ms_DataStream.Write(t_typeMsg.c_getDataZone[0], Length(t_typeMsg.c_getDataZone));
      ms_DataStream.Free;
    end;
    Donc le but c'est que je remplisse le TMemoryStream avec ce que me renvoie la callback (la variable "data"), est-ce que quelqu'un sait comment faire ?

    Merci ^^

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Il y a sûrement plein de méthodes. On croit dorénavant savoir que ça doit se passer dans une CallBack qui reçoit des paquets de 64 octets qu'il s'agit de conserver.
    Si c'est bien ça, revoir le principe du tableau dynamique : Length pour avoir son nombre d'éléments, SetLength pour le redimensionner, Low et High pour les indices.
    A chaque appel de la fonction, augmenter la taille du tableau de manière à loger dans ce nouvel élément le nouveau tampon.
    Ou utiliser un flux (TMemoryStream par exemple), comme dans ton exemple, mais avec une variable globale, s'il s'agit d'agréger les données reçues.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 420
    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 420
    Points : 5 819
    Points
    5 819
    Par défaut
    Vu que ça à l'air de parler à personne, je me demandais si je devais pas partir plutôt sur un TMemoryStream style :

    procedure test(data: PAnsiChar);
    begin
    ms_DataStream := TMemoryStream.Create();
    ms_DataStream.Write(t_typeMsg.c_getDataZone[0], Length(t_typeMsg.c_getDataZone));
    ms_DataStream.Free;
    end;

    Donc le but c'est que je remplisse le TMemoryStream avec ce que me renvoie la callback (la variable "data"), est-ce que quelqu'un sait comment faire ?

    Merci ^^
    ça doit être un truc comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure test(data: PAnsiChar);
    var
      Temp : AnsiString;
    begin
      Temp := data^;
      ms_DataStream := TMemoryStream.Create();
      ms_DataStream.Write(Pointer(Temp)^, Length(Temp) * SizeOf(AnsiChar));
      ms_DataStream.Position := 0; 
      ms_DataStream.Free;
    end;
    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

  6. #6
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Okay donc si je reste avec mon tableau dyn. ça pourrait se passer comme ceci ? :

    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
     
    procedure test(t_typeMsg.c_getDataZone: PAnsiChar);
    var
      i_HighBuff: integer;
      GetRepInfoList.aby_getDataZone: Array of Byte;
    begin
      if (FirstItération = true) then
      begin
        move(t_typeMsg.c_getDataZone[0], GetRepInfoList.aby_getDataZone[0], 64);  
      end
      else
      begin
        HighBuff := High(GetRepInfoList.aby_getDataZone);
        move(t_typeMsg.c_getDataZone[0], GetRepInfoList.aby_getDataZone[HighBuff], 64);  
      end;
    end;
    Mon ordi plante (fuite mémoire sûrement) lors de la deuxième itération :s

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    J'ai essayé ta méthode anapurna mais au niveau du Write ça ne passe pas, j'ai une exception.
    Pour la méthode avec le tableau, je pense qu'il faut faire un SetLength à chaque itération du coup ?

  8. #8
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Faut-il que mon tableau soit dans une variable globale ?

  9. #9
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 420
    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 420
    Points : 5 819
    Points
    5 819
    Par défaut
    salut

    c'est pas très clair
    c_getDataZone est de quel type ?
    aby_getDataZone est de quel type

    pour etre clair

    si tu avais un tableau de string par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Tab : array of string 
    ...
    SetLength(Tab,Length(Tab)+1);
    Tab[High(Tab)] := MonString;
    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

  10. #10
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mai 2013
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2013
    Messages : 190
    Points : 113
    Points
    113
    Par défaut
    Okay c'est bon cela à l'air d'être pas mal :

    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
     
    var 
      aby_getDataZone: Array of Byte; // variable globale
     
    procedure test(t_typeMsg.c_getDataZone: PAnsiChar);
    var
      i_HighBuff: integer;
    begin
      if (FirstItération = true) then
      begin
        move(t_typeMsg.c_getDataZone[0], aby_getDataZone[0], 64);  
      end
      else
      begin
        HighBuff := High(aby_getDataZone);
        move(t_typeMsg.c_getDataZone[0], aby_getDataZone[HighBuff], 64);  
      end;
    end;
    Merci à vous deux

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

Discussions similaires

  1. Swig C++ Tcl - remplir un buffer
    Par scorbo dans le forum Interfaçage autre langage
    Réponses: 5
    Dernier message: 01/10/2012, 09h02
  2. Remplir un buffer char*
    Par stalker00 dans le forum Débuter
    Réponses: 4
    Dernier message: 03/05/2011, 14h57
  3. [WD14] Remplir un buffer
    Par reitsab dans le forum WinDev
    Réponses: 4
    Dernier message: 11/12/2009, 15h08
  4. Remplir l'intérieur d'une vue en coupe - Stencil buffer?
    Par ShevchenKik dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/11/2008, 21h06
  5. Alpha blending et Z-buffer directx 8
    Par Cesar4 dans le forum DirectX
    Réponses: 1
    Dernier message: 23/05/2002, 12h58

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