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