Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2

Index was outside the bounds of array

19.09.2017, 17:31. Показов 2255. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь сделать лексер, получаю такую ошибку в строке 46.

Вот дословный код:

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
    public class Lexer
    {
        public static int last_id = 0;
        public static int tokens_number = 0;
        public static bool in_string = false;
 
        public Lexer ()
        {
            
        }
 
        public static int Tokenize(char[] text, string tokens, string[] out_buffer)
        {
            for (int i_text = 0; i_text < text.Length; i_text++) // Обходим текст
            {
                for (int i_token = 0; i_token < tokens.Length; i_token++) // Обходим токены
                {
                    if (text [i_text] == tokens [i_token]) // Если символ текста - токен
                    {
                        if (tokens_number != 0 && out_buffer[tokens_number - 1] != "\\" && (text[i_text] == '\"' || text[i_text] == '\'')) in_string = !in_string; // Если встретилась кавычка без слеша, меняем состояние: мы сейчас в кавычках/вне кавычек
 
                        for (int i_buffer = 0, i_char = 0; i_char <= i_text - last_id;) // Обходим все символы, начиная с последнего записанного + 1, и заканчивая текущим
                        {
                            if (i_char != i_text - last_id)                                       // Если до самого токена не долши
                            {
                                out_buffer[tokens_number] += text[last_id + i_char].ToString(); // Записываем символ в буфер
 
 
                                //if (((IS_NOT_SPACE(text[last_id + itext])) && !we_in_string) || we_in_string)
                                //{
                                //       out_buffer[tokens_number][ibuffer] = text[last_id + itext] ;// Записываем символ в буфер
 
                                //   ++ibuffer;
                                //    ++itext;
                                //}
                                //else 
 
                                ++i_buffer;
                                ++i_char;
 
                            }
                            else                                                            // Если дошли
                            {
                                tokens_number++;                                            // Выделяем отдельное место для токена
 
                                out_buffer[tokens_number] += text[i_text].ToString();       // И записываем его
                            }
                        }
 
                        tokens_number++;
 
                        last_id = i_text + 1;
                    }
                }
            }
 
            return 0;
        }
    }
 
    class MainClass
    {
        public static void Main (string[] args)
        {
            char[] text = new char[1024];
            text = ("using System;\n\nnamespace MONOCX\n{\n\tclass MainClass\n\t{\n\t\tpublic static void Main (string[] args)\n\t\t{\n\t\t\tConsole.WriteLine (\"Hello World!\");\n\t\t\tchar[] = \"test.text() ? 1 : --0;\"\n\t\t}\n\t}\n}").ToCharArray();
            string tokens = " \n\r\t\v\"\'()[]{}!@#$:;.,/?%^&*-=+|";
            string[] out_buffer = new string[1024];
            Lexer.Tokenize(text, tokens, out_buffer);
            Console.WriteLine (out_buffer);
        }
    }
Кто подскажет? В чём моет быть проблема?

Какого чёрта он за пределами буфера, если раззмер text = 1024, как и string, не меньше 5.

Снимок со значениями всех переменных и местом возникновения исключения прилагается.

P.S.: tokens_number == 1
Миниатюры
Index was outside the bounds of array  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2017, 17:31
Ответы с готовыми решениями:

Index was outside the bounds of the array
Всем привет, есть задание, надо создать программу которая используя частотный анализ будет расшифровывать текст. Начал писать первый...

Как исправить ошибку Index was outside the bounds of the array в игре Шашки (при перемещении)
Вот код. Я пометил места где возникают ошибки(ошибки возникают на крайних элементах).

Помогите исправить ошибку "Index was outside the bounds of the array"
int a = { 27, 12, 4, 2, 9, 10, 0 }; foreach (int v in a) { Console.Write(&quot;| {0} |&quot;, v); ...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2017, 17:47
Лучший ответ Сообщение было отмечено mkostoevr как решение

Решение

Цитата Сообщение от mkostoevr Посмотреть сообщение
P.S.: tokens_number == 1
В скрине отладчика этого не видно.
Подозреваю, что значение на самом деле — 1024.

Добавлено через 1 минуту
Кстати, зачем все поля класса объявлены статическими? Выглядит как баг.

Добавлено через 4 минуты
Цитата Сообщение от mkostoevr Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                        for (int i_buffer = 0, i_char = 0; i_char <= i_text - last_id;) // Обходим все символы, начиная с последнего записанного + 1, и заканчивая текущим
                        {
                            if (i_char != i_text - last_id)                                       // Если до самого токена не долши
                            {
                                out_buffer[tokens_number] += text[last_id + i_char].ToString(); // Записываем символ в буфер
 
                                ++i_buffer;
                                ++i_char;
 
                            }
                            else                                                            // Если дошли
                            {
                                tokens_number++;                                            // Выделяем отдельное место для токена
 
                                out_buffer[tokens_number] += text[i_text].ToString();       // И записываем его
                            }
                        }
Вот в этом участке кода не видно изменений переменных, которые бы повлияли на условие цикла в случае невыполнения условия внутри цикла.
Если на первой итерации i_char == i_text - last_id, то цикл зястрянет на блоке else до тех пор, пока tokens_number не выйдет за границы массива out_buffer.
1
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2
19.09.2017, 18:35  [ТС]
Действительно... Не рассчитал...

Спасибо!

Добавлено через 3 минуты
Поля статические, чтобы не писать каждый раз "Lexer.Variable". А методы - чтобы вызывать их не создавая объект.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
19.09.2017, 18:47
Цитата Сообщение от mkostoevr Посмотреть сообщение
Поля статические, чтобы не писать каждый раз "Lexer.Variable".
Учтите, что эти поля общие для всех экземпляров.
0
Незнайка
26 / 11 / 2
Регистрация: 14.10.2016
Сообщений: 373
Записей в блоге: 2
19.09.2017, 18:56  [ТС]
kolorotur, буду знать, спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2017, 18:56
Помогаю со студенческими работами здесь

Почему выбивает ошибку "Index was outside the bounds of the array"?
Здравствуйте ув. форумчане! Помогите пожалуйста, не могу понять почему выбивает ошибку &quot;Index was outside the bounds of the...

Ошибка "Index was outside the bounds of the array" при отправке сообщения с вложениями
При отправке сообщения с вложениями выскакивает вот эта ошибка: Что это может быть?

Index was outside the bounds of the array
Помогите пожалуйста. На другом компе все работало, на этом не хочет. В ответе выходило -48. сейчас кидает ошибку program fiba; ...

Index was outside the bounds of the array
Здравствуйте. Изучаю пример на VB2010. Считываю COMport. При первом считывании работает, а при втором( через 1S) при выводе на Label ,...

System.IndexOutOfRangeException Index was outside the bounds of the array
Приветствую всех. Столкнулся с проблемой System.IndexOutOfRangeException Index was outside the bounds of the array. Имеется код ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru