Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132

Проход по элементам коллекции и ошибка "Индекс находился за пределами диапазона"

28.11.2012, 19:11. Показов 2473. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
День добрый,

у меня тут достаточно загадочная ситуация. нужна помощь.

есть цикл, при помощи которого я прохожу по всем элементам коллекции, от 0-ого элемента до последнего. в коллекции 20 элементов.
сам массив заполняется в другом методе.
проблема в том, что периодически вылезает ошибка
Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index

я сделал вывод в текстовый файл, того, что у меня происходит и видно, что на лог останавливается на последнем элементе. и далее соответственно вылезает ошибка.
лог:
Кликните здесь для просмотра всего текста
tick_points.Count, индекс цикла (), X, Y, диаметр
20 0, 107 ,14285 ,6
20 1, 117 ,14305 ,6
20 2, 127 ,14305 ,6
20 3, 137 ,14285 ,6
20 4, 147 ,14285 ,6
20 5, 157 ,14285 ,6
20 6, 167 ,14325 ,6
20 7, 177 ,14305 ,6
20 8, 187 ,14285 ,6
20 9, 197 ,14305 ,6
20 10, 207 ,14305 ,6
20 11, 217 ,14305 ,6
20 12, 227 ,14305 ,6
20 13, 237 ,14305 ,6
20 14, 242 ,14300 ,16
20 15, 257 ,14305 ,6
20 16, 267 ,14285 ,6
20 17, 277 ,14305 ,6
20 18, 287 ,14305 ,6
20 19, 297 ,14305 ,6
20 0, 107 ,14305 ,6
20 1, 117 ,14305 ,6
20 2, 127 ,14285 ,6
20 3, 137 ,14285 ,6
20 4, 147 ,14285 ,6
20 5, 157 ,14325 ,6
20 6, 167 ,14305 ,6
20 7, 177 ,14285 ,6
20 8, 187 ,14305 ,6
20 9, 197 ,14305 ,6
20 10, 207 ,14305 ,6
20 11, 217 ,14305 ,6
20 12, 227 ,14305 ,6
20 13, 232 ,14300 ,16
20 14, 247 ,14305 ,6
20 15, 257 ,14285 ,6
20 16, 267 ,14305 ,6
20 17, 277 ,14305 ,6
20 18, 287 ,14305 ,6


видно, что до последнего элемента под индексом 19 - цикл не дошел, вылезла ошибка.
загадка в том, что ошибка вылезает даже если проверять элемент на равенство нулю! о как.

C#
1
2
     if (tick_points[z] != null)
                            writer.WriteLine(tick_points.Count + " " + z + ", " + (tick_points[z].X - kroog_size / 2) + " ," + (tick_points[z].Y - kroog_size / 2) + " ," + kroog_size);
вот так я тоже не могу написать ибо вылезает та же самая ошибка. как быть в таком случае или отсеять нулевые элементы?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
                for (int z = 0; z < tick_points.Count; z++)
                {
                    // определение направления сделки в зависимости от элемента массива
                    if (direction_mass[z] == "buy") deal_direction = true; else deal_direction = false;
 
 
                    // определение размера кружочка в зависимости от объема
                    if (volume_mass[z] <= limit_size_1) { kroog_size = kroog_diametr_1; }; // <= 10
                    if (volume_mass[z] > limit_size_1 && volume_mass[z] < limit_size_2) { kroog_size = kroog_diametr_2; show_string = true; }; // > 10 < 100
                    if (volume_mass[z] >= limit_size_2) { kroog_size = kroog_diametr_3; show_string = true; }; // >=100
 
 
                    // в соответствии с данными из массивов - рисуем круг
                    if (deal_direction) g.DrawEllipse(new Pen(Color.Green, 1), tick_points[z].X - kroog_size / 2, tick_points[z].Y - kroog_size / 2, kroog_size, kroog_size); else g.DrawEllipse(new Pen(Color.LightCoral, 1), tick_points[z].X - 3, tick_points[z].Y - 3, 6, 6); // Х - горизонтальная координата, Y - вертикальная. элипс рисуется от верхнего правого круга по этому от места точки - нужно отступить 1/2 диавметра влево и вверх. 6 - диаметр, 3 - радиус
                    // фон круга
 
 
                    using (StreamWriter writer = new StreamWriter(@"C:\\1.txt", true))
                    {
                        
                        //if (tick_points[z] != null)
                            //writer.WriteLine(tick_points.Count + " " + z + ", " + (tick_points[z].X - kroog_size / 2) + " ," + (tick_points[z].Y - kroog_size / 2) + " ," + kroog_size);
                    }
                                        
                    if (deal_direction) g.FillEllipse(Brushes.LimeGreen, tick_points[z].X - kroog_size / 2, tick_points[z].Y - kroog_size / 2, kroog_size, kroog_size); else g.FillEllipse(Brushes.LightPink, tick_points[z].X - kroog_size / 2, tick_points[z].Y - kroog_size / 2, kroog_size, kroog_size);
                    //ошибка вылезает индекс за пределами диапазона? есть подозрение, что в момент очистки очереди происходит обращеие в пустой массив
 
                    // цифра в кружочке
                    if (show_string) g.DrawString(volume_mass[z].ToString(), kroog_font, Brushes.Black, (tick_points[z].X - g.MeasureString(volume_mass[z].ToString(), kroog_font).Width / 2), tick_points[z].Y - kroog_font.Height / 2); // // выводим объем текстом. что бы определить куда нужно выводить строку - нужно ее длину поделить пополам и результат вычесть из точки. длина строки зависит от того, каким шрифтом пишем
                                        
                    show_string = false; // переведем флаг показывания цифры в кружочке в фолс, что бы если придет сдлека с объемом < 10 не выводить надпись
 
                } // for
Миниатюры
Проход по элементам коллекции и ошибка "Индекс находился за пределами диапазона"  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.11.2012, 19:11
Ответы с готовыми решениями:

Ошибка - Индекс за пределами диапазона
Здраствуйте! Помогите пож-та решить проблему. class SomeClass { public void SomeMethod(List&lt;string&gt; lst) { ...

Ошибка: Индекс за пределами диапазона
Ошибка: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции. ...

Индекс за пределами диапазона. Ошибка
Помогите исправить ошибку. Появляется при многократном добавлении записи в листбокс (но это не точно). Вот архив с моим проектом:

12
1 / 1 / 1
Регистрация: 25.11.2012
Сообщений: 9
28.11.2012, 19:19
Тут проблема не в том что вы обращаетесь к неинициализированному элементу массива, а в том что вы вылазиете за пределы массива

Проверить можно так

C#
1
2
if (z>=0&& z<tick_points.Count())
...
0
33 / 31 / 7
Регистрация: 16.08.2012
Сообщений: 126
28.11.2012, 19:24
Зачем поверять, можно просто не вылазить за пределы
C#
1
for (int z = 0; z < tick_points.Count-1; z++)
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
28.11.2012, 23:29  [ТС]
вы меня не совсем поняли. мне не нужно обрезать количество проходов по массиву. в нем 20 элементов, вот все их и нужно перебирать. просто в какой то момент получается, что коллекция - становится меньше на один элемент. я пока не разобрался еще с этим. тоесть как то нужно прикрутить проверку на то инициализированный элемент или нет.
0
1 / 1 / 1
Регистрация: 25.11.2012
Сообщений: 9
29.11.2012, 07:57
Как раз таки тот код что я привел проверяет находится ли z в массиве. Непонятно только почему массив становится меньше
0
Не осилил Linux
 Аватар для =OutlaW=
267 / 61 / 6
Регистрация: 06.08.2009
Сообщений: 223
29.11.2012, 10:29
slinger если ты не меняешь коллекцию в цикле она может измениться только из другого потока.
попробуй обратный проход, чисто ради интереса:
C#
1
2
3
for (int z = tick_points.Count - 1; z >= 0; z--)
{
}
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
29.11.2012, 13:41  [ТС]
да так и есть, размер коллекции может измениться и это как раз происходит из другого потока. происходит это крайне редко. обратный проход не поможет ибо цикл может начаться по одному количеству элементов, а в процессе обхода - оно опять изменится.

нужно как то проверять последний элемент на то, инициализирован он или нет. вот в чем вопрос
0
Не осилил Linux
 Аватар для =OutlaW=
267 / 61 / 6
Регистрация: 06.08.2009
Сообщений: 223
29.11.2012, 14:32
хм...из другого потока??? и ты это так спокойно сообщаешь только в 3-ем своем сообщении, и то только после моей наводки?
используй средства синхронизации. lock (tick_points) например, при всех обращениях к коллекции.
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
29.11.2012, 14:50  [ТС]
там у меня сложный алгоритм. я просто сам только заметил, что периодически другой поток меняет длину коллекции. по поводу lock не уверен. единственный вариант - не запускать цикл for, пока происходит изменение размера коллекции. и тогда lock надо будет ставить на тот участок, где и происходит изменение. чую - зависнит все к чертям тогда..
0
Не осилил Linux
 Аватар для =OutlaW=
267 / 61 / 6
Регистрация: 06.08.2009
Сообщений: 223
29.11.2012, 15:07
slinger, если цикл будет в локе, он и не запустится, пока другой lock не отпустит коллекцию.
сделай тело цикла минимальным по времени выполнения, и блокируй.
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
29.11.2012, 15:11  [ТС]
тоесть блокировать и цикл и то место, в котором меняется размер коллекции?
0
Не осилил Linux
 Аватар для =OutlaW=
267 / 61 / 6
Регистрация: 06.08.2009
Сообщений: 223
29.11.2012, 16:27
Цитата Сообщение от slinger Посмотреть сообщение
тоесть блокировать и цикл и то место, в котором меняется размер коллекции?
блокировать все места, где происходит обращение к коллекции. и цикл в том числе.
но стараться делать код внутри локов наиболее быстро выполняющимся.
0
4 / 4 / 0
Регистрация: 21.04.2012
Сообщений: 132
29.11.2012, 16:41  [ТС]
вопрос по lock: если лок будет установлен на код, который должен добавить элемент в коллекцию, вот пример

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// заполняем очередь тиков + параллельно коллекцию объемов и направлений сделок. эти три коллекции - идут параллельно
            if (tick_que.Count <= que_length) // кол-во элементов в очереди
            {
                tick_que.Add(price); // добавли элемент в колекцию тиков
                volume_que.Add(volume);
                direction_que.Add(action);
            }
            else
            {
                tick_que.Clear(); volume_que.Clear(); direction_que.Clear();// удалить все элементы из коллекции
 
                form1_root.stakan.que_elements_procceded = 1; // обнулим счетчик обработанных элементов очереди
                tick_que.Add(price); volume_que.Add(volume); direction_que.Add(action); // и опять добавим элементы
            }
то, добавление будет отложено до тех пор пока другой лок не отпустит tick_que? я правильно понимаю?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2012, 16:41
Помогаю со студенческими работами здесь

График функции и ошибка: Индекс за пределами диапазона
График не получается. ошибка: Индекс за пределами диапазона. помогите пожалуйста... using System; using...

Индекс за пределами диапазона. Что за новая чудо-ошибка?
Всем привет! С этой ошибкой пожалуй знаком каждый программист, который написал хотя бы один цикл/ Но сегодня она предстала передо...

Ошибка при записи в ListBox (Индекс за пределами диапазона)
Имеется вот такой кодusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

Ошибка при умножении матриц, индекс за пределами диапазона
private void button1_Click(object sender, EventArgs e) { int arrColCount =...

Ошибка при произведении матриц (Индекс за пределами диапазона)
Помогите пожалуйста. private void button1_Click(object sender, EventArgs e) { int arrColCount =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru