Ошибка с листом [РЕШЕНО]

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Ошибка с листом [РЕШЕНО]

Сообщение trololoid 21 окт 2012, 13:31

Ошибка такова:
Скрытый текст:
InvalidOperationException: Collection was modified; enumeration operation may not execute.
System.Collections.Generic.List`1+Enumerator[System.Int32].VerifyState ()
System.Collections.Generic.List`1+Enumerator[System.Int32].MoveNext ()
TerrainCreater.CreateTerrain () (at Assets/_Script/TerrainCreater.cs:20)


Код главного действующего лица:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class TerrainCreater : MonoBehaviour
{
    public  Manager mn;
    public  MeshFilter Filter;
    public  List<int> bases =new List<int>();

    [ContextMenu("Create Terrain")]
    void CreateTerrain()
    {
        Debug.Log("1");
        for (int i=0;i<mn.BaseAmount;i++)
        {
            Debug.Log("2");
            int temp= Random.Range(0, mn.TerrainLength);
            Debug.Log(temp);
//20 -снизу
           foreach (int bs in bases)
            {
                Debug.Log("3");
                int size = mn.granitsa;
                while(bs-size<temp&&bs+size>temp)
                {
                    Debug.Log("4");
                    temp = Random.Range(0, mn.TerrainLength);
                }
                bases.Add(temp);
                Debug.Log(temp+"Added-Down");
            }
        }
    }
}


Код склада переменных:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Manager : MonoBehaviour
{
    public int TerrainLength=2000;
    public int BaseAmount=3;
    public int granitsa = 20;
}


Консоль:
Скрытый текст:
Изображение


Сижу в ступоре, что не так :-\
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось trololoid 21 окт 2012, 15:19, всего редактировалось 1 раз.
Аватара пользователя
trololoid
Старожил
 
Сообщения: 712
Зарегистрирован: 15 сен 2011, 19:18
Откуда: Туапсе, Краснодарский край, Россия

Re: Ошибка с листом

Сообщение waruiyume 21 окт 2012, 13:45

Создайте дополнительный список и добавляйте в него, а потом слейте их вместе.
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Ошибка с листом

Сообщение Nicloay 21 окт 2012, 14:34

проблема в том что ты итерируешься по base и в него же добавляешь значение, возможен бесконечный цикл, если будешь использовать for - то такого не будет.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Ошибка с листом

Сообщение trololoid 21 окт 2012, 15:14

Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class TerrainCreater : MonoBehaviour
{
    public Manager mn;
    public MeshFilter Filter;
    public List<int> bases = new List<int>();
    public List<int> tmp = new List<int>();

    [ContextMenu("Clear Lists")]
    void ClearLists()
    {
        bases.Clear();
        tmp.Clear();
    }

    [ContextMenu("Create Terrain")]
    void CreateTerrain()
    {
        for (int i = 0; i < mn.BaseAmount; i++)
        {
            int temp = Random.Range(0, mn.TerrainLength);
            Debug.Log(temp);
            if (bases.Count > 0)
            {
                foreach (int bs in bases)
                {
                    //Заполняем временный лист
                    tmp.Add(bs);
                }
                foreach (int bs in tmp)
                {
                    int size = mn.granitsa;
                    while (bs - size < temp && bs + size > temp)
                    {
                        //Если между базами не хватает места, то пересчёт
                        temp = Random.Range(0, mn.TerrainLength);
                    }
                    bases.Add(temp);
                    Debug.Log(temp + " Added-Down");
                }
                tmp.Clear();
            }
            else
            {
                //Первая база
                bases.Add(temp);
            }

        }
    }

}


Появился забавный эффект.
Если кол-во баз должно быть 2, то всё работает как надо.
Изображение
Если 3, то:
Изображение
Если 4, то:
Изображение
Вообщем с трёх баз начинает возводить кол-во одинаковых чисел в квадрат.

Решил проверкой на наличие этого числа в главном листе, чувствую, что индус поступил бы также.

Вдруг оказалось, что с третей базы начинает добавляться лишняя база, решил проверкой на кол-во чисел. Теперь мне можно пить чай с индусами.
Финальная версия такова:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;

public class TerrainCreater : MonoBehaviour
{
    public Manager mn;
    public MeshFilter Filter;
    public List<int> bases = new List<int>();
    public List<int> tmp = new List<int>();

    [ContextMenu("Clear Lists")]
    void ClearLists()
    {
        bases.Clear();
        tmp.Clear();
    }

    [ContextMenu("Create Terrain")]
    void CreateTerrain()
    {
        bases.Clear();
        for (int i = 0; i < mn.BaseAmount; i++)
        {
            int temp = Random.Range(0, mn.TerrainLength);
            Debug.Log(temp);
            if (bases.Count > 0)
            {
                foreach (int bs in bases)
                {
                    //Заполняем временный лист
                    tmp.Add(bs);
                }
                foreach (int bs in tmp)
                {
                    int size = mn.granitsa;
                    while (bs - size < temp && bs + size > temp)
                    {
                        //Если между базами не хватает места, то пересчёт
                        temp = Random.Range(0, mn.TerrainLength);
                    }
                    if (!bases.Contains(temp)&&bases.Count<mn.BaseAmount)
                    {
                        bases.Add(temp);
                        Debug.Log(temp + " Added-Down");
                    }
                }
                tmp.Clear();
            }
            else
            {
                //Первая база
                bases.Add(temp);
            }

        }
    }

}
 
Аватара пользователя
trololoid
Старожил
 
Сообщения: 712
Зарегистрирован: 15 сен 2011, 19:18
Откуда: Туапсе, Краснодарский край, Россия


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6