6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
1

Cоздать указатель типа char в классе

22.04.2017, 20:22. Показов 4168. Ответов 26

Author24 — интернет-сервис помощи студентам
Доброго времени суток, форумчане!

Пытаюсь создать указатель типа char в классе, что бы потом он ссылался на char массив, но C# выдаёт ошибку.
Почему? Как это исправить? В С++ таких ошибок не выдавало.

C#
1
2
3
4
5
6
7
8
class kalculiator
        {
           public enum typesT { UNDEFTOK, OPERATOR, NUMBER, VAREBAL};
           public enum errorsT { SERROR, PARENS, NOEXP, DIVZERO };
 
           char* exp_ptr; //Выдаёт ошибку
            char [] token=new char[70];
            typesT tok_type;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.04.2017, 20:22
Ответы с готовыми решениями:

Аргумент типа const char* несовместим с параметром типа char* в классе
Данную ошибку находит в 74 - 76 строках, не могу понять что не так. #include <iostream> #include...

Объявить в классе-наследнике указатель, указывающий туда же, куда указывает указатель в классе-родителе
Здравствуйте. Имеется базовый класс MainWindow: #ifndef MAINWINDOW_H #define MAINWINDOW_H...

Указатель на поле типа char []
Всем добрый день! Ситуация такая: есть класс, в нём есть поля типа char и метод, работающий с...

Cоздать файл OLD.T из элементов типа char с помощью цикла repeat, признак выхода из цикла символ (!)
Построить программу в лазарусе, которая создает файл OLD.T из элементов типа char с помощью цикла...

26
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
22.04.2017, 20:31 2
Потому что в C# можно и нужно писать код без указателей. Для доступа к элементам массива используйте индекс...
Вы уже помоему создавали недавно подобную тему и там вам все разжевали...
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 20:35  [ТС] 3
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы уже помоему создавали недавно подобную тему и там вам все разжевали...
Там у меня строка была и указатель я не использовал
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 20:40 4
Vlad__i__mir, пользуйтесь String и его возможностями, типа Substring и []. Указатели вам здесь не нужны.
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 20:42  [ТС] 5
Цитата Сообщение от Rius Посмотреть сообщение
и []
Что это значит?
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 20:43 6
Vlad__i__mir, индексатор, в 4 сообщении той темы же показали: Поэлементный просмотр анализ строки
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
22.04.2017, 20:43 7
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Что это значит?
Это значит то же самое что и в С++, обращение к элементу массива по индексу...
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 20:50  [ТС] 8
Цитата Сообщение от Rius Посмотреть сообщение
пользуйтесь String и его возможностями, типа Substring и []
А почему выдаёт ошибку когда я пытаюсь этим методом извлечь один символ из строки?

C#
1
2
3
4
string exp_ptr;
 int iter;
char [] token=new char[70];
token=exp_ptr.Substring(iter,1); //Ошибка
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 20:52 9
Vlad__i__mir, потому что переменные exp_ptr и iter не инициализированы, потому что iter может выйти за длину строки, потому что для взятия одного символа есть [i] .
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 21:06  [ТС] 10
Цитата Сообщение от Rius Посмотреть сообщение
потому что переменные exp_ptr и iter не инициализированы, потому что iter может выйти за длину строки, потому что для взятия одного символа есть [i]
Инициализировал и попробовал обоими способами:
C#
1
2
3
4
5
6
7
8
9
10
static void Main(string[] args)
        {
            string exp_ptr = " мммгм"; 
            int iter = 0;
            int i = 0;
            char[] token = new char[70];
            token [i] = exp_ptr.Substring(iter, 1); //Ошибка
 
            token[i] = exp_ptr(i);//Ошибка
        }
Мы не можем записать символ из string in char?
0
Эксперт .NET
6451 / 4053 / 1598
Регистрация: 09.05.2015
Сообщений: 9,480
22.04.2017, 21:10 11
C#
1
2
3
4
5
6
7
            string exp_ptr = " мммгм";
            int iter = 0;
            int i = 0;
            char[] token = new char[70];
            token[i] = exp_ptr[iter]; // нет ошибки
 
            token[i] = exp_ptr[i];// нет ошибки
1
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 21:11 12
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Инициализировал и попробовал обоими способами:
Да ладно?
Цитата Сообщение от Rius Посмотреть сообщение
потому что для взятия одного символа есть [i]
Добавлено через 46 секунд
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Мы не можем записать символ из string in char?
Строку в символ запихнуть не можем.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 21:15  [ТС] 13
Цитата Сообщение от Rius Посмотреть сообщение
Строку в символ запихнуть не можем.
Но мы же берем не всю строку, а отдельный символ.

Так что мы не можем брать и извлекать отдельные символы из строки в С#?
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 21:18 14
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
Но мы же берем не всю строку, а отдельный символ.
Substring возвращает подстроку.
Отдельные символы - смотрите выше ^^^.

Добавлено через 2 минуты
Да, кстати, строка может быть из одного несчастного символа. Даже из нуля символов. Тем не менее, это строка.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 21:22  [ТС] 15
Цитата Сообщение от Rius Посмотреть сообщение
Отдельные символы - смотрите выше ^^^.
Забыл про скобки...
Ещё один вопрос: как в строке определить, что она закончилась?
В массиве символов есть '\0', а как быть со строкой?
0
Эксперт .NET
10530 / 6458 / 1502
Регистрация: 25.05.2015
Сообщений: 19,580
Записей в блоге: 14
22.04.2017, 21:24 16
У строки есть известная длина: свойство Length.
Пользуйтесь.
Литература по C# для начинающих и не только , Шилдт, глава 7 - массивы и строки. Почитайте. Иначе вы на каждой запятой будете спотыкаться и по теме создавать.
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
22.04.2017, 21:33  [ТС] 17
Спасибо!
0
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
26.04.2017, 22:21  [ТС] 18
И снова здравствуйте!

Нужна ваша помощь. Подскажите как быть когда нам нужно взять из строки несколько символов, и передать их как единую лексему в другую функцию, ну например функция анализатора выражения считывает символы из входной строки, например это строка "10-(2/3)", первой лексемой будет "10", но функция то считает и запишет сперва 1 потом 0 (до разделителя). То есть если мы запишем данные элементы в массив символов, то это будет 2 символа и в функции выполняющие анализ передастся как массив 2-х символов, соответственно сравнение будет идти не всей лексемы, а только её части "1", а нужно чтобы была полная лексема "10", только тогда будет верный её анализ. Записать в переменную типа char, то же не могу, потому что строку мы читаем по-символьно - до разделителя. В С++ это решалось с помощью указателя на массив символов, а тут не знаю как быть
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
26.04.2017, 22:31 19
ну это зависит от принципа разделения на "лексемы", по конкретному символу,между символами, по группе знаков, по иному общему признаку. Для
Цитата Сообщение от Vlad__i__mir Посмотреть сообщение
"10-(2/3)"
, имхо, лучше всего подойдет регулярное выражение
C#
1
2
3
4
5
6
7
            var str = "10-(2/3)";
            MatchCollection mc = new Regex(@"\d+").Matches(str);
            foreach(Match item in mc)
            {
                Console.WriteLine(item);
            }
            Console.ReadKey(true);
1
6 / 6 / 1
Регистрация: 04.01.2017
Сообщений: 465
26.04.2017, 23:00  [ТС] 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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
class kalculiator
        {
        public enum typesT {UNDEFTOK, OPERATOR, NUMBER, VARIABLE};
        
        public double [] vars=new double [NUMVARS];
        char[] operators_deistviy = new char[9] { '+', '-', '*', '/', '%', '^', '=', '(', ')' };
 
        string exp_ptr; //содержет вырожение
        int iter=0;
        int i = 0;
        char [] token=new char[70]; //содержет текущую лексему
        typesT tok_type; //содержет тип лексемы
              
           
        public kalculiator ()
        {
        exp_ptr = "";
        for (int j = 0; j < NUMVARS; j++) vars[j] = 0.0;
        }
        public double eval_exp (string exp)
        {
        double rezult=0;
        exp_ptr = exp;
        get_token();
 
        if (!String.IsNullOrEmpty(exp_ptr)) //
        return 0.0;
                
        add_sub2 (ref rezult);
                if (iter != exp_ptr.Length) Console.WriteLine("Ошибка! Не достигнут конец строки.");
        return rezult;
        }
 
 
        public void add_sub2 (ref double rezult)
        {
        double temp=0;
        char op;
        mul_div_pers3(ref rezult);
        while ((op = token) == '+' || op == '-') //Исправить, после выяснения как замен указ на тек лексему
           {
            get_token();
            mul_div_pers3(ref temp); //Исправить, после выяснения как замен указ на тек лексему
                    switch (op)
              {
                 case '-':
                 rezult = rezult - temp;
                 break;
                 case '+':
                 rezult = rezult + temp;
                 break;
              }
            }
         }
            public void mul_div_pers3 (ref double rezult)
            {
                double temp=0;
                char op;
                stepen4 (ref rezult);
                while ((op = token) == '*' || op == '/' || op == '%') //Исправить, после выяснения как замен указ на тек лексему
                {
                    get_token();
                    stepen4(ref temp);
                    switch (op)
                    {
                        case '*':
                            rezult = rezult * temp;
                            break;
                        case '/':
                          if (temp==0.0) Console.WriteLine("Ошибка! Деление на 0.");
                            else rezult = rezult / temp;
                            break;
                        case '%':
                            rezult = (int)rezult % (int)temp;
                            break;
                    }
                }
 
            }
            public void stepen4 (ref double rezult)
            {
                double temp=0, ex;
                unarn_oper5(ref rezult);
                if (token == '^') //Исправить, после выяснения как замен указ на тек лексему
                {
                    get_token();
                    stepen4(ref temp);
                    ex = rezult;
                    if (temp == 0.0)
                    {
                        rezult = 1.0;
                        return;
                    }
                    for (int t = (int)temp - 1; t > 0; --t) rezult = rezult * (double)ex;
                }
            }
            public void unarn_oper5 (ref double rezult)
            {
                char op;
                skobky6 (ref rezult);
 
                op = (char)0;
                if ((tok_type == typesT.OPERATOR) && token == '+' || token == '-') //Исправить, после выяснения как замен указ на тек лексему
                {
                    op = token; //Исправить, после выяснения как замен указ на тек лексему
                    get_token();
                }
                skobky6(ref rezult);
                if (op == '-') rezult = -rezult;
            }
            public void skobky6 (ref double rezult)
            {
                if ((token == '(')) //Исправить, после выяснения как замен указ на тек лексему
                {
                    get_token();
                    add_sub2(ref rezult);
                    if (token != ')') Console.WriteLine("Ошибка! Нет закрывающейсяскобки"); //Исправить, после выяснения как замен указ на тек лексему
                    get_token();
                }
                else account7(ref rezult);
 
 
            }
            public void account7(ref double rezult)
            {
                switch (tok_type)
                {
                    case typesT.NUMBER:
                        rezult = Convert.ToDouble(token); //преобразование строки в тип double
                        get_token();
                       return;
                    //default: ;
                    
                }
            }
            public bool isdelim(char c)
            {
                if (c=='+' || c=='-' || c=='*'|| c=='/'|| c=='^' || c=='='|| c=='('|| c==')' ||c=='\r') //сравнение символа с 1-м операндом и...
                return true;
                return false;
            }
            public void get_token()
            {
                char [] temp=new char [10]; //??? Нужен аналог указателя!!!
                int l = 0;
                token [i]= exp_ptr[iter]; //??? Нужен аналог указателя!!!
                tok_type = typesT.UNDEFTOK; //обнуление типа для анализа следующей лексемы
                
                if (iter==exp_ptr.Length) return;
 
 
                if (exp_ptr.IndexOfAny(operators_deistviy, iter, 1) > -1) //
                { //ищет нужный оператор в 
                    tok_type = typesT.OPERATOR;
                    token [0] = exp_ptr[iter]; iter++; //перейти к следующему символу
                }
                
                else if ((int)exp_ptr[iter]>=97 && (int)exp_ptr[iter]<=122)
                { //проверка на принадлежность к букве алфавита
                    while (!isdelim(exp_ptr[iter])) //проверка на разделитель
                    { token[l] = exp_ptr[iter]; iter++; l++; }
                tok_type= typesT.VARIABLE; }
                
                else if ((int)exp_ptr[iter] >= 48 && (int)exp_ptr[iter] <= 57)
                { //проверяет на принадлежность к числу
                    while (!isdelim(exp_ptr[iter])) { token[l] = exp_ptr[iter]; ++iter; ++l; } //проверка на разделители
                    tok_type = typesT.NUMBER;
                }
               token[l] = '\0';
               
 
            }
          
        };
 
        static void Main(string[] args)
        {
            string expstr;
                        
            kalculiator ob=new kalculiator();
           
                
                Console.WriteLine("Enter expression: ");
                expstr=Console.ReadLine();
                               
                Console.WriteLine ("Ansver is: {0}", ob.eval_exp(expstr));
            
 
            return;
        }
    }
}
Вот в функции get_token() считывается очередная лексема, а потом её нужно передать в функцию, которая будет уже её анализировать.
Цитата Сообщение от Diamante Посмотреть сообщение
лучше всего подойдет регулярное выражение
Ваш вариант не понял, можно прокомментировать, что данный код делает
0
26.04.2017, 23:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.04.2017, 23:00
Помогаю со студенческими работами здесь

Как считать значения типа char* в классе
В общем у меня есть класс, в котором создаются объекты и некоторые параметры должны записываться в...

Поиск объекта в классе по строке типа char
Есть такая задача : Описать класс с именем PRICE, содержащий следующие поля: - название товара;...

Передать указатель типа char с последним символом 0
В функцию WriteFiĺe передаю строку( общаюсь по сом порту).Собираю сообщение и подсчитывал...

Сохранение/Загрузка указателя на указатель типа char
char **data = new char*; Подскажите, пожалуйста, как записать содержимое всего выше...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru