Pop Quiz what is wrong with this code?

WebFreak001 d.forum at webfreak.org
Mon Jun 22 13:02:10 UTC 2020


On Monday, 22 June 2020 at 12:42:26 UTC, Steven Schveighoffer 
wrote:
> On 6/20/20 11:22 PM, Danni Coy wrote:
>> On Sun, Jun 21, 2020 at 9:40 AM Avrina via Digitalmars-d
>> <digitalmars-d at puremagic.com> wrote:
>>>
>>> On Saturday, 20 June 2020 at 18:15:27 UTC, Steven 
>>> Schveighoffer
>>> wrote:
>>>> On 6/20/20 12:00 PM, Danni Coy wrote:
>>>>
>>>>> I tried explicitly making x and y ints and I got a
>>>>> depreciation warning.
>>>>
>>>> foreach(ptrdiff_t y, ref row; offsetMap)
>>>>
>>>> is that what you wanted?
>>>>
>>>> ptrdiff_t is the signed version of size_t. The complaint is 
>>>> not
>>>> that you are converting from unsigned to signed, but that you
>>>> are converting from 64-bit to 32-bit.
>
>>> Why isn't that deprecated as well? implicitly converting from
>>> ulong to long is an error as much as ulong to uint.
>> 
>> It turns out this line is the bigger problem.
>> 
>>   immutable SDL_FPair offset  = { center.x - x, y - center.y };
>> FPair is a
>> struct SDL_FPair
>> {
>>      float x;
>>      float y;
>> ...
>> if those values were ints.
>> dmd will not allow a downcast from ulong to int
>> (the compiler would have caught the issue for me)
>> but it will allow casting ulong to float which is why It took 
>> me a
>> couple of hours with a debugger
>> trying to find the bug.
>
> So this entire conversation is incorrect -- there is no 
> promotion to unsigned happening.
>
> What is the bug with size_t implicitly casting to float? I 
> would think it would work.
>
> -Steve

I think the issue is that it's converting the ulongs to float, 
which are actually negative and not positive: center.x - x and y 
- center.y might become negative and because it's a ulong it will 
be a huge number, then converting to float it will be a huge 
float number instead of some normal negative number.

so:

size_t centerX = 1;
size_t x = 3;
float f = centerX - x; // <- this is not -2, this is 1.84467e+19 
without any warnings or deprecations printed

Meanwhile an implicit cast to int is disallowed (error) but it 
would actually contain the correct result and nobody would have 
ever found it.


More information about the Digitalmars-d mailing list