在D中通过引用传递数组
我正在尝试将函数在D中通过引用传递数组,d,D,我正在尝试将函数M中的数据从matrixA复制到matrixB,但出现错误: app.d(20): Error: function app.M (double[][] s, ref double[][] d, int row, int col) is not callable using argument types (double[5][5], double[][], int, int) 代码: 目前,让多维动态数组与静态数组配合使用有点困难 要回答您的问题,您可以使用模板定义一个函数,该函
M
中的数据从matrixA
复制到matrixB
,但出现错误:
app.d(20): Error: function app.M (double[][] s, ref double[][] d, int row, int col) is not callable using argument types (double[5][5], double[][], int, int)
代码:
目前,让多维动态数组与静态数组配合使用有点困难 要回答您的问题,您可以使用模板定义一个函数,该函数可以采用以下任一方式:
void M(T)(T s, ref double[][] d, int row, int col)
if (is(typeof(s[0][0]) : double))
{ }
此声明表示源s
可以是任何类型的T
,因此将T索引为0,0将返回一个double(或隐式转换为double的内容)
但是,您的函数体将无法按显示的方式工作。当s和d的大小可能不同时,您不能仅将其分配给d。这可能更接近您所要查找的内容:
{
d.length = row;
foreach(i ; 0 .. d.length)
d[i] = s[i][0..col].dup;
}
这里似乎有两个问题。一个是
ref
问题,另一个是无法进行隐式转换的问题
在D中使用ref
时,类型必须完全匹配。隐式转换不会剪切它。例如,如果
int[5] a = [1, 2, 3, 4, 5];
int[] b = a;
你有
void foo(int[] bar) {}
然后这两行都将编译
foo(a);
foo(b);
因为静态数组隐式转换为动态数组,但是如果您更改它,使foo
按ref获取其参数
void foo(ref int[] a) {...}
然后
因此,如果您有一个接受ref double[][]
的函数,则必须向其传递double[][]
。隐式转换为double[][]
的任何函数都不起作用
现在,比这更糟糕的是,因为您正在传递一个double[5][5]
,它不会隐式转换为double[][]
。因此,即使ref
接受隐式转换,您的代码也不会工作,即使删除ref
,您的代码也不会工作。一维静态数组可以切片(隐式或显式)获取动态数组,但不能切片多维静态数组以获取动态数组
double[5] a;
double[] b = b; // compiles
double[] c = a[]; // compiles
double[5][5] d;
double[][] e = d; // does not compile
double[][] f = d[]; // does not compile
好的,如果您想将double[5][5]
分配给double[][]
,您必须执行以下操作
double[5][5] a;
double[][] b;
foreach(i; row; a)
b[i] = row[];
最近已经做了一些工作,用多维切片支持用户定义的类型,因此可以将
double[5][5]
切片到double[]
的语法我不知道,但它可能只适用于用户定义的类型。无论如何,没有从double[5][5]
到double[]
,而隐式转换不适用于ref
,如果您提供了编译时使用的代码,则会更容易为您提供帮助。即使您尝试执行的操作是正确的,这里的内容也不会编译,因为您在数组定义中使用了…
,并且在任何数组定义之外调用了M
函数和不存在的参数。可以考虑……作为[ 1,2,3,4,5 ],我试图调用M内部main。
double[5] a;
double[] b = b; // compiles
double[] c = a[]; // compiles
double[5][5] d;
double[][] e = d; // does not compile
double[][] f = d[]; // does not compile
double[5][5] a;
double[][] b;
foreach(i; row; a)
b[i] = row[];