Форум программистов, компьютерный форум CyberForum.ru

C++ Ошибка памяти - C++

Восстановить пароль Регистрация
 
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
02.03.2014, 21:16     C++ Ошибка памяти #1
я пишу скриптовый язык программирования на с++
сейчас занят тем что пытаюсь сделать так чтоб программа считывала строку и конвертировала её в выражение. Но у меня вылетает Ошибка памяти. Где ошибка. Заранее спасибо.
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
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
float operate(string);
int main()
{
    string a;
    while (a != "exit")
    {
        getline (cin, a);
        cout << operate(a) << endl;
    }
    return 0;
}
 
float operate(string a)
{
    char op;    
    for(int j = 0; j < a.length(); j++)
    {
        if (a[j] == '+')
        {
            op = '+';
            break;
        }
        else if (a[j] == '-')
        {
            op = '-';
            break;
        }
        else if (a[j] == '*')
        {
            op = '*';
            break;
        }
        else if (a[j] == '/')
        {
            op = '/';
            break;
        }
 
    }   
    if ((op != '+')&&(op != '-')&&(op != '*')&&(op != '/'))
    {
            char * str = new char[a.length()];
            strcpy(str, a.c_str());
            atof(str);
            return atof(str);
 
    }
            
 
    for (int i = 0; i < a.length(); i++)
    {
                
        if (a[i] == '+')
        {
            operate(a.substr (0, a.length()-(i-1))) + operate(a.substr (i+1, a.length()));
            break;
        }
        else if (a[i] == '-')
        {
            operate(a.substr (0, a.length()-(i-1))) - operate(a.substr (i+1, a.length()));
            break;
        }
        else
        {
            if (a[i] == '*')
            {
                operate(a.substr (0, a.length()-(i-1))) * operate(a.substr (i+1, a.length()));
                break;
            }
            else if (a[i] == '/')
            {
                operate(a.substr (0, a.length()-(i-1))) / operate(a.substr (i+1, a.length()));
                break;
            }
        }
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 21:16     C++ Ошибка памяти
Посмотрите здесь:

C++ Ошибка выделения памяти...
C++ ошибка с выделением памяти
Ошибка при выделении памяти C++
C++ Выделение памяти. Ошибка
Очистка памяти - ошибка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,159
Завершенные тесты: 1
02.03.2014, 21:30     C++ Ошибка памяти #2
строка 47
char * str = new char[a.length()];
Тут не хватает одного символа под терминальный ноль,
заканчивающий текстовую строку.
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
02.03.2014, 21:35  [ТС]     C++ Ошибка памяти #3
Пробовал так char * str = new char[a.length()+'\0'];
и так char * str = new char[a.length()+1];
не работает
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
02.03.2014, 21:38     C++ Ошибка памяти #4
во float operate(string a) после цикла for (int i = 0; i < a.length(); i++) (на 55 строчке) функция ничего не возвращает
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
02.03.2014, 21:42  [ТС]     C++ Ошибка памяти #5
а что она должна возвращать? попробовал просто для интереса return 0; всё таже ошибка
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
02.03.2014, 21:54     C++ Ошибка памяти #6
Рекурсия у вас бесконечная вышла вот и памяти на стеке и не хватало, да op не имело значения по умолчанию

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
float operate(string a)
{
    char op=' ';    
    for(int j = 0; j < a.length(); j++)
    {
        if (a[j] == '+')
        {
            op = '+';
            break;
        }
        else if (a[j] == '-')
        {
            op = '-';
            break;
        }
        else if (a[j] == '*')
        {
            op = '*';
            break;
        }
        else if (a[j] == '/')
        {
            op = '/';
            break;
        }
 
    }   
    if ((op != '+')&&(op != '-')&&(op != '*')&&(op != '/'))
    {
            char * str = new char[a.length()];
            strcpy(str, a.c_str());
            atof(str);
            return atof(str);
 
    }
            
 
    for (int i = 0; i < a.length(); i++)
    {
                
        if (a[i] == '+')
        {
            return operate(a.substr (0, a.length()-(i+1))) + operate(a.substr (i+1, a.length()));
            break;
        }
        else if (a[i] == '-')
        {
            return operate(a.substr (0, a.length()-(i+1))) - operate(a.substr (i+1, a.length()));
            break;
        }
        else
        {
            if (a[i] == '*')
            {
                return operate(a.substr (0, a.length()-(i+1))) * operate(a.substr (i+1, a.length()));
                break;
            }
            else if (a[i] == '/')
            {
               return operate(a.substr (0, a.length()-(i+1))) / operate(a.substr (i+1, a.length()));
                break;
            }
        }
    }
}
Добавлено через 4 минуты
У меня тоже ошибка a.length()-(i+1) замените на a.length()-i в последнем цикле
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
02.03.2014, 22:15  [ТС]     C++ Ошибка памяти #7
спасибо, но тогдане работает следующее 6/2 коточе когда в начале только 1 число. например 6/2 length = 3 а i = 1.

Добавлено через 6 минут
и это работает только для 2 чисел. А если я ввожу скажем 60/2 + 10/2 то он говорит -nan
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.03.2014, 00:34     C++ Ошибка памяти #8
Посмотрю утром, но я вроде с + проверил
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
03.03.2014, 00:35  [ТС]     C++ Ошибка памяти #9
спасибо. я тоже поковыряюсь.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
03.03.2014, 00:39     C++ Ошибка памяти #10
Return atof(str);
Где освобождение памяти из-под str?
Почему не
C++
1
2
3
float retval=atof(str);
delete[] str;
return retval;
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,588
03.03.2014, 00:45     C++ Ошибка памяти #11
Kuzia domovenok, да там вообще выделение динамическое не надо...
можно же сразу:
C++
1
return atof(a.c_str());
да и length можно один раз посчитать, вместо того, чтобы дергать его постоянно, да еще и в условии цикла.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 05:24     C++ Ошибка памяти
Еще ссылки по теме:

C++ Ошибка в выделении памяти
C++ Ошибка выделения памяти
Ошибка памяти C++

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

Или воспользуйтесь поиском по форуму:
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
03.03.2014, 05:24  [ТС]     C++ Ошибка памяти #12
Всё. сам сппвился. Нашёл ошибку. Вот код:
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
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
float operate(string);
int main()
{
    string a;
    while (a != "exit")
    {
        getline (cin, a);
        if (a != "exit")
            cout << operate(a) << endl;
    }
    return 0;
}
 
float operate(string a)
{
    bool md = false;
    char op=' ';    
    for(int j = 0; j < a.length(); j++)
    {
        if (a[j] == '+')
        {
            op = '+';
            break;
        }
        else if (a[j] == '-')
        {
            op = '-';
            break;
        }
        else if (a[j] == '*')
        {
            op = '*';
            break;
        }
        else if (a[j] == '/')
        {
            op = '/';
            break;
        }
 
    }   
    if ((op != '+')&&(op != '-')&&(op != '*')&&(op != '/'))
    {
           return atof(a.c_str());
 
    }
            
 
    for (int i = 0; i < a.length(); i++)
    {
                
        if (a[i] == '+')
        {
            return operate(a.substr (0, i)) + operate(a.substr (i+1, a.length()));
            break;
        }
        else if (a[i] == '-')
        {
            return operate(a.substr (0, i)) - operate(a.substr (i+1, a.length()));
            break;
        }
        else
            md = true;
        if ((i == a.length()-1)&&(md == true))
        {
            for (int k = 0; k < a.length(); k++)
            {
                
                if (a[k] == '*')
                {
                    return operate(a.substr (0, k)) * operate(a.substr (k+1, a.length()));
                    break;
                }
                else if (a[k] == '/')
                {
                    return operate(a.substr (0, k)) / operate(a.substr (k+1, a.length()));
                    break;
                }
            }
        }
    }
}
Yandex
Объявления
03.03.2014, 05:24     C++ Ошибка памяти
Ответ Создать тему
Опции темы

Текущее время: 17:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru