begin process at 2010 02 10 06:36:21
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Delphi

 > 

Mutimédia

 > 

Image & Vidéo

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 23 octobre 2006 à 18:22:55 | Msg d'erreur lors de l'utilisation d'Initialize ...

cerber943

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

lundi 23 octobre 2006 à 18:37:26 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cirec

Membre Club Administrateur CodeS-SourceS
Salut,

Essaye avec FillChar :

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


 
@+
Cirec

lundi 23 octobre 2006 à 18:42:03 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cerber943

Ca me donne le meme message d'erreur ... (biensur j'ai commenté les initialize)
lundi 23 octobre 2006 à 18:45:40 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cirec

Membre Club Administrateur CodeS-SourceS
et avec ceci ?:

ZeroMemory(@Lignes, SizeOf(Lignes));

 
@+
Cirec

lundi 23 octobre 2006 à 18:57:32 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cerber943

Toujours pareil :(
lundi 23 octobre 2006 à 21:55:27 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

f0xi

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !


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;



Croc (click me)
mardi 24 octobre 2006 à 14:38:49 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cerber943

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
mardi 24 octobre 2006 à 22:37:28 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

f0xi

Membre Club Administrateur CodeS-SourceS

mais de rien.


Croc (click me)
mercredi 25 octobre 2006 à 13:06:58 | Re : Msg d'erreur lors de l'utilisation d'Initialize ...

cirec

Membre Club Administrateur CodeS-SourceS
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) Do Lignes[I] := 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



Cette discussion est classée dans : lignes, for, colonnes, nblignes, nbcols


Répondre à ce message

Sujets en rapport avec ce message

colonne dans un fichier Csv [ par furax13 ] j'ai un fiohier csv qui contient environ 60 colonnes et 20000 lignes+ 1 ligne d'entête. Dans une listBox, j'ai la liste des colonnes à extraire (cor listview numeroter les lignes [ par sagitaz ] bonjour à tous voici mon soucis, j'ai 4 colonnes dans une listview, je rempli celle-ci avec les infos des fichier que je selectionne grace a un opendi Nombre de lignes et de colonnes dans un TDbGrid [ par Francky23012301 ] Salut à tous, J'aimerai réaliser la procedure suivante : Procedure var nc, nl : integer; while nc<= nombre de colonnes dans table1 do nl<=nombre de Resizer les colonnes er les lignes d'un stringGrid [ par codial ] Bonjour, tout est dans la question. J'ai un StrinGrid alClient sur un panel. Quelqu'un peut il m'expliquer comment 'resizer' les colonnes et les lign comment convertir ça en Delphi [ par faimo ] Salut : comment convertir ça en Delphi : [code=cpp] UCHAR FoulString[] = "foul"; BOOL ScanBuffer ( __in_bcount(BufferSize) PUCHAR Buffer, __in Masquer des lignes dans une CustomGrid [ par Gerard ] Bonjour, Je veux faire des tris dans des Grids (DrawGrid et StringGrid) et pour cela j'ai pensé affecter une hauteur nulle aux lignes que je voulais etat à 30 colonnes [ par habib1976 ] [b]sous delphi je veux créer un état composé de 30 colonnes le problème c'est que le nombre de colonnes dépasse la largeur du format du papier que je How to count by programm whole lines belong to Chappter 1,2,3,4 etc [ par kkasiekk ] Hi Friends I am looking for solution for my programm ... Hope there is someone to help me with [^^happy13] As about my problem: I have to redaging my Alignement à droite des colonnes Quick Report [ par nabil351974 ] Par défaut Alignement à droite des colonnes Quick Report Bonjour à toutes tous et à tous, j'ai un état fait avec Quick Report.il dispose de 3 colonne


Nos sponsors


Sondage...

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales