ADA - Ejecutar en una tarea una función implementada en otra tarea

 
Vista:

Ejecutar en una tarea una función implementada en otra tarea

Publicado por Sergio (1 intervención) el 06/11/2011 13:56:30
Hola señores,

Necesito ayuda, soy completamente nuevo en esto de ADA. He leído algunos manuales pero no logro aclararme. El tema es el siguiente, necesito hacer un programa (el que sea) pero con la siguiente especificación:
"Implementar en ADA dos task (tareas): Task A y Task B. Task A deberá ejecutar una función implementada en Task B.

Tengo algo así, pero no funciona, podeis ayudarme:
//////////////////////////////////////////////////////////////////////////////////////////////////////
with gnat.io; use gnat.io;
procedure hello is

task Tarea1;
task Tarea2;

task body Tarea1 is
X : Tarea2;
begin

Factorial(X);

end Tarea1;

task body Tarea2 is
begin
function Factorial (N : Positive) return Positive is
begin
if N = 1 then
return 1;
else
return (N * Factorial (N - 1));
end if;
end Factorial;
end Tarea2;

N:Integer;
begin
-- En este momento comienzan a ejecutarse ambas tareas.
Put("Introduce un numero: "); Get(N); New_Line;
Factorial(N); Put("El factorial es": &N);
end hello;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Gracias
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

Implementación de tareas y llamadas entre ellas

Publicado por Alejandro (155 intervenciones) el 03/07/2023 16:45:29
Hola, Sergio.

He notado algunos errores en tu código que están impidiendo que funcione correctamente. Aquí te muestro una versión corregida del código, explicando los cambios realizados:

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
with ada.text_io; use ada.text_io;
procedure hello is
 
   task Tarea1;
   task Tarea2;
 
   task body Tarea1 is
      X : Positive;
   begin
      X := Tarea2.Factorial(5);  -- Llamada a la función Factorial de la Tarea2 con un valor de ejemplo (5)
      Put_Line("Resultado del factorial: " & Positive'Image(X)');
   end Tarea1;
 
   task body Tarea2 is
      function Factorial(N : Positive) return Positive is
      begin
         if N = 1 then
            return 1;
         else
            return (N * Factorial(N - 1));
         end if;
      end Factorial;
   end Tarea2;
 
begin
   -- En este momento comienzan a ejecutarse ambas tareas.
   Tarea1;
   delay 0.1;  -- Se agrega un pequeño retraso para permitir que Tarea1 termine antes de que finalice el programa
end hello;

Principales cambios realizados:

1. Se agregó `use ada.text_io;` en lugar de `use gnat.io;` para utilizar los procedimientos de entrada/salida estándar de Ada.

2. Se agregaron los operadores `&` y `Positive'Image` en la línea `Put_Line` para imprimir correctamente el resultado del factorial.

3. Se corrigió la llamada a la función `Factorial` dentro de `Tarea1` utilizando la sintaxis `Tarea2.Factorial(5)` como ejemplo.

4. Se agregó `delay 0.1;` al final del programa para dar tiempo a que `Tarea1` termine antes de que finalice el programa. Puedes ajustar el valor de `delay` según tus necesidades.

Recuerda que en Ada, las tareas deben ser activadas explícitamente mediante la llamada al nombre de la tarea, como se hace con `Tarea1;` en el programa principal.

Espero que esta versión corregida te ayude a avanzar con tu proyecto en Ada. ¡Buena suerte!
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