С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
#1

Ошибки при попытке прочитать в указанном месте - C++

11.10.2012, 17:08. Просмотров 424. Ответов 8
Метки нет (Все метки)

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
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct stack
{ 
    char c;
    struct stack *next;
};
 
char pop(stack**);
stack *push(stack *st, char a);
int PRIOR(char a);
 
int main()
{
    stack *OPERS=NULL;
    char a[80], outstr[80];
    int k=0,point=0;
    setlocale(LC_ALL,"Rus");
    
    do
    {
        cout<<"Введите выражение (в конце '='):";
        cin>>a[k];
        while(a[k]!='\0'&&a[k]!='=')
        {
            if(a[k]==')')
            {
                while(OPERS->c!='(')
                    outstr[point++]=pop(&OPERS);
                pop(&OPERS);
            }
            if(a[k]=='(')
                OPERS=push(OPERS,'(');
            if(a[k]=='+'||a[k]=='/'||a[k]=='*'||a[k]=='-')
            {
                if(OPERS==NULL)
                    OPERS=push(OPERS,a[k]);
                else
                    if(PRIOR(OPERS->c)<PRIOR(a[k]))
                        OPERS=push(OPERS, a[k]);
                    else
                    {
                        while((OPERS!=NULL)&&(PRIOR(OPERS->c)>=PRIOR(a[k])))
                            outstr[point++]=pop(&OPERS);
                        OPERS=push(OPERS,a[k]);
                    }
            }
            k++;
        }
        while(OPERS!=NULL)
        outstr[point++]=pop(&OPERS);
        outstr[point]='/0';
        cout<<"\n "<<outstr<<"\n ";
        cout<<"\nПовторить(y/n)?";
    }while(getchar()!='n');
}
 
stack *push(stack *HEAD, char a)
{
  stack *PTR;
  PTR=new stack;
    if(PTR==NULL) 
  {
    cout<<"нет памяти";
    exit(-1);            
  }
  PTR->c=a;                                
  PTR->next=HEAD;           
  return PTR;                               
}
 
 
char pop(stack **HEAD)
{
  stack *PTR;
  char a;
  if(*HEAD==NULL) return '\0'; 
  PTR=new stack;
  PTR=*HEAD;                   
a=PTR->c; //вот в этом месте отладчик выдает сообщение с адресами.
  *HEAD=PTR->next;         
  delete PTR;   
  return a;                   
}
 
 
int PRIOR(char a)
{
  switch(a)
  {
    case '*':
    case '/':
         return 3;
 
    case '-':
    case '+':
         return 2;
 
    case '(':
         return 1;
  }
}
Необработанное исключение в "0x012b13b9" в "sdsd.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000032".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2012, 17:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ошибки при попытке прочитать в указанном месте (C++):

Возникают ошибки при попытке использования библиотеки graphics.h - C++
Не работает библиотека graphics.h Ошибка и скрин с программы находятся во вложении. П.5.18.Правил Запрещено размещать задания и...

Компилятор выдает три ошибки, при попытке скомпилировать программу - C++
Добрый день. Мне по заданию нужно решить эту формулу: l=min(x+y,y-z)/max(x,y). Я написал код программы на C++, но компилятор выдает 3...

XE3 выдаёт ошибки при попытке присвоения значения переменной string - C++
Новый Builder С++ почему-то ругается на то что в старой версии (2006) работало. Может кто знает причину изменений. вот листинг: ...

Ошибки на ровном месте (VS2010) - C++
В общем, сделал класс разбитый на два файла (.h и .cpp). Часть методов этого класса определена прямо в его теле при его объявлении (т.е. в...

Вывод на экран список файлов и название программ С++ , находящимся в указанном при запуске программы каталоге - C++
Добрый день! Помогите пожалуйста: Написать программу, которая выведет на экран список файлов и название программ С++ ,...

Доделать и исправить. Дано слово из 12 букв. Поменять местами его трети: первую треть разместить на месте третьей, вторую на месте первой и 3 на 2 - C++
#include&lt;stdio.h&gt; #include&lt;iostream.h&gt; int main(void) { int i,j; char slovo; for(i=0;i&lt;4;i++) { for(j=0;j&lt;3;j++) ...

8
David Sylva
1291 / 953 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
11.10.2012, 17:17 #2
Сразу вижу у тебя ошибку в неправильном вводе. Как ты просишь ввести выражение и сохраняешь его в одной ячейке a[0]?
1
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
12.10.2012, 02:59  [ТС] #3
Хм... недочеты.. спасибо, вы раскрыли глаза! а что насчет функции ?
0
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
13.10.2012, 10:40  [ТС] #4
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
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct stack
{ 
    char c;
    struct stack *next;
};
 
char pop(stack ** top);
void push(stack **st, char a);
int PRIOR(char a);
 
int main()
{
    
    char a[80], outstr[80];
    int k=0,point=0;
    setlocale(LC_ALL,"Rus");
    
    stack *OPERS;
    
    freopen("input.txt", "r",stdin);
    freopen("output.txt", "w", stdout);
 
    
    do
    {
        cout<<"Введите выражение (в конце '='):";
        cin>>a[k];
        while(a[k]!='\0'&&a[k]!='=')
        {
            if(a[k]==')')
            {
                while(OPERS->c!='(')
                    outstr[point++]=pop(&OPERS);
                pop(&OPERS);
            }
            if(a[k]=='(')
                OPERS=push(OPERS,'(');
            if(a[k]=='+'||a[k]=='/'||a[k]=='*'||a[k]=='-')
            {
                if(OPERS==NULL)
                    OPERS=push(OPERS,a[k]);
                else
                    if(PRIOR(OPERS->c)<PRIOR(a[k]))
                        OPERS=push(OPERS, a[k]);
                    else
                    {
                        while((OPERS!=NULL)&&(PRIOR(OPERS->c)>=PRIOR(a[k])))
                            outstr[point++]=pop(&OPERS);
                        OPERS=push(OPERS,a[k]);
                    }
            }
            k++;
        }
        while(!feof(stdin))
        outstr[point++]=pop(&OPERS);
        outstr[point]='/0';
        cout<<"\n "<<outstr<<"\n ";
        cout<<"\nПовторить(y/n)?";
    }while(getchar()!='n');
}
 
void push(stack **HEAD, char a)
{
  stack *pv;
  pv=new stack;
  pv->c=a;                                
  pv->next=*HEAD;           
  *HEAD=pv;                               
}
 
 
char pop(stack **HEAD)
{
  char a=(*HEAD)->c;
  stack *pv=*HEAD;
  *HEAD = (*HEAD)->next;                   
  delete pv;   
  return a;                   
}
 
 
int PRIOR(char a)
{
  switch(a)
  {
    case '*':
    case '/':
         return 3;
 
    case '-':
    case '+':
         return 2;
 
    case '(':
         return 1;
  }
}
вот чуть переработанный код.. ошибки из-за идентификатора OPERS. Хочу сделать ввод через файлы.. поставьте на путь истинный, заплутавшего..
0
David Sylva
1291 / 953 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
13.10.2012, 10:51 #5
В чём суть задачи ?
0
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
13.10.2012, 12:28  [ТС] #6
Задача состоит в конвертации из инфиксной записи в постфиксную (Обратная Польская Запись). Ввожу выражение, оно обрабатывается и вычисляется.
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
#include <iostream>
#include <iomanip>
#include <locale>
using namespace std;
 
struct stack
{ 
    char c;
    struct stack *next;
};
 
char pop(stack ** top);
void push(stack **st, char a);
int PRIOR(char a);
 
int main()
{
    
    char a[80], outstr[80];
    int k=0,point=0;
    setlocale(LC_ALL,"Rus");
        
    freopen("input.txt", "r",stdin);
    freopen("output.txt", "w", stdout);
 
    stack OPERS;
    
    do
    {
        cin>>a[k];
        while(a[k]!='\0')
        {
            if(a[k]==')')
            {
                while((&OPERS)->c!='(')
                    outstr[point++]=pop(&OPERS);
                pop(&OPERS);
            }
            if(a[k]=='(')
                OPERS=push(&OPERS,'(');
            if(a[k]=='+'||a[k]=='/'||a[k]=='*'||a[k]=='-')
            {
                if((&OPERS)==NULL)
                    OPERS=push(&OPERS,a[k]);
                else
                    if(PRIOR((&OPERS)->c)<PRIOR(a[k]))
                        OPERS=push(&OPERS, a[k]);
                    else
                    {
                        while(((&OPERS) != NULL) && (PRIOR((&OPERS)->c) >= PRIOR(a[k])))
                        {   outstr[point++]=pop(&OPERS);}
                        OPERS=push((&OPERS),a[k]);
                    }
            }
            k++;
        }
        while(!feof(stdin))
        outstr[point++]=pop(&OPERS);
        outstr[point]='/0';
        cout<<"\n "<<outstr<<"\n ";
        cout<<"\nПовторить(y/n)?";
    }while(getchar()!='n');
}
 
void push(stack **HEAD, char a)
{
  stack *pv;
  pv=new stack;
  pv->c=a;                                
  pv->next=*HEAD;           
  *HEAD=pv;                               
}
 
 
char pop(stack **HEAD)
{
  char a=(*HEAD)->c;
  stack *pv=*HEAD;
  *HEAD = (*HEAD)->next;                   
  delete pv;   
  return a;                   
}
 
 
int PRIOR(char a)
{
  switch(a)
  {
    case '*':
    case '/':
         return 3;
 
    case '-':
    case '+':
         return 2;
 
    case '(':
         return 1;
  }
}
вот кстати очередная итерация кода... неразбериха с OPERS - несовместимость в указателях..
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.10.2012, 12:49 #7
У вас push() ничего не возвращает. Тогда что вы присваиваете OPERS в 41 строке и далее?
0
snw
10 / 10 / 0
Регистрация: 11.10.2012
Сообщений: 93
13.10.2012, 13:18  [ТС] #8
Там ж вроде принцип какой-то был с указателями... push по другому не знаю как реализовать )
0
David Sylva
1291 / 953 / 51
Регистрация: 17.05.2012
Сообщений: 2,687
13.10.2012, 13:22 #9
Посмотри похожая тема, может что-то подчерпнёшь для себя. Преобразовать выражение в постфиксную форму
1
13.10.2012, 13:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.10.2012, 13:22
Привет! Вот еще темы с ответами:

Вылет при попытке очистки консоли - C++
В программе много раз вызывается функция, которая очищает окно консоли с помощью команды system(&quot;cls&quot;); и перерисовывает консоль...

Ошибка при попытке загрузки файла - C++
Задача состоит в том, чтобы по очереди загрузить файлы, введя их имена в консоль. #include &lt;fstream&gt; #include &lt;iostream&gt; using...

Ошибка при попытке создания шаблона - C++
В чём ошибка? Функции Map::isGardenWithoutWallFlag, Map::setNothing, Map::incrementRoad, Map::setFlagWall имеют действительно такие...

Ошибка при попытке открытия файла - C++
Добрый день. При выполнении функции открытия файла F.open(adr,ios::in) по несуществующему адресу программу выбивает при этом появляется...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.