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 :

SizeOf tableau dynamique


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut SizeOf tableau dynamique
    Bonjour,
    je rencontre un problème pour obtenir la taille d'un tableau dynamique.
    Avant tout était statique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
    TLigne: array [O..19] of byte;
    TTab: array [0..9] of TLigne;
    Quand je fais SizeOf(TLigne) j'obtiens 20 et SizeOf(TTab) 200. Normal

    Maintenant j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
    TLigne: array of byte;
    TTab: array of TLigne;
    Dans le code j'alloue mes tableaux (20 et 10 par ex.). Quand je fais SizeOf(TLigne) ou SizeOf(TTab) j'obtiens maintenant 4. Normal aussi je pense mais je voudrais avoir encore 20 et 200 quand je fais le SizeOf... Et je ne sais pas comment faire.

    Je ne vois pas la solution, si il y en a une, merci de m'aider.

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 886
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 886
    Points : 11 411
    Points
    11 411
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    SizeOf() renvoie la taille du type de la variable, soit celle d'un pointeur pour un tableau dynamique (4) et 20 pour un tableau fixe de 20 octets.

    Pour connaître son nombre d'éléments, il faut utiliser Length(), et pour allouer un nombre d'éléments : SetLength(tableau, longueur_voulue)

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    Oui c'est ce que j'ai fais.

    Or ici Length(TLigne)=20 et Length(TTab)=10 et non pas 200...

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    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 736
    Points : 25 645
    Points
    25 645
    Par défaut
    Ce qui est vrai !

    Tu confonds la mémoire et le nombre d'élement !
    Quel est ton besoin, tu veux recopier le tableau dynamique dans un buffer ou un fichier donc déterminer la taille en octet ?
    Sur un Tableau dynamique, ça va, sur un tableau de tableau c'est plus délicat !

    donc

    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
    type
      TLigne: array of byte;
      TTab: array of TLigne; 
      TLigne20: array [0..19] of byte;
      TTab10: array [0..9] of TLigne; 
    var
      Ligne: TLigne;
      Tab: TTab;
      Ligne20: TLigne20;
      Tab10: TTab10;
    begin   
     
      SetLength(Ligne, 20);
      SetLength(Tab, 10);
     
      if SizeOf(Ligne20) = Length(Ligne) * SizeOf(Byte) then
        ShowMessage('OK Ligne');
     
      if SizeOf(Tab10) = Length(Tab) * Length(Ligne) * SizeOf(Byte) then
        ShowMessage('OK Tab');
    end;

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    En fait, j'enregistre ce tableau dans un fichier précédé d'un index.
    Avec les tableaux dynamiques, le tableau peut être de n'importe quelle taille donc je ne connais pas sa taille avant l'ouverture, je connais juste le nombre de tableaux qu'il y a dans le fichier.

    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
    // Je trouve la taille du fichier
      if FindFirst(FFileName,faAnyFile,Sr)=0 then
      try
        TailleFichier := Int64(Sr.FindData.nFileSizeHigh) shl 32 + Sr.FindData.nFileSizeLow;
      finally
        FindClose(Sr);
      end
      else
        TailleFichier := 0;
      TailleTableau:= TailleFichier div NombreTab -4;
      case TailleTableau of // Il y a plusieurs tailles que je vais définir plus tard
        200: begin
          X:= 19;
          Y:= 9;
        end;
      end;
      SetLength(Ligne, X+1);
      SetLength(Tab, Y+1,X+1); // Pas sûr de moi ici, si je ne mais pas ça, je me retrouve avec un tableau à une dimension bien que TTab: array of TLigne;
    // Ouverture du fichier
    try
        FS:=TFileStream.Create(FFileName,fmOpenRead);
     
        FS.Seek(0,0);
        FS.ReadBuffer(Index,SizeOf(integer));
        FS.ReadBuffer(Tab,SizeOf(TTab)); // En tableau statique
        FS.ReadBuffer(Tab,(X+1)*(Y+1)); // En tableau dynamique
    // Il y a une erreur car j'essaie de mettre un élément de 200 dans un de 4...
      except
        on E:Exception do
          ...
      end;

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 736
    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 736
    Points : 25 645
    Points
    25 645
    Par défaut
    C'est aussi parce que tu écris pas dans le tableau mais dans le pointeur du tableau !
    Tableau Statique Tab et Tab[0] c'est pareil
    Tableau Dynamique Tab est un Pointeur qui indique l'emplacement de Tab[0] (bon c'est sans compter des trucs de compteur de référence et autre)


    Si X et Y indique le plus haut Index (donc la longueur c'est effectivement +1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FS.ReadBuffer(Tab[0], (X+1) * (Y+1) * SizeOf(Byte)); // En tableau dynamique
    Ton élément étant un Byte, ça fait 1 mais cela te donne la véritable formule

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 60
    Points : 78
    Points
    78
    Par défaut
    Ah oui merci je n'avais pas fait attention à ça !

    Du coup ça marche mieux, merci !

    Je mets résolu mais je reviendrai peut-être ici car j'ai l'impression que mes problèmes ne sont pas tout à fait finis...

    Merci pour avoir réglé celui là

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/03/2015, 19h31
  2. récupérer la memoire et tableau dynamique
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 06/01/2003, 09h02
  3. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 15h19
  4. [Kylix] tableau dynamique
    Par sdoura2 dans le forum EDI
    Réponses: 1
    Dernier message: 31/10/2002, 09h57
  5. Réponses: 4
    Dernier message: 13/05/2002, 17h43

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