how to do this meta-programming? print the address of random element's address of a variable length of arrays?
Ali Çehreli
acehreli at yahoo.com
Sat Sep 12 03:11:09 UTC 2020
On 9/11/20 6:44 PM, mw wrote:> e.g.
>
> int[] a = new int[la];
> int[] b = new int[lb];
> int[] c = new int[lc];
> int[] d = new int[ld];
>
>
> the func I want to write, e.g. for 2 arrays (instantiation) is like this:
>
> void print_random_elem_addr(int[] x, int[] y) {
> auto i = random_int_between(0, x.length);
> auto j = random_int_between(0, y.length);
> print(&(x[i], &(y[j])); // only single print() func call allowed!
> }
>
>
> But I want one generic function, which can be called as:
>
> print_random_elem_addr(a, b);
> print_random_elem_addr(a, b, c);
> print_random_elem_addr(a, b, c, d);
If they are all of same type like int[] in this case, then you can
variable number of parameters, which means "any number of int[] arrays"
below, elements of which can be called either as separate arguments or
as a single array argument:
import std.stdio;
import std.random;
void print_random_elem_addr(int[][] arrays...) {
foreach (i, array; arrays) {
const chosen = uniform(0, array.length);
writefln!"Array %s, element %s: %s"(i, chosen, &array[chosen]);
}
}
void main() {
auto randomLengthArray() {
return new int[uniform(1, 101)];
}
auto a = randomLengthArray();
auto b = randomLengthArray();
auto c = randomLengthArray();
writeln("As independent arguments:");
print_random_elem_addr(a, b, c);
writeln("As a single argument:");
print_random_elem_addr([a, b, c]);
}
Warning: The array that is automatically generated by the first
print_random_elem_addr() call in main() is short-lived: You cannot store
a slice of it because the array that contains the arguments may be
destroyed upon leaving the function (e.g. in the "independent" case above).
Here is some more information:
http://ddili.org/ders/d.en/parameter_flexibility.html#ix_parameter_flexibility.variadic%20function
There are other ways of doing the same thing. For example, if you want
to work with different ranges, you can use tuple template parameters:
http://ddili.org/ders/d.en/templates_more.html#ix_templates_more.tuple%20template%20parameter
Ali
More information about the Digitalmars-d-learn
mailing list