digitalmars.D.learn - question about using std.bitmanip.read
- Charles (24/24) Nov 06 2015 Hi guys,
- BBaz (9/34) Nov 06 2015 You must create a classic run-time branch:
- Nicholas Wilson (17/42) Nov 06 2015 Cheat!
- Charles (5/56) Nov 06 2015 Thanks!
- Mike Parker (5/21) Nov 06 2015 You're passing endianess as a function argument, but the
- Mike Parker (2/6) Nov 06 2015 Missed this in my previous reply.
- Charles (3/4) Nov 06 2015 No problem. I appreciate you taking the time to help me either
Hi guys, It's me again... still having some issues pop up getting started, but I remain hopeful I'll stop needing to ask so many questions soon. I'm trying to use std.bitmanip.read; however, am having some issues using it. For basic testing I'm just trying to use: read!double(endianess, ubyteArr).writeln; endianess is an Endian from std.system, and ubyteArr is an 8 byte ubyte[]. When I run this I get: Error: template std.bitmanip.read cannot deduce function from argument types !(double)(Endian, ubyte[]), candidates are: std.bitmanip.read(T, Endian endianness = Endian.bigEndian, R)(ref R range) if (canSwapEndianness!T && isInputRange!R && is(ElementType!R : const(ubyte))) dmd failed with exit code 1. Clearly that didn't work, so I tried excluding the endianess: read!double(ubyteArr).writeln; and that does work! But its the wrong byte order, so its incorrect anyways. I went to std.bitmanip to look for unittests using the Endian, and the only one that does uses read!(T, endianness), which needs endianness to be known at compile time, which I don't have. Any suggestions?
Nov 06 2015
On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:Hi guys, It's me again... still having some issues pop up getting started, but I remain hopeful I'll stop needing to ask so many questions soon. I'm trying to use std.bitmanip.read; however, am having some issues using it. For basic testing I'm just trying to use: read!double(endianess, ubyteArr).writeln; endianess is an Endian from std.system, and ubyteArr is an 8 byte ubyte[]. When I run this I get: Error: template std.bitmanip.read cannot deduce function from argument types !(double)(Endian, ubyte[]), candidates are: std.bitmanip.read(T, Endian endianness = Endian.bigEndian, R)(ref R range) if (canSwapEndianness!T && isInputRange!R && is(ElementType!R : const(ubyte))) dmd failed with exit code 1. Clearly that didn't work, so I tried excluding the endianess: read!double(ubyteArr).writeln; and that does work! But its the wrong byte order, so its incorrect anyways. I went to std.bitmanip to look for unittests using the Endian, and the only one that does uses read!(T, endianness), which needs endianness to be known at compile time, which I don't have. Any suggestions?You must create a classic run-time branch: --- if(endianess == Endian.bigEndian) read!(Endian.bigEndian, double)(ubyteArr).writeln; else read!(Endian.littleEndian, double)(ubyteArr).writeln; --- or in the same fashion use a final switch.
Nov 06 2015
On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:Hi guys, It's me again... still having some issues pop up getting started, but I remain hopeful I'll stop needing to ask so many questions soon. I'm trying to use std.bitmanip.read; however, am having some issues using it. For basic testing I'm just trying to use: read!double(endianess, ubyteArr).writeln; endianess is an Endian from std.system, and ubyteArr is an 8 byte ubyte[]. When I run this I get: Error: template std.bitmanip.read cannot deduce function from argument types !(double)(Endian, ubyte[]), candidates are: std.bitmanip.read(T, Endian endianness = Endian.bigEndian, R)(ref R range) if (canSwapEndianness!T && isInputRange!R && is(ElementType!R : const(ubyte))) dmd failed with exit code 1. Clearly that didn't work, so I tried excluding the endianess: read!double(ubyteArr).writeln; and that does work! But its the wrong byte order, so its incorrect anyways. I went to std.bitmanip to look for unittests using the Endian, and the only one that does uses read!(T, endianness), which needs endianness to be known at compile time, which I don't have. Any suggestions?Cheat! T read(T,R)(Endian endianness , R r) { if(endianness == Endian.bigEndian) return std.bitmanip.read!(T,Endian.bigEndian,R)(r); else if (endianness == Endian.littleEndian) return std.bitmanip.read!(T,Endian.littleEndian,R)(r); } but... you are on a little endian system (bigEndian gave wrong byte order ) you don't need to use bitmanip.read type repainting will work. ubyte[] r = [ /* ... */ ]; double d = *cast(double*)r.ptr;
Nov 06 2015
On Saturday, 7 November 2015 at 03:53:14 UTC, Nicholas Wilson wrote:On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:Thanks!Hi guys, It's me again... still having some issues pop up getting started, but I remain hopeful I'll stop needing to ask so many questions soon. I'm trying to use std.bitmanip.read; however, am having some issues using it. For basic testing I'm just trying to use: read!double(endianess, ubyteArr).writeln; endianess is an Endian from std.system, and ubyteArr is an 8 byte ubyte[]. When I run this I get: Error: template std.bitmanip.read cannot deduce function from argument types !(double)(Endian, ubyte[]), candidates are: std.bitmanip.read(T, Endian endianness = Endian.bigEndian, R)(ref R range) if (canSwapEndianness!T && isInputRange!R && is(ElementType!R : const(ubyte))) dmd failed with exit code 1. Clearly that didn't work, so I tried excluding the endianess: read!double(ubyteArr).writeln; and that does work! But its the wrong byte order, so its incorrect anyways. I went to std.bitmanip to look for unittests using the Endian, and the only one that does uses read!(T, endianness), which needs endianness to be known at compile time, which I don't have. Any suggestions?Cheat! T read(T,R)(Endian endianness , R r) { if(endianness == Endian.bigEndian) return std.bitmanip.read!(T,Endian.bigEndian,R)(r); else if (endianness == Endian.littleEndian) return std.bitmanip.read!(T,Endian.littleEndian,R)(r); }but... you are on a little endian system (bigEndian gave wrong byte order )The actual use case is reading a binary file of unknown endianness. I don't think I'm that fortunate sadly.
Nov 06 2015
On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:Hi guys, It's me again... still having some issues pop up getting started, but I remain hopeful I'll stop needing to ask so many questions soon. I'm trying to use std.bitmanip.read; however, am having some issues using it. For basic testing I'm just trying to use: read!double(endianess, ubyteArr).writeln; endianess is an Endian from std.system, and ubyteArr is an 8 byte ubyte[]. When I run this I get: Error: template std.bitmanip.read cannot deduce function from argument types !(double)(Endian, ubyte[]), candidates are: std.bitmanip.read(T, Endian endianness = Endian.bigEndian, R)(ref R range) if (canSwapEndianness!T && isInputRange!R && is(ElementType!R : const(ubyte))) dmd failed with exit code 1.You're passing endianess as a function argument, but the signatures in the error says it's supposed to be a template argument. Did you try this? read!(double, endianess)(ubyteArr);
Nov 06 2015
On Saturday, 7 November 2015 at 03:19:44 UTC, Charles wrote:I went to std.bitmanip to look for unittests using the Endian, and the only one that does uses read!(T, endianness), which needs endianness to be known at compile time, which I don't have.Missed this in my previous reply.
Nov 06 2015
On Saturday, 7 November 2015 at 04:25:00 UTC, Mike Parker wrote:Missed this in my previous reply.No problem. I appreciate you taking the time to help me either way :)
Nov 06 2015