[Gambas-user] Minor bug with READ & WRITE commands?

nando nando_f at ...951...
Mon Jan 19 06:11:14 CET 2009


If something like..
 WRITE #pResult + (ii * 8), CINT(.x) 
casts it as int, then no problem


---------- Original Message -----------
From: Benoit Minisini <gambas at ...1...>
To: nando_f at ...951..., mailing list for gambas users
<gambas-user at lists.sourceforge.net>
Sent: Mon, 19 Jan 2009 02:01:51 +0100
Subject: Re: [Gambas-user] Minor bug with READ & WRITE commands?

> On vendredi 16 janvier 2009, nando wrote:
> > Benoit,
> >
> > Question regarding the line:
> > > > WRITE #pResult + (ii * 8), .x
> >
> > does WRITE see it casted as variant or int ?
> > -Fernando
> >
> 
> You exactly got the point. :-)
> 
> As fResult is an Object[] array, fResult[ii].x is a Variant.
> 
> Why? Because, in Gambas, the datatype of an operator or a function is never 
> more precise than the datatype of the arguments, unless the operator or 
> function always returns the same datatype. Read that sentence at least twice.
> 
> So, as fResult is Object[], then fResult[ii] is Object, and fResult[ii].x is 
> always a Variant, as the interpreter cannot know that fResult[ii] is always a 
> Class1.
> 
> As READ and WRITE receive a Variant, they read/write a byte before the value 
> in memory.
> 
> So what is written at the pointer is not two bytes &H64+&H00 (the 100 value) 
> but three bytes &H04+&H64+&H00 (&H04 meaning Integer).
> 
> As the memory address is computed at each loop, the third byte is replaced by 
> the first byte of the next write. The last written byte is outside of the 
> array. It does not crash because memory allocation are often rounded by the C 
> library.
> 
> When reading, what happens? The GetAStruct C function receives:
> 
> &H04+&H64+ &H04+&HC8+ &H04+&H64 +...+ &H04+&HC8+&H00
> 
> And modifies it:
> 
> &H0E+&H64+ &H05+&HC8+ ...
> 
> Then READ wants to read a Variant, and so interprets the first byte, &H0E, as 
> a datatype that means...a Class, something that is cannot understand, and so 
> you get an error message. But in other situations, you can crash the 
> interpreter, because READ can write in memory more than expected!
> 
> What is the solution? You have to tell Gambas which is the real datatype to 
> read and write.
> 
> The first solutiion is what you did: using a local variable with the accurate 
> datatype.
> 
> The second solution is not having Object as intermediate expression datatype. 
> Instead of:
> 
>   WITH fResult[ii]
> 
> Do that:
> 
>   DIM hClass AS Class1
> 
>   hClass = fResult[ii]
>   WITH hClass
> 
> Then the interpreter will know at runtime that hClass is a Class1, and so that 
> hClass.x is always an integer.
> 
> So, all that is not really a bug, but I admit it is a bit weird, and not 
> beginner-friendly.
> 
> In Gambas 3, I'm currently thinking about a better, or at least clearer 
> syntax. It will be a mix of:
> 
> - True memory streams, i.e. a class that inherits Stream and that points at a 
> memory emplacement.
> 
> - Classic Basic memory access function. PEEK, POKE ? :-) And/Or MkInt$(), 
> MkLong$()...
> 
> - Explicitely specifying the datatype in READ and/or WRITE, or having 
> ReadInteger(), ReadFloat(), WriteInteger()... methods in the Stream class, or 
> as subroutines.
> 
> People, tell me what you think about that. I'm going to bed now.
> 
> -- 
> Benoit Minisini
> 
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> SourcForge Community
> SourceForge wants to tell your story.
> http://p.sf.net/sfu/sf-spreadtheword
> _______________________________________________
> Gambas-user mailing list
> Gambas-user at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/gambas-user
------- End of Original Message -------





More information about the User mailing list