Arrays 错误:D编程中的范围冲突
我在struct中有动态数组和一个使用动态数组的方法。问题是,当我运行程序时,出现了范围冲突错误。但是,当我在方法内部创建一个新的动态数组时,它工作得很好。以下代码会导致问题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 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);
}