![]() |
|
Inconsistency in RND - Printable Version +- Boriel Basic Forum (https://forum.boriel.com) +-- Forum: Compilers and Computer Languages (https://forum.boriel.com/forumdisplay.php?fid=12) +--- Forum: ZX Basic Compiler (https://forum.boriel.com/forumdisplay.php?fid=11) +---- Forum: Help & Support (https://forum.boriel.com/forumdisplay.php?fid=16) +---- Thread: Inconsistency in RND (/showthread.php?tid=849) |
Inconsistency in RND - Alessandro - 2018-08-05 If I write this simple program: Code: DIM u as UBYTEHowever, inside of a larger program, this instruction: Code: DIM x AS UBYTEAlso, the RND of the first example always returns exactly the same sequence when started afresh, at least under emulation (Spectaculator): 9, 34, 15, 7, 16, 25, 13, 37, 7, 24, 19 etc. In the past I used a simple routine (by John Connolly) to generate random numbers. Here it is, modified to let it return values from 0 to 31: Code: LD A,RRe: Inconsistency in RND - boriel - 2018-08-06 Alessandro Wrote:If I write this simple program:This might be a bug. Please provide me some code (you can do it privately, if you want). Also keep in mind that memory address 23670 and 23671 (ROM SEED variable) is also used by ZX Basic, so if something is accidentally writing there it will cause the RND sequence to repeat. Quote:Also, the RND of the first example always returns exactly the same sequence when started afresh, at least under emulation (Spectaculator): 9, 34, 15, 7, 16, 25, 13, 37, 7, 24, 19 etc.That's to be expected. You have to RANDOMIZE the sequence first. Use RANDOMIZE to have a different sequence each time. Since RANDOMIZE uses the system ROM timer ensure (within an emulator) that the time the program starts is always different. A trick is to ask the user to press a key before randomize, or doing it during the program main menu. Quote:In the past I used a simple routine (by John Connolly) to generate random numbers. Here it is, modified to let it return values from 0 to 31:When using asm as a function, you should use FASTCALL to inline return a register. Try this: Code: FUNCTION FASTCALL myRND As BytePlease tell me if this helps. Re: Inconsistency in RND - Alessandro - 2018-08-08 Unfortunately it does not work. I wrote this simple program (prova.bas): Code: for n = 1 TO 20but at the moment of compiling it, here is the result: prova.bas:1: warning: Using default implicit type 'float' for 'myRND' prova.bas:9: identifier 'myRND' is a var, not a function prova.bas:9: 'myRND' already declared as a var at 1 To make it work, I must insert the Assembly code into a subroutine: Code: 10 myRND()This will produce the desired effect. Re: Inconsistency in RND - boriel - 2018-08-08 Alessandro Wrote:Unfortunately it does not work. I wrote this simple program (prova.bas): You have to declare the function *before* it's being used. Put the function before the code that invokes it; try and tell me.
Re: Inconsistency in RND - Alessandro - 2018-08-09 Thank you, now it works On a side note, I thought that functions, being a kind of subroutines (at least that's what I read in the Wiki) should be put at the end of the code, as it was normal with subroutines. (I never mastered the use of functions in Sinclair BASIC to be honest.) Re: Inconsistency in RND - boriel - 2018-08-09 Alessandro Wrote:Thank you, now it works If you need to call a function before implementing it, you can also pre-declare a function (like in C), using DECLARE, followed by the function header: Code: DECLARE FUNCTION FASTCALL myRND as Byte |