Variable "i" can not be read at compile time
ag0aep6g
anonymous at example.com
Sun May 24 16:57:54 UTC 2020
On 24.05.20 18:34, data pulverizer wrote:
> I'm getting the error:
>
> ```
> Error: variable i cannot be read at compile time
> Error: template instance
> script.runKernelBenchmarks!(Tuple!(DotProduct!float, Gaussian!float,
> Polynomial!float, Exponential!float, Log!float, Cauchy!float,
> Power!float, Wave!float, Sigmoid!float)) error instantiating
> ```
>
> When I run ...
>
> ```
> ...
> auto runKernelBenchmarks(KS)(KS kernels, long[] n, bool verbose = true)
> {
> auto tmp = bench(kernels[0], n, verbose);
> alias R = typeof(tmp);
> R[] results = new R[kernels.length];
> results[0] = tmp;
> for(size_t i = 1; i < results.length; ++i)
> {
> results[i] = bench(kernels[i], n, verbose);
> }
> return results;
> }
>
> void main()
> {
> alias T = float;
> auto kernels = tuple(DotProduct!(T)(), Gaussian!(T)(1),
> Polynomial!(T)(2.5f, 1),
> Exponential!(T)(1), Log!(T)(3), Cauchy!(T)(1),
> Power!(T)(2.5f), Wave!(T)(1), Sigmoid!(T)(1,
> 1));
> string[] kernelNames = ["DotProduct", "Gaussian", "Polynomial",
> "Exponential", "Log", "Cauchy",
> "Power", "Wave", "Sigmoid"];
> long[] n = [100L, 500L, 1000L];
> auto results = runKernelBenchmarks(kernels, n);
> writeln("Results: ", results);
> }
> ```
Since `kernel` is a `Tuple`, you can only access it with compile-time
constant indices.
But your loop variable `i` is not a compile-time constant, it's being
calculated at run time. What's more, it depends on `results.length`
which is also not a compile-time constant. But `results.length` is the
same as `kernels.length`. And being the length of a `Tuple`, that one is
a compile-time constant.
So you can rewrite your loop as a `static foreach` (which is evaluated
during compile-time) using `kernels.length` instead of `results.length`:
static foreach (i; 1 .. kernels.length)
{
results[i] = bench(kernels[i], n, verbose);
}
More information about the Digitalmars-d-learn
mailing list