Parámetros Línea de Comandos. ADA
SOLUCIONARIO
Parámetros Línea de Comandos. ADA
2026-03-16
Por
Occam's Razor

with Ada.Command_line; use Ada.Command_Line;
with Ada.Text_IO; use Ada.Text_IO;

procedure Cmdline is
begin
   Put_Line (Integer'Image(Argument_Count) & " Parametros ...");
   for I in 1..Argument_Count loop
      Put_Line ("Parameter " & Integer'Image(I) & " : " & Argument(I));
   end loop;
   if Argument_Count /= 1 then
      Put_Line ("Just one parameter please");
      return;
   end if;      
     
   Put_Line ("Hello " & Argument(1));
      
end Cmdline;

Para poder acceder a los parámetros pasados a través de la línea de comandos Ada proporciona el paquete Ada.Command_line. Este paquete define un array llamado Argument que contiene los argumentos comenzando con el índice 1. El número de argumentos de almacena en la función Argument_Count.

Este paquete también nos proporciona el nombre del programa siendo ejecutado en la función Command_Name.

Como sucede con otros lenguajes, ADA nos ofrece varias posibilidades para poder procesar la línea de comando de forma sencilla. Como siempre elegiremos la versión más parecida a getopt que es, por así decirlo, la implementación estándar. El código sería algo como esto:

with GNAT.Command_Line;
with Ada.Command_Line;
with GNAT.Strings;


procedure CmdlineGetopt is
   use Ada.Text_IO;
   use GNAT.Command_Line;
   use GNAT.Strings;

   Config : Command_Line_Configuration;

   Help_Flag   : aliased Boolean := False;
   Input_File  : aliased String_Access := new String'("input.txt");
   Output_File : aliased String_Access := new String'("output.txt");

procedure Print_Help is
   begin
      Put_Line ("Usage: program [options]");
      Put_Line ("Options:");
      Put_Line ("  -h, --help           Show this help message");
      Put_Line ("  -i, --input FILE     Input file (default: input.txt)");
      Put_Line ("  -o, --output FILE    Output file (default: output.txt)");
   end Print_Help;

begin
   Define_Switch
     (Config      => Config,
      Switch      => "-h",
      Long_Switch => "--help",
      Help        => "Show program help1",
      Output      => Help_Flag'Access);

   Define_Switch
     (Config      => Config,
      Switch      => "-i:",
      Long_Switch => "--input:",
      Help        => "Input file",
      Output      => Input_File'Access);

   Define_Switch
     (Config      => Config,
      Switch      => "-o:",
      Long_Switch => "--output:",
      Help        => "Output file",
      Output      => Output_File'Access);

   begin
    Getopt (Config);
   
     
   if Help_Flag then
      Print_Help;
      return;
   end if;

   Put_Line ("Input file : " & Input_File.all);
   Put_Line ("Output file: " & Output_File.all);
   exception
      when Exit_From_Command_Line =>
         -- Normal early exit (e.g. --help)
         Ada.Command_Line.Set_Exit_Status (Ada.Command_Line.Success); 
         return;
    end;
   
end CmdlineGetopt;

Como siempre algunos comentarios sobre este código.

SOY NOVATO

La línea Input_File : aliased String_Acess := new... está declarando un puntero puntero a una cadena de caracteres e inicializandolo con new. La palabra clave aliased significa que la variable tiene una dirección estable cuando se usa 'Address. String_Access es un tipo que normalmente se declara como type String_Access is access all Strings;

 

Lo primero que podemos ver en este nuevo código es que hemos usado Define_switch para definir todos los flags de nuestro programa. GNAT.Command_line ofrece otros procedimientos como Define_parameter para definir en detalle flags con parámetros (en principio Define_switch es para valores booleanos), sin embargo, el parámetro output de Define_switch, nos permite indicar donde queremos almacenar los valores de esos flags. Observad que para input y output hemos añadido : al final de la opción para indicar que estos flags reciben parámetros… de la forma a la que nos tiene acostumbrados getopts.

En ADA, no existe nada parecido a exit, así que o el programa termina normalmente o debemos producir una excepción. Si retornamos del programa principal, como estamos haciendo en el bloque if que muestra la ayuda, el programa generará una excepción que se mostrará en pantalla y parecerá un error.

¿SABÍAS QUE?

Podemos retornar un valor de estado al terminar el programa utilizando el procedimiento Set_Exit_Status del paquete Ada.Command_Line.

 

Para evitarlo, podemos capturar al excepción, lo cual podemos hacer metiendo el código que produce la excepción en un bloque begin - end e incluyendo el bloque exception donde procesar la excepción Exit_From_Command_Line.

Resumen

  • Ada retorna los parámetros de la línea de comandos en el array Ada.Command_Line.Arguments como cadenas de caracteres.
  • El array de argumentos comienza en 1.
  • El paquete GNAT.Command_Line nos ofrece un interfaz similar a getopt para procesar nuestra línea de comando fácilmente.

SOBRE Occam's Razor
Somos una revista libre que intenta explicar de forma sencilla conceptos tecnológicos y científicos de los que no podemos escapar. Al final, todo es más fácil de lo que parece!

 
Tu publicidad aquí :)