How do you iterate "vertically" over a 2-D array?

Chris Katko ckatko at gmail.com
Tue Oct 9 10:56:45 UTC 2018


On Tuesday, 9 October 2018 at 10:52:47 UTC, Chris Katko wrote:
> I have a 2-D array:
>
> int[5][5] data =
> 	[
> 		[1, 0, 1, 0, 0],
> 		[1, 0, 1, 0, 0],
> 		[1, 0, 1, 1, 1],
> 		[1, 0, 0, 1, 0],
> 		[1, 1, 1, 1, 0]
> 	];
>
>
> 1 - Is there a way to foreach vertically through that? (that 
> is, rotated 90 degrees from the usual iteration.)
>
> 2 - Is there a way to send that "vertical slice" to a function?
>
> int count_numbers(){/*...*/}
>
> count_numbers(data[0]); //horizontal sum of array[0][0..$-1] 
> WORKS.
> count_numbers(data[][0]); //vertical sum of array[0..$-1][0] 
> HYPOTHETICAL
>
> I'm working on an RLE encoding function and I need both 
> vertical and horizontal strips. It just occurred to me that the 
> problem is essentially the same, if you can "transpose" the 
> matrix.
>
> Oh geez, did I just realize what I need? some sort of matrix 
> transpose function? I found this post;
>
> https://forum.dlang.org/post/na8ikk$2ojo$1@digitalmars.com
>
> The problem is though, even if I use [][], instead of [5][5] 
> (or try using his conversion function), I can call 
> transposed... but I can't call my function with it!
>
> void run_rle3(int [] a){/*...*/}
>
> 	run_rle3(data[0]); //works
> 	run_rle3(data.transposed[0]); //nope [see error below]
> 	run_rle3(data[0].transposed); //nope (didn't expect this to)
> 	run_rle3((data.transposed)[0]); //nope [see error below]
>
> Error: function dmap.run_rle3 (int[] a) is not callable using 
> argument types (Transversal!(int[][], cast(TransverseOptions)0))

So according to this:

https://dlang.org/library/std/range/transposed.html

It's trying to take my [0] as an argument for the 
TransverseOptions variable? But even if I wrap it in parenthesis, 
it still takes it! (See the last line of code.)

auto taco = (data.transposed);
run_rle3(taco); //same error, but <-------- HERE?



More information about the Digitalmars-d-learn mailing list