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

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

Войти
Регистрация
Восстановить пароль
 
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
#1

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

02.03.2014, 21:16. Просмотров 371. Ответов 11
Метки нет (Все метки)

я пишу скриптовый язык программирования на с++
сейчас занят тем что пытаюсь сделать так чтоб программа считывала строку и конвертировала её в выражение. Но у меня вылетает Ошибка памяти. Где ошибка. Заранее спасибо.
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;
            }
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.03.2014, 21:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос C++ Ошибка памяти (C++):

Ошибка памяти - C++
Всем пользователям - приветствие! :good: Мне нужна Ваша помощь... Делаю свою первую курсовую работу... И, я решил перевести...

Ошибка памяти - C++
Доброго дня. Случилась у меня тут значит загвоздка с ошибкой памяти, препод смотреть и разбираться не стал, сказал, мол, сам виноват ошибка...

Ошибка выделения памяти - C++
Извиняюсь за то, что не умею гуглить. =) vector&lt;double&gt; v; v.resize(1000500); v.reserve(1000500); resize - просто говорит о...

Ошибка выделения памяти... - C++
Когда я пытаюсь выделить память двумерному динамическому массиву, возникает ошибка &quot;Microsoft C++ exception: std::bad_alloc at memory...

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Выделение памяти. Ошибка - C++
Доброе утро! Есть программа, которая хранит сведения о студентах. В ней реализовано 2 класса. 1 - класс группа 2 - студент. Всё работает:...

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

Добавлено через 6 минут
и это работает только для 2 чисел. А если я ввожу скажем 60/2 + 10/2 то он говорит -nan
0
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
03.03.2014, 00:34 #8
Посмотрю утром, но я вроде с + проверил
0
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
03.03.2014, 00:35  [ТС] #9
спасибо. я тоже поковыряюсь.
0
Kuzia domovenok
1892 / 1747 / 119
Регистрация: 25.03.2012
Сообщений: 5,936
Записей в блоге: 1
03.03.2014, 00:39 #10
Return atof(str);
Где освобождение памяти из-под str?
Почему не
C++
1
2
3
float retval=atof(str);
delete[] str;
return retval;
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
03.03.2014, 00:45 #11
Kuzia domovenok, да там вообще выделение динамическое не надо...
можно же сразу:
C++
1
return atof(a.c_str());
да и length можно один раз посчитать, вместо того, чтобы дергать его постоянно, да еще и в условии цикла.
0
CProgrammer
0 / 0 / 2
Регистрация: 02.03.2014
Сообщений: 29
03.03.2014, 05:24  [ТС] #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;
                }
            }
        }
    }
}
0
03.03.2014, 05:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2014, 05:24
Привет! Вот еще темы с ответами:

Очистка памяти - ошибка - C++
Здравствуйте, друзья. Подскажите, пожалуйста, где ошибка: #include &lt;stdio.h&gt; int main() { int size = 5; int **array = new...

Ошибка выделения памяти - C++
char * host; host = (char*)malloc(wcslen(_host)); // выделяю память memset(host,'\0',wcslen(_host)); // очищаю host = '\0 ';...

Ошибка выделения памяти(?) - C++
Первый перечень(Который perech) записывается нормально,а вот второй(makeperech) крашит(объявления вроде те же,что и в первом перечне,не...

Ошибка в выделении памяти - C++
проблема с выделением памяти. ошибку никак найти не могу, поможет кто исправить? #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using...


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

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

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