Thread overview | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
March 10, 2007 casting and arrays.. | ||||
---|---|---|---|---|
| ||||
std.file.read(filename); returns type void[] And it it seems i can cast that to whatever type i like, int[], bool[], ect.. anyway it compiles... but.. when casting between array types like this are runtime checks made to make sure the block being cast has the correct granularity.. if the return was void[7] will i get an runtime error casting it to int? Does a cast like that even work? cheers, cw |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Warwick | "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... > std.file.read(filename); > > returns type void[] > > And it it seems i can cast that to whatever type i like, int[], bool[], ect.. anyway it compiles... but.. when casting between array types like this are runtime checks made to make sure the block being cast has the correct granularity.. Yes. > if the return was void[7] will i get an runtime error casting it to int? Yes. void main() { ubyte[] a = [cast(ubyte)1, 2, 3, 4, 5, 6, 7]; int[] x = cast(int[])a; } That cast will give an "array cast misalignment" at run-time. |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... > "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >> std.file.read(filename); >> >> returns type void[] >> >> And it it seems i can cast that to whatever type i like, int[], bool[], ect.. anyway it compiles... but.. when casting between array types like this are runtime checks made to make sure the block being cast has the correct granularity.. > > Yes. Cool.. very nice feature.. :-) |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... > "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >> std.file.read(filename); >> >> returns type void[] Ok say you have that void[] array returned from std.read.file(). Whats the best way to copy a struct out from the void array? Only way i can think is memcpy, or some heavy duty casting and pointers. Is there a cleaner - pretier way with D? thanks, cw |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Warwick | Chris Warwick wrote: > "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... >> "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >>> std.file.read(filename); >>> >>> returns type void[] > > Ok say you have that void[] array returned from std.read.file(). Whats the best way to copy a struct out from the void array? Only way i can think is memcpy, or some heavy duty casting and pointers. Is there a cleaner - pretier way with D? > > thanks, > > cw > > Assuming that array.length == YourStruct.sizeof, you can say cast(YourStruct*)array.ptr to treat the array as the struct in-place. -- Kirk McDonald http://kirkmcdonald.blogspot.com Pyd: Connecting D and Python http://pyd.dsource.org |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kirk McDonald | "Kirk McDonald" <kirklin.mcdonald@gmail.com> wrote in message news:esvk4l$28mi$1@digitalmars.com... > Chris Warwick wrote: >> "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... >>> "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >>>> std.file.read(filename); >>>> >>>> returns type void[] >> >> Ok say you have that void[] array returned from std.read.file(). Whats the best way to copy a struct out from the void array? Only way i can think is memcpy, or some heavy duty casting and pointers. Is there a cleaner - pretier way with D? >> >> thanks, >> >> cw > > Assuming that array.length == YourStruct.sizeof, you can say > cast(YourStruct*)array.ptr > to treat the array as the struct in-place. Well i cant realy do that cause im reading a binary file in, and then i want to parse it, extract structs and various types here and there. cheers, cw |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Warwick | Chris Warwick wrote: > "Kirk McDonald" <kirklin.mcdonald@gmail.com> wrote in message news:esvk4l$28mi$1@digitalmars.com... >> Chris Warwick wrote: >>> "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... >>>> "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >>>>> std.file.read(filename); >>>>> >>>>> returns type void[] >>> Ok say you have that void[] array returned from std.read.file(). Whats the best way to copy a struct out from the void array? Only way i can think is memcpy, or some heavy duty casting and pointers. Is there a cleaner - pretier way with D? >>> >>> thanks, >>> >>> cw >> Assuming that array.length == YourStruct.sizeof, you can say >> cast(YourStruct*)array.ptr >> to treat the array as the struct in-place. > > Well i cant realy do that cause im reading a binary file in, and then i want to parse it, extract structs and various types here and there. Then you need to do pointer arithmetic, it seems. Assuming your struct has a deserializer method that takes a void*: --- for (int i = 0; i < array.length; i++) { if (someStructStartsHere()) { someStruct s; s.deserialize(array.ptr + i); do_stuff_with_someStruct (s); } } --- That should probably work. > cheers, > > cw > > |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to gareis | gareis wrote: > Chris Warwick wrote: >> "Kirk McDonald" <kirklin.mcdonald@gmail.com> wrote in message news:esvk4l$28mi$1@digitalmars.com... >>> Chris Warwick wrote: >>>> "Jarrett Billingsley" <kb3ctd2@yahoo.com> wrote in message news:esvhdv$261a$1@digitalmars.com... >>>>> "Chris Warwick" <sp@m.me.not> wrote in message news:esvf5h$2317$1@digitalmars.com... >>>>>> std.file.read(filename); >>>>>> >>>>>> returns type void[] >>>> Ok say you have that void[] array returned from std.read.file(). Whats the best way to copy a struct out from the void array? Only way i can think is memcpy, or some heavy duty casting and pointers. Is there a cleaner - pretier way with D? >>>> >>>> thanks, >>>> >>>> cw >>> Assuming that array.length == YourStruct.sizeof, you can say >>> cast(YourStruct*)array.ptr >>> to treat the array as the struct in-place. >> >> Well i cant realy do that cause im reading a binary file in, and then i want to parse it, extract structs and various types here and there. > > Then you need to do pointer arithmetic, it seems. Assuming your struct has a deserializer method that takes a void*: > --- > for (int i = 0; i < array.length; i++) { > if (someStructStartsHere()) { > someStruct s; > s.deserialize(array.ptr + i); > do_stuff_with_someStruct (s); > } > } > --- > > That should probably work. > >> cheers, >> >> cw >> >> Personally, I like std.stream.MemoryStream for things like this. That way, I don't have to stuff around with pointer arithmetic, and potentially make a mistake. Incidentally, I never knew that you could safely cast arrays of one type to another! Yet another thing I didn't know about D :P -- Daniel -- Unlike Knuth, I have neither proven or tried the above; it may not even make sense. v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/ |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris Warwick | "Chris Warwick" <sp@m.me.not> wrote in message news:esvnvu$2ku8$1@digitalmars.com... > > Well i cant realy do that cause im reading a binary file in, and then i want to parse it, extract structs and various types here and there. I wouldn't really recommend std.file.read for anything more than reading in the simplest of files. Use std.stream.File or BufferedFile for reading in complex files. You can then read in a struct with .readExact. |
March 11, 2007 Re: casting and arrays.. | ||||
---|---|---|---|---|
| ||||
Posted in reply to gareis | gareis wrote:
> Then you need to do pointer arithmetic, it seems. Assuming your struct has a deserializer method that takes a void*:
> ---
> for (int i = 0; i < array.length; i++) {
> if (someStructStartsHere()) {
> someStruct s;
> s.deserialize(array.ptr + i);
> do_stuff_with_someStruct (s);
> }
> }
> ---
>
Let D do the memcpy?
foreach (i, elem; array)
{
if (someStructStartsHere()) {
someStruct s = * (cast(someStruct*) &array[i]);
}
}
That should copy the struct out of the array.
Cheers,
Reiner
|
Copyright © 1999-2021 by the D Language Foundation