[Pascal] nombre limite de valeurs en pointeurs

nombre limite de valeurs en pointeurs [Pascal] - Delphi/Pascal - Programmation

Marsh Posté le 13-04-2002 à 01:36:05    

Bonsoir, je dois stocker dans un programme pascal (si si ca existe encore :p) des images 36*36 pixels dans des pointeurs.
 
Cela represente environ 1200 valeurs par image à garder dans des pointeurs. Tout en sachant qu'il y a 25 images environ a stocker :p
 
Le probleme c'est que des que j'aim mis 8 images en memoire, le PC commence à peiner, 9 c'est fini, j'ai le droit a une belle erreur Heap Over Flow.
 
Est ce qu'il existe pas un moyen plus simple pour augmenter le nombre max de valeurs que l'on peut stocker dans des pointeurs ?
Ou est est ce que qqun aurait une idée sur la maniere de stocker les 1200 valeurs d'une image en memoire alliant pointeurs et autre type de variable ?
 
(C pour un projet info scolaire t il faut utiliser les pointeurs deds:))
 
PS : les images sont lues pixel par pixel et je stocke la valeur de la couleur d'un pixel en memoire (c'est pour cela qu'il y a 1200 valeurs dans par image).
 
 
Merci d'avance !

Reply

Marsh Posté le 13-04-2002 à 01:36:05   

Reply

Marsh Posté le 13-04-2002 à 01:55:04    

Ben tu fait un pointeur qui pointe au debut de ton image.
De quoi as tu besoin en plus si tu connais le structure de donnée?
Tu alloues la taille necessaire pour contenir ton image
(taille du header + (nb de lignes*nb de pts par ligne*nb d'octet par pixel)) et tu pointes au debut.
Supposant que tu as une image 1200*1200*4 (1 octet par couleur+1 en rab pour des flags) ca te fait: 5Megs par image environ.
Pour 9 images, ca te bouffe environ 45 Megs de memoire.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2002 à 02:02:50    

oui mais la c pas le cas.
C'est des images 36*36 16 couleurs (classique sous TP).
Le prob c qu'apres 8 images alouées dans les pointeurs soit (8*1297 = 10376 pointeurs aloués) si j'essaye d'ajouter une 9ieme image, j'ai une erreur ...
 
Ya qu'un nombre de 1 à 16 stocké dans chaque pointeur. (format byte) normalement ca devrait pas faire 45 MB :p
Mais bon, ca passe po :(

Reply

Marsh Posté le 13-04-2002 à 02:51:26    

Mais pourquoi faire un pointeur par pixel?
Tu as lu ce que je t'ai ecrit??
Un pointeur devrait suffire en tout et pour tout par image.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2002 à 03:02:58    

JBs a écrit a écrit :

oui mais la c pas le cas.
C'est des images 36*36 16 couleurs (classique sous TP).
Le prob c qu'apres 8 images alouées dans les pointeurs soit (8*1297 = 10376 pointeurs aloués) si j'essaye d'ajouter une 9ieme image, j'ai une erreur ...
 
Ya qu'un nombre de 1 à 16 stocké dans chaque pointeur. (format byte) normalement ca devrait pas faire 45 MB :p
Mais bon, ca passe po :(  




Dans ce que je te disais, il suffisait d'adapter la formule:
36*36*1 ca fait 1296 octets par image.
Il suffit donc d'un pointeur pointant sur une zone de taille 1296 pour stocker une de tes images, soit un petit peu plus que 1Ko. Tu devrais pouvoir avoir bien plus de 9 images (environ 10k) en memoire.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2002 à 03:49:57    

ouais mais la, ca depasse mes compétances :(
 
J'ai uniquement vu le stockage de donnée dans un pointeur, apres pour savoir cb de memoire allouer a un pointeu ou un autre, c po faire :(
 
En fait ce que tu essaye de me faire comprendre c de mettre les 1200 valeurs correspondant aux couleurs des pixels dans un seul et unique pointeur au lieu de faire un pointeur par pixel ?
 
 
Voila comment je procede actuellement : (Peux pas faire copier/coller domage :( )
Une image : 34*34 pixels
Elle est stockée dans un fichier texte imgX.dat
 
Je lis le fichier
for i:=1 to 34 do
  for j:=1 to 34 do
    news(courant);
    read(fichier,courant^.newpixel);
    precedant^.suivant:=courant;
    precedant:=courant;
end;
La l'assignation pixel / pixel d'une image est faite a raison d'un pixel par pointeur.
 
Apres, qd je dois reaffciher l'image dans le programme, j'ai la premiere valeur du pointeur stockée dans un tableau et je l'appelle dans une boucle un peu comme ci-dessus.
 
 
ps : mes connaissances se limitent a l'apprentissage scolaire.

Reply

Marsh Posté le 13-04-2002 à 06:02:33    

Bon, mon pascal est SGDG, car ca fait un bail que j'en ai pas fait, mais je ferais un truc du genre:
 
Tu declare des variables:
image: array [1..1296] of Byte;  
p: ^Byte;
i: Integer;
 
Tu fait pointer le pointeur au debut du tableau:
p := @image[1];  
 
Tu remplis et incrementes le pointeur:
for i:=1 to 1296 do  
read(fichier,p^);
Inc(p);
end;
 
 
 
Notes qu'il etait aussi simple de faire:
for i:=1 to 1296 do  
read(fichier,image[i]);
end;
Mais bon, puisque tu as l'air de vouloir utiliser un pointeur...
 
Un truc vraiment dynamique serait:
type
  Image = array [1 .. 1296] of Byte;
  ImgPtr = ^Image;
 
 
var
  p, aux: ImgPtr;
 
 
begin
  GetMem (p, 1296 * SizeOf (Byte));
  aux := p;
  for i:=1 to 1296 do  
  read(fichier,aux^);
  Inc(aux);
  end;
  ......
  // Tu peux maniper l'image avec p qui pointe au debut et aux
  //avec des boucles:
  // aux := p;
  // for i:=1 to 1296 do  
  // manip_du_pixel(aux^);
  // Inc(aux);
  // end;
 
  // et quand tu as plus besoin de l'image:
  FreeMem(p, 1296 * SizeOf (Byte));
end;
 
J'ai ete voir la page du gnu-pascal ( http://www.gnu-pascal.de/gpc_toc.html ) avant de te repondre, car j'en avais oublie la syntaxe pour les pointeurs.
A+,

 

[jfdsdjhfuetppo]--Message édité par gilou--[/jfdsdjhfuetppo]


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-04-2002 à 13:52:33    

Merci Gilou !
Je v tester ca de suite !
 
(Je suis obligé de passer par les pointeurs car ca fait parti de la grille d'evaluation du projet info et faut en retirer le max de points :p)

Reply

Marsh Posté le 13-04-2002 à 16:53:08    

Bon j'ai essayé Gilou, j'ai trouve une solution ... enfin partiellement quoi.
Je stocke les lignes completes d'une image dans un tableau lui meme dans un pointeur le prob c que une ligne sur 2 est toute noire, et je pige pas pk :(
 
Merci pour ton aide en tout cas !  :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed