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 :

Taille d'un tableau dynamique


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut Taille d'un tableau dynamique
    bonjour,

    je reviens sur un vieux code delphi ANSI standard (<=D7) et je
    suis un peu perplexe sur la taille du tableau dynamique que me renvoie le prog
    je lis dans un TFileStream une chaine unicode avec un size header de 4 octets sans zéro terminal
    après redimensionnement de mon tableau j'y stocke le contenu en y ajoutant le zéro terminal
    et pour finir je convertis ce tableau en une chaine ANSI dont le contenu et la taille correspond au résultat attendu
    l'affichage test de la chaine unicode est également correct
    en revanche si je cherche à connaître sa taille le résultat est complètement fantaisiste (taille réelle : 62 taille affichée : x13BA7401)
    pourtant je pensais que Length donnait bien le nb d'éléments du tableau. pour info High() donne Length()+1...
    le code abrégé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    wKeyWords:array of WideChar;
    sKeyWords:string;
    aDataSize:array[0..3] of Byte;
    iLength:LongInt;
     
    iLength:=oPFileStream.Read(aDataSize,4);
    SetLength(wKeyWords,Integer(aDataSize)*2 + 2); //+ zéro terminal
    FillChar(wKeyWords[0],Integer(aDataSize)*2 + 2,0); <- erreur rectifiée
    iLength:=oPFileStream.Read(wKeyWords,Integer(aDataSize)*2);
    messagebox (0,pchar(inttostr(Length(wKeyWords))),pchar(inttostr(High(wKeyWords))), 0);  // la taille est incohérente !
    messageboxw (0, @wKeyWords, 'la chaine unicode', 0); // affichage correct
    edit : mauvaise transcription du code rectifiée
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    As-tu contrôlé ce que valait Integer(aDataSize) ?

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    oui, la valeur est exacte (les données sont bien en little endian et correctement transtypées)
    en fait c'est la méthode Read qui perturbe le format de mon tableau
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    1) pourquoi déclarer "aDataSize:array[0..3] of Byte;" et non "aDataSize: Integer" ?

    2) oPFileStream.Read(wKeyWords[0],Integer(aDataSize)*2);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    1) pourquoi déclarer "aDataSize:array[0..3] of Byte;" et non "aDataSize: Integer" ?
    par habitude... pour accéder au besoin aux octets directement j'aime les transtypage inutiles
    mais cette modif ne change rien
    2) oPFileStream.Read(wKeyWords[0],Integer(aDataSize)*2);
    erreur de transcription déjà modifiée dans mon message initial

    pour info, le strict remplacement du tableau dynamique par un tableau fixe de WideChar renvoie en revanche une taille parfaitement correcte
    une idée ?

    edit : pour ta remarque n°2 j'ai confondu la ligne...
    pointer sur le premier item du tableau pour la lecture du TFileStream renvoie bien la bonne taille...mais pas un tableau cohérent ce qui n'est pas
    illogique puisque rien ne garanti que les items soient contigus en mémoire
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    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
     
    var
      wKeyWords:array of WideChar;
    //  sKeyWords:string; // non utilisé
     
      aDataSize:array[0..3] of Byte; // Integer
      iLength:LongInt;
    begin
      iLength:=oPFileStream.Read(aDataSize,4);
      // SetLength(wKeyWords,Integer(aDataSize)*2 + 2); //+ zéro terminal
      SetLength(wKeyWords,Integer(aDataSize) + 1); // wKeywords est un tableau de WideChar qui occupent déjà 2 octets
     
    //  FillChar(wKeyWords[0],Integer(aDataSize)*2 + 2,0); <- erreur rectifiée
      FillChar(wKeyWords[0],Integer(aDataSize) + 1 ,0); <- erreur rectifiée
     
    //  iLength:=oPFileStream.Read(wKeyWords,Integer(aDataSize)*2);
      iLength:=oPFileStream.Read(wKeyWords[0],Integer(aDataSize)*2); 
     
    //  messagebox (0,pchar(inttostr(Length(wKeyWords))),pchar(inttostr(High(wKeyWords))), 0);  // la taille est incohérente !
      ShowMessage(IntToStr(Length(wKeywords)); // c'est très exactement Integer(aDataSize) + 1
     
    //  messageboxw (0, @wKeyWords, 'la chaine unicode', 0); // affichage correct
    // je suis très surpris !
      messageboxw (0, PChar(wKeyWords), 'la chaine unicode', 0);
    maintenant il serait tout aussi simple de travailler comme cedi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      sKeyWords:string;   
      aDataSize: Integer;
    begin
      oPFileStream.Read(aDataSize,4);
     
      SetLength(sKeyWords, aDataSize); 
     
      oPFileStream.Read(wKeyWords[1], aDataSize * SizeOf(Char)); 
     
      ShowMessage(IntToStr(Length(sKeywords)); 
     
      ShowMessage(sKeyWords);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Réponses: 7
    Dernier message: 10/01/2007, 15h07
  2. Changer la taille d'un tableau dynamique
    Par clem1313 dans le forum Langage
    Réponses: 1
    Dernier message: 28/02/2006, 01h57
  3. Réponses: 6
    Dernier message: 16/01/2006, 13h29
  4. Comment récupérer la taille d'un tableau dynamique ?
    Par Tchaill39 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2005, 14h21
  5. Connaitre la taille d'un tableau dynamique
    Par lewellah dans le forum C
    Réponses: 2
    Dernier message: 23/09/2005, 18h37

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