| Thread overview | |||||||
|---|---|---|---|---|---|---|---|
|
May 29, 2015 strange bug with unions? | ||||
|---|---|---|---|---|
| ||||
I don't know why but when using a template union with a static ubyte array i get bizarre results!
module main;
import std.stdio;
private union ByteConverter(T)
{
ubyte[T.sizeof] bytes;
T value;
}
ubyte[] toBytes(T)(T from) if (!is(T == const))
{
ByteConverter!T converter;
converter.value = from;
return converter.bytes;
}
T fromBytes(T)(in ubyte[] bytes)
{
ByteConverter!T converter;
converter.bytes = bytes;
return converter.value;
}
void main(string[] args)
{
writeln(fromBytes!uint(toBytes(34u)));// should print 32 but prints 1244564
}
why dose it print 1244564 the array is static size so why is it acting like bytes is a pointer not a static array?
| ||||
May 29, 2015 Re: strange bug with unions? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to seen | On Friday, 29 May 2015 at 07:55:55 UTC, seen wrote: > I don't know why but when using a template union with a static ubyte array i get bizarre results! > > module main; > > import std.stdio; > private union ByteConverter(T) > { > ubyte[T.sizeof] bytes; > T value; > } > > ubyte[] toBytes(T)(T from) if (!is(T == const)) > { > ByteConverter!T converter; > converter.value = from; > return converter.bytes; > } > > T fromBytes(T)(in ubyte[] bytes) > { > ByteConverter!T converter; > converter.bytes = bytes; > return converter.value; > } > > void main(string[] args) > { > writeln(fromBytes!uint(toBytes(34u)));// should print 32 but prints 1244564 > } > > why dose it print 1244564 the array is static size so why is it acting like bytes is a pointer not a static array? http://fr.wikipedia.org/wiki/Endianness#Little_endian | |||
May 29, 2015 Re: strange bug with unions? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to deadalnix | On Friday, 29 May 2015 at 08:00:54 UTC, deadalnix wrote:
> On Friday, 29 May 2015 at 07:55:55 UTC, seen wrote:
>> I don't know why but when using a template union with a static ubyte array i get bizarre results!
>>
>> module main;
>>
>> import std.stdio;
>> private union ByteConverter(T)
>> {
>> ubyte[T.sizeof] bytes;
>> T value;
>> }
>>
>> ubyte[] toBytes(T)(T from) if (!is(T == const))
>> {
>> ByteConverter!T converter;
>> converter.value = from;
>> return converter.bytes;
>> }
>>
>> T fromBytes(T)(in ubyte[] bytes)
>> {
>> ByteConverter!T converter;
>> converter.bytes = bytes;
>> return converter.value;
>> }
>>
>> void main(string[] args)
>> {
>> writeln(fromBytes!uint(toBytes(34u)));// should print 32 but prints 1244564
>> }
>>
>> why dose it print 1244564 the array is static size so why is it acting like bytes is a pointer not a static array?
>
> http://fr.wikipedia.org/wiki/Endianness#Little_endian
endianness should not be an issue since I'm not changing machines
and using static array unions is a common way to convert to bytes in D.
| |||
May 29, 2015 Re: strange bug with unions? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to seen | On 05/29/2015 12:55 AM, seen wrote: > I don't know why but when using a template union with a static ubyte > array i get bizarre results! > > module main; > > import std.stdio; > private union ByteConverter(T) > { > ubyte[T.sizeof] bytes; That's a fixed-length array (aka static array), which has value semantics. > T value; > } > > ubyte[] toBytes(T)(T from) if (!is(T == const)) That function returns a slice to a... > { > ByteConverter!T converter; > converter.value = from; > return converter.bytes; ... local static array. :( Replace the return type with a) auto b) ubyte[T.sizeof] > } > > T fromBytes(T)(in ubyte[] bytes) > { > ByteConverter!T converter; > converter.bytes = bytes; > return converter.value; > } > > void main(string[] args) > { > writeln(fromBytes!uint(toBytes(34u)));// should print 32 but prints > 1244564 > } > > why dose it print 1244564 the array is static size so why is it acting > like bytes is a pointer not a static array? Now it prints 34. :) Ali | |||
May 29, 2015 Re: strange bug with unions? | ||||
|---|---|---|---|---|
| ||||
Posted in reply to seen | On Friday, 29 May 2015 at 07:55:55 UTC, seen wrote: > ubyte[] toBytes(T)(T from) if (!is(T == const)) > { > ByteConverter!T converter; > converter.value = from; > return converter.bytes; > } This function is incorrect: it is returning a slice (dynamic array) of a static array, which is located on the stack. The fact that it compiles without error is bug 9279 (https://issues.dlang.org/show_bug.cgi?id=9279). | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply