digitalmars.D - Question about the new AA behavior in 0.19
- Anton V Staaf (39/39) Aug 10 2006 I've just started working with D. I'm very pleased with what I see.
- Derek Parnell (11/15) Aug 10 2006 Yes, that is what we need to do for now. Maybe in v2.0 of D we will have
- Sean Kelly (8/35) Aug 10 2006 Personally, I'd prefer if use of AAs as an lvalue inserted the element
- nobody (9/11) Aug 11 2006 I was actually just looking for the changelog yesterday. I found:
- Lars Ivar Igesund (6/23) Aug 11 2006 I suppose he meant GDC 0.19 which is based on the DMD 0.162 frontend.
- Anton V Staaf (5/8) Aug 11 2006 Yes, you are correct. I wasn't all that clear about which part I was
- S. (10/22) Aug 14 2006 The fact that you are using ++ makes this code invalid even if the
I've just started working with D. I'm very pleased with what I see. I have noticed something that might be a bug though. I'm not sure the correct protocol for reporting potential bugs, so I figured I'd send my thoughts here first. The following code apparently worked in earlier versions of D (I haven't tested this, but have seen similar code in other threads): import std.stdio; void main () { int[int][int] array; array[12][15]++; } I compiled this with: gdc test.d -o test And when run it results in an ArrayBoundsError exception being thrown. After reading the message boards I came across a change in 0.19 that I think is responsible. Apparently associative arrays would add entries just by being referenced. 0.19 removed this behavior and they now throw ArrayBoundsError exceptions. This makes perfect sense to me and is the right behavior (at least it seems to be to me). The problem is that the first access in the multidimensional array modification is being treated as just that, and access, and not an lvalue. At least that's what I think is happening. This seams like an unintentional side effect of the change. If I change the code to initialize the inner associative array then it works but is cumbersome: import std.stdio; void main () { static int[int] init; int[int][int] array; array[12] = init; array[12][15]++; } That version works fine in 0.19, but means that every time you want to modify a multidimensional associative array you need to check each inner dimension to make sure it's initialized and initialize it if it is not. Thank you, Anton Staaf
Aug 10 2006
On Thu, 10 Aug 2006 16:31:45 -0700, Anton V Staaf wrote: ...every time you want to modify a multidimensional associative array you need to check each inner dimension to make sure it's initialized and initialize it if it is not.Yes, that is what we need to do for now. Maybe in v2.0 of D we will have some help from the compiler. And BTW, this applies to non-AA dynamic-length arrays too. -- Derek (skype: derek.j.parnell) Melbourne, Australia "Down with mediocrity!" 11/08/2006 10:37:53 AM
Aug 10 2006
Anton V Staaf wrote:I've just started working with D. I'm very pleased with what I see. I have noticed something that might be a bug though. I'm not sure the correct protocol for reporting potential bugs, so I figured I'd send my thoughts here first. The following code apparently worked in earlier versions of D (I haven't tested this, but have seen similar code in other threads): import std.stdio; void main () { int[int][int] array; array[12][15]++; } I compiled this with: gdc test.d -o test And when run it results in an ArrayBoundsError exception being thrown. After reading the message boards I came across a change in 0.19 that I think is responsible. Apparently associative arrays would add entries just by being referenced. 0.19 removed this behavior and they now throw ArrayBoundsError exceptions. This makes perfect sense to me and is the right behavior (at least it seems to be to me).Personally, I'd prefer if use of AAs as an lvalue inserted the element if it didn't exist and then returned a reference to this element, while use of AAs as an rvalue simply returned the init value of the contained type and didn't modify the AA. 'in' could still be used for testing whether the AA contained the value or not. But I suppose that's water under the bridge at this point ;-) Sean
Aug 10 2006
Anton V Staaf wrote:thrown. After reading the message boards I came across a change in 0.19 that I think is responsible. Apparently associative arrays would addI was actually just looking for the changelog yesterday. I found: D 0.163 (current) back to D 0.140 (Nov 23, 2005) http://www.digitalmars.com/d/changelog.html D 0.139 (Nov 7, 2005) back to D 0.43 (Sep 28, 2002) http://www.digitalmars.com/d/changelog1.html However I could not find a link for anything as far back as D 0.19. I tried changelog2.html but got dropped back on the homepage. Since you were asking about D 0.19 I thought I might ask if you found anything before Sep 2002?
Aug 11 2006
nobody wrote:Anton V Staaf wrote:I suppose he meant GDC 0.19 which is based on the DMD 0.162 frontend. -- Lars Ivar Igesund blog at http://larsivi.net DSource & #D: larsivithrown. After reading the message boards I came across a change in 0.19 that I think is responsible. Apparently associative arrays would addI was actually just looking for the changelog yesterday. I found: D 0.163 (current) back to D 0.140 (Nov 23, 2005) http://www.digitalmars.com/d/changelog.html D 0.139 (Nov 7, 2005) back to D 0.43 (Sep 28, 2002) http://www.digitalmars.com/d/changelog1.html However I could not find a link for anything as far back as D 0.19. I tried changelog2.html but got dropped back on the homepage. Since you were asking about D 0.19 I thought I might ask if you found anything before Sep 2002?
Aug 11 2006
Lars Ivar Igesund wrote:I suppose he meant GDC 0.19 which is based on the DMD 0.162 frontend.Yes, you are correct. I wasn't all that clear about which part I was talking about. Thanks for the info folks, Anton
Aug 11 2006
On 2006-08-10 16:31:45 -0700, Anton V Staaf <dm socialhacker.com> said:import std.stdio; void main () { static int[int] init; int[int][int] array; array[12] = init; array[12][15]++; }The fact that you are using ++ makes this code invalid even if the symptom you state is there. (++ is a lookup and an increment.) However, I think you are correct about the multidimensional problem anyways as I have run into it in the past. I think you have to do: array[12] = new int[int]; array[12][15] = 1; for the time be-ing -S
Aug 14 2006