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 :

La fonction Pos() plante. Question de longueur.


Sujet :

Langage Delphi

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut La fonction Pos() plante. Question de longueur.
    Bonjour à tous

    Voici le code qui passe très bien au compilateur, mais plante à l'exécution sous l'EDI.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    { Chn_Cherchee : string;
       Ptr_Fiche_En_RAM : Pointer; 
    }
     
    Retour := Pos(Chn_Cherchee, Ptr_Fiche_En_RAM^);
    Ptr_Fiche_En_RAM pointe sur un buffer contenant un fichier entier, concaténé à d'autres fichiers. Tout est correct : j'ai vérifié en recréant le fichier à partir du buffer.

    Il me faudrait une Pos() avec indication de la surface mémoire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    où Longueur_Fiche désigne la surface à ne pas dépasser. 
    Retour := Pos(Chn_Cherchee, Ptr_Fiche_En_RAM^, Longueur_Fiche);
    Faute de quoi, j'ai cette erreur systématique faisant clairement référence à une notion de Length !

    http://hfr-rehost.net/fullsize/http:...13ce58b83d.png

    Auriez-vous une idée ? Mes infos tirées de l'aide de Delphi sur toutes les fonctions de traitement des chaînes ne m'amène à rien...

    Merci :hello:

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Tu es encore la dessus, SearchBinaryInBinary et son exemple n'était suffisant ?

    ça passe le déférencement d'un pointeur non typé ?
    Ptr_Fiche_En_RAM est vrai un pointeur et non un PChar ?
    D'ailleurs, le résultat sera la recherche d'une chaine dans la chaine ne contenant qu'un seul char ...

    Tu peux tenter de le simuler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TFiche_En_RAM = packed record
         refCnt: Longint;
         length: Longint;
         Data: Pointer; 
      end;
    Cela fonctionne en D7,
    En unicode la structure contient le CodePage et la taille du char avant refCnt, mais l'unicode poserait d'autre problème de comparaison entre un String et un Buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    { 
       Chn_Cherchee : string;
       Ptr_Fiche_En_RAM : Pointer; 
       Fiche_En_RAMRec: TFiche_En_RAM;
    }
     
    Fiche_En_RAMRec.refCnt := -1;
    Fiche_En_RAMRec.length := Longueur_Fiche;
    Fiche_En_RAMRec.Data := Ptr_Fiche_En_RAM;
     
    Retour := Pos(Chn_Cherchee, PString(@Fiche_En_RAMRec.Data)^);
    // Retour := Pos(Chn_Cherchee, string(Fiche_En_RAMRec.Data)); // syntaxe plus simple mais je trouve que la première évite tout doute de code implicite
    Cela reste un gros délire !
    Code rigolo a tester mais à ne pas conserver pour un projet en prod !

    Faire PosMem, c'est deux boucles simples à coder !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Points : 123
    Points
    123
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Tu es encore la dessus, SearchBinaryInBinary et son exemple n'était suffisant ?

    ça passe le déférencement d'un pointeur non typé ?
    Ptr_Fiche_En_RAM est vrai un pointeur et non un PChar ?
    D'ailleurs, le résultat sera la recherche d'une chaine dans la chaine ne contenant qu'un seul char ...

    Tu peux tenter de le simuler

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    type
      TFiche_En_RAM = packed record
         refCnt: Longint;
         length: Longint;
         Data: Pointer; 
      end;
    Cela fonctionne en D7,
    En unicode la structure contient le CodePage et la taille du char avant refCnt, mais l'unicode poserait d'autre problème de comparaison entre un String et un Buffer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    { 
       Chn_Cherchee : string;
       Ptr_Fiche_En_RAM : Pointer; 
       Fiche_En_RAMRec: TFiche_En_RAM;
    }
     
    Fiche_En_RAMRec.refCnt := -1;
    Fiche_En_RAMRec.length := Longueur_Fiche;
    Fiche_En_RAMRec.Data := Ptr_Fiche_En_RAM;
     
    Retour := Pos(Chn_Cherchee, PString(@Fiche_En_RAMRec.Data)^);
    // Retour := Pos(Chn_Cherchee, string(Fiche_En_RAMRec.Data)); // syntaxe plus simple mais je trouve que la première évite tout doute de code implicite
    Cela reste un gros délire !
    Code rigolo a tester mais à ne pas conserver pour un projet en prod !

    Faire PosMem, c'est deux boucles simples à coder !
    Eh voui Je n'arrivais pas à piger SearchBinary... J'y reviendrai, de tte façon.

    J'étais gêné d'avoir insisté et mis les gens en colère. Je m'excuse si c'est le cas.

    Je n'aurais pas pensé à cette structure (ci-dessus), mais je vais tester ça.

    D'autant qu'avec Move(), je copie très bien mon buffer... mais plantage systématique à l'enregistrement 76 !! En mode trace, plantage, en mode EXE pas de plantage, mais à partir de l'enregistrement 76 (donc n° 75) , vlan !

    Vraiment désolé d'avoir abusé Et merci pr cette idée

Discussions similaires

  1. Delphi6 Fonction POS
    Par PimpW dans le forum Delphi
    Réponses: 7
    Dernier message: 03/08/2006, 09h44
  2. [Système] Pourquoi la fonction ini_get plante ?
    Par renaudjuif dans le forum Langage
    Réponses: 14
    Dernier message: 02/08/2006, 00h17
  3. La fonction DestroyWindow plante !!!
    Par Jean++ dans le forum MFC
    Réponses: 3
    Dernier message: 26/08/2005, 10h32
  4. [LG]Fonction POS evoluée ?
    Par JoseF dans le forum Langage
    Réponses: 4
    Dernier message: 07/11/2004, 14h38

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