digitalmars.D.learn - .sort property for array of structs broken in DMD 2 ?
- Sivo Schilling (67/67) Sep 02 2008 Below a small program testing the .sort property for an array of
- Extrawurst (3/89) Sep 02 2008 Did u file a bugreport ? If there is not already one for this, cause i
- Gide Nwawudu (6/73) Sep 17 2008 I think this is the same bug as 1309. If so, you should add your test
Below a small program testing the .sort property for an array of
structs.
---
// Test of opCmp for structs
import std.stdio;
import std.string;
struct S
{
string face;
int opCmp(S rhs)
{
int fcmp = cmp(face, rhs.face);
return fcmp;
}
}
void testOpCmp()
{
S[] faces = new S[5];
faces[0].face = "Morgens";
faces[1].face = "Mittags";
faces[2].face = "Abends";
faces[3].face = "Nachts";
faces[4].face = "Immer";
writefln("faces before .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
faces = faces.sort;
writefln("faces after .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
}
void main()
{
testOpCmp();
}
---
The output of the program compling with DMD 1.034 is as expected:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Abends
i = 1, face = Immer
i = 2, face = Mittags
i = 3, face = Morgens
i = 4, face = Nachts
But compiling with DMD 2.018 without any modification of the code
the program outputs:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Mittags
i = 1, face = Morgens
i = 2, face = Nachts
i = 3, face = Abends
i = 4, face = Immer
The output of course indicates that the opCmp member of S is completly
ignored and that realy happens in this case (easy to proof).
But then the .sort property at least for arrays of structs is not much
useful.
Any ideas ?
Regards.
Sep 02 2008
Did u file a bugreport ? If there is not already one for this, cause i
think it is a known issue
Sivo Schilling wrote:
Below a small program testing the .sort property for an array of
structs.
---
// Test of opCmp for structs
import std.stdio;
import std.string;
struct S
{
string face;
int opCmp(S rhs)
{
int fcmp = cmp(face, rhs.face);
return fcmp;
}
}
void testOpCmp()
{
S[] faces = new S[5];
faces[0].face = "Morgens";
faces[1].face = "Mittags";
faces[2].face = "Abends";
faces[3].face = "Nachts";
faces[4].face = "Immer";
writefln("faces before .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
faces = faces.sort;
writefln("faces after .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
}
void main()
{
testOpCmp();
}
---
The output of the program compling with DMD 1.034 is as expected:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Abends
i = 1, face = Immer
i = 2, face = Mittags
i = 3, face = Morgens
i = 4, face = Nachts
But compiling with DMD 2.018 without any modification of the code
the program outputs:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Mittags
i = 1, face = Morgens
i = 2, face = Nachts
i = 3, face = Abends
i = 4, face = Immer
The output of course indicates that the opCmp member of S is completly
ignored and that realy happens in this case (easy to proof).
But then the .sort property at least for arrays of structs is not much
useful.
Any ideas ?
Regards.
Sep 02 2008
I think this is the same bug as 1309. If so, you should add your test
case to the comments.
http://d.puremagic.com/issues/show_bug.cgi?id=1309
Gide
On Tue, 02 Sep 2008 18:09:27 -0400, Sivo Schilling
<sivo.schilling web.de> wrote:
Below a small program testing the .sort property for an array of
structs.
---
// Test of opCmp for structs
import std.stdio;
import std.string;
struct S
{
string face;
int opCmp(S rhs)
{
int fcmp = cmp(face, rhs.face);
return fcmp;
}
}
void testOpCmp()
{
S[] faces = new S[5];
faces[0].face = "Morgens";
faces[1].face = "Mittags";
faces[2].face = "Abends";
faces[3].face = "Nachts";
faces[4].face = "Immer";
writefln("faces before .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
faces = faces.sort;
writefln("faces after .sort");
foreach(int i, S f; faces) writefln("i = %d, face = %s", i, f.face);
}
void main()
{
testOpCmp();
}
---
The output of the program compling with DMD 1.034 is as expected:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Abends
i = 1, face = Immer
i = 2, face = Mittags
i = 3, face = Morgens
i = 4, face = Nachts
But compiling with DMD 2.018 without any modification of the code
the program outputs:
faces before .sort
i = 0, face = Morgens
i = 1, face = Mittags
i = 2, face = Abends
i = 3, face = Nachts
i = 4, face = Immer
faces after .sort
i = 0, face = Mittags
i = 1, face = Morgens
i = 2, face = Nachts
i = 3, face = Abends
i = 4, face = Immer
The output of course indicates that the opCmp member of S is completly
ignored and that realy happens in this case (easy to proof).
But then the .sort property at least for arrays of structs is not much
useful.
Any ideas ?
Regards.
Sep 17 2008









Extrawurst <spam extrawurst.org> 