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 :

Ecriture dans un tableau dynamique.


Sujet :

Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut Ecriture dans un tableau dynamique.
    en fait j'aimerais copier le contenu d'un tableau dynamique d'entier 16 bit dans un fichier texte si possible les un au dessous des autres.donc voici le code utilisé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    data : file;
    tab_dyn_img : array of array of i16; //entier 16 bit
     
    assign (data,'data.text');
    rewrite (data);
    blockwrite (data, tab_dyn_img[1][0],sizeof (tab_dyn_img[1]));
    closefile (data);
    j'ai aussi essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    blockwrite (data,addr( tab_dyn_img[1][0]^,sizeof (tab_dyn_img[1]));
    ainsi que d'autre désinence sur le même thème.

    Le programme s'exécute, crée le fichier et le rempli avec des carrés!?
    Alors je ne sais pas si c'est juste un petit problème ou si la méthode n'est pas bonne. J'ai passé l'aprés midi à chercher infructueusement.

    Merci d'avance.

    Olivier

  2. #2
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Si tu veux obtenir un fichier texte lisible dans le bloc-notes, ce n'est pas la bonne méthode. Utilise plutôt alors WriteLn que BlockWrite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    assign (data, 'data.text');
    rewrite(data);
    for I := 0 to Length(tab_dyn_img[1])-1 do
      WriteLn(data, tab_dyn_img[1][I]);
    closefile(data);

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 705
    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 705
    Points : 25 575
    Points
    25 575
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blockwrite (data, tab_dyn_img[0][0], SizeOf);
    devrait fonctionner
    même si par habitude avec les tableau de tableau, je ferais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := Low(tab_dyn_img) to High(tab_dyn_img) do
      blockwrite (data, tab_dyn_img[i][0],Length(tab_dyn_img[i]));

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    pour le tu peux mettre

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 705
    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 705
    Points : 25 575
    Points
    25 575
    Par défaut
    J'aurais tendance à dire même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteLn(data, IntToStr(tab_dyn_img[1][i]));
    Je ne sais pas si WriteLn converti pas lui même un entier en chaine à l'écriture ... j'en doute en tout cas

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par ShaiLeTroll
    Je ne sais pas si WriteLn converti pas lui même un entier en chaine à l'écriture ... j'en doute en tout cas
    Si si, il le fait

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data: textfile;
    assign (data, 'data.text');
    rewrite(data);
    for i := low(tab_dyn_img[1]) to high(tab_dyn_img[1]) do
      WriteLn(data, tab_dyn_img[1][i]);
    closefile(data);
    et le fichier est vide!

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 705
    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 705
    Points : 25 575
    Points
    25 575
    Par défaut
    tu as mis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := low(tab_dyn_img[1]) to high(tab_dyn_img[1]) do
      WriteLn(data, tab_dyn_img[1][i]);
    au lieu de ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := Low(tab_dyn_img) to High(tab_dyn_img) do
    WriteLn(data, tab_dyn_img[i]);
    tu as confondu la manipulation par "pointeur" de BlockWrite et par valeur de WriteLn

  9. #9
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    J'ai pas l'impression : son tableau dynamique est à 2 dimensions.

    Mais c'est bizarre que ça marche pas T'es sur que ton tableau n'est pas vide, au moins ?

  10. #10
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 547
    Points
    547
    Par défaut
    Quelques rappels

    Les tableaux dynamiques en Delphi sont implicitement des pointeurs (mais doivent se manipuler plutôt comme des "références") et donc un array of array of i16 sera en interne un pointeur vers un tableau de pointeurs vers des tableaux de i16. Ceci implique que ces types de tableaux ne sont pas forcément carrés et que les données ne sont pas contigües d'une ligne à l'autre.

    Donc on ne peut écrire le tableau à partir d'une seule adresse (@tab_dyn_img[0][0]) et il faut nécessaire écrire ligne par ligne (et non pas colonne par colonne).

    Ensuite ce sont des tableaux d'indice de base 0.

    Enfin BlockWrite écrit des blocs de tailles définis soit par le type de fichier (ici file of i16), soit lors du Rewrite (sinon taille par défaut 128 ).

    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
    type  i16 =  ShortInt;
    procedure TForm2.Button1Click(Sender: TObject);
    var
      Data : file of i16;
      tab_dyn_img : array of array of i16;
      I,J: Integer;
    begin
       SetLength(tab_dyn_img, 4 , 5 );
     
       for I := Low(tab_dyn_img) to High(tab_dyn_img) do
        for J := Low(tab_dyn_img[I]) to High(tab_dyn_img[I]) do
           tab_dyn_img[I,J] := I+J;
     
       AssignFile (data,'C:\data.text');
       Rewrite(data);
       for I := Low(tab_dyn_img) to High(tab_dyn_img) do
         BlockWrite (data, tab_dyn_img[I][0], sizeof (tab_dyn_img[I]));
       CloseFile (data);
    end;
    Résultat :
    Ā̂ȁЃ̂ԄЃ؅
    Ben oui c'est interprété en ascii
    Avec un éditeur hexadécimal :
    00010203010203040203040503040506

  11. #11
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Plutot que de bosser sur du TextFile ou du File j'utiliserais plutot un TStream : TFileStream, TMemoryStream ou encore TStringStream dont la gestion est plus simple et efficace a mon gout

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    Le tableau est plein vu que je le trace dans une Tchart et il est bien dynamique à deux dimensions. et y'a toujours rien dans mon fichier texte .

    Ben oui c'est interprété en ascii
    Avec un éditeur hexadécimal :
    comment je peux faire pour qu'il écrive en hexadécimal et si possible les chiffre les uns au dessous des autres sinon c'est pas exploitable.

    quand au Tstream je n'ai absolument aucune idée de comment ca marche je vais me renseigner merci.

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    bon je me suis documenté sur les tstream et j'ai réassayé avec ça donc voici le 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
     
    var
    F:Tfilestream;
    data_name:Tfilename;
    begin
    f:=nil;    
    data_name :='data.text';
        try
            deletefile(data_name);
            F:= Tfilestream.Create(data_name,fmcreate or fmshareexclusive);
            try
                F.Position :=0;
                i := sizeof (Tab_Dyn_Img);
                F.WriteBuffer(i,sizeof(i));
                for i:=1 to sizeof(Tab_Dyn_Img[0]) do
                begin
                    T:=sizeof(Tab_Dyn_Img[0][0]);
                    F.WriteBuffer(Tab_Dyn_Img[0],T);
                end;
            finally
                F.Free;
            end;
    //suivi de la gestion des exceptions....
    Et le fichier texte est toujours rempli de carré?!

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    bon en fait,il fallait utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    lenght(Tab_dyn_img[0]);
    //au lieu de
    sizeof(Tab_dyn_img[0]);
    voila voila

  15. #15
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    pour info :
    Length renvoie le nombre d'element d'un tableau (chaine ou tableau) et sizeof la taille en octets du type de la variable transmise.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 171
    Points : 75
    Points
    75
    Par défaut
    Il y a encore deux ou trois petit trucs qui me chiffonent :
    pourquoi par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blockread(tab_dyn_img[0],512);
    marche et pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    blockread(tab_dyn_img[0],length(tab_dyn_img[0]);
    . 512 est arbitraire mais lors de l'éxécution, le programme plante à partir d'une certaine valeur (ici : 4101, mon tableau dynamique étant evidement plus grand que cette valeur). du coup je suis obligé de passer par deux boucle pour parcourir mon tableau et ça ralentit fortement le programme.
    c'est aussi le cas quand j'utilise un filestream :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    F:= Tfilestream.Create(data_name,fmcreate or
    fmshareexclusive);
    try
    F.Position :=0;
    F.WriteBuffer(Tab_Dyn_Img[0],length(Tab_Dyn_Img[0]));

Discussions similaires

  1. [FPDF] problème avec les images dans un tableau dynamique
    Par GADSN dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 08/04/2009, 12h11
  2. Réponses: 6
    Dernier message: 26/12/2006, 18h01
  3. [SQL] Recupération Requete SQL dans un tableau dynamique PHP
    Par victor.jbju dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 13/09/2006, 17h48
  4. [Conception] Recuperer des données dans un tableau dynamique
    Par Tartanjet dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/09/2006, 01h28
  5. [VBA-E]Afficher tout dans un tableau dynamique croisé
    Par alex_95 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/03/2006, 14h09

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