ADA - ¿Se puede hacer esto?

 
Vista:

¿Se puede hacer esto?

Publicado por Efferalagan (1 intervención) el 23/01/2008 16:44:48
Buenas, tengo una duda con esto... ¿Se puede reservar espacio en la memoria para un array en función de una variable?, es decir ; sería algo así:

[...]

function Crear_Vector (Nodos : in Integer) return Vector_2 is
type Vector_2 is array (integer range <>) of integer;
Reordenador : Vector_2 (1..Nodos);
NodosAux : Integer := 1;
ListaAux : P_Nodo_Simple := Lista;

[...]

Si no se pudiese así, ¿existiría alguna forma de hacerlo?
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

Reservar espacio en la memoria para un array en función de una variable

Publicado por Alejandro (155 intervenciones) el 30/06/2023 20:31:43
En ADA, no es posible reservar espacio en la memoria para un array en función de una variable de manera directa. En el código que proporcionaste, estás intentando usar una variable, `Nodos`, para definir el tamaño del array `Reordenador`, pero esto no está permitido en ADA.

Sin embargo, puedes utilizar estructuras de datos dinámicas, como punteros y listas enlazadas, para lograr un comportamiento similar. Aquí te proporciono una posible solución utilizando listas enlazadas:

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
with Ada.Text_IO; use Ada.Text_IO;
 
procedure Main is
   type P_Nodo_Simple is access all Nodo_Simple;
 
   type Nodo_Simple is
      record
         -- Tus campos de nodo aquí
      end record;
 
   type Lista is access all Nodo_Simple;
 
   function Crear_Vector(Nodos : in Integer) return Lista is
      type Vector_2 is array (Integer range <>) of P_Nodo_Simple;
      Reordenador : Vector_2(1..Nodos);
      NodosAux : Integer := 1;
      ListaAux : Lista := null;
   begin
      -- Crear los nodos de la lista y asignarlos al array
      for I in 1..Nodos loop
         Reordenador(I) := new Nodo_Simple;
         -- Inicializar los campos del nodo según sea necesario
         -- ...
 
         -- Agregar el nodo a la lista
         Reordenador(I).all.Next := ListaAux;
         ListaAux := Reordenador(I).all'Access';
      end loop;
 
      return ListaAux;
   end Crear_Vector;
 
   -- Resto de tu código
 
begin
   -- Llamar a la función Crear_Vector para crear la lista dinámica
   null;
end Main;

En esta solución, se utiliza un array `Reordenador` de tipo `Vector_2` para almacenar los punteros a los nodos de la lista enlazada. La función `Crear_Vector` crea los nodos de la lista y los asigna al array. Luego, los nodos se enlazan entre sí y se devuelve un puntero al primer nodo de la lista.

Recuerda que al utilizar estructuras de datos dinámicas, debes ser responsable de gestionar la memoria adecuadamente, liberando los nodos cuando ya no los necesites para evitar fugas de memoria.
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