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