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 :

Conseil sur des copymemory


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 22
    Points : 17
    Points
    17
    Par défaut Conseil sur des copymemory
    Bonjour à tous,

    je développe actuellement un parseur de données sous forme d'une library qui utilise des TbyteDynArray contenant les données à parser dans une fonction récursive.

    je parcours les TbyteDynArray en effectuant successivement des décalages vers la gauche en utilisant la fonction CopyMemory comme suit :

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Array1, Array2 : TByteDynArray;
     
    Len2 := Length(Array2);
    CopyMemory( Array1 , @Array2[2] , Len2 - 2 );
    de temps en temps et de manière aléatoire, j'ai des erreurs "ErangeError vérification d'étendues".

    je n'ai pas l'impression que cela provient d'un débordement de tableau mais on ne sait jamais.

    je développe sou Delphi 7 et Windows 7.

    Cordialement,
    Arnaud.

  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 128
    Points
    13 128
    Par défaut
    Ca pourrait être le cas si tu as un nombre impair de bytes puisque tu décales de 2 !

    Maintenant, tu sembles passer par un tableau intermédiaire pour faire ton décallage. Sache que tu peux utiliser MoveMemory avec des blocs qui se chevauchent (interdit avec CopyMemory) .

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CopyMemory(@Array1, @Array2[2] , Len2 - 2);
    et d'une manière générale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CopyMemory(@Array1[indexDestination], @Array2[indexDepart], TailleACopier);
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  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 128
    Points
    13 128
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyMemory(@Array1, @Array2[2] , Len2 - 2);
    Surtout pas sur un tableau dynamique Array1 est LE pointer.

    La "manière générale" est correct puisqu'un index est défini.

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    oui il manque @array1[0]
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Citation Envoyé par Kanter Voir le message
    je parcours les TbyteDynArray en effectuant successivement des décalages vers la gauche en utilisant la fonction CopyMemory comme suit :
    Pourquoi passer par des tableaux intermédiaires et des décalages ?
    Il serait beaucoup plus performant d'avoir les données en mémoire dans un seul et unique tableau, puis de ne transmettre que des pointeurs sur l'élément courant à chacune de tes procédures.

    Tu codes l'analyseur lexical avec un automate d'états finis, puis l'analyseur syntaxique avec un deuxième AEF (et donc une grammaire LL(1)), chaque octet des données sources ne sera lu qu'une et une seule fois. Aucune recopie intermédiaire à faire, pas de retour arrière non plus dans l'analyse...

    Ton parseur pourra être aussi performant qu'un simple for sur la longueur de la chaîne.

    Il existe aussi pas mal de générateurs de code qui créent les parseurs automatiquement à partir d'une grammaire.

Discussions similaires

  1. besoin d un conseil sur des livres en C
    Par sonnyanderson dans le forum Livres
    Réponses: 3
    Dernier message: 15/09/2013, 22h10
  2. besoin d un conseil sur des livres en C ++
    Par sonnyanderson dans le forum Livres
    Réponses: 2
    Dernier message: 13/09/2013, 19h07
  3. Besoin de conseil sur des diagrammes UML
    Par lucares dans le forum Autres Diagrammes
    Réponses: 4
    Dernier message: 10/11/2011, 22h14
  4. Des conseils sur des cours SQL?
    Par EmmanuelleC dans le forum Langage SQL
    Réponses: 17
    Dernier message: 30/11/2009, 16h27
  5. [Maven 2]conseil sur la hierarchie des projets
    Par Sniper37 dans le forum Maven
    Réponses: 2
    Dernier message: 17/01/2007, 10h07

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