ah, so making the assignment to the scalar variable is the difference, vs
an array variable.  they are in different memory areas.

thanks I think that is a clear answer.

On Tue, May 29, 2018 at 7:08 PM, Ken Pettit <petti...@gmail.com> 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> 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>
>> wrote:
>>
>>>
>>> On Tue, May 29, 2018 at 5:13 AM Jeffrey Birt <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.
>>>
>>>
>>>
>>
>>
>
>

Reply via email to