[Gambas-user] Wrong error message
Doriano Blengino
doriano.blengino at ...1909...
Tue May 4 08:25:32 CEST 2010
Benoît Minisini ha scritto:
>> Benoît Minisini ha scritto:
>>
>>>> Hi!
>>>> There's minor bug.
>>>> Overflow with concatenate operator causes wrong error message.
>>>> You can reproduce the bug with this code:
>>>>
>>>> Dim ii As Integer
>>>> Dim jj As Integer
>>>>
>>>> For ii = 9 To 0 Step -1
>>>> jj&= ii<--- Wanted Integer got String instead.
>>>> Next
>>>>
>>>> Gambas 3 rev 2879 @ Ubuntu 9.10 64bit
>>>>
>>>> Jussi
>>>>
>>> I'd like to know what you expected exactly from that code, and what you
>>> think the error message should be!
>>>
>>> For information, the previous code is equivalent to:
>>>
>>> Dim ii As Integer
>>> Dim jj As Integer
>>>
>>> For ii = 9 To 0 Step -1
>>>
>>> jj = CInt(CStr(jj)& CStr(ii))
>>>
>>> Next
>>>
>>> The error message comes from CInt(). When its argument cannot be
>>> converted to an integer, it just says that there is a type mismatch (you
>>> forgot to tell that) and that its argument is not an integer.
>>>
>> I think that Jussi is right. Even the form you are using shows that the
>> "&" operator is used with an integer to the left, and so, the "&" is
>> meaningless. This is even more true with the C-style operator "&="
>> which, by definition, must not cast the operand to the left.
>>
>> In other words, I would say that automatic type conversion must be
>> performed only when reading values, and never when writing.
>>
>> Regards,
>> Doriano
>>
>>
>
> I admit that the error message is misleading. It is a generic error message
> raised by the internal interpreter conversion that converts anything to
> anything.
>
> I could have made more detailed error messages, but:
>
> - They are many many possible fail cases, so many many possible error
> messages, and I'm not sure I can guess them all.
>
> - When you convert something, you usually just want the conversion to succeed.
> In the few cases you want to know exactly why the conversion has failed, you
> can do the analyze by yourself.
>
> And for your remark about casting: why not converting when writing? Do you
> want the interpreter to raise an error instead? As in both cases you have to
> check the datatype you are processing, and that usually what you want is
> automatic conversion (otherwise, why using a string operator like '&' with
> integer arguments?), I decided to automatically convert datatypes as much as
> possible.
>
The problem is not very clear to me, but the following should be right:
gambas uses operators to cast its operands; if it was not so, then why
use "&" instead "+" to concatenate strings? But, when you use notations
like "+=", you have a variable on the left (an L-Value), not a value you
can cast... now, if the user writes something that can not work, like:
sString$ /= 3
the compiler should detect this. As Jussi says, this is a minor issue,
because even if the compiler does not notice, the interpreter will - as
soon the user checks the program. But this kind of check would be
responsibility of the compiler, not the interpreter.
About the "why not converting while writing"... it could be a good idea,
but "sString$ /= 3" what should do? Probably take the integer value
stored in sString$, divide by three, convert again in string, and store
the result back in sString$... but then why the code from Jussi raises
an error? Shouldn't it work instead?
Regards,
Doriano
More information about the User
mailing list