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 :

Somme de bytes un par un


Sujet :

Delphi

  1. #21
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 726
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 726
    Points : 15 126
    Points
    15 126
    Par défaut
    Citation Envoyé par Atheus Voir le message
    Mais ReadByte... Mon "vieux D7" ne le connait pas !
    Exact, désolé.

    Bon, comme de toute façon ReadByte et les autres s'appuient tous sur Read, yakà s'adapter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      ...
      B: Byte;
    begin
      ...
        with LFileStream do begin
          Position := 0;
          for i := 0 to Size -1 do begin
            Read(B, 1); // LE truc! Read lit et avance tout seul : bonheur
            sum := sum + B;
          end;
          Free;
       end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    @Atheus

    Tu ne peux pas mélanger les deux techniques.

    Soit tu te travailles sur le pointeur interne du stream seek(7, soFromEnd), soit sur le pointeur externe inc(P, Size -7).
    Dans le premier cas, tu devras passer par Read(B, 1); Inc(Sum, B); comme le propose Jipété, sinon comme mon exemple (Inc(Sum, P^); Inc(P);.

    Oui l'écriture est possible mais mieux vaut utiliser write (pointeur interne) qui va s'assurer que la taille mémoire allouée est suffisante. Par pointeur externe serait possible aussi mais il faudra gérer soit-même la taille du stream.

  3. #23
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Super intéressant, merci.

    Remarque tout de même, le code de Jipété parait super optimisé, mais dans les faits... Ça met une 30aine de sec pour obtenir le résultat.
    Avec le code d'Andnotor, c'est instantané !
    Étrange non ?

  4. #24
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 664
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 664
    Points : 6 966
    Points
    6 966
    Par défaut
    Citation Envoyé par Atheus Voir le message
    Ça met une 30aine de sec pour obtenir le résultat.
    Avec le code d'Andnotor, c'est instantané !
    Étrange non ?
    Incrémenter un pointeur est plus rapide que le for (plus d'instruction à exécuter).
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. ___ Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.3.2 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.1 Entreprise
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.4)

  5. #25
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    @Atheus
    pointeur externe inc(P, Size -7).
    Ok, j'ai compris qu'on incrémente ici avec les 6 derniers caractères, mais comment je lis ce qui est incrémenté ensuite ?
    Je ne peux pas utiliser 2 fois le array of byte P puisqu'il aura été rempli 2 fois de différentes manières ?

  6. #26
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé de prendre en compte vos propositions pour continuer mon petit programme.
    Le résultat de ma requête n'est pas celui escompté et pire, j'ai une erreur qui lance le débogueur.

    Pour lire mon Stream, j'ai bien la boucle qui me donne le bon résultat (thème principal de ce thread) par ajout de bytes par bytes
    Mais du coup, je veux profiter du Stream ouvert pour récupérer une signature de fichier, à savoir les 6 derniers octets.

    Voici mon code :

    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
     
    var
      i : integer;
      P : pByte;
      Q : pByte;
      Result : integer;
      Last : integer;
     
      begin
      Result := 0;
      with TMemoryStream.Create do
      try
        LoadFromFile(OpenDialog1.Filename);
        P := Memory;
        Q := Memory;   // Ne voulant pas remplir le buffer avec des données différentes, j'en créé un autre ?
        inc(Q, Size -7); // J'incrémente en suivant votre méthode, donc ici, juste les 6 derniers bytes
        Last := Read(Q, 5); // Ici j'essaye de récupérer ses 6 bytes... ET C'est sûrement là que ça bloque.......
     
        for i := 0 to Size -1 do  // La boucle derrière qui elle fonctionne très bien
        begin
          inc(Result, P^);
          inc(P);
     
     
        end;
     
      finally
      Free;
      end;
     
    ShowMessage('Somme des octets  : '+FloatToStr(Result));
    ShowMessage('Derniers hex : '+IntToHex(Last,1););

  7. #27
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 941
    Points
    40 941
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je m'interroge sur le bien fondé du type de la variable LAST
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #28
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    La réponse sera forcément une série de bytes... Mais même si je change le type de variable, ça ne marche pas.

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 689
    Points : 13 118
    Points
    13 118
    Par défaut
    Ni P ni Q ne sont des array of byte dans ton code mais de pointeurs typé byte.

    Si tu veux lire 6 octets à la fin du fichier, ce sera quelque chose comme ceci.

    A l'aide du pointeur interne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var Buffer :array[0..5] of byte;
     
    seek(5, soFromEnd);
    Read(Buffer, 6);
    Et par pointeur externe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var Buffer :array[0..5] of byte;
     
    P := Memory;
    Inc(P, Size -6);
    CopyMemory(@Buffer, P, 6);
    Je te répète, tu ne peux pas mixer les deux techniques.

  10. #30
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    CopyMemory ? Ouah, je ne serais jamais allé le chercher celui là !
    Ok ok, je retiens, pas de mélange de techniques.

    Je te remercie, je teste ça ce soir.

  11. #31
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 22
    Points : 6
    Points
    6
    Par défaut
    Testé, et je confirme, la méthode avec pointeurs est juste ULTRA rapide, même sur des fichiers assez lourd.
    MERCI encore vivement à tous, vous êtes vraiment géniaux ! (et tellement réactifs !)
    Je suis super content et désolé d'avoir usé de votre patience.

    A très vite.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Somme des champs commencant par le même mot
    Par kemsy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/10/2008, 18h47
  2. Somme de temps regroupés par nom
    Par Jonathan Raucy dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 21/08/2008, 08h39
  3. Somme de champs commençant par
    Par Jérémy VAUTIER dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 15/02/2008, 22h46
  4. Réponses: 9
    Dernier message: 04/01/2007, 11h58
  5. [Conception] Faire une somme de valeurs définies par une boucle
    Par fixbraun dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 25/09/2006, 23h46

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