Msg d'erreur lors de l'utilisation d'Initialize ...

Résolu
cerber943 Messages postés 32 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 26 octobre 2006 - 23 oct. 2006 à 18:22
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 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);

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

8 réponses

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
23 oct. 2006 à 21:55
voila ta version corrigée, mais le resultat final semble erroné, dus a la non remise a zero des tableaux :

type
  pPixelLine   = ^TPixelLine;
  TPixelLine   = array[0..4096] of integer;

  TZonesCar    = array[0..15] of TBitmap;
  pDynIntArray = ^TDynIntArray;
  TDynIntArray = array of integer;

procedure RazDynArray(const pArray : pDynIntArray; const Value : integer);
var i : integer;
begin
  for i := 0 to high(pArray^) do

      pArray^[i] := AValue;
end;

procedure InitDynArray(const pArray : pDynIntArray; const ALength : integer;const AValue : integer);
begin
  SetLength(pArray^,ALength);
  RazDynArray(pArray,AValue);
end;

procedure calculStats(car : TBitmap);
var zones       : TZonesCar;
    lines,
    cols        : TDynIntArray;
    pPL         : pPixelLine;
    x, y, i,
    nbLines,
    nbCols,
    nbPix,
    nbBk,
    nbCBk,
    nbLBk       : Integer;
begin
  zones    := DecoupeCar(car);
  nbLines  := zones[1].height;
  nbCols   := zones[1].width;
  nbPix    := nbLines*nbCols;

  InitDynArray(@Lines,  nbLines, 0);
  InitDynArray(@cols, nbCols, 0);

  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);

  SetLength(Lines,0);
  SetLength(Cols,0);
end;

<hr size="2" width="100%" />Croc (click me)
3
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 oct. 2006 à 18:37
Salut,

Essaye avec FillChar :

  FillChar(Lignes, SizeOf(Lignes),  #0);

 
@+
Cirec

<hr size="2" />
0
cerber943 Messages postés 32 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 26 octobre 2006
23 oct. 2006 à 18:42
Ca me donne le meme message d'erreur ... (biensur j'ai commenté les initialize)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
23 oct. 2006 à 18:45
et avec ceci ?:

ZeroMemory(@Lignes, SizeOf(Lignes));

 
@+
Cirec

<hr size="2" />
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cerber943 Messages postés 32 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 26 octobre 2006
23 oct. 2006 à 18:57
Toujours pareil :(
0
cerber943 Messages postés 32 Date d'inscription lundi 20 janvier 2003 Statut Membre Dernière intervention 26 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
0
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
24 oct. 2006 à 22:37
mais de rien.

<hr size="2" width="100%" />Croc (click me)
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
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 à 55  For 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;

@+
Cirec

<hr size ="2" />
0
Rejoignez-nous