Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Reading DATA
#1
Lo siento si esto ha sido preguntado antes, pero no lo he encontrado.

Dado un proc como este:


Code:
const NumLocs as ubyte = 2

'enum Exits
    const ExitNorth as ubyte = 0
    const ExitSouth as ubyte = 1
    const ExitEast as ubyte = 2
    const ExitWest as ubyte = 3
    const ExitUp as ubyte = 4
    const ExitDown as ubyte = 5
    const NumExits as ubyte = 6
'end enum

dim locDescs(NumLocs) as string
dim locExits(NumLocs, NumExits) as integer


sub init_locs()
    'locDescs( 0 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
    'locDescs( 1 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
   
    restore LocData
   
    for i = 0 to NumLocs - 1
        print "numloc i:", i
       
        ' Read the desc
        read locDescs( i )
        print "read numloc i: "; i; locDescs( i )
               
        ' Read the exits
        for j = 0 to NumExits - 1
            print "numloc i:"; i; " exit "; j
            read locExits(i, j)
            print "numloc i:"; i; " exit "; j; " = "; locExits(i, j)
            input a
        next
    next
   
    return
                     
    LocData:
    ' Loc 0 - Landing
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data -1, 1, -1, -1, -1, -1
   
    ' Loc 1 - Valley
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data 0, -1, -1, -1, -1, -1
end sub


El problema es el siguiente. Si descomento las primeras líneas y comento la línea
Code:
read locDescs( i )
y los data correspondientes, el programa parece que funciona. Pero si dejo el programa tal y como está, solo lee porquería en la posición i del vector locDescs, y el Speccy se reinicia. ¿No se pueden leer cadenas con READ? Según los docs, entiendo que sí...
Reply
#2
Hola!

Sí se pueden leer cadenas con READ y DATA.
Qué versión del compilador tienes? Este programa no debería compilarte. La instrución INPUT a, no está soportada como tal.
Si quieres hacer una pausa usa PAUSE 0.

Igualmente en las nuevas versiones, los DATA han de definirse fuera de las funciones y SUBs.
Además, corregí un bug con READ para tamaños numéricos pequeños. Descárgate esta beta y dime si funciona (haz click sobre el enlace correspondiente a tu sistema operativo):

http://www.boriel.com/files/zxb/zxbasic-...ta4.tar.gz
http://www.boriel.com/files/zxb/zxbasic-...-beta4.zip
http://www.boriel.com/files/zxb/zxbasic-...-win32.zip
http://www.boriel.com/files/zxb/zxbasic-...x64.tar.gz
http://www.boriel.com/files/zxb/zxbasic-...cos.tar.gz
---
Boriel
Reply
#3
Hola,
> Sí se pueden leer cadenas con READ y DATA.
> Qué versión del compilador tienes? Este programa no debería compilarte. La instrución INPUT a, no está soportada como tal.
> Si quieres hacer una pausa usa PAUSE 0.
Pues funciona como uno se esperaría... pero vale, lo cambio por un pause 0.
Code:
$ ./zxbc.sh --version

zxbc.py 1.17.3

La versión es la última que encontré en Github...

> Igualmente en las nuevas versiones, los DATA han de definirse fuera de las funciones y SUBs.
Oh, con lo recogidito que queda así... :-P
Me descargo la beta, y te cuento.
Gracias,

Hola,
Me salen muchos warnings de funciones que no se usan de la librería estándar. ¿Esto es normal?
-- Baltasar

Vale, probada la nueva versión.
Code:
$ ./zxbc.sh --version
zxbc.py v1.18.0-beta4
Hasta donde veo, fuciona bien, pero... ahora se me queda atascado tras leer el cuarto byte de las conexiones, las salidas, de la primera loc.
He cambiado el código fuente:
Code:
' Locs
' (c) 2022/25 Reveni Baltasar MIT License <baltasarq@gmail.com>
const NumLocs as ubyte = 2
'enum Exits
    const ExitNorth as ubyte = 0
    const ExitSouth as ubyte = 1
    const ExitEast as ubyte = 2
    const ExitWest as ubyte = 3
    const ExitUp as ubyte = 4
    const ExitDown as ubyte = 5
    const NumExits as ubyte = 6
'end enum
dim locDescs(NumLocs) as string
dim locExits(NumLocs, NumExits) as integer
sub init_locs()
    'locDescs( 0 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
    'locDescs( 1 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
   
    restore LocData
   
    for i = 0 to NumLocs - 1
        print "numloc i:", i
       
        ' Read the desc
        read locDescs( i )
        print "read numloc i: "; i; locDescs( i )
               
        ' Read the exits
        for j = 0 to NumExits - 1
            print "numloc i:"; i; " exit "; j
            read locExits(i, j)
            print "numloc i:"; i; " exit "; j; " = "; locExits(i, j)
            pause 0
        next
    next
end sub
LocData:
    ' Loc 0 - Landing
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data -1, 1, -1, -1, -1, -1
   
    ' Loc 1 - Valley
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data 0, -1, -1, -1, -1, -1

¿Me he metido en un jardín con lo de los DATA? ¿Es mejor asignarlos "normal", y punto?
¿Es posible inicializar a -1 un vector con locExits, sin recorrer a un bucle for?
Gracias,
-- Baltasar
Reply
#4
baltasarq Wrote:Hola,
> Sí se pueden leer cadenas con READ y DATA.
> Qué versión del compilador tienes? Este programa no debería compilarte. La instrución INPUT a, no está soportada como tal.
> Si quieres hacer una pausa usa PAUSE 0.
Pues funciona como uno se esperaría... pero vale, lo cambio por un pause 0.
Code:
$ ./zxbc.sh --version

zxbc.py 1.17.3

La versión es la última que encontré en Github...

> Igualmente en las nuevas versiones, los DATA han de definirse fuera de las funciones y SUBs.
Oh, con lo recogidito que queda así... :-P
Me descargo la beta, y te cuento.
Gracias,

Hola,
Me salen muchos warnings de funciones que no se usan de la librería estándar. ¿Esto es normal?
-- Baltasar

Vale, probada la nueva versión.
Code:
$ ./zxbc.sh --version
zxbc.py v1.18.0-beta4
Hasta donde veo, fuciona bien, pero... ahora se me queda atascado tras leer el cuarto byte de las conexiones, las salidas, de la primera loc.
He cambiado el código fuente:
Code:
' Locs
' (c) 2022/25 Reveni Baltasar MIT License <baltasarq@gmail.com>
const NumLocs as ubyte = 2
'enum Exits
    const ExitNorth as ubyte = 0
    const ExitSouth as ubyte = 1
    const ExitEast as ubyte = 2
    const ExitWest as ubyte = 3
    const ExitUp as ubyte = 4
    const ExitDown as ubyte = 5
    const NumExits as ubyte = 6
'end enum
dim locDescs(NumLocs) as string
dim locExits(NumLocs, NumExits) as integer
sub init_locs()
    'locDescs( 0 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
    'locDescs( 1 ) = "El lugar del alunizaje. La vaina abierta y sin  " _
    '   + "contenido parece una triste parodia de ella misma. " _
    '   + "Un valle natural conduce al sur."
   
    restore LocData
   
    for i = 0 to NumLocs - 1
        print "numloc i:", i
       
        ' Read the desc
        read locDescs( i )
        print "read numloc i: "; i; locDescs( i )
               
        ' Read the exits
        for j = 0 to NumExits - 1
            print "numloc i:"; i; " exit "; j
            read locExits(i, j)
            print "numloc i:"; i; " exit "; j; " = "; locExits(i, j)
            pause 0
        next
    next
end sub
LocData:
    ' Loc 0 - Landing
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data -1, 1, -1, -1, -1, -1
   
    ' Loc 1 - Valley
    data "El lugar del alunizaje. La vaina abierta y sin  " _
      + "contenido parece una triste parodia de ella misma. " _
      + "Un valle natural conduce al sur."
    data 0, -1, -1, -1, -1, -1

¿Me he metido en un jardín con lo de los DATA? ¿Es mejor asignarlos "normal", y punto?
¿Es posible inicializar a -1 un vector con locExits, sin recorrer a un bucle for?
Gracias,

No, está bien Smile
Es simplemente que el DATA del BASIC de ZX Spectrum es muy potente (permite incluso expresiones como DATA x * x + SQRT(x ^3), y cosas así.
Todo eso está soportado, solo que no está muy probado y por eso ahora eres el primer tester que lo prueba a fondo. :-)

Si es inicializar un vector o matriz numérico, se puede hacer directamente, pero recuerda que aquí el DIM es una declaración, no una "instanciación". Es decir, DIM, independientemente de la posición donde se ponga, se hace al principio de la ejecución del programa una sola vez.

Para crear un array numérico inicializado (no funciona con cadenas por el momento), es con la sintaxis:
Code:
DIM a(5) as Uinteger => {0, 1, 2, 3, 4, 5}

Admite múltiples dimensiones, anidando llaves. Aquí tienes más información (al final de la página): https://zxbasic.readthedocs.io/en/docs/d...clarations

Y lo dicho, los arrays inicializados se inicializan una vez. Si necesitas inicializarlos repetidamente, has de usar READ y DATA :-)
---
Boriel
Reply
#5
El programa que has puesto no hace nada. Supongo que le fallta llamar a la subrutina init_locs()
lo he hecho, y pulsando una tecla me va leyendo todo hasta que termina. Así que no veo el fallo?
---
Boriel
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)