Ошибка: нарушение диапазона в программировании D
У меня есть динамический массив в структуре и метод, который использует динамический массив. Проблема в том, что я получаю ошибку нарушения диапазона при запуске программы. Однако, когда я создаю новый динамический массив внутри метода, он работает нормально. Следующий код вызывает проблемы.
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);
}
Я в основном добавляю эту строку для проверки объема. Кажется, что инициализированный FrontArr нельзя увидеть в методе push(int x). Любое объяснение?
Заранее спасибо.
3 ответа
Инициализация структур должна быть гарантирована. Это то, что вы не хотите, чтобы конструкция по умолчанию создавала исключение. По этой причине D не поддерживает конструкторы по умолчанию в структурах. Представь если
MyStr s;
привело к исключению. Вместо этого D предоставляет свой собственный конструктор по умолчанию, который инициализирует все поля свойством init. В вашем случае вы не вызываете ваш конструктор, а просто используете предоставленные значения по умолчанию, что означает, что frontArr никогда не инициализируется. Вы хотите что-то вроде:
void main() {
MyStr s = MyStr(10);
s.push(5);
}
Вероятно, ошибкой компилятора должны быть значения по умолчанию для всех параметров конструктора структуры. Bugzilla
По какой-то причине D не поддерживает конструкторы структуры, которые не требуют аргументов, либо используйте opCall, либо удалите инициализатор по умолчанию в this()
struct MyStr {
int[] frontArr;
static MyStr opCall() {
MyStr s;
s.frontArr = new int[10];
return s;
}
void push(int x) {
frontArr[0] = x;
}
}
Я могу ошибаться (я давно не использовал D, поэтому он немного ржавый), но FrontArr - это массив, и в вашем примере кода вы пытаетесь присвоить ему указатель на массив. Динамические массивы работают примерно так (обратите внимание, что скопированный учебник D находится здесь)
int[] MyArray;
MyArray.length = 3;