digitalmars.D.learn - Casting gremlins
- Todd (16/16) Oct 10 2007 In C it was possible to cast a Uint to a Char[], however, I can't seem t...
- Frits van Bommel (6/25) Oct 10 2007 In C, an array is just a pointer. In D it also contains a length (unless...
- Todd (4/30) Oct 10 2007 I have a function that returns an uint, we'll call it 'data1'. from ther...
- BCS (7/44) Oct 10 2007 do you expect this?:
- Christopher Wright (16/48) Oct 10 2007 You're speaking of casting, so I assume you want to print out the value
- Todd Titus (4/6) Oct 11 2007 I used toString() on it. with the same results. I have found 2 additiona...
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? Todd 'newest newbee'
Oct 10 2007
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?
Oct 10 2007
Frits van Bommel Wrote:Todd wrote: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. Thanks for the reply, ToddIn 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?
Oct 10 2007
Todd wrote:Frits van Bommel Wrote:do you expect this?: uint i = 57; char[] c = cast(char[])i; writef("%s\n", c); // prints "57" AFAIK C won't do this. D has a function to do it. look in std.string for toString(uint).Todd wrote: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. Thanks for the reply, ToddIn 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?
Oct 10 2007
Todd wrote:Frits van Bommel Wrote: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.Todd wrote: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.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?Thanks for the reply, Todd
Oct 10 2007
Christopher Wright Wrote:If, however, you merely one a human-readable form of the integer, just use std.string.toString on it.I used toString() on it. with the same results. I have found 2 additional errors,(they multiply like rabbits). 1st. It compiles and links ok, and will output correctly non-stop, but if I recompile it without making any changes it won't output. compile it again and it works. seems like an inconsistent compile bug ?? 2nd. I had to substitute a known value, (to bypass-rule out any hardware issues) in the above compile. I found, or rather isolated it to an 'if' statement that seems to mask the output. I'll try to narrow it down further in the morning.
Oct 11 2007