www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - .sort property on dynamic array?

reply Kramer <Kramer_member pathlink.com> writes:
I can't tell if I'm not using the sort property of dynamic arrays correctly, or
if something else is going on.

I was using the recls module and gathering up a bunch of Entry objects in an
array of Entries.  When I go to sort the array using the sort property, I get an
access violation.  I'm not sure how to debug it from here.  I don't know if I
need to supply my own sort routine or if there's something else I should do.
The Phobos doc. doesn't really speak to that.

I'm using dmd 0.111.

Here's the code:

#import std.recls;
#
#void main()
#{
#    Entry[] entries;
#    entries.length = 1000;
#
#    int i;
#
#    Search path = new Search(".", "*.*", RECLS_FLAG.RECLS_F_RECURSIVE);
#    foreach (Entry e; path)
#    {
#        if (i == entries.length)
#            entries.length = entries.length * 2;
#        entries[i] = e;
#        i++;
#    }
#    
#    entries.sort;
#}

-Kramer
Feb 04 2005
next sibling parent reply "Ben Hinkle" <bhinkle mathworks.com> writes:
I haven't actually run this but try adding
#    entries = entries[0..i];
right before
#    entries.sort;
since the sort algorithm is sorting all the null entries at the end of the 
array and it could be getting seg-v's trying to compare null against other 
items. That's just a hunch, though. 
Feb 04 2005
parent reply Kramer <Kramer_member pathlink.com> writes:
In article <cu0l9k$604$1 digitaldaemon.com>, Ben Hinkle says...
I haven't actually run this but try adding
#    entries = entries[0..i];
right before
#    entries.sort;
since the sort algorithm is sorting all the null entries at the end of the 
array and it could be getting seg-v's trying to compare null against other 
items. That's just a hunch, though. 

That works; no seg. fault. But, I'm just wondering, is that the way it should work? I guess maybe with more doc. on how the sort does it's thing I could figure out a solution (or be able to override it), but it might have taken me a while otherwise. It's not a problem for people familiar with D, but what about amatuers such as myself who think that sort should just do what it can (i.e., sort things in a consistent manner, either with nulls at the top, or the bottom, whatever) without complaining. True, everything has a learning curve, but arrays are a basic structure in languages, so someone coming over from c/c++ (or any other language) would probably not expect to have too much of a learning curve on D arrays. Although, I do recognize that they have qualities that /are/ different from other languages. Sorry if that sounded like a rant... just thinking out loud. :) -Kramer
Feb 04 2005
parent reply Ben Hinkle <Ben_member pathlink.com> writes:
In article <cu0nbo$7v7$1 digitaldaemon.com>, Kramer says...
In article <cu0l9k$604$1 digitaldaemon.com>, Ben Hinkle says...
I haven't actually run this but try adding
#    entries = entries[0..i];
right before
#    entries.sort;
since the sort algorithm is sorting all the null entries at the end of the 
array and it could be getting seg-v's trying to compare null against other 
items. That's just a hunch, though. 

That works; no seg. fault. But, I'm just wondering, is that the way it should work? I guess maybe with more doc. on how the sort does it's thing I could figure out a solution (or be able to override it), but it might have taken me a while otherwise. It's not a problem for people familiar with D, but what about amatuers such as myself who think that sort should just do what it can (i.e., sort things in a consistent manner, either with nulls at the top, or the bottom, whatever) without complaining. True, everything has a learning curve, but arrays are a basic structure in languages, so someone coming over from c/c++ (or any other language) would probably not expect to have too much of a learning curve on D arrays. Although, I do recognize that they have qualities that /are/ different from other languages. Sorry if that sounded like a rant... just thinking out loud. :) -Kramer

I sympathize with the argument that it shouldn't seg-v on null. I had noticed this a while ago now that I think about it. The typeinfo for class objects ti_C.d has a compare function with the comment and if clause: // Regard null references as always being "less than" if (o1 != o2) which will not test as "less than" but will actually seg-v. If we change that != to !== (and maybe a few others in that file) it would probably be fine. The only possible problem could be with some logic identities but I can't really think of any problems. Also note that it might be better to say null is greater than everything so that it appears at the end of the array instead of at the front.
Feb 04 2005
parent "Walter" <newshound digitalmars.com> writes:
"Ben Hinkle" <Ben_member pathlink.com> wrote in message
news:cu120r$h0n$1 digitaldaemon.com...
 // Regard null references as always being "less than"
 if (o1 != o2)
 which will not test as "less than" but will actually seg-v. If we change

 to !== (and maybe a few others in that file)  it would probably be fine.

Fixed. -Walter
Feb 06 2005
prev sibling parent reply "Matthew" <admin stlsoft.dot.dot.dot.dot.org> writes:
Does it do the same thing with int / some vanilla objects?

"Kramer" <Kramer_member pathlink.com> wrote in message 
news:cu0ih6$33h$1 digitaldaemon.com...
I can't tell if I'm not using the sort property of dynamic arrays 
correctly, or
 if something else is going on.

 I was using the recls module and gathering up a bunch of Entry objects 
 in an
 array of Entries.  When I go to sort the array using the sort 
 property, I get an
 access violation.  I'm not sure how to debug it from here.  I don't 
 know if I
 need to supply my own sort routine or if there's something else I 
 should do.
 The Phobos doc. doesn't really speak to that.

 I'm using dmd 0.111.

 Here's the code:

 #import std.recls;
 #
 #void main()
 #{
 #    Entry[] entries;
 #    entries.length = 1000;
 #
 #    int i;
 #
 #    Search path = new Search(".", "*.*", 
 RECLS_FLAG.RECLS_F_RECURSIVE);
 #    foreach (Entry e; path)
 #    {
 #        if (i == entries.length)
 #            entries.length = entries.length * 2;
 #        entries[i] = e;
 #        i++;
 #    }
 #
 #    entries.sort;
 #}

 -Kramer

 

Feb 08 2005
parent reply Kramer <Kramer_member pathlink.com> writes:
No.  I tried it with an int array and a struct array with the struct consisting
of a char[] field and an int field.  They both passed the sort.  For the recls
code, the foreach loop works, but just not the sort routine on the array.
Hmmm...  Will dig around in the array sort routine.  Maybe I'll trip over
something...

-Kramer

In article <cubl3s$12b0$1 digitaldaemon.com>, Matthew says...
Does it do the same thing with int / some vanilla objects?

"Kramer" <Kramer_member pathlink.com> wrote in message 
news:cu0ih6$33h$1 digitaldaemon.com...
I can't tell if I'm not using the sort property of dynamic arrays 
correctly, or
 if something else is going on.

 I was using the recls module and gathering up a bunch of Entry objects 
 in an
 array of Entries.  When I go to sort the array using the sort 
 property, I get an
 access violation.  I'm not sure how to debug it from here.  I don't 
 know if I
 need to supply my own sort routine or if there's something else I 
 should do.
 The Phobos doc. doesn't really speak to that.

 I'm using dmd 0.111.

 Here's the code:

 #import std.recls;
 #
 #void main()
 #{
 #    Entry[] entries;
 #    entries.length = 1000;
 #
 #    int i;
 #
 #    Search path = new Search(".", "*.*", 
 RECLS_FLAG.RECLS_F_RECURSIVE);
 #    foreach (Entry e; path)
 #    {
 #        if (i == entries.length)
 #            entries.length = entries.length * 2;
 #        entries[i] = e;
 #        i++;
 #    }
 #
 #    entries.sort;
 #}

 -Kramer

 


Feb 09 2005
parent "Matthew" <admin stlsoft.dot.dot.dot.dot.org> writes:
It's not out of the question that it's a recls problem, although I'm 
struggling to fathom how. Do you want to send me a bit of illustrative 
code, and I'll delve with my latest version of recls here. If it is a 
bug, it'd be nice to have it fixed before I update Phobos with the new 
recls in the next week or so.

"Kramer" <Kramer_member pathlink.com> wrote in message 
news:cuete6$14am$1 digitaldaemon.com...
 No.  I tried it with an int array and a struct array with the struct 
 consisting
 of a char[] field and an int field.  They both passed the sort.  For 
 the recls
 code, the foreach loop works, but just not the sort routine on the 
 array.
 Hmmm...  Will dig around in the array sort routine.  Maybe I'll trip 
 over
 something...

 -Kramer

 In article <cubl3s$12b0$1 digitaldaemon.com>, Matthew says...
Does it do the same thing with int / some vanilla objects?

"Kramer" <Kramer_member pathlink.com> wrote in message
news:cu0ih6$33h$1 digitaldaemon.com...
I can't tell if I'm not using the sort property of dynamic arrays
correctly, or
 if something else is going on.

 I was using the recls module and gathering up a bunch of Entry 
 objects
 in an
 array of Entries.  When I go to sort the array using the sort
 property, I get an
 access violation.  I'm not sure how to debug it from here.  I don't
 know if I
 need to supply my own sort routine or if there's something else I
 should do.
 The Phobos doc. doesn't really speak to that.

 I'm using dmd 0.111.

 Here's the code:

 #import std.recls;
 #
 #void main()
 #{
 #    Entry[] entries;
 #    entries.length = 1000;
 #
 #    int i;
 #
 #    Search path = new Search(".", "*.*",
 RECLS_FLAG.RECLS_F_RECURSIVE);
 #    foreach (Entry e; path)
 #    {
 #        if (i == entries.length)
 #            entries.length = entries.length * 2;
 #        entries[i] = e;
 #        i++;
 #    }
 #
 #    entries.sort;
 #}

 -Kramer



Feb 09 2005