digitalmars.D - Possible bug in skipOver() from std/algorithm/searching.d
- Danny Arends (47/47) Jan 22 2017 Hey all,
- Daniel N (2/7) Jan 22 2017 The ASCII code for / is 47.
- Danny Arends (10/16) Jan 22 2017 Two further observations:
- Stefan Koch (8/26) Jan 22 2017 This is not a bug.
- Danny Arends (11/47) Jan 22 2017 Yeah I kind of figured that, however it is very confusing the
- Stefan Koch (7/56) Jan 22 2017 No it never promotes the integer to a string.
- Bauss (6/55) Jan 24 2017 It really isn't if you understand how the types are operating
- Chris Wright (1/1) Jan 22 2017 Add a `writeln(l);` after the call to formattedRead().
Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. Given the following code: ---- test.d ---- import std.stdio, std.algorithm, std.conv, std.format, std.string; void main() { int x; for (auto t = 40; t < 50; t++) { // Create a string holding a number and put a forward slash behind it string l = to!string(t) ~ "/"; // Write the created string to the ouput writef("'%s'", l); // Read the number using the formattedRead function formattedRead(l, "%d", &x); // Write the number to the ouput writef(" -> '%d'", x); // Skip over the loaded number l.skipOver(x); // Print what is left of the string writeln(" -> '", l, "'"); } } ------------------- After running this code dmd -run test.d I get the following output: '40/' -> '40' -> '/' '41/' -> '41' -> '/' '42/' -> '42' -> '/' '43/' -> '43' -> '/' '44/' -> '44' -> '/' '45/' -> '45' -> '/' '46/' -> '46' -> '/' '47/' -> '47' -> '' '48/' -> '48' -> '/' '49/' -> '49' -> '/' Why is in the case of 47, the slash at the end eaten up by the skipOver function ? I tested all numbers from 0 to 1000, and it only occurs when the number is 47 (?!) Can anyone confirm this, since it looks like such a weird bug to me ? Kind regards, Danny Arends
Jan 22 2017
On Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:Hey all, Can anyone confirm this, since it looks like such a weird bug to me ? Kind regards, Danny ArendsThe ASCII code for / is 47.
Jan 22 2017
On Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. [...]Two further observations: (Obs 1) 47 is ascii code for forwards slash '/' (Obs 2) Changing the line: l.skipOver(x); to: l.skipOver(to!string(x)); Does not show the bug.
Jan 22 2017
On Sunday, 22 January 2017 at 10:01:09 UTC, Danny Arends wrote:On Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:This is not a bug. But working as intended. you call skip over with an (char[] skip, int overThis) and skip over will do comparions like this (if (skip[pos] == overThis)) and since '\' == 47; it will skip over that one.Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. [...]Two further observations: (Obs 1) 47 is ascii code for forwards slash '/' (Obs 2) Changing the line: l.skipOver(x); to: l.skipOver(to!string(x)); Does not show the bug.
Jan 22 2017
On Sunday, 22 January 2017 at 10:30:14 UTC, Stefan Koch wrote:On Sunday, 22 January 2017 at 10:01:09 UTC, Danny Arends wrote:Yeah I kind of figured that, however it is very confusing the skipOver() function, first tries to match an integer input as a ascii code. However if this ascii code is NOT found (e.g. when x = 46, ascii code for '.') it promotes the integer to a string, and then skips passed the string 46. I think the promotion of the input integer to string shouldn't happen, or should be clearly documented.. Greetings DannyOn Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:This is not a bug. But working as intended. you call skip over with an (char[] skip, int overThis) and skip over will do comparions like this (if (skip[pos] == overThis)) and since '\' == 47; it will skip over that one.Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. [...]Two further observations: (Obs 1) 47 is ascii code for forwards slash '/' (Obs 2) Changing the line: l.skipOver(x); to: l.skipOver(to!string(x)); Does not show the bug.
Jan 22 2017
On Sunday, 22 January 2017 at 11:20:18 UTC, Danny Arends wrote:On Sunday, 22 January 2017 at 10:30:14 UTC, Stefan Koch wrote:No it never promotes the integer to a string. it compares a char to an uint. You pass a string and an int to it. And the elements of the string are getting compared to the uint See this overload https://dlang.org/phobos/std_algorithm_searching.html#.skipOver.2On Sunday, 22 January 2017 at 10:01:09 UTC, Danny Arends wrote:Yeah I kind of figured that, however it is very confusing the skipOver() function, first tries to match an integer input as a ascii code. However if this ascii code is NOT found (e.g. when x = 46, ascii code for '.') it promotes the integer to a string, and then skips passed the string 46. I think the promotion of the input integer to string shouldn't happen, or should be clearly documented.. Greetings DannyOn Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:This is not a bug. But working as intended. you call skip over with an (char[] skip, int overThis) and skip over will do comparions like this (if (skip[pos] == overThis)) and since '\' == 47; it will skip over that one.Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. [...]Two further observations: (Obs 1) 47 is ascii code for forwards slash '/' (Obs 2) Changing the line: l.skipOver(x); to: l.skipOver(to!string(x)); Does not show the bug.
Jan 22 2017
On Sunday, 22 January 2017 at 11:20:18 UTC, Danny Arends wrote:On Sunday, 22 January 2017 at 10:30:14 UTC, Stefan Koch wrote:It really isn't if you understand how the types are operating when compiled. There is theoretically no such thing as a character when it comes to actual data types. It's nothing but a number on the OS level. Unless it's a Unicode etc. then it's a sequence of numbers to form code pointsOn Sunday, 22 January 2017 at 10:01:09 UTC, Danny Arends wrote:Yeah I kind of figured that, however it is very confusing the skipOver() function, first tries to match an integer input as a ascii code. However if this ascii code is NOT found (e.g. when x = 46, ascii code for '.') it promotes the integer to a string, and then skips passed the string 46. I think the promotion of the input integer to string shouldn't happen, or should be clearly documented.. Greetings DannyOn Sunday, 22 January 2017 at 09:55:49 UTC, Danny Arends wrote:This is not a bug. But working as intended. you call skip over with an (char[] skip, int overThis) and skip over will do comparions like this (if (skip[pos] == overThis)) and since '\' == 47; it will skip over that one.Hey all, I encountered some unexpected behavior in std.format, I was parsing Wavefront obj file, and ran into an issue. I updated the compiler to the latest stable version (// DMD64 D Compiler v2.072.2), however I think it's a Phobos related issue. [...]Two further observations: (Obs 1) 47 is ascii code for forwards slash '/' (Obs 2) Changing the line: l.skipOver(x); to: l.skipOver(to!string(x)); Does not show the bug.
Jan 24 2017
Add a `writeln(l);` after the call to formattedRead().
Jan 22 2017