Thread overview
how to iterate on Array?
Jun 27, 2015
aki
Jun 27, 2015
John Chapman
Jun 27, 2015
Ali Çehreli
Jun 27, 2015
jmh530
Jun 28, 2015
aki
Jun 28, 2015
Marc Schütz
Jun 29, 2015
aki
June 27, 2015
I want to print the contents of Array!int

import std.stdio;
import std.container;

void pr(Array!int a) {
	foreach(i, v; a[]) {
		writeln("%4s: %s\n", i, v);
	}
}

But when I compile it by DMD 2.062 on Windows
it says:

testArray.d(5): Error: cannot infer argument types
(line 5 is at "foreach(i, v; a[]) {" )

What's wrong? how can I iterate the array?

Thanks, aki.

June 27, 2015
On Saturday, 27 June 2015 at 17:43:13 UTC, aki wrote:
> I want to print the contents of Array!int
>
> import std.stdio;
> import std.container;
>
> void pr(Array!int a) {
> 	foreach(i, v; a[]) {
> 		writeln("%4s: %s\n", i, v);
> 	}
> }
>
> But when I compile it by DMD 2.062 on Windows
> it says:
>
> testArray.d(5): Error: cannot infer argument types
> (line 5 is at "foreach(i, v; a[]) {" )
>
> What's wrong? how can I iterate the array?
>
> Thanks, aki.

size_t i;
foreach (v; a[])
  writeln("%s: %s", i++, v);
June 27, 2015
On 06/27/2015 10:43 AM, aki wrote:

> void pr(Array!int a) {
>      foreach(i, v; a[]) {

You are rightly assuming that the loop counter is available for all container types. Unfortunately, it is the case only for arrays.

Luckily, it is very easy to achieve it with std.algorithm.enumerate:

import std.stdio;
import std.container;
import std.range;

void pr(Array!int a) {
    foreach(i, v; a[].enumerate) {
        writeln("%4s: %s\n", i, v);
    }
}

void main()
{
    auto a = Array!int();
    pr(a);
}

Ali

June 27, 2015
On Saturday, 27 June 2015 at 18:32:10 UTC, Ali Çehreli wrote:
>
> Luckily, it is very easy to achieve it with std.range.enumerate:
>

FTFY
June 28, 2015
On Saturday, 27 June 2015 at 18:32:10 UTC, Ali Çehreli wrote:
> On 06/27/2015 10:43 AM, aki wrote:
> You are rightly assuming that the loop counter is available for all container types. Unfortunately, it is the case only for arrays.

Now I know. Thanks for it.
aki.


June 28, 2015
On Saturday, 27 June 2015 at 17:43:13 UTC, aki wrote:
> But when I compile it by DMD 2.062 on Windows
> it says:
>
> testArray.d(5): Error: cannot infer argument types
> (line 5 is at "foreach(i, v; a[]) {" )

2.062 is really ancient, we're about to release 2.068 soon. Consider upgrading, because there have been tons of bugfixes since your version.

On current DMD, the error message is slightly clearer:

"Error: cannot infer argument types, expected 1 argument, not 2"
June 29, 2015
On Sunday, 28 June 2015 at 10:16:47 UTC, Marc Schütz wrote:
> On Saturday, 27 June 2015 at 17:43:13 UTC, aki wrote:
>> But when I compile it by DMD 2.062 on Windows
>> it says:
>>
>> testArray.d(5): Error: cannot infer argument types
>> (line 5 is at "foreach(i, v; a[]) {" )
>
> 2.062 is really ancient, we're about to release 2.068 soon. Consider upgrading, because there have been tons of bugfixes since your version.
>
> On current DMD, the error message is slightly clearer:
>
> "Error: cannot infer argument types, expected 1 argument, not 2"

Ah, you answered my another question.
Even if I put all the types like foreach(size_t i, int v; a[])
he still said "cannot infer." I wonder why he need to infer?
Now I got it. I'm looking forward 2.068.
Aki.