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.
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.
Bonjour,
Je ne sais pas comment est fait votre tableau.
Dans tout les cas vous ne devez lire que la moitié de la liste.
Avec count comme nombre d'élément.
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;
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.
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
PS : Grillé
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;
@+ Phil
Blaise PascalNous 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.
PS : n'oubliez pas le tag
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.
Je sais pas du tout ce que c'est et j'ai rien trouvé dans ma recherche dessus. Est-ce que permettrait à mon instructionPeut être pourriez vous simplement ajouter un flag ordre de lecture.
d'écrire la ligne dans le fichier directement à l'envers??
Code : Sélectionner tout - Visualiser dans une fenêtre à part F.Writebuffer(Save_tab[i][j][0],2*length(Save_tab[0][0]));
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
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.
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
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.
Bon j'ai testé l'algo et ça marche suffisament rapidement à mon goût. donc
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;
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager