Индекс находился вне границ массива. хотя я пытался это остановить

2
while (worldY != WorldHeight) { //3rd pass (Filling in rough terrain)
    while (worldX != WorldWidth) {
        if (worldY > 0) {
            if (world[worldX, worldY-1] == 1) { world[worldX, worldY] = 1; }
            if (worldX > 0) {
                if (world[worldX-1, worldY-1] == 1) { world[worldX, worldY] = 1; }
            }
            if (worldX < WorldWidth) {
                if (world[worldX+1, worldY-1] == 1) { world[worldX, worldY] = 1; }
            }
        }
        if (worldX > 0) {
            if (world[worldX-1, worldY] == 1) { world[worldX, worldY] = 1; }
        }
        if (worldX < WorldWidth) {
            if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
        }
        worldX++;
    }
    worldX = 0;
    worldY++;
}

Некоторое время я искал это, спрашивал об этом моих друзей и интернет, но почему каждый раз, когда он достигает здесь, он игнорирует мои первоначальные заявления if и подходит к тем, кого я не хочу, давая мне System.IndexOutOfRangeException: Индекс находился за пределами массива. даже при том, что я помещаю код, который выглядит так, как будто это должно помешать этому.

какие-либо предложения? или альтернативный код?

  • 0
    Предложение, мимо некоторых выборочных данных и инициализации, и то , что вы ожидаете , что выход будет, и те подвесные кронштейны и одна линия , if s просто сделать его все более запутанной
Теги:
indexoutofboundsexception

1 ответ

2
Лучший ответ

Если подумать, что проблема в логике выглядит так:

if (worldX < WorldWidth) {
    if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}

Здесь вы проверяете, меньше ли worldX меньше WorldWidth и затем использует worldX + 1. Но это небезопасно. Рассмотрим случай, когда WorldWidth равен 6, а worldX равно 5. Тогда вы проверяете только штраф, но worldX + 1 тогда равно 6 и вызывает IndexOutOfBoundsException.

Правильный способ справиться с этим:

if ((worldX + 1) < WorldWidth) {
    if (world[worldX+1, worldY] == 1) { world[worldX, worldY] = 1; }
}

Эта же проблема присутствует дважды в вашем коде, поэтому, как только вы исправляете эти вхождения, она должна работать так, как ожидалось.

Также в качестве предложения я бы предложил использовать while (index < length) вместо while (index != length). Хотя оба работают в этом случае, если позже вы решили увеличить индекс на два по какой-то причине, вы можете попасть в бесконечный цикл, если только индекс просто пропустил точное значение длины.

  • 0
    Вау, у тебя глаза лучше, чем у меня, у меня просто остекленели. Upvote
  • 0
    @TheGeneral Слишком много ifs :-D
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню