Re: Array operations, dynamic arrays and length
On Thursday, 2 July 2015 at 19:27:57 UTC, J Miller wrote: I knew that automatic allocation doesn't happen, but I'm confused by the fact if you explicitly declare "c" with "int[] c;" and then assign "c[] = a[] * b[]", versus using "auto c = a[] * b[]", you get two different errors (array length mismatch vs no destination memory). I find it confusing as well. For me it's about consistency of syntax. For instance, auto z = x+y works with numeric types, but the equivalent you use for arrays doesn't work. It just means one more thing to remember.
Re: Array operations, dynamic arrays and length
On Thursday, 2 July 2015 at 12:59:03 UTC, Steven Schveighoffer wrote: On 7/2/15 8:21 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= " wrote: On Thursday, 2 July 2015 at 10:48:56 UTC, Steven Schveighoffer wrote: On 7/1/15 8:36 PM, J Miller wrote: Oh, and to make things really confusing, "auto e = a[] - b[]" and "int[] e = a[] - b[]" both cause "Error: array operation a[] - b[] without destination memory not allowed". Using dmd 2.067.0. This is not a bug. You need to allocate memory before you can write to it. Automatic allocation doesn't happen in D. This particular part works as intended, but the other things _are_ buggy. Right, my point was to address an obvious misconception on how these statements work. Other languages happily will allocate a new array in such cases, D does not. -Steve I knew that automatic allocation doesn't happen, but I'm confused by the fact if you explicitly declare "c" with "int[] c;" and then assign "c[] = a[] * b[]", versus using "auto c = a[] * b[]", you get two different errors (array length mismatch vs no destination memory).
Re: Array operations, dynamic arrays and length
On 7/2/15 8:21 AM, "Marc =?UTF-8?B?U2Now7x0eiI=?= " wrote: On Thursday, 2 July 2015 at 10:48:56 UTC, Steven Schveighoffer wrote: On 7/1/15 8:36 PM, J Miller wrote: Oh, and to make things really confusing, "auto e = a[] - b[]" and "int[] e = a[] - b[]" both cause "Error: array operation a[] - b[] without destination memory not allowed". Using dmd 2.067.0. This is not a bug. You need to allocate memory before you can write to it. Automatic allocation doesn't happen in D. This particular part works as intended, but the other things _are_ buggy. Right, my point was to address an obvious misconception on how these statements work. Other languages happily will allocate a new array in such cases, D does not. -Steve
Re: Array operations, dynamic arrays and length
https://issues.dlang.org/show_bug.cgi?id=14759
Re: Array operations, dynamic arrays and length
On Thursday, 2 July 2015 at 10:48:56 UTC, Steven Schveighoffer wrote: On 7/1/15 8:36 PM, J Miller wrote: Oh, and to make things really confusing, "auto e = a[] - b[]" and "int[] e = a[] - b[]" both cause "Error: array operation a[] - b[] without destination memory not allowed". Using dmd 2.067.0. This is not a bug. You need to allocate memory before you can write to it. Automatic allocation doesn't happen in D. This particular part works as intended, but the other things _are_ buggy.
Re: Array operations, dynamic arrays and length
On 7/1/15 8:36 PM, J Miller wrote: Oh, and to make things really confusing, "auto e = a[] - b[]" and "int[] e = a[] - b[]" both cause "Error: array operation a[] - b[] without destination memory not allowed". Using dmd 2.067.0. This is not a bug. You need to allocate memory before you can write to it. Automatic allocation doesn't happen in D. -Steve
Re: Array operations, dynamic arrays and length
On Wednesday, 1 July 2015 at 21:15:13 UTC, Marc Schütz wrote: On Wednesday, 1 July 2015 at 19:09:36 UTC, Alex Parrill wrote: I don't think this is a bug. Since you don't initialize `c` to anything, it defaults to an empty slice. Array [] operations apply to each element of a slice, but `c` doesn't have any elements, so it does nothing. I _do_ think it's a bug. Compare: import std.stdio; void main() { int[] a = [1,1,1,1]; int[] b = [1,1,1,1]; int[] c; int[2] d; c[] = a[] - b[]; // works c.writeln;// [] d[] = a[] - b[]; // works d.writeln;// [0, 0] d[] = a[];// throws! // object.Error@(0): Array lengths don't match for copy: 4 != 2 } So, in the case of subtraction, it assigns only as many elements as the destination has, but for direct assignment, it throws an error. This is clearly inconsistent. Bug. "c[] = a[] b[]" produces "[]" for operators "-" and "/", but "object.Error@(0): Array lengths don't match for vector operation: 0 != 4" for operators "+" and "*". Wat. Oh, and to make things really confusing, "auto e = a[] - b[]" and "int[] e = a[] - b[]" both cause "Error: array operation a[] - b[] without destination memory not allowed". Using dmd 2.067.0.
Re: Array operations, dynamic arrays and length
On Wednesday, 1 July 2015 at 19:09:36 UTC, Alex Parrill wrote: I don't think this is a bug. Since you don't initialize `c` to anything, it defaults to an empty slice. Array [] operations apply to each element of a slice, but `c` doesn't have any elements, so it does nothing. I _do_ think it's a bug. Compare: import std.stdio; void main() { int[] a = [1,1,1,1]; int[] b = [1,1,1,1]; int[] c; int[2] d; c[] = a[] - b[]; // works c.writeln;// [] d[] = a[] - b[]; // works d.writeln;// [0, 0] d[] = a[];// throws! // object.Error@(0): Array lengths don't match for copy: 4 != 2 } So, in the case of subtraction, it assigns only as many elements as the destination has, but for direct assignment, it throws an error. This is clearly inconsistent.
Re: Array operations, dynamic arrays and length
On Tuesday, 30 June 2015 at 22:37:34 UTC, ixid wrote: int[] a = [1,1,1,1]; int[] b = [1,1,1,1]; int[] c; c[] = a[] - b[]; c.writeln; This outputs []. This feels wrong, it feels like something that should have exploded or set the length to 4. If the lengths of a and b are mismatched it throws an exception. It also throws an exception if a dynamic array is longer or a static array is not the same length but is happy when a dynamic array is shorter. Is this intended behaviour and if so why? I don't think this is a bug. Since you don't initialize `c` to anything, it defaults to an empty slice. Array [] operations apply to each element of a slice, but `c` doesn't have any elements, so it does nothing. Change `int[] c;` to `int[] c = new int[4];` and it works.
Re: Array operations, dynamic arrays and length
On Tuesday, 30 June 2015 at 22:37:34 UTC, ixid wrote: int[] a = [1,1,1,1]; int[] b = [1,1,1,1]; int[] c; c[] = a[] - b[]; c.writeln; This outputs []. This feels wrong, it feels like something that should have exploded or set the length to 4. If the lengths of a and b are mismatched it throws an exception. It also throws an exception if a dynamic array is longer or a static array is not the same length but is happy when a dynamic array is shorter. Is this intended behaviour and if so why? Yes, clearly a bug. Please open a bug report at https://issues.dlang.org/
Array operations, dynamic arrays and length
int[] a = [1,1,1,1]; int[] b = [1,1,1,1]; int[] c; c[] = a[] - b[]; c.writeln; This outputs []. This feels wrong, it feels like something that should have exploded or set the length to 4. If the lengths of a and b are mismatched it throws an exception. It also throws an exception if a dynamic array is longer or a static array is not the same length but is happy when a dynamic array is shorter. Is this intended behaviour and if so why?