вот мой метод, это просто вложенный цикл:
IEnumerator startNewRound()
{
string st = "آبپتثجچحخدذرضطظعغفقکگلمنوهی";
for (int i = 0; i < st.Length; i++)
{
for (int j = i + 1; i < st.Length; j++)
{
for (int z = j + 1; z < st.Length; z++)
{
if (z > st.Length) continue;
yield return new WaitForSeconds(0.1f);
Debug.Log("I = " + i + " J = " + j + " Z= " + z);
}
}
}
}
внезапно внутри цикла программа зависает на несколько секунд, счетчик 'j' меняется, и все взрывается! вот мой журнал:
не могу понять что не так!
В качестве примечания, журнал отладки внутри второго цикла, но вне третьего, вероятно, помог бы вам отладить проблему. Или действительно просто используя отладчик и пошагово. Вы бы быстро увидели, что j достигает значения, которое не должно было быть разрешено, и, вероятно, заметили бы проблему, описанную JamieC в своем ответе. Отладка — ваш друг.





Во втором вложенном цикле вы по ошибке используете i вместо j в качестве управляющей переменной цикла:
for (int j = i + 1; i < st.Length; j++)
Должно быть
for (int j = i + 1; j < st.Length; j++)
Почему это вызывает проблему? Давайте посмотрим на соответствующую часть вывода:
I = 0 J = 24 Z= 25
I = 0 J = 24 Z= 26
I = 0 J = 25 Z= 26
I = 0 J = 2147483647 Z= -2147483648
I = 0 J = 2147483647 Z= -2147483647
I = 0 J = 2147483647 Z= -2147483646
В тот момент, когда ваш код достигает I=0, J=25 и z=26 (что на единицу меньше длины st), происходит следующее:
z увеличивается до 27z < st.Length и, таким образом, завершает этот цикл.j увеличивается до 26z в j+1 (27)z < st.Length - ложь. Выйдите из цикла, даже не входя в него, чтобы вывести что-либоi < st.Length - true и входит в цикл.j увеличиваетсяХотя это правда, не будет ли j по-прежнему инициализироваться i+1 и никогда не будет таким отрицательным значением. Другими словами, ваш ответ верен, но отвечает ли он на вопрос?
отрицательное значение, вероятно, связано с переполнением int.
@LasseVågsætherKarlsen Возможно, вы правы, я не знаю - мы не можем видеть, что еще происходит. Но могу поспорить, что это как-то связано с этой переменной управления циклом!
@Stucky: почти наверняка правда, этот ответ мог бы на самом деле объяснить, почему код делает то, что он делает. Хорошие ответы объясняют не только, что нужно изменить, но и почему это необходимо.
@Chris, но мы не можем видеть достаточно остального кода, чтобы понять, что происходит. В настоящее время невозможно объяснить, но, как я уже сказал выше, я уверен, что это связано с циклом управления var!
о, подождите ... может быть, это так.
@Jamiec: вы абсолютно можете видеть основную проблему. По сути, третий цикл никогда ничего не делает, если j > st.length (поскольку z тоже будет). Таким образом, второй цикл продолжает увеличивать j, пока, наконец, не достигнет максимального значения, а затем z переполнится, и, наконец, третий цикл что-то сделает. Единственное, что я не могу понять, это почему j равно -2147483648, а не 2147483647. Я подозреваю, что это может быть связано с тем, что приведенный код не совсем соответствует тому результату, который нам показывают.
@Крис ага. Обновленный ответ. Его не так просто описать. Я думаю, вы могли бы сделать лучше, чем я
@Jamiec: я думаю, что ваш ответ описывает это превосходно! Я начал писать свой собственный ответ, пытаясь объяснить его полностью, и я был очень рад видеть, что вы выглядели так, будто собирались обновить, потому что мой ответ читается ужасно (добавленные детали для ответа сделали его очень беспорядочным).
Я оставляю свой предыдущий комментарий, чтобы не создавать пробелов в ветке комментариев, но вы, конечно, абсолютно правы.
Я не вижу ваш журнал как изображение. Опубликовать как текст