STRUCT-DOUBLE crashes when assigning integer

From Liberty BASIC Family
Revision as of 03:03, 11 October 2023 by StPendl (talk | contribs) (1 revision imported)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search


Description

If struct contains field of type Double, then LB crashes attempting to write integer value into that field with error message "a non-continuable protection violation has occurred. Check ERROR.LOG file." Integer could just happen as calculation result.

Example code to demonstrate the bug.

struct x, dbl as double
x.dbl.struct = 1.1 '<-- ok
y = 0.3+0.7 'happens to be integer value
'x.dbl.struct = y '<-- crash if uncommented

Example code to work around the bug.

It looks like we can force LB to consider number Double without changing (does not work if y*(1+1e-20) saved in temporary variable)

struct x, dbl as double
x.dbl.struct = 1.1 '<-- ok
y = 0.3+0.7 'happens to be integer value
'x.dbl.struct = y '<-- crash
x.dbl.struct = y*(1+1e-20) '<- does not crash,
'and  does not change y value
print x.dbl.struct
if x.dbl.struct = y then print "double in struct = y"

Another Example code to work around the bug.

'Use the Using() function to create a double
'from an integer
Struct myStruct, value As double
myStruct.value.struct = Val(Using("#.#", 0))
Print myStruct.value.struct

'Or set up a function, but you have
'to use Val() to get the double
myStruct.value.struct = Val(Dbl$(0))
Print myStruct.value.struct
Function Dbl$(val)
    Dbl$ = Using("#.#", val)
End Function

'Creating a numeric return function
'will not work as LB will automatically
'turn the number back into an integer
''''''''''This will NOT work'''''''''
'Function Dbl(val)
'    Dbl = Val(Using("#.#", val))
'End Function