Ошибка: нарушение диапазона в программировании D - PullRequest
4 голосов
/ 03 декабря 2010

У меня есть динамический массив в структуре и метод, который использует динамический массив. Проблема в том, что я получаю ошибку нарушения диапазона при запуске программы. Однако, когда я создаю новый динамический массив внутри метода, он работает нормально. Следующий код вызывает проблему.

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 ]

6 голосов
/ 03 декабря 2010

Инициализация структур должна быть гарантирована. Это то, что вы не хотите, чтобы конструкция по умолчанию создавала исключение. По этой причине D не поддерживает конструкторы по умолчанию в структурах. Представь, если

MyStr s;

привело к исключению. Вместо этого D предоставляет собственный конструктор по умолчанию, который инициализирует все поля свойством init. В вашем случае вы не вызываете конструктор, а просто используете предоставленные значения по умолчанию, что означает, что frontArr никогда не инициализируется. Вы хотите что-то вроде:

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

Вероятно, ошибкой компилятора должны быть значения по умолчанию для всех параметров конструктора структуры. Bugzilla

0 голосов
/ 03 декабря 2010

По любой причине, 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;
    }
}
0 голосов
/ 03 декабря 2010

Я могу ошибаться (я давно не использовал D, поэтому он немного ржавый), но FrontArr - это массив, и в вашем примере кода вы пытаетесь присвоить ему указатель на массив. Динамические массивы работают так (обратите внимание, что скопированный учебник D найден здесь )

int[] MyArray;
MyArray.length = 3;
...