Casting gremlins

Christopher Wright dhasenan at gmail.com
Wed Oct 10 17:18:04 PDT 2007


Todd wrote:
> Frits van Bommel Wrote:
> 
>> Todd wrote:
>>> In C it was possible to cast a Uint to a Char[], however, I can't seem to get it to compile in D. 
>>>
>>> example: I have 
>>>
>>> uint data1;
>>> long data;
>>> long lblonedata;
>>> .
>>> .
>>> .
>>> char[] dataone = cast(char[]) data1;
>>> lblonedata = atoi(dataone);
>>>
>>> I'm importing std.string, std.conv;
>>>
>>> and get e2ir: cannot cast uint to char[]
>>>
>>> I was using dmd 1.022 and switched to 2.x today with no help.
>>> Does D use a different method? or I'm I missing something obvious?
>> In C, an array is just a pointer. In D it also contains a length (unless 
>> it's a static array, in which case that's encoded in the type).
>> You could try casting to a pointer instead, but casting between pointer 
>> and non-pointer types usually means you're doing something wrong. What 
>> is it exactly that you're trying to achieve here?
> 
> I have a function that returns an uint, we'll call it 'data1'. from there, I'm trying to cast it to a char to insert into a textbox, similiar to 'mini-calc'. I know it's simple, but it seems to be escaping me at the moment.

You're speaking of casting, so I assume you want to print out the value 
of each byte. And if you're trying to make it human-readable, you'll 
have to convert it.

So, you want to change to ubyte. You have to use masks and shifts, or 
just shifts, for that, along with casts.

int i = someFunc();
ubyte[4] bytes;
bytes[0] = cast(ubyte)((i << 0)  >> 24);
bytes[1] = cast(ubyte)((i << 8)  >> 16);
bytes[2] = cast(ubyte)((i << 16) >>  8);
bytes[3] = cast(ubyte)((i << 24) >>  0);

Then to get a human-readable form of these, you can call 
std.string.toString on them.

If, however, you merely one a human-readable form of the integer, just 
use std.string.toString on it.

> Thanks for the reply,
> Todd
> 


More information about the Digitalmars-d-learn mailing list