begin process at 2012 02 10 05:24:02
  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 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 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 attributs colonnes StringGrid [ par PhilLU ] Salut, Je souhaite donner à certaines colonnes d'un StringGrid l'attribut editable (goEdit:=True?) et à d'autres colonnes non. Comment faire? Merci à Ouvrir / Enregistrer [ par Valentin_Loupe ] Bonjour,Je voudrais savoir si quelqu'un peut m'aider, je voudrais faire quelque chose :En fait, le principe est simple : je voudrais pouvoir enregistr Affichage des colonnes d'un DBgrid Horizontalement et verticalement [ par lazsaida ] BonjourJe voudrai afficher des donner liées à une table et à un datasource dans une grille de deux manière Verticale et Horizontale , J'ai trouver le effacer polyline [ par seba31stien ] Bonjour, dans mon appli, je trace des lignes entre deux points sur un paintbox (équipé d'une carte géo) selon : PaintBox1.Canvas.Polyline([cc[site_i Connaitre le nombres de lignes dans un fichier texte [ par Tank01 ] Bonjour, Je suis débutant en delphi, et voici le problème auquel je suis confronté: Soit un document texte contenent plusieurs lignes. je traite ces


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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 : 1,482 sec (3)

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