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 :

[Débutant] Inverser un tableau


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 [Débutant] Inverser un tableau
    Pour optimiser mon programme j'ai besoin d'inverser l'ordre des données (le dernier chiffre devient le premier ect) d'un tableau dynamique de manière globale sans passer par une boucle qui lis tous les éléments c'est trop long.

    Merci d'avance.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    Je ne sais pas comment est fait votre tableau.

    Dans tout les cas vous ne devez lire que la moitié de la liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For I := 0 to (Count -1) div 2 do begin
      Temp := Valuer[i];
      Valeur[I] := Valeur[Count - I];
      Valeur[Count - i] := Temp;
    end;
    Avec count comme nombre d'élément.

    Une idée comme cela en passant.
    Peut être pourriez vous simplement ajouter un flag ordre de lecture.
    Dans ce cas vous n'avez pas à traiter le changement, vous vous contentez de lire de 0 à count - 1 ou de count -1 à 0.

  3. #3
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    salut

    tu ne pourra pas eviter la boucle par contre
    se ne sera que sur la moite de indice

    imagine tu as un tableau de 100 element

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    max := 100;
     
    for i := 0 to round((max/2)+0.2) do 
    begin
      TabFi[i]        := TabData[max-i];
      TabFi[max-i]  := TabData[i];
    end;
    PS : Grillé
    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  4. #4
    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
    En fait j'ai un tableau de tableau de 512*512 et je dois inverser une ligne sur deux pour que le fichier dans lequel je vais l'écrire soit lisible correctement(j'utilise un Tsreamfile). Le faire point par point c'est lent.
    Peut être pourriez vous simplement ajouter un flag ordre de lecture.
    Je sais pas du tout ce que c'est et j'ai rien trouvé dans ma recherche dessus. Est-ce que permettrait à mon instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F.Writebuffer(Save_tab[i][j][0],2*length(Save_tab[0][0]));
    d'écrire la ligne dans le fichier directement à l'envers??

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    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 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Faudrait voir l'ensemble du programme

    d'ou vient le Tableau ?
    Pourquoi l'écrire à l'envers ?

    Sinon, normalement l'inversion d'item dans un tableau c'est rapide, j'aurais fait le même algo que Tardiff Jean-François, avec juste la moitié de parcours...
    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

  6. #6
    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
    en fait c'est un tableau d'image 512*512 et une ligne sur deux de chaque image a était enregistré à l'envers ( et ca j'y peux rien) donc si j'enregistre le tableau tel quel, lors de la lecture on voit l'image et sa réflection mélangé. Et comme j'ai parfois besoin d'enregistrer une centaine d'image... ca traine.

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    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 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Peux-tu nous fournir la fonction qui inverse actuellement ton tableau ??
    tes images dans le tableau c'est des TImage, ou le binaire d'une Image ?
    Et ton problème peut venir de là, si tu déplace dans le tableau le binaire, au lieu de déplacer un pointeru sur le binaire, ce n'est pas supprenant que ce soit lent, ...

    Ensuite, faut bien voir qu'enregisté une centaine d'image, j'ignore la taille, mais cela peut devenir monstreux ... faut bien que le disque écrive, je m'en suis arrêté au ATA 133, mais c'est du 133 Mo/s donc en gros (disons la moitié pour le réel), si tu as 100 Images de 1.33Mo (ça fait un bitmap 24bit de 241x241) ça doit bien mettre 2s pour écrire les données, sans compter le temps de la gestion des fichiers par Windows dans la FAT, ... et vu que ton programme n'est pas tout seul, windows ne va envoyer les données que lorsqu'il a le temps de gérer les ressources pour ton programme, donc ce temps peut énormément augmenter ... mais personnellement au bureau pour écrire 133 séquence de 1Mo, dans un seul fichier, cela prend 19s (bon il y a de l'affichage ce qui est très lent, des processmessages, ...)
    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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,


    Pour résumé si j'ai bien compris.

    vous avez un tableaux de 512 *512. Taille fixe et invariable
    Pour enregistrer les données dans le bon ordre vous devez utiliser un ordre différent de l'ordre numérique, ou trier les données pour pouvoir utilise l'ordre numérique de 0 à 512


    Si au lieu de fair
    for i := 0 to 511 do begin
    for j := 1 to 511 do begin
    MaDonné := MonTableau indicé par i, j
    end;
    end;

    vous faite
    for i := 0 to 511 do begin
    for j := 1 to 511 do begin
    MaDonné := MonTableau indicé par Realivalue(i), realjValue(j)
    end;
    end;

    Et que cous realiser 2 fontions qui transforme (RealIValue et RealJValue) qui vous donne les bon indice dans le tableau, vous n'avez plus besoin de le trier.
    La conversion, le trie ce fait à la volé/virtuellement.

  9. #9
    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 j'ai testé l'algo et ça marche suffisament rapidement à mon goût. donc


  10. #10
    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
    L'ordre d'écriture dans le tableau n'est pas modifiable il ne dépend que de l'ordre de mesure des données.

    Les images sont enregistrées au format pic en 16bit qui permet d'enregistrer toutes les images dans un même fichier, les données étant enregistrer en bloc mais elles doivent être dans l'ordre. Donc le programme doit trier tous les tableaux avant de les enregistrer dans le fichier.

    Actuellement pour trier remettre dans l'ordre et écrire 50 images (donc 50*512*512 données) je mets à peu prés 4s. Et voici ma procedure de trie et ecriture.

    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
    Save_tab:=array of array of array;//(nb d'img)*(512)*(512)/ triées. données 
    Tab_dyn_Img := array of array;//(nb d'img)*(512*512) / tableau d'origine des données données en vrac.
     
    for i:= 0 to repetition.Value-1 do
                  begin
                    for j:=0 to 255 do
                    begin
                      Save_Tab[i][2*j]:= Copy(Tab_Dyn_Img[i],(2*j)*(512+repos)+dec,512);
                      Save_Tab[i][2*j+1]:= Copy(Tab_Dyn_Img[i],(2*j+1)*(512+repos)+dec,512);
                      for k :=0 to 255 do
                      begin
                        Temp :=Save_tab[i][2*j+1][k];
                        Save_tab[i][2*j+1][k]:=Save_tab[i][2*j+1][511-k];
                        Save_tab[i][2*j+1][511-k]:=Temp;
                      end;
                      F.WriteBuffer(Save_tab[i][2*j][0],2*length(Save_tab[0][0]));
                      F.Writebuffer(Save_tab[i][2*j+1][0],2*length(Save_tab[0][0]));
                    end;
                  end;
                end;

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

Discussions similaires

  1. [Débutant] Inverser une chaîne de caractères
    Par zbooon dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 28/04/2017, 13h44
  2. Réponses: 3
    Dernier message: 24/09/2005, 09h34
  3. Aide débutant instruction VBA tableau Excell
    Par damien33 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 23/09/2005, 10h31
  4. [Débutant] Définir un tableau de JPanel
    Par etiennegaloup dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 20/07/2005, 10h22
  5. [Débutant] Trier un tableau en 2 boucles
    Par SaladinDev dans le forum Assembleur
    Réponses: 9
    Dernier message: 07/05/2005, 22h38

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