在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[];