Arrays 错误:D编程中的范围冲突

Arrays 错误:D编程中的范围冲突,arrays,d,Arrays,D,我在struct中有动态数组和一个使用动态数组的方法。问题是,当我运行程序时,出现了范围冲突错误。但是,当我在方法内部创建一个新的动态数组时,它工作得很好。以下代码会导致问题 struct MyStr { int[] frontArr; this(int max = 10) { frontArr = new int[10]; } void push(int x) { frontArr[0] = x; } } void m

我在struct中有动态数组和一个使用动态数组的方法。问题是,当我运行程序时,出现了范围冲突错误。但是,当我在方法内部创建一个新的动态数组时,它工作得很好。以下代码会导致问题

struct MyStr {
 int[] frontArr;

    this(int max = 10) {
         frontArr = new int[10];
    }

    void push(int x) {
         frontArr[0] = x;
    }
}

void main() {
    MyStr s;
    s.push(5);
}

然而,这一个有效

struct MyStr {
 int[] frontArr;

    this(int max = 10) {
         frontArr = new int[10];
    }

    void push(int x) {
         frontArr = new int[10]; // <---Add this line
         frontArr[0] = x;
    }
}

void main() {
    MyStr s;
    s.push(5);
}
struct MyStr{
int[]frontArr;
这(int max=10){
frontArr=新整数[10];
}
无效推送(整数x){
frontArr=new int[10];//我可能错了(我已经有一段时间没有使用D了,所以它有点生疏了。)但是frontArr是一个数组,在您的代码示例中,您试图为它分配一个指向数组的指针。动态数组的工作原理是这样的(注意复制了一个D教程)


无论出于何种原因,D不支持不需要参数的结构构造函数,请使用opCall或删除
this()


必须保证结构的初始化。这是因为您不希望结构的默认构造引发异常。因此,D不支持结构中的默认构造函数。假设

MyStr s;
导致引发异常。相反,D提供了自己的默认构造函数,该构造函数将初始化init属性的所有字段。在您的情况下,您没有调用构造函数,只是使用提供的默认值,这意味着frontArr从未初始化。您希望类似于:

void main() {
    MyStr s = MyStr(10);
    s.push(5);
}

为结构构造函数的所有参数设置默认值可能是编译器的错误。

您遇到了什么问题?您是否尝试过向构造函数中放入writefln调用以确保它实际被执行?@DK这是个好主意。是的,创建的构造函数从未被调用。实际上,(new int[10])生成一个数组,而不是指向数组的指针。如果它生成了,代码将根本无法编译。代码看起来很好;我所能想到的是,构造函数没有因为某种奇怪的原因而被调用。谢谢,@DK看起来我对D的了解比我想象的更粗糙。听起来不错。让我试试,我会让你知道的。谢谢!它必须做到这一点所有类型的
init
属性在编译时都必须是已知的。对于structs,这实际上是默认构造函数。但由于构造函数将在运行时运行,这不起作用。因此,无论成员变量直接初始化为什么值,都将用于
init
和默认构造函数不允许使用。静态
opCall()
是解决问题的一种方法。但是,您必须执行类似
auto s=MyStr()
的操作,而不是问题代码中使用的
MyStr s
MyStr s
将始终使用
init
属性。
MyStr s;
void main() {
    MyStr s = MyStr(10);
    s.push(5);
}