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