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);
Stats.Stats[i].id:=i;
Stats.Stats[i].nbCNoir:=nbCNoir/nbCols;
Stats.Stats[i].nbLNoir:=nbLNoir/nbLignes;
Stats.Stats[i].nbNoir:=nbNoir/nbPix;
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.
Merci d'avance pour votre aide