QB64.org Forum

Active Forums => QB64 Discussion => Topic started by: Phenominalprogrammer on August 26, 2020, 07:06:20 pm

Title: Problem with locate command
Post by: Phenominalprogrammer on August 26, 2020, 07:06:20 pm
When I try code like this I get

Illegal function call





Code: QB64: [Select]
  1. Location_x = 100
  2. Location_y = 25
  3.  
  4. Locate location_x, location_y
  5.  
  6. Print "a nice test"
  7.  

Title: Re: Problem with locate command
Post by: bplus on August 26, 2020, 07:12:43 pm
You can only LOCATE within the character cells of the screen. One character is 8 X 16 pixels.
Default screen is 640 X 400? 640 /8 = 80 max cell column

400 / 16 = 25 rows

PLUS if you start to print past the last row or 2 the screen starts scrolling or will switch to _FONT 8 first.

Welcome to the forum @Phenominalprogrammer
Title: Re: Problem with locate command
Post by: SMcNeill on August 26, 2020, 09:42:09 pm
You can only LOCATE within the character cells of the screen.

One point of quirkiness which you may not be aware of, Bplus: That statement isn't correct in 100% of all cases. 

LOCATE with a variable-width font, and there's no set character cells to reference.  Instead, you LOCATE X-pixels width, Y-rows down.   (It's not row/column, and it's not  pixel/pixel reference; it's a hybrid pixel/row reference.)

Of course, SCREEN 0 (which is all that's referenced by default in the original code) won't even work with variable-width fonts at all, so for most folks it's a moot distinction.  ;)
Title: Re: Problem with locate command
Post by: TempodiBasic on August 27, 2020, 01:21:36 pm
WHILE  Bplus AND SMcNeill give the right tecnical informations
 I must add this one
  your code posted is a QBasic/QB way to use screen mode in console state or in other words
your code
Code: QB64: [Select]
  1. Location_x = 100
  2. Location_y = 25
  3.  
  4. LOCATE location_x, location_y
  5.  
  6. PRINT "a nice test"
  7.  
is equal to
Code: QB64: [Select]
  1. Location_x = 100
  2. Location_y = 25
  3.  
  4. LOCATE location_x, location_y
  5.  
  6. PRINT "a nice test"
  7.  
because in QBasic/QB if you don't specify the screen mode that , for default, it  is the console screen only text 80x25, 31 foreground colors and 7 background colors (32 and 8 if you include the black). QB64 emulates QB so you get the same error!
But this syntax must be deprecated if we must give more importance to QB64 than Qbasic/QB, in fact in QB64
you should write so
Code: QB64: [Select]
  1. SCREEN _NEWIMAGE (80,25,0)
  2. Location_x = 100
  3. Location_y = 25
  4.  
  5. LOCATE location_x, location_y
  6.  
  7. PRINT "a nice test"
  8.  
and in this case it is obvious why you get the error!

WEND
Title: Re: Problem with locate command
Post by: bplus on August 27, 2020, 01:45:34 pm
Code: QB64: [Select]
  1. _TITLE "Locate Test in default screen, press spacebar for another 20, press esc to quit"
  2. T$ = "A nice test."
  3. lt = LEN(T$)
  4.     CLS
  5.     FOR i = 1 TO 20
  6.  
  7.         ' KEEPING Row and Col in bounds for LOCATE
  8.         row = INT(RND * 25) + 1: col = INT(RND * (80 - lt)) + 1
  9.         'LOCATE 1, 1: PRINT SPACE$(20) 'debug row and col
  10.         'LOCATE 1, 1: PRINT row, col
  11.  
  12.         LOCATE row, col: PRINT T$;
  13.     NEXT
  14.     SLEEP
  15.  
  16.  
  17.  
Title: Re: Problem with locate command
Post by: MWheatley on August 28, 2020, 10:54:10 am
I'd add that LOCATE has for me always been a difficult command in terms of code compatibility: different BASICs implement it in different ways.  I once ported some regularly-used statistics calculations over to Liberty BASIC, in the days before QB64 (or at least, before I discovered QB64).

Liberty BASIC implements LOCATE the other way round -- ie, not LOCATE x, y but instead LOCATE y, x...!  Which to me is crazy.  When I gave up on Liberty BASIC (I felt ripped off on licensing too, which didn't help), I had to convert everything back.

So use LOCATE with caution, is my advice.

Malcolm

Title: Re: Problem with locate command
Post by: Petr on August 28, 2020, 11:46:21 am
None problems with LOCATE. First set your text screen to correct values. Locate use is LOCATE  ROW, COLUMN


Code: QB64: [Select]
  1. SCREEN _NEWIMAGE(100, 25, 0)
  2.  
  3. Location_x = 100
  4. Location_y = 25
  5.  
  6. LOCATE Location_y, Location_x
  7.  
  8. PRINT "a nice test"
  9.