Discusión:Programación en Ada/Unidades predefinidas/Ada.Text IO

De Wikilibros, la colección de libros de texto de contenido libre.
Ir a la navegación Ir a la búsqueda

Terminal ANSI[editar]

Según w:en:ANSI.SYS este fichero existe en todas las versiones de Windows así que en teoría podría conseguirse portabilidad cargando en Windows este fichero. Ahora en versiones modernas de Windows (desde ME para acá) no sé como se hará. En DOS y Windows 9x se hacía modificando el fichero CONFIG.SYS, pero tengo entendido que ese fichero ya no se carga. ManuelGR 17:59 31 jul, 2005 (UTC)


El terminal ANSI también se puede cargar en XP y similares (según he leído) modificando un archivo... pero no podemos obligar al usuario a modificar un archivo de sistema solo para usar nuestra aplicación, no? ;p Andres_age 21:29 31 jul, 2005 (UTC)

Backspace: character:=ASCII.Del; -- Unix[editar]

Creo que esto no es cierto, al menos no soy capaz de implementar lo del contador y el backspace en Linux. Aún no sé qué caracter devuelve el backspace. ManuelGR 18:23 31 jul, 2005 (UTC)

Pues sí que es Del, pero lo que no consigo es hacer que se borre el caracter anterior al pulsarlo. Definitivamente el
            Ada.Text_IO.Put (ASCII.BS &' '& ASCII.BS);

no funciona en este caso. ManuelGR 18:50 31 jul, 2005 (UTC)

Sobre el carácter, estuve trasteando un buen rato en Suse, y el Get_Immediate no devolvía eco (??); para borrar el carácter, detecto cuando se ha pulsado la tecla Backspace, borro el carácter y retrocedo el contador una unidad. Esto lo he hecho en mi "programa", ahora reinicio en linux y lo pruebo para este ejemplo que tenemos.

Andres_age 19:35 31 jul, 2005 (UTC)

Vale, el problema no era ni de Windows ni de Linux ni nada: era del Get_Immediate. Es que hay dos versiones, yo suelo usar la bloqueante: Get_immediate(Char) a secas, sin parámetro boolean ni nada. De esta forma el programa SI que funciona perfectamente. A mí me da que de la otra manera, con el "Leído" el apretar ESC es como si no lo reconociera como pulsado; además si apretabas varias veces las otras teclas podías borrar dos carácteres en vez de uno (sí, sí, como lo oyes), supongo que por algo de esa variable Leído, y que la "entrada" iba más rápido que el eco (se ejecutaba dos veces, pero tan rápidamente que el eco solo aparecía una vez)... Bueno, de esta manera funciona bien, ah, y esta versión de get_immediate NO tiene eco! Se necesita hacer un Put(char) para visualizar el carácter leído. He cambiado a String porque es más fácil de borrar (solo quitas uno al contador), sino tendría que separar el unbounded_string en el último carácter, etc etc. No se si es fácil o no, pero como no lo parece :P pues lo he puesto con strings normales. Si quieres ponerlo con Unbounded, mejor que mejor (es mucho más flexible), pero lo dicho, no estoy muy ducho en como separar un string :p

Andres_age 20:20 31 jul, 2005 (UTC)

Pues sí señor, ahora está mucho mejor. Es más limpio con la versión bloqueante del Get_Immediate, el problema es que yo pensaba que sólo existía la no bloqueante (por eso lo del delay). En cuanto a lo del unbounded, para borrar sí que se ofuscaría un poco el código así que mejor dejarlo así. El problema es que tienes la limitación en el número de caracteres del string en vez de en el rango del Integer, pero vamos al final es un ejemplo del text_io así que da igual. ManuelGR 22:08 31 jul, 2005 (UTC)

Bueno, un entero tal como es de 32 bits tiene un límite de 4 mil millones más o menos (y con signo, pues de -2000 a 2000), por eso puse 10 caracteres: es imposible, a no ser que se use float o long integer (¿existe en Ada?) que pase de esa cantidad. Es más, puse 5.000.000.000 y me saltó el constraint error :) Y sí, es un ejemplo, lo principal es quedarse con la idea. Aunque... yo podría hacer la versión "fácil" en Windows con strings, y la versión Linux hacerla con unbounded strings. Así no sería exactamente igual, y se vería como trabajar los strings restringidos y los no restringidos. ¿Que te parece? ¿O será rizar el rizo? ¿Sería mejor dejarlo como ejemplo de Ada.Unbounded_string? Andres_age 06:49 1 agosto, 2005 (UTC)

Creo que sería rizar el rizo, con el string es más fácil ahora, luego es la mejor solución. Al final parece que no hay tantas diferencias en el ejemplo entre sistemas, sólo las teclas. Yo creo que lo mejor será es ponerlas como constantes con el valor de Windows (por ser el sistema mayoritario, mal que me pese) y poner en comentarios qué valor hay que poner para que funcione en Unix. Creo que eso es más didáctico que repetir el mismo ejemplo casi igual con un par de cambios. Por cierto, 00000000001 no cabría ahora :-P Pero ya en serio en realidad el tamaño de los tipos estándar en Ada depende de la arquitectura usada. En nuestros micros es 32 bits pero en uno de 64 bits podría ser de 64. Por eso para lo del string lo mejor será usar el atributo 'width que hace precisamente eso. Para integer es 11 porque tiene en cuenta que puedes poner el signo. Lo que me lleva a pensar que nuestro programa no admite negativos y deberíamos llamarlo leer_natural o soportar el signo -. Bueno ya veremos. Lo del 'Width si que lo cambio ya. ManuelGR 18:29 1 ago, 2005 (UTC)

Integer'image(x)[editar]

¿Ahora que lo veo, no es más fácil poner Número'img que integer'image(número)? ¿Hay diferencias entre las dos formas, o son equivalentes? Andres_age 7:53 2 agosto, 2005 (UTC)

Sí, es más fácil, pero no es portable. Img es un atributo específico de GNAT. Nuestro código debería ser portable a cualquier compilador de Ada. Lo que sí se puede hacer es usar el Ada.Integer_Text_IO, que con la cláusula use se hace bastante fácil:

Put ("Has escrito:"); Put (Número); New_Line;

Pero hay quien no le gusta usar la clásula use. ManuelGR 18:37 2 ago, 2005 (UTC)