ADA - Tipo de parámetro para hacer bitmap en Ada

 
Vista:
sin imagen de perfil

Tipo de parámetro para hacer bitmap en Ada

Publicado por angela (1 intervención) el 17/09/2015 20:09:53
Buenas gente! Tengo un problema con un código que encontré en Internet, es para hacer un bitmap en Ada, el problema es que no se que tipo de dato debo de ponerle el primer parámetro del procedimiento Put_PPM(???,X), les agradecería que me ayudaran.

Este es el código:

procedure Main is

type Luminance is mod 2**8;
type Pixel is record
R, G, B : Luminance;
end record;
Black : constant Pixel := (others => 0);
White : constant Pixel := (others => 255);
type Image is array (Positive range <>, Positive range <>) of Pixel;
type Point is record
X, Y : Positive;
end record;

procedure Fill (Picture : in out Image; Color : Pixel) is
....
end Fill;

procedure Print (Picture : Image) is
...
end Print;


procedure Put_PPM (File : Ada.Streams.Stream_IO.File_Type; Picture : Image) is
use Ada.Characters.Latin_1;
Size : constant String := Integer'Image (Picture'Length (2)) & Integer'Image (Picture'Length (1));
Buffer : String (1..Picture'Length (2) * 3);
Color : Pixel;
Index : Positive;
begin
String'Write (Stream (File), "P6" & LF);
String'Write (Stream (File), Size (2..Size'Last) & LF);
String'Write (Stream (File), "255" & LF);
for I in Picture'Range (1) loop
Index := Buffer'First;
for J in Picture'Range (2) loop
Color := Picture (I, J);
Buffer (Index) := Character'Val (Color.R);
Buffer (Index + 1) := Character'Val (Color.G);
Buffer (Index + 2) := Character'Val (Color.B);
Index := Index + 3;
end loop;
String'Write (Stream (File), Buffer);
end loop;
Character'Write (Stream (File), LF);
end Put_PPM;

X : Image (1..64, 1..64);

begin
Fill (X, (255, 255, 255));
X (1, 2) := (R => 255, others => 0);
X (3, 4) := X (1, 2);

Print(X);

Put_PPM(???,X);
end Main;
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Solución para el parámetro de Put_PPM

Publicado por Alejandro (155 intervenciones) el 03/07/2023 18:08:25
Para resolver el problema con el código y determinar qué tipo de dato debes proporcionar como primer parámetro del procedimiento Put_PPM, necesitas utilizar el tipo adecuado para representar un archivo en Ada. En este caso, puedes usar el tipo "Ada.Streams.Stream_IO.File_Type".

Aquí tienes el código modificado para incluir el tipo correcto como primer parámetro de Put_PPM:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
with Ada.Text_IO; -- Necesario para la salida en consola
with Ada.Streams.Stream_IO;
 
procedure Main is
   type Luminance is mod 2**8;
   type Pixel is record
      R, G, B : Luminance;
   end record;
   Black : constant Pixel := (others => 0);
   White : constant Pixel := (others => 255);
   type Image is array (Positive range <>, Positive range <>) of Pixel;
   type Point is record
      X, Y : Positive;
   end record;
 
   procedure Fill (Picture : in out Image; Color : Pixel) is
      -- Implementación del procedimiento Fill
   begin
      null; -- Código de llenado del bitmap
   end Fill;
 
   procedure Print (Picture : Image) is
      -- Implementación del procedimiento Print
   begin
      null; -- Código de impresión del bitmap
   end Print;
 
   procedure Put_PPM (File : Ada.Streams.Stream_IO.File_Type; Picture : Image) is
      use Ada.Characters.Latin_1;
      Size : constant String := Integer'Image (Picture'Length (2)) & Integer'Image (Picture'Length (1));
      Buffer : String (1..Picture'Length (2) * 3);
      Color : Pixel;
      Index : Positive;
   begin
      String'Write (Stream (File), "P6" & LF);
      String'Write (Stream (File), Size (2..Size'Last) & LF);
      String'Write (Stream (File), "255" & LF);
      for I in Picture'Range (1) loop
         Index := Buffer'First;
         for J in Picture'Range (2) loop
            Color := Picture (I, J);
            Buffer (Index) := Character'Val (Color.R);
            Buffer (Index + 1) := Character'Val (Color.G);
            Buffer (Index + 2) := Character'Val (Color.B);
            Index := Index + 3;
         end loop;
         String'Write (Stream (File), Buffer);
      end loop;
      Character'Write (Stream (File), LF);
   end Put_PPM;
   X : Image (1..64, 1..64);
begin
   Fill (X, (255, 255, 255));
   X (1, 2) := (R => 255, others => 0);
   X (3, 4) := X (1, 2);
   Print(X);
   -- Abre el archivo para escritura
   declare
      File : Ada.Streams.Stream_IO.File_Type;
   begin
      Ada.Streams.Stream_IO.Open (File, Ada.Streams.Stream_IO.Out_File, "nombre_del_archivo.ppm");
      Put_PPM(File, X);
      Ada.Streams.Stream_IO.Close(File);
   end;
   Ada.Text_IO.Put_Line("Archivo generado correctamente");
end Main;

Asegúrate de reemplazar "nombre_del_archivo.ppm" con el nombre deseado para el archivo de salida. Al ejecutar el programa, se generará un archivo PPM válido con el contenido del bitmap definido en la matriz "X".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar