digitalmars.D.learn - variations of int sizes (and signded/unsigned) between platorms
- Jason House (10/27) Apr 23 2007 I have a small section of code that is giving me issues moving between
- Daniel Keep (19/52) Apr 23 2007 find should probably be returning ptrdiff_t, since that looks like what
- Jason House (5/18) Apr 24 2007 It would help if the various distributions were consistent. Digging a
- Daniel Keep (17/36) Apr 24 2007 True. But then again, DMD only works on 32-bit archs, and since
- Kirk McDonald (14/26) Apr 24 2007 It seems like a version statement would be exactly the right thing to
- Frits van Bommel (2/26) Apr 24 2007 Or you could just use ptrdiff_t...
I have a small section of code that is giving me issues moving between two machines. On my amd64 machine, find returns a long and the slice operation expects ulongs. On my friend's machine, find returns an int and refuses to accept cast(ulong)startComment. Maybe it should be cast(uint)startComment? Of course, that won't work on my machine. Rather that try to decipher this with version checks (when I don't know how this varies from system to system), what's the proper way to solve this? I'm using gdc on my amd64 machine. I'm not sure if my friend is using gdc or dmd... or even if this is a variation form one version of phobos to another.$ dsss build housebot.d => housebot-0.6 + /bin/rebuild -Idsss_imports/ -I. -S./ -I/include/d -S/lib/ -oqdsss_objs -Dddoc -unittest -w -g housebot.d -ofhousebot-0.6 warning - gtp.d:105: Error: implicit conversion of expression (startComment) of type long to ulong can cause loss of data Command /bin/rebuild returned with code 256, aborting. $ head -n 108 gtp.d | tail private void getArgs(out char[][] args){ char[] line = inStream.readLine(); char[] commentFree = line; if (startComment > -1) commentFree = line[0..startComment]; // Remove starting whitespace, trailing whitespace // Also replace sequences of spaces and tabs with a single space char[] squeezedLine = strip(squeeze(tr(line, "\t"," ")," "));
Apr 23 2007
Jason House wrote:I have a small section of code that is giving me issues moving between two machines. On my amd64 machine, find returns a long and the slice operation expects ulongs. On my friend's machine, find returns an int and refuses to accept cast(ulong)startComment. Maybe it should be cast(uint)startComment? Of course, that won't work on my machine. Rather that try to decipher this with version checks (when I don't know how this varies from system to system), what's the proper way to solve this? I'm using gdc on my amd64 machine. I'm not sure if my friend is using gdc or dmd... or even if this is a variation form one version of phobos to another.find should probably be returning ptrdiff_t, since that looks like what you're getting. If you try casting startComment to size_t on line 105, that should work. FYI: | 32-bit alias | 64-bit alias | size_t | uint | ulong | ptrdiff_t | int | long | Hope that helps. -- Daniel -- int getRandomNumber() { return 4; // chosen by fair dice roll. // guaranteed to be random. } http://xkcd.com/ v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/$ dsss build housebot.d => housebot-0.6 + /bin/rebuild -Idsss_imports/ -I. -S./ -I/include/d -S/lib/ -oqdsss_objs -Dddoc -unittest -w -g housebot.d -ofhousebot-0.6 warning - gtp.d:105: Error: implicit conversion of expression (startComment) of type long to ulong can cause loss of data Command /bin/rebuild returned with code 256, aborting. $ head -n 108 gtp.d | tail private void getArgs(out char[][] args){ char[] line = inStream.readLine(); char[] commentFree = line; if (startComment > -1) commentFree = line[0..startComment]; // Remove starting whitespace, trailing whitespace // Also replace sequences of spaces and tabs with a single space char[] squeezedLine = strip(squeeze(tr(line, "\t"," ")," "));
Apr 23 2007
Daniel Keep wrote:find should probably be returning ptrdiff_t, since that looks like what you're getting. If you try casting startComment to size_t on line 105, that should work. FYI: | 32-bit alias | 64-bit alias | size_t | uint | ulong | ptrdiff_t | int | long | Hope that helps. -- DanielIt would help if the various distributions were consistent. Digging a little, it appears that gdc for AMD64 returns ptrdiff_t while the code that comes with dmd returns int. Also, http://www.digitalmars.com/d/phobos/std_string.html also says int.
Apr 24 2007
Jason House wrote:Daniel Keep wrote:True. But then again, DMD only works on 32-bit archs, and since ptrdiff_t is an alias they're *technically* the same :3 I suppose that problems like this will disappear once DMD starts generating 64-bit executables, since it'll *have* to be addressed. I think it was Linus Torvalds who once remarked that porting something to lots of platforms tended to expose a lot of bugs just like the above :P -- Daniel -- int getRandomNumber() { return 4; // chosen by fair dice roll. // guaranteed to be random. } http://xkcd.com/ v2sw5+8Yhw5ln4+5pr6OFPma8u6+7Lw4Tm6+7l6+7D i28a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/find should probably be returning ptrdiff_t, since that looks like what you're getting. If you try casting startComment to size_t on line 105, that should work. FYI: | 32-bit alias | 64-bit alias | size_t | uint | ulong | ptrdiff_t | int | long | Hope that helps. -- DanielIt would help if the various distributions were consistent. Digging a little, it appears that gdc for AMD64 returns ptrdiff_t while the code that comes with dmd returns int. Also, http://www.digitalmars.com/d/phobos/std_string.html also says int.
Apr 24 2007
Jason House wrote:I have a small section of code that is giving me issues moving between two machines. On my amd64 machine, find returns a long and the slice operation expects ulongs. On my friend's machine, find returns an int and refuses to accept cast(ulong)startComment. Maybe it should be cast(uint)startComment? Of course, that won't work on my machine. Rather that try to decipher this with version checks (when I don't know how this varies from system to system), what's the proper way to solve this? I'm using gdc on my amd64 machine. I'm not sure if my friend is using gdc or dmd... or even if this is a variation form one version of phobos to another.It seems like a version statement would be exactly the right thing to use in this case. Try something like this: version (X86_64) { alias ulong find_t; } else { alias uint find_t; } Then, in the slice, use a cast(find_t). -- Kirk McDonald http://kirkmcdonald.blogspot.com Pyd: Connecting D and Python http://pyd.dsource.org
Apr 24 2007
Kirk McDonald wrote:Jason House wrote:Or you could just use ptrdiff_t...I have a small section of code that is giving me issues moving between two machines. On my amd64 machine, find returns a long and the slice operation expects ulongs. On my friend's machine, find returns an int and refuses to accept cast(ulong)startComment. Maybe it should be cast(uint)startComment? Of course, that won't work on my machine. Rather that try to decipher this with version checks (when I don't know how this varies from system to system), what's the proper way to solve this? I'm using gdc on my amd64 machine. I'm not sure if my friend is using gdc or dmd... or even if this is a variation form one version of phobos to another.It seems like a version statement would be exactly the right thing to use in this case. Try something like this: version (X86_64) { alias ulong find_t; } else { alias uint find_t; } Then, in the slice, use a cast(find_t).
Apr 24 2007