cerber943
Messages postés32Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention26 octobre 2006
-
23 oct. 2006 à 18:22
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 2022
-
25 oct. 2006 à 13:06
Bonjour,
Voici le code qui pose problème :
type
TZonesCar = array[0..15] of TBitmap;
procedure TAnalysCar.calculStats(car : TBitmap);
var zones : TZonesCar;
lignes,colonnes: array of Integer;
x,y,i,nbLignes,nbCols,nbPix,nbNoir,nbCNoir,nbLNoir : Integer;
begin
zones:=DecoupeCar(car);
nbLignes:=zones[1].height;
nbCols:=zones[1].width;
nbPix:=nbLignes*nbCols;
// on dimensionne nos tableaux :
SetLength(lignes,nbLignes);
SetLength(colonnes,nbCols);
// on initialise nos tableau pour qu'ils soit à 0 partour
Initialize(lignes); <=== Lorsque cette ligne est commentée aucun PB
Initialize(colonnes); <=== Lorsque cette ligne est commentée aucun PB
for i:=low(zones) to high(zones) do begin
// Traitement pour chaque zone
nbNoir:=0; nbCNoir:=0; nbLNoir:=0;
// for x:=0 to nbLignes-1 do lignes[x]:=0; <== Non commenté lorsque commenté au dessus
// for x:=0 to nbCols-1 do colonnes[x]:=0; <== Non commenté lorsque commenté au dessus
for y:=0 to nbLignes-1 do
for x:=0 to nbCols-1 do // $00000000 noir et $00FFFFFF blanc
if zones[i].Canvas.Pixels[x,y]=$00000000 then
begin
Inc(nbNoir);
Inc(lignes[y]);
Inc(colonnes[x]);
end;
// Ici on doit avoir le nb de pix noir sur l'image(nbNoir)
// lignes[] contient le nombre de pixels sur chaque ligne
// colonnes[] contient le nombre de pixels sur chaque colonne
for x:=0 to nbLignes-1 do
if lignes[x]>0 then Inc(nbLNoir);
for x:=0 to nbCols-1 do
if colonnes[x]>0 then Inc(nbCNoir);
end;
// A la fin on désalloue notre tableau (delphi le fait tout seul normalement mais bon)
libereZones(zones);
Finalize(lignes);
Finalize(colonnes);
end;
Lorsque je commente les 2 lignes au début du code (Initialize(...)) et que je décommente mes 2 boucles FOR 4 lignes plus bas (voir flèches sur la droite), le programme s'exécute correctement.
J'ai lu dans des tutoriels de tableaux dynamiques qu'il fallait utiliser Initialize pour mettre à 0 toutes les valeures de mon tableau mais lorsque je l'utilise dans cette fonction, dès que je veux modifier le contenu de mon tableau (colonnes[] ou lignes[]) par exemple en incrémentant colonnes[x], j'obtiens le message :
EAccessViolation avec le message 'Violation d'accès à l'adresse 00453184 dans le module ......... Ecriture de l'adresse 00000000'.
Sauriez-vous quelle est la cause de ce problème ? et éventuellement si vous ne voyez pas d'autres problèmes car cette fonction fonctionne correctement sans l'utilisation d'Initialize, je cherche à la modifier car mon prog une fois lancé grossit en mémoire régulièrement.
for i := low(zones) to high(zones) do begin
nbBk := 0;
nbCBk := 0;
nbLBk := 0;
RazDynArray(@Lines,0);
RazDynArray(@Cols,0);
for y := 0 to nbLines-1 do begin
{ Zones[i].pixelFormat doit etre a pf32Bit dans DecoupeCar }
pPL := Zones[i].ScanLine[y];
for x:=0 to nbCols-1 do begin
if pPL[x] = $000000 then begin
Inc(nbBk);
Inc(lines[y]);
Inc(cols[x]);
end;
if cols[x] > 0 then Inc(nbCBk);
end;
if lines[y] > 0 then Inc(nbLBk);
end;
with Stats.Stats[i] do begin
id := i;
nbCNoir := nbCBk/nbCols;
nbLNoir := nbLBk/nbLines;
nbNoir := nbBk/nbPix;
end;
end;
libereZones(zones);
cerber943
Messages postés32Date d'inscriptionlundi 20 janvier 2003StatutMembreDernière intervention26 octobre 2006 24 oct. 2006 à 14:38
Merci beaucoup f0xie, je ne sais pas ce que je ferais sans toi, depuis que je viens ici, 4 questions = 4 réponses valides de toi !!
Désolé d'avoir abusé de ton temps et merci encore
Cirec
Messages postés3833Date d'inscriptionvendredi 23 juillet 2004StatutModérateurDernière intervention18 septembre 202250 25 oct. 2006 à 13:06
Il n'est pas utile d'initialiser le tableau dynamique
La preuve ici :
Var Lignes : Array Of Integer;
procedure TForm1.Button1Click(Sender: TObject);
Var I : Integer;
begin SetLength(Lignes, 10);
// on met les dix premier à 55For I:Low(Lignes) to High(Lignes) <gras>Do Lignes[I] :</gras> 55;
// et les dix suivant on les laisse
SetLength(Lignes, 20);
For I: = Low(Lignes) to High(Lignes) Do Memo1.Lines.Add(IntToStr(Lignes[I]));
end;