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(); // И записываем его } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д