Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pila vacia #212

Open
1 of 5 tasks
guizans opened this issue Oct 20, 2022 · 8 comments
Open
1 of 5 tasks

Pila vacia #212

guizans opened this issue Oct 20, 2022 · 8 comments
Assignees
Labels

Comments

@guizans
Copy link

guizans commented Oct 20, 2022

Reportando bug

no escribir en esta área y marcarlo al completar el issue.

  • Error global, no me deja correr Latino.
  • El error ocurre en una palabra reservada. Por ejemplo: si osi sino (escribir la palabra reservada en detalles).
  • Es un error en una función específica (escribir la función en detalles).
  • Es una falla de memoria (memory leak).
  • El error solo ocurre en el REPL (al ejecutar latino sin parámetros).

no escribir en esta área y marcarlo al completar el issue.

Más detalles:

Hola.
Cuando ejecuto este código, el imprimir siempre me imprime falso, y después me marca error de Pila vacia.
Estoy usando la versión 1.4.1 en Fedora.

Muchas gracias.

Código en donde ocurre:

// código_aquí
repetir
	imprimir("Escribe un número entre el 1 - 20: ")
	x = leer()
	imprimir(x)
	y = anumero(x)
hasta(y==10)
@FrkL81
Copy link

FrkL81 commented Oct 22, 2022

Hola guizans,

Yo utilizo Windows y me ocurre igual. Sin embargo, el error ocurre creo, por tu elección del ciclo "repetir --- hasta". El manual de latino dice que:

Si no se incrementa el valor de una variable contadora este bucle se repetiría infinitamente sin parar, produciendo un error en la memoria.

Por lo que entiendo que la condición debe comprobarse contra un contador.

Quizás utilizando un ciclo "mientras" logres tu objetivo:

conmutador = falso
contador = 0
x = 0
y = 10

mientras (conmutador == falso)
    limpiar()
    imprimir("Escribe un número entre el 1 - 20: ")
    x = leer()
    si (y == x)
        conmutador = verdadero
    fin
    contador++
fin

imprimir ("El número es " .. y .. " y lo adivinaste en " .. contador .. " intentos.")
leer()

En esta lógica utilizo un contador solo para llevar la cuenta de las veces que se introduce un número. El ciclo se repetirá mientras el dato introducido sea diferente del valor inicializado en la variable "y", en tu caso 10.

Espero esto te ayude.

@guizans
Copy link
Author

guizans commented Oct 22, 2022

Hola FrkL81

Tu código es una opción para salvar el escollo. Pero creo que si que es un bug, ya que a pesar de no tener un contador, por lo menos tendría que hacer un bucle, ya que como tu dices que aparece en la documentación: Si no se incrementa el valor de una variable contadora este bucle se repetirá sin parar y este no es el caso, ya que solo se repite una vez. Eso y si ejecutas el código verás que el problema viene dado con el valor de x, ya que en vez de almacenar la entrada de consola, siempre imprime con falso, con lo cual no tiene sentido, y sólo lo hace si está dentro del bucle.
Un saludo.

@MelvinG24
Copy link
Member

@guizans, el problema es que estas comparando una variable a la cual no estas declarado antes de la funcion sino que dentro de la funcion... Trata con declarar la variable y antes de entrar al loop

@guizans
Copy link
Author

guizans commented Oct 26, 2022

Hola MelvinG24.

y = 5
x = ""
repetir
	imprimir("Escribe un número entre el 1 - 20: ")
	x = leer()
	imprimir(x)
	y = anumero(x)
        imprimir(y)
hasta(y==10)

Pues lo he probado así y me da el mismo error. El problema creo que es la asignación de la función leer(), ya que el primer imprimir(x) me da falso y da igual lo que introduzca por teclado. Y el segundo imprimir(y) me pone que es nulo, ya que 'x' no tiene nada dentro y no puede hacer una conversión, y es normal que el bucle de error, ya que la variable 'y' está vacia.

Un saludo.

@FrkL81
Copy link

FrkL81 commented Oct 31, 2022

Saludos MelvinG24, guizans,

Ahora creo que el análisis de @guizans es correcto. En la respuesta que me redactó anteriormente está el punto donde ocurre el error, que es al tratar de asignar a la variable x un valor desde la consola. Al parecer no se puede hacer esto correctamente dentro del Loop -repetir ... hasta-

y = 5
x = 0
x = leer()

repetir
	imprimir("Escribe un número entre el 1 - 20: ")
	
	imprimir(x)
	y = x
        imprimir(y)
hasta(y==10)

Al sacar la asignación fuera del Loop, si se introduce un valor distinto al requerido en la condición, se produce el error que si es esperado según la documentación.

Me agradó ver algo de interacción por aquí ... espero siga así y que esto ayude a evolucionar el lenguaje más rápido.
Un cordial saludo a todo el que lea esto. Sigan apoyando este genial lenguaje ...

@guizans
Copy link
Author

guizans commented Nov 2, 2022

Hola FrkL81

He estado probando el código tal como lo has publicado, pero en tú código hay un problema que es lógico, ya que la variable x e y son una cadena de carácteres y por lo tanto el bucle da el error esperado. Hasta ahí todo correcto. Pero si haces como en el código original, que llamo a la función anumero() para hacer la conversión de una cadena de caracteres a una variable numérica, la función imprimir(y) me imprime falso, aun poniendo la función leer() fuera del bucle. Es como si dentro del bucle no funcionasen las funciones o tienen un comportamiento erróneo. Da la sensación de que solo funciona la función imprimir().

Ojalá este lenguaje evolucione, me gusta. Mis mas sinceras felicitaciones a los desarrolladores que estarán haciendo lo que pueden con muy pocos recursos.

Un saludo.

@FrkL81
Copy link

FrkL81 commented Nov 23, 2022

Hola guizans,

Si, veo lo que dices, sin embargo, ese error debe ser provocado por algo diferente al tipo de dato. Si te fijas en el primer código que escribí en este hilo de comentarios, hice una comparación de una variable introducida por consola en tiempo de ejecución, con otra numérica escrita en el código sin hacer una conversión del tipo de dato y funciona.

No he comprobado en la documentación, pero creo que se puede apreciar que Latino es un lenguaje dinámicamente tipado. Lo que quiere decir que, el lenguaje en la mayor parte de los casos determina en tiempo de ejecución el tipo adecuado para cada variable.

Por ejemplo:

limpiar()
num1 = 0
num2 = 0
imprimir ("Introduce el primer número:")
num1 = leer()

imprimir ("Introduce el segundo número:")
num2 = leer()

    imprimir ("La suma es: " .. num1 + num2)
    
    imprimir ("La concatenación es: " .. num1 .. num2)

leer()

Para la suma se determina en tiempo de ejecución que los datos son de tipo numéricos.
Para la concatenación se determina que son del tipo cadena de caracteres.

... Saludos

@guizans
Copy link
Author

guizans commented Nov 27, 2022

Hola FrkL81

Si, veo que Latino es un lenguaje dinámicamente tipado, lo cual lo vuelve fácil. Me he dado cuenta en mi código que la función anumero() se puede precindir de ella. Pero el error persiste.

Un saludo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

3 participants