Dos veces enter al ejecutar en wsl

Dos veces enter al ejecutar en wsl

de David Paul Gonzalez Damian -
Número de respuestas: 3

Buenas, estoy probando y tengo una duda sobre la ejecución en wsl, tengo un programa que compila y se ejecuta solo que para que imprima el resultado debo darle dos veces enter. Esto no sucede en windows donde solo con ingresar los datos y dar enter una vez hace todo. La duda es si esto es un error en el programa o es normal en linux.

Paso el código: 

program polemico;

var a, c: char;
    d, resultado: integer;
begin
read(a);
resultado := ord(a)-48;
while a <> '=' do
    begin
    read(a);
    read(c);
    if a = '+' THEN
        resultado := resultado + (ord(c)-48)
    else if a = '-' then
        resultado := resultado - (ord(c)-48)
    else if a = '/' then
        resultado := resultado div (ord(c)-48)
    else if a = '*' then
        resultado := resultado * (ord(c)-48)
    end;
writeln(resultado)
end.

Saludos, David

En respuesta a David Paul Gonzalez Damian

Re: Dos veces enter al ejecutar en wsl

de Federico Bello Perez -
Hola David,
Podrías pasar la entrada entera que estés haciendo? A priori se me ocurre que sea porque el primer enter quede guardado en alguna de las dos lecturas de carácteres. En otra línea, supongo que el 48 es la posición de '0' en la tabla ASCII, lo correcto seria utilizar ord('0'), de esta forma el algoritmo funciona por más que se cambien las posiciones en la tabla (siempre y cuando se mantenga el orden). También ayuda en qué no tenes que acordarte todas las posiciones de memoria.
Saludos,
En respuesta a Federico Bello Perez

Re: Dos veces enter al ejecutar en wsl

de David Paul Gonzalez Damian -
Paso codigo

program polemico;
var a, c: char;
d, resultado: integer;
begin
d:=0;
read(a);
resultado := ord(a)-ord('0');
while a <> '=' do
begin
read(a,c);
if a = '+' THEN
resultado := resultado + (ord(c)-ord('0'))
else if a = '-' then
resultado := resultado - (ord(c)-ord('0'))
else if a = '/' then
resultado := resultado div (ord(c)-ord('0'))
else if a = '*' then
resultado := resultado * (ord(c)-ord('0'));
writeln('vuelta ', d);
d:=d+1;
end;
writeln('El total es: ', resultado);
end.

Ejecución en WSL:

code@DESKTOP-8PV2598:~/temp$ ./p5ej8
2+2= (doy enter)
vuelta 0
(segundo enter)
vuelta 1
El total es: 4
code@DESKTOP-8PV2598:~/temp$

En Windows mismo código :

C:\FPC\3.0.4\bin\i386-win32\a_Codigos_Pascal>p5ej8.exe
2+2= (doy enter)
El total es: 4

C:\FPC\3.0.4\bin\i386-win32\a_Codigos_Pascal>
En respuesta a David Paul Gonzalez Damian

Re: Dos veces enter al ejecutar en wsl

de Federico Bello Perez -
Bien. Lo que pasa es lo siguiente, uso de ejemplo el '2+2=' (voy a ignorar la parte de los cálculos). El primer 2 va a quedar guardado en el primer read(a), como a es distinto de '=' entra en el while, por lo que el '+' queda guardado en a y el '2' queda en c. La variable a sigue siendo distinta al centinela, por lo que el read(a,c) se vuelve a ejecutar. En 'a' queda el '=' y, al presionar enter, en lugar de estar ingresando todo el input, el enter va a quedar guardado en 'c', ya que es un char. Recién cuando ejecutas el segundo enter se ingresan bien todos los datos y termina el programa.
Resumiendo un poco, para que ande bien tenés que cambiar los reads para que siempre que leas un '=' salga del while, y no que haga otra lectura más. Pique: en general está bueno hacer la lectura de la variable con la que vas chequeando el centinela al final del cuerpo del while o del repeat.

Espero se haya entendido, cualquier cosa avisa.