DMD message of the day ...

Unknown W. Brackets unknown at simplemachines.org
Fri Mar 31 07:41:21 PST 2006


Why are you using a pointer type for ptr?  That's just asking for 
trouble, imho... why not use a ptrdiff_t (which is designed for this 
very purpose, afaik)?  Or do you hate those types for some reason?

-[Unknown]


> Unknown W. Brackets wrote:
>> Shouldn't you make them ubytes or something first?
>>
>> Also, forgive my ignorance, but for what good reason would you add two 
>> pointers?  Subtracting is great and wonderful... adding a pointer and 
>> an int is amazing...  but adding pointers?
>>
>> -[Unknown]
>>
>>
>>> "incompatible types for ((cast(void*)(src)) + (cast(void*)*(p))): 
>>> 'void*' and 'void*'"
>>>
>>> :)
> 
> Yeah ... it is a bit odd :)
> 
> This came up when serializing & deserializing arrays. I ended up 
> modifying each array pointer|length pair to be an offset|length pair 
> instead, and then writing that pair as though it were an ordinary field 
> (like a long int).
> 
> When deserializing, the offset|length pair gets converted back to a 
> pointer|length pair by adding a base-address to the offset. Hence, we 
> end up with what /looks/ like the addition of two pointers.
> 
> The decoding looked something like this:
> 
> void* base_address;
> void[]* p = address_of_encoded_array;
> *p = (base_address + (*p).ptr)[0 .. (*p).length];
> 
> where (*p).ptr is actually the encoded offset, rather than a pointer. 
> That's where DMD tossed the amusing "void* is incompatible with void*" 
> error. This was fixed by removing the .ptr syntax, causing DMD to 
> extract the offset via implicit type-casting instead (matching the void* 
> on the LHS).
> 
> The approach is a bit grubby, but that's ok.
> 
> - Kris



More information about the Digitalmars-d-bugs mailing list