Thread overview | |||||||||
---|---|---|---|---|---|---|---|---|---|
|
December 06, 2015 Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Hi! I have the following code: int main(string[] argv) { import std.algorithm: sum; import std.stdio: writeln; uint[3] a1 = [1, 2, 3]; uint[] a2; for (int i = 1; i <= 3; ++i) a2 ~= i; writeln("a1: ", sum(a1)); writeln("a2: ", sum(a2)); return 0; } This throws the error: dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are: /usr/include/dmd/phobos/std/algorithm/iteration.d(3916): std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front))) /usr/include/dmd/phobos/std/algorithm/iteration.d(3927): std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front))) So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays? Regards |
December 06, 2015 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | 06.12.2015 15:23, Tim K. пишет:
> Hi! I have the following code:
>
> int main(string[] argv)
> {
> import std.algorithm: sum;
> import std.stdio: writeln;
>
> uint[3] a1 = [1, 2, 3];
> uint[] a2;
> for (int i = 1; i <= 3; ++i)
> a2 ~= i;
>
> writeln("a1: ", sum(a1));
> writeln("a2: ", sum(a2));
> return 0;
> }
>
> This throws the error:
> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce
> function from argument types !()(uint[3]), candidates are:
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916):
> std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R
> && is(typeof(r.front + r.front)))
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927):
> std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R &&
> !isInfinite!R && is(typeof(seed = seed + r.front)))
>
>
> So a dynamic array works just fine. In fact, if I uncomment the line in
> question the program compiles and outputs the correct value (for a2).
> Why does "sum" not work on static arrays?
>
>
> Regards
Because static array aren't ranges, but dynamic ones are. Try this:
writeln("a1" ", sum (a1[])); // using [] makes static array to be a range
|
December 06, 2015 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tim K. | On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote:
> Hi! I have the following code:
>
> int main(string[] argv)
> {
> import std.algorithm: sum;
> import std.stdio: writeln;
>
> uint[3] a1 = [1, 2, 3];
> uint[] a2;
> for (int i = 1; i <= 3; ++i)
> a2 ~= i;
>
> writeln("a1: ", sum(a1));
> writeln("a2: ", sum(a2));
> return 0;
> }
>
> This throws the error:
> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are:
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916): std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front)))
> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927): std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front)))
>
>
> So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays?
>
>
> Regards
So that you do not shoot yourself in the foot too easily. A static array is a value type so it is passed by value to functions. If you pass a 1M array to a function... well, I guesse you don't want to do that.
The solution is to slice it: a1[].sum; That way you avoid the problem.
|
December 06, 2015 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to cym13 | On Sunday, 6 December 2015 at 12:27:49 UTC, cym13 wrote: > A static array is a value type so it is passed by value to functions. Oh, right, I totally forgot about that. Thank you for reminding me. And yes, I was not planning on doing that. I just have a local fixed-size array that I wanted to get the sum of... > The solution is to slice it: a1[].sum; That way you avoid the problem. Thank you two. Regards |
October 10, 2020 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to cym13 | On Sunday, 6 December 2015 at 12:27:49 UTC, cym13 wrote: > On Sunday, 6 December 2015 at 12:23:05 UTC, Tim K. wrote: >> Hi! I have the following code: >> >> int main(string[] argv) >> { >> import std.algorithm: sum; >> import std.stdio: writeln; >> >> uint[3] a1 = [1, 2, 3]; >> uint[] a2; >> for (int i = 1; i <= 3; ++i) >> a2 ~= i; >> >> writeln("a1: ", sum(a1)); >> writeln("a2: ", sum(a2)); >> return 0; >> } >> >> This throws the error: >> dummy.d(11): Error: template std.algorithm.iteration.sum cannot deduce function from argument types !()(uint[3]), candidates are: >> /usr/include/dmd/phobos/std/algorithm/iteration.d(3916): >> std.algorithm.iteration.sum(R)(R r) if (isInputRange!R && !isInfinite!R && is(typeof(r.front + r.front))) >> /usr/include/dmd/phobos/std/algorithm/iteration.d(3927): >> std.algorithm.iteration.sum(R, E)(R r, E seed) if (isInputRange!R && !isInfinite!R && is(typeof(seed = seed + r.front))) >> >> >> So a dynamic array works just fine. In fact, if I uncomment the line in question the program compiles and outputs the correct value (for a2). Why does "sum" not work on static arrays? >> >> >> Regards > > So that you do not shoot yourself in the foot too easily. A static array is a value type so it is passed by value to functions. If you pass a 1M array to a function... well, I guesse you don't want to do that. Can the template func `sum()` be made to take `ref` of a static array? > The solution is to slice it: a1[].sum; That way you avoid the problem. While I understand the explanation of the current behavior, and the work-around, this inconstancy of making func calls means either the library, or the language leaves something to be desired: i.e dynamic array and static array cannot be used interchangeably: (sure I'm not talking about array decl / allocation, the user have to take different actions) I'm talking about a simple function call to calc the sum of the array. ``` sum(static_array[]); // v.s. sum(dynamic_array); ``` For example, if the user first decl a static array for fast prototyping, and later changed mind to use dynamic array, then s/he need to change the call all over the places. (I hope you are not telling me, every time people should use: ``` array_func(any_array[]); ``` is the correct D-idiom to use array in a func call) |
October 11, 2020 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to mw | Sidenote, sort also not works with static arrays. |
October 11, 2020 Re: Why does sum not work in static arrays? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alaindevos | On Sun, Oct 11, 2020 at 01:26:13PM +0000, Alaindevos via Digitalmars-d-learn wrote: > Sidenote, sort also not works with static arrays. Just slice it with []. T -- I think the conspiracy theorists are out to get us... |
Copyright © 1999-2021 by the D Language Foundation