Hi Steve,
Or rather "... fails becuase *F* is pointing to the old location for
A$(0)".
Ken
On 5/29/18 4:08 PM, Ken Pettit wrote:
Hi Steve,
The line:
20 F=VARPTR(A$(0)):*K*=256*PEEK(F+2)+PEEK(F+1)
Doesn't work because you take the value of VARPTR(A$(0)) and assign it
to F. But then you assign the value of K. This creates a new scalar
variable, causing A$(0) to be moved. So then the
"256*PEEK(F+2)+PEEK(F+1)" fails because K is pointing to the old
location for A$(0).
If you change your line as follows, then it should work because K is
created first, causing A$() to be moved, and *then* you take the
address of A$():
20 K=0:F=VARPTR(A$(0)):*K*=256*PEEK(F+2)+PEEK(F+1)
Ken
On 5/29/18 3:43 PM, Stephen Adolph wrote:
Ken, when I first read your code I said "That wont work and k(0) will
be wrong."
however it seems to work.
I cannot explain why your code works and my original code did not. I
never modify the string content.
-------------------------------------
your line:
20 FOR X=0TO3:F=VARPTR(A$(X)):K(X)=256*PEEK(F+2)+PEEK(F+1):NEXT
compared with
20 F=VARPTR(A$(0)):*K(0)*=256*PEEK(F+2)+PEEK(F+1)
yield the same answers for K(0)
-----------------------------------
your line:
20 FOR X=0TO3:F=VARPTR(A$(X)):K(X)=256*PEEK(F+2)+PEEK(F+1):NEXT
compared with
20 F=VARPTR(A$(0)):*K*=256*PEEK(F+2)+PEEK(F+1)
yield different answers for K, K(0)
the only difference is using K vs K(0).
I still don't know a good rule for how to safely use VARPTR!!
On Tue, May 29, 2018 at 4:52 PM, Ken Pettit <petti...@gmail.com
<mailto:petti...@gmail.com>> wrote:
Steve,
Are you are trying to pre-calculate the addresses of the strings
to save time or something?
One thing to note is that the address of the A$() or D$() array
variable will move around in RAM. However, as long as you don't
modify the strings *in* the array after they are first assigned,
then the "256*PEEK(K+2)+PEEK(K+1)" address values pointing to the
actual text will NOT change. Those addresses will be pointing
back to the actual string text in the BASIC program (which
doesn't move around during program execution).
This is an optimization BASIC makes. When strings are first
assigned, the variable is created with an address pointing to the
actual string text. The initial value simply points to the BASIC
program. If the contents of that string variable are changed
after that point, then BASIC moves the text into high RAM to make
the modification. Otherwise the text simply lives in the BASIC
program.
So you could create an array of pre-calculated addresses as follows:
10 DIM
A$(3):DIMK(3):A$(0)="blah0":A$(1)="blah1":A$(2)="blah2":A$(3)="blah3"
20 FOR X=0TO3:F=VARPTR(A$(X)):K(X)=256*PEEK(F+2)+PEEK(F+1):NEXT
30 REM
40 REM Now any variable can be created and the values in K() will
still be correct.
Ken
On 5/29/18 9:25 AM, Stephen Adolph wrote:
John, I wasn't able to declare variables in any meaningful way
to solve this problem. Only assignment seemed to work. Do you
know a trick for that?
steve
On Tue, May 29, 2018 at 12:21 PM, John R. Hogerhuis
<jho...@pobox.com <mailto:jho...@pobox.com>> wrote:
On Tue, May 29, 2018 at 5:13 AM Jeffrey Birt
<bir...@soigeneris.com <mailto:bir...@soigeneris.com>> wrote:
>>> Anytime a new scalar (i.e. non-array) variable is
created, the addresses of the array variables must all
change to make room for the new scalar variable.
So BASIC copies all the arrays to a new memory address?
That does not seem very efficient.
Jeff
I think it’s a trade off. Extra levels of indirection are
also inefficient.
It’s either take the hit on a “move” when a variable is
created or take a guaranteed hit every variable access.
And you can avoid the cost by declaring your variables up front.
— John.