Index was outside the bounds of array - C#
Формулировка задачи:
Пытаюсь сделать лексер, получаю такую ошибку в строке 46.
Вот дословный код:
Кто подскажет? В чём моет быть проблема?
Какого чёрта он за пределами буфера, если раззмер text = 1024, как и string, не меньше 5.
Снимок со значениями всех переменных и местом возникновения исключения прилагается.
P.S.: tokens_number == 1
Листинг программы
- 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);
- }
- }
Решение задачи: «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(); // И записываем его
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д