14 / 14 / 5
Регистрация: 16.01.2016
Сообщений: 81

Массив внутри класса static. Выбрасывает исключение на методе .Split

06.10.2018, 03:26. Показов 4428. Ответов 20

Студворк — интернет-сервис помощи студентам
здравствуйте! доделываю ранее заказанную программу. столкнулся с гнпонятным.
объявлен класс(часть):
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
public static class LexicalAnalyze
    {
        public struct OutStruct
        {
            public string Lexem;
            public enum type
            {
                Identifier, Splitter, Literal
            }
            public type Type;
 
        }
 
        private static List<OutStruct> LB1_Result;
 
        static string buffer = string.Empty;
        static int lengthtmp;
        static int csymb;
        static string ctext;
 
 
    ===> public static string[] SpecialWords[/B][/COLOR];// = { "procedure", "begin", "end", "var", "integer", "if", "then", "else" };
 
     ===> public static char[] similarSplitters[/B][/COLOR]; // = { ',', ';', '=', ':', '(', ')', '+', '-', '*', '/' , '<', '>'};
 
        public static List<string> LB2_SpecialWords = SpecialWords.ToList();
        public static List<string> LB2_Splitters;// список разделителей
        public static List<string> LB2_Literals;
        public static List<string> LB2_Variables;
        private static List<string> LB2_Result;
 
 
        /// <summary>
        /// Производит лексический анализ текста. 
        /// </summary>
        /// <param name="code">Параметр, в котором хранится текст. </param>
        /// <returns>Возвращает таблицу стандартных символов - список, содержащий форматированную строку вида "({0}$({1},{2})", где 
        /// {0} - это имя лексемы,
        /// {1} - это номер таблицы, в которой содержится лексема: 
        /// 1 - Спец. слова,
        /// 2 - Разделитель,
        /// 3 - Литерал,
        /// 4 - Идентификатор, 
        /// {2} - порядковый номер элемента, начиная с 0. 
        /// </returns>
 
        public static List<string> AnalyzeText(string code)
        {
            ctext = code;
            lengthtmp = ctext.Length;
            csymb = 0;
            buffer = string.Empty;
            LB1_Result = new List<OutStruct>();
            while (csymb != lengthtmp)
            {
                if (char.IsDigit(ctext[csymb]))
                {
                    bool isD = true;
                    Add();
                    Next();
                    while (isD)
                    {
                        if (char.IsDigit(ctext[csymb]))
                        {
                            Add();
                            Next();
                        }
                        else
                            isD = false;
                    }
                    Out(OutStruct.type.Literal);
                    Clear();
                }
                else if (char.IsLetter(ctext[csymb]) || (ctext[csymb] == '@' || ctext[csymb] == '#' || ctext[csymb] == '$'))
                {
                    bool isL = true;
                    Add();
                    Next();
                    while (isL && csymb < lengthtmp)
                    {
                        if (char.IsLetterOrDigit(ctext[csymb]))
                        {
                            Add();
                            Next();
                        }
                        else
                            isL = false;
                    }
                    Out(OutStruct.type.Identifier);
                    Clear();
                }
                else if (isSplitter(ctext[csymb]))
                {
                    Add();
                    Next();
                    Out(OutStruct.type.Splitter);
                    Clear();
                }
                else if (ctext[csymb] == ' ' || ctext[csymb] == '\n' || ctext[csymb] == '\t')
                    Next();
                else
                    throw new UnknownSymbol(ctext[csymb].ToString(), csymb, 1);
            }
           
            LB2_Splitters = new List<string>();
            ReturnListOfSplitters();
            LB2_Literals = new List<string>();
            LB2_Variables = new List<string>();
            LB2_Result = new List<string>();
            for (int i = 0; i < LB1_Result.Count; i++)
            {
...............................
в main из внешнего файла читается грамматика. в первой строке ключевые слова, в следующей разделители. попытки таковы:
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
73
74
75
class Program
    {
        static void Main(string[] args)
        {
            string file = "input.txt";
            string grammar = "grammar.txt";
 
            if (!IsFileExists(file) || !IsFileExists(grammar))
            {
                Console.WriteLine("Нет требуемых файлов");
                return;
            }
 
            string code = ReadFile(file);// входной файл с анали-мой программой
 
            if(code.Trim() == "")
            {
                Console.WriteLine("Файл input.txt пустой");
                return;
            }
 
            string gramm = ReadFile(grammar);//чтение файла с описанием грамматики
 
            if (gramm.Trim() == "")
            {
                Console.WriteLine("Файл grammar.txt пустой");
                return;
            }
 
            string[] words = gramm.Split(new char[] { '\n' });
            // string[] kwords;
            // string[] kwords1;
            //  kwords = words[0].Split(new char[] { ',' });--так работает
       ===>  LexicalAnalyze.SpecialWords = words[0].Split(new char[] { ',' });
 
          //  kwords1 = words[1].Split(new char[] { ',' });--так работает
     ===>    LexicalAnalyze.similarSplitters = words[1].Split(new char[] { ',' }).Select(ch => ch[0]).ToArray();
 
            try
            {
                var readyLex = LexicalAnalyze.AnalyzeText(code);
                SyntaxAnalyze.AnalyzeText(readyLex);
            }
            catch (Errors.Error error)
            {
                Console.WriteLine(error.Message);
                Console.WriteLine(error.Length);
            }
 
            Console.WriteLine("Описание правильное");
        }
 
        static string ReadFile(string path)
        {
            string text = "";
 
            // Функция ReadAllLines возвращает массив строк, поэтому мы снова превращаем ее в строку
            string[] readText = File.ReadAllLines(path);
            foreach (string s in readText)
            {
                text += s + '\n';
            }
 
            return text;
        }
 
        // Проверяем существует ли входной файл
        static bool IsFileExists(string path)
        {
            // Возвращает true если файл существует и false в ином случае
            return File.Exists(path);
        }
 
 
    }
в строке
C#
1
 LexicalAnalyze.SpecialWords = words[0].Split(new char[] { ',' });
System.TypeInitializationException
HResult=0x80131534
Сообщение = Инициализатор типа "var3task2.LexicalAnalyze" выдал исключение.
Источник = var3task2
Трассировка стека:
в var3task2.Program.Main(String[] args) в C:\Users\yazim\Desktop\var3task2\var3tas k2\Program.cs:строка 454

Внутреннее исключение 1:
ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source

в другой строке выдает
C#
1
 LexicalAnalyze.similarSplitters = words[1].Split(new char[] { ',' }).Select(ch => ch[0]).ToArray();
System.IndexOutOfRangeException
HResult=0x80131508
Сообщение = Индекс находился вне границ массива.
Источник = mscorlib
Трассировка стека:
в System.String.get_Chars(Int32 index)
в var3task2.Program.<>c.<Main>b__0_0(Strin g ch) в C:\Users\yazim\Desktop\var3task2\var3tas k2\Program.cs:строка 457
в System.Linq.Enumerable.WhereSelectArrayI terator`2.MoveNext()
в System.Linq.Buffer`1..ctor(IEnumerable`1 source)
в System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
в var3task2.Program.Main(String[] args) в C:\Users\yazim\Desktop\var3task2\var3tas k2\Program.cs:строка 457

как можно переписать эти две строки? как я понимаю, нужен объект класса в котором будет память для массива?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.10.2018, 03:26
Ответы с готовыми решениями:

Использовать private члены класса внутри static ф-ий этого же класса.
Все привет! Такая вот проблема. Есть класс (естественно тестовый, для пример): class SCRIPT{ private: SCRIPT(); ...

Вызов public метода public класса внутри static метода static класса
Подскажите, пожалуйста, возможен вызов не статического метода не статического класса внутри статического метода статического класса? ...

Как правильно создать массив объектов текущего класса в методе данного класса?
Привет! Ставится задача создания метода, который формирует массив объектов. Правильно ли делать этот метод внутри класса, экземпляром...

20
14 / 14 / 5
Регистрация: 16.01.2016
Сообщений: 81
06.10.2018, 16:38  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от escoult Посмотреть сообщение
но то же можно сделать и со статическими полями
все понял что я не дописал
C#
1
public static string[] specialWords = new string[]
спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2018, 16:38

Разделители в методе Split()
Возможно ли передавать в Split() аргумент таким образом, чтобы разделение происходило по всем элементам, кроме того, что в скобках?

Выбрасывает исключение при запуске
Здравствуйте. Установил студию, при попытке запустить выбрасывает сообщение &quot;an exception was thrown by a taskscheduler&quot;... ...

Выбрасывает исключение при сортировке
не могу понять из-за чего выбрасывает исключение при сортировке const T&amp; GetData(int index) const - здесь исключение выбрасывает ...

Виснет при методе String.Split
При таком коде: string str = Console.ReadLine(); string str1 = str.Split(new char { '.', '?', '!' }); Console.WriteLine(&quot;123&quot;); ...

Поток выбрасывает исключение в конце работы
Это лаба для универа, реализация шаблона производитель-потребитель. В конце работы выбрасывает исключение (см. скрин). В чем дело?) ...


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

Или воспользуйтесь поиском по форуму:
21
Ответ Создать тему
Опции темы

Новые блоги и статьи
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru