Ошибка: нарушение диапазона в программировании 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;
Другие вопросы по тегам