next up previous
Next: Enlaces interesantes Up: Docencia de Javier Miranda Previous: Docencia de Javier Miranda

Preguntas frecuentes sobre Ada

  1. PREGUNTA ¿Cómo puedo trabajar en Ada con números reales de mayor precisión?

    Respuesta. Ada te permite decir al compilador el número de dígitos que requiere tu aplicación (en números reales en coma fija y en coma flotante. Echa un vistazo al siguiente ejemplo para que veas cómo se hace.

    with Text_IO;
    procedure Num is
    
       procedure Ejemplo_Float is
          type Mi_Float is digits 18;
          --  Con la linea anterior creo un numero en coma
          --  flotante con 18 digitos de precision.
          package Float_IO is new Text_IO.Float_IO (Mi_Float);
          N : Mi_Float := 3.14;
       begin
          Float_IO.Put (N);
       end Ejemplo_Float;
    
       procedure Ejemplo_Coma_Fija is
          type Mi_ComaFija is delta 0.00000000000000001 digits 18;
          --  Con la linea anterior creo un numero en coma
          --  flotante con 12 digitos de precision.
          package ComaFija_IO is new Text_IO.Decimal_IO (Mi_ComaFija);
          N : Mi_ComaFija := 2.0;
       begin
          ComaFija_IO.Put (N);
       end Ejemplo_Coma_Fija;
    
       --  Además, Ada proporciona el paquete Ada.Numerics con soporte
       --  para numeros complejos y control adicional de la precisión
       --  de números en reales en coma fija y flotante.
    begin
       Ejemplo_Float;
       Ejemplo_Coma_Fija;
    end Num;
    

  2. PREGUNTA Tengo un problema con este segmento de código de Ada para leer un número que tiene que ser positivo. He puesto una estructura loop junto con un begin-end y un manejador de excepciones para que si se introduce un dato no positivo se controle el error y vuelva a preguntar por el dato. El problema es que si se pone cualquier valor no positivo, salta error y se entra en un bucle infinito (aunque el texto "Introduce el número de muestras a simular aparece" no se detiene a tomar el valor, es como si siempre tomase el valor erróneo y simpre saltase directamente al manejador)

        loop
           begin
             Text_IO.Put_Line ( "Introduce el numero de muestras a simular: ");
             Text_IO.Get (Numero);
             exit;
           exception
             when others =>
                 Text_IO.Put_Line ("Introducelo de nuevo. Debe ser positivo!");
           end;
        end loop;
    

    Respuesta. El problema lo tienes porque cuando salta el error tienes que decirle a Ada que descarte esa línea errónea (mediante Text_IO.Skip_Line). Al no hacerlo le está diciendo que lo intente "de nuevo". Por tanto, la solución correcta es:

        loop
           begin
             Text_IO.Put_Line ( "Introduce el numero de muestras a simular: ");
             Text_IO.Get (Numero);
             exit;
           exception
             when others =>
                 Text_IO.Put_Line ("Introducelo de nuevo. Debe ser positivo!");
                 Text_IO.Skip_Line;
           end;
        end loop;
    

  3. PREGUNTA. Para la práctica de la asignatura he hecho el procedimiento que introduce una ficha en mi base de datos. En el programa principal tengo un menú y una de las opciones permite al usuario ver todos los datos que ha guardado. ¿Puedo declarar este segundo procedimiento como un subprograma dentro del procedimiento ``insertar'' para evitar duplicar variables?

    Respuesta Si lo pones dentro del procedimiento "insertar" estas obligando a que solamente se puede llamar desde dentro de "insertar" (y eso no es lo que tu quieres).

    La solución que hiciste es buena (aunque pueda parecerte que no lo es) porque si más adelante decides que ese procedimiento esté en otro paquete puedes copiarlo y pegarlo en el otro paquete con total tranquilidad (porque tiene dentro de él todas sus variables).

    Si insistes en escribir poco (que no es lo mejor) hay otra solución que es poner las variables fuera de los procedimientos (mira el código de la primera versión del paquete "Array_No_Ordenado" y fijate que las variables "Contenido" y "Num_Elementos" están en el fichero "adb" fuera de todos los procedimiento). Esto SOLAMENTE DEBE HACERSE cuando tienes varios procedimientos que necesitan tener algunas variables comunes.

  4. PREGUNTA ¿ Cómo puedo controlar el cursor en Linux para que un programa Ada pueda escribir en cualquier posición de la pantalla de texto (sin utilizar pantalla gráfica) ? ¿ Cómo puedo escribir utilizando diferentes colores (tanto para el fondo de pantalla como para el texto) ?

    Respuesta. Utiliza el paquete de Daniel Alcantara de la Hoz

    Si tienes una conexión lenta y quieres descargarte estos tres ficheros en tu PC de una sóla vez, utiliza pantalla-1.0.tgz.

  5. PREGUNTA ¿ Cómo puedo controlar el puerto serie (COM1) de Windows desde Ada ?

    Respuesta. La forma más sencilla de controlar los periféricos (puerto serie y puerto paralelo) desde Ada es tratándolos como ficheros. Por ejemplo:

       with Text_IO;
       procedure Ejemplo is
          F : Text_IO.File_Type;
       begin
          Text_IO.Open (F, Text_IO.Out_File, ``COM1'');
          . . .
          Text_IO.Close (F);
       end Ejemplo;
    

    Si necesitas un control más fino (para indicar el numero de bits, paridad, etc), utiliza el paquete que está en el apartado ``COM Ports'' en la siguiente dirección: http://users.erols.com/leakstan/Stephe/.

  6. PREGUNTA ¿ Cómo puedo hacer que mi programa Ada trabaje con números aleatorios ?

    Respuesta. Utiliza el siguiente paquete:

    Si tienes una conexión lenta y quieres descargarte estos tres ficheros en tu PC de una sóla vez, utiliza random-1.0.tgz.

  7. PREGUNTA ¿ Cómo puedo acceder desde Ada a los parámetros que se pasan desde la línea de órdenes ?

    Respuesta. Utilizando el paquete Ada.Command_Line, que es un paquete que viene con todos los compiladores de Ada. Como ejemplo de uso mira este programa:

    with Ada.Command_Line;
    with Text_IO;
    procedure Test_CommandLine is
    begin
       if Ada.Command_Line.Argument_Count = 0 then
          Text_IO.Put_Line ("No me pasaste nada");
       else
          Text_IO.Put_Line ("Estos son los parametros que me pasaste:");
          for I in 1 .. Ada.Command_Line.Argument_Count loop
             Text_IO.Put_Line (Ada.Command_Line.Argument (I));
          end loop;
       end if;
    end Test_CommandLine;
    

  8. PREGUNTA ¿ Cómo se hace en Ada un programa que copie un fichero de texto y que se comporte como los programas que vienen en Windows o en Linux ?

    Respuesta. Echa un vistazo a este ejemplo: copia.adb

  9. PREGUNTA ¿ Cómo se hace en Ada un programa que busque una palabra dentro de un fichero de texto y que se comporte como los programas que vienen en Windows o en Linux ?

    Respuesta. Echa un vistazo a este ejemplo: busca.adb


next up previous
Next: Enlaces interesantes Up: Docencia de Javier Miranda Previous: Docencia de Javier Miranda
Javier Miranda 2007-03-05