Index was outside the bounds of array - C#

Узнай цену своей работы

Формулировка задачи:

Пытаюсь сделать лексер, получаю такую ошибку в строке 46. Вот дословный код:
    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»

textual
Листинг программы
                        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();       // И записываем его
                            }
                        }

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы