![]() |
Inconsistency in RND - Printable Version +- Forum (https://www.boriel.com/forum) +-- Forum: Compilers and Computer Languages (https://www.boriel.com/forum/forumdisplay.php?fid=12) +--- Forum: ZX Basic Compiler (https://www.boriel.com/forum/forumdisplay.php?fid=11) +---- Forum: Help & Support (https://www.boriel.com/forum/forumdisplay.php?fid=16) +---- Thread: Inconsistency in RND (/showthread.php?tid=849) |
Inconsistency in RND - Alessandro - 08-05-2018 If I write this simple program: Code: DIM u as UBYTE However, inside of a larger program, this instruction: Code: DIM x AS UBYTE 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. 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,R Re: Inconsistency in RND - boriel - 08-06-2018 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 Byte Please tell me if this helps. Re: Inconsistency in RND - Alessandro - 08-08-2018 Unfortunately it does not work. I wrote this simple program (prova.bas): Code: for n = 1 TO 20 but 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 - 08-08-2018 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 - 08-08-2018 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 - 08-09-2018 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 |