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 :

Correspondance memmove() (langage C) en Delphi


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 Correspondance memmove() (langage C) en Delphi
    Bonjour all,

    avez-vous connaissance d'une correspondance de la méthode memmove() (en C) en Delphi ?

    Car je veux faire une manipulation avec mon buffer (un tableau de byte), il faut que je rajoute au début de celui-ci des valeurs qui proviennent d'un type record:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    /*
    stSTR_MEM_HEADER c'est mon record 
    byNewCfg c'est mon buffer (array of byte)
    dwNewZoneSize // taille total des données car la taille est inconnue d'avance 
    */
    memmove (&byNewCfg[sizeof (STR_MEM_HEADER)], &byNewCfg[0], dwNewZoneSize);
    j'ai pensé à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Move(stSTR_MEM_HEADER, c_getDataZone[0], dwNewZoneSize);
    cela me rajoute bien mon record mais me fausse mes byte par la suite :s

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    Si tu veux insérer des données, tu devras avoir deux Move : Le premier va décaler les données existantes de offset [0] à [sizeof (STR_MEM_HEADER)] et le deuxième copier les nouvelles données à offset [0].
    Bien sûr penser à augmenter la taille du tableau avant cela s'il est dynamique

  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
    Ah oui ok,
    donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     Move(c_getDataZone, c_getDataZone[0], sizeof(stSTR_MEM_HEADER));
     Move(stSTR_MEM_HEADER, c_getDataZone[0], dwNewZoneSize);
    C'est ça ? ^^

  4. #4
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    Quelque chose comme ç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
    //Ancienne taille
    OldSize := Length(c_getDataZone);
     
    //Agrandir le tableau de SizeOf()
    SetLength(c_getDataZone, OldSize +SizeOf(stSTR_MEM_HEADER));
     
    //Pointeur décalé de SizeOf()
    DestPtr := pointer(integer(c_getDataZone) +SizeOf(stSTR_MEM_HEADER)); 
     
    //Décalle l'ancienne donnée complète (OldSize)
    Move(c_getDataZone[0], DestPtr^, OldSize);
     
    //Insère la nouvelle
    Move(stSTR_MEM_HEADER, c_getDataZone[0], SizeOf(stSTR_MEM_HEADER));

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    c'est le code d'origine qui est faux...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memmove (&byNewCfg[sizeof (STR_MEM_HEADER)], &byNewCfg[0], sizeof (STR_MEM_HEADER));
    ce qui pourrait s'écrire comme ceci sous Delphi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      t: array[0..1] of STR_MEM_HEADER;
    begin
      t[1] := t[0];
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    S'il s'agissait d'un tableau de STR_MEM_HEADER oui mais ça ne semble pas être le cas (enfin on ne sait pas).
    Par contre la taille du bloc à déplacer était mal calculée. Elle aurait dû être de dwNewZoneSize -SizeOf(STR_MEM_HEADER)

  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
    Je vous confirme le code est juste, pour rappel STR_MEM_HEADER est un type record :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    tSTR_MEM_HEADER = Packed record
        byMemMagic
        ...
        abyReserve: Array[0..4 - 1] of Byte; // reserve for future
      end;
    je vais essayer ton code Andnotor c'est la bonne piste de toute façon.

  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
    Ok c'est bon ça me décale bien mon buffer, j'ai la même taille que sur mon programme en C ça à l'air bon, merci à vous !

  9. #9
    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
    voici la solution que j'ai tirée en vue de ce que Andnotor a donné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    OldSize := Length(c_getDataZone);
     
    SetLength(c_getDataZone, OldSize + SizeOf(stSTR_MEM_HEADER));
     
    DestPtr := pointer(integer(c_getDataZone) + SizeOf(stSTR_MEM_HEADER));
     
    Move(c_getDataZone[0], DestPtr^, OldSize);
     
    Move(stSTR_MEM_HEADER, c_getDataZone[0], SizeOf(stSTR_MEM_HEADER));
    si ça peut aider quelqu'un d'autre !

    Bonne journée

  10. #10
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Petite astuce pour l'incrémentation de pointeurs, pour remplacer la ligne DestPtr := pointer(integer(c_getDataZone) + SizeOf(stSTR_MEM_HEADER)); :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      DestPtr : ^tSTR_MEM_HEADER;
    ...
      DestPtr := @c_getDataZone[0];
      Inc(DestPtr); //va avancer le pointeur de la taille d'un tSTR_MEM_HEADER
    ou aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var
      DestPtr : PByte;
    ...
      DestPtr := @c_getDataZone[0];
      Inc(DestPtr, SizeOf(tSTR_MEM_HEADER));

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ou encore

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      c_getDataZone: array of tSTR_MEM_HEADER;
    begin
      OldSize := Length(c_getDataZone);
      SetLength(c_getDataZone, OldSize + 1);
      Move(c_getDataZone[0], c_getDataZone[1], OldSize * SizeOf(tSTR_MEM_HEADER));
      c_getDataZone[0] := stSTR_MEM_HEADER;
    end;
    mais il serait peut-être plus efficace de gérer cela dans un liste
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Membre expérimenté Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Points : 1 448
    Points
    1 448
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var
      c_getDataZone: array of tSTR_MEM_HEADER;
    begin
      OldSize := Length(c_getDataZone);
    Mais comme l'a dit Andnotor,
    Citation Envoyé par Andnotor Voir le message
    S'il s'agissait d'un tableau de STR_MEM_HEADER oui mais ça ne semble pas être le cas (enfin on ne sait pas).

  13. #13
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 693
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 693
    Points : 13 126
    Points
    13 126
    Par défaut
    En fait, je ne sais même pas pourquoi j'ai compliqué le truc

    Si c'est un array of byte : Move(c_getDataZone[0], c_getDataZone[SizeOf(stSTR_MEM_HEADER)], OldSize);... comme la source C : memmove (&byNewCfg[sizeof (STR_MEM_HEADER)], &byNewCfg[0], dwNewZoneSize);

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

Discussions similaires

  1. Comment avez-vous appris le langage Delphi ?
    Par NoisetteProd dans le forum Débuter
    Réponses: 368
    Dernier message: 08/05/2019, 23h34
  2. Correspondance du langage naturel à SPARQL
    Par daniel1985 dans le forum SPARQL
    Réponses: 1
    Dernier message: 30/07/2012, 23h26
  3. Integrer du langage C dans delphi
    Par jean-tristan dans le forum Débuter
    Réponses: 8
    Dernier message: 30/04/2009, 12h46
  4. [Langage] [Delphi] [SGBD] Choix du moteur d'accès SGBD
    Par consult69 dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 08/12/2005, 18h27

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