Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
CF asker
0 / 0 / 1
Регистрация: 05.11.2014
Сообщений: 48
1

Неопределенное поведение в Debug и Release

28.11.2014, 20:47. Просмотров 864. Ответов 6
Метки нет (Все метки)

Писал программу для сложения больших чисел (в файле содержатся числа с количеством цифр от 1 до 30). При запуске через компилятор всё работает нормально. Использовал динамические массивы. Но если запустить через созданную .exe программу выдается аварийное завершение (abnormal program termination). Окно тут же закрывается, еле успел прочитать. С чем может быть связана ошибка?
Код моей проги: (входные данные - 4 строки, первые 2 количество цифр в числах, последние - сами цифры; выходные - результат сложения чисел)
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
#include <vcl.h>
#include <iostream.h>
#include <fstream.h>
#pragma hdrstop
 
#pragma argsused
int main(int argc, char* argv[])
{
int num1,num2,num3,num4,a,num5,k(0),num6;
 
char * p1=new char [num1];
char * p2=new char [num2];
char * p3=new char [num3];
char * p4=new char [num4];
int * p5=new int [num5];
int * p6=new int [num6];
 
ifstream f("D:\\temp\\input.txt");
f>>num1>>num2;
 
char c;
f.get(c); //deletes \n
 
for (int i=0;i<num1;i++)
{
f.get(p1[i]);
}
f.get(c);  //deletes \n
 
for (int i=0;i<num2;i++)
{
f.get(p2[i]);
}
 
a=abs(num1-num2);
if (num1==num2) {}
else
{
        if (num1>num2)
        {
        num3=num2;
        for(int i=0;i<num2;i++)
        { p3[num2-1+a-i]=p2[num2-1-i]; }
        for (int i=0;i<num1;i++)
        { p4[num1-1-i]=p1[num1-1-i]; }
        for(int i=0;i<a;i++)
        { p3[a-1-i]='0'; }
        }
        else
        {
        num3=num1;
        for(int i=0;i<num1;i++)
        { p3[num1-1+a-i]=p1[num1-1-i]; }
        for (int i=0;i<num2;i++)
        { p4[num2-1-i]=p2[num2-1-i]; }
        for(int i=0;i<a;i++)
        { p3[a-1-i]='0'; }
        }
}
 
for (int i=0;i<num3+a;i++)
{
p5[num3+a-i]=StrToInt(p4[num3+a-1-i])+StrToInt(p3[num3+a-1-i])+k;
if (p5[num3+a-i]>=10)
{ p5[num3+a-i]-=10; k=1; }
else
k=0;
}
p5[0]=k;
 
f.close();
 
ofstream in("D:\\temp\\output.txt");
 
if (k==0)
{
for (int i=0;i<num3+a;i++)
{ p6[num3+a-i-1]=p5[num3+a-i-1+1]; }
for (int i=0;i<num3+a;i++)
{ cout<<p6[i]; in<<p6[i];}
}
else
{ for (int i=0;i<num3+a+1;i++)
{cout<<p5[i]; in<<p5[i];} }
 
in.close();
 
system("pause");
        return 0;
}
P.S. Простите, что не оптимизировал для удобства чтения
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.11.2014, 20:47
Ответы с готовыми решениями:

Неопределенное поведение С++
Вот такой вопрос: что из этого обязательно вызовет неопределенное поведение ?...

Неопределенное поведение пользовательской функции
значит писал для лабы вот такой код: town.h #include &lt;Windows.h&gt; #include...

Создание массива, неопределенное поведение
Пишу такой код: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace...

Неопределенное поведение при приведении типа
Суть проблемы в том что, после принудительного приведения типа деструктор...

Один и тот же объект в одном выражении модифицируется несколько раз - неопределенное поведение
Уважаемые форумчане! Недавно столкнулся с интересным на мой взгляд необычным...

6
Max Dark
шКодер самоучка
1970 / 1746 / 861
Регистрация: 09.10.2013
Сообщений: 3,855
Записей в блоге: 6
Завершенные тесты: 2
28.11.2014, 20:50 2
Цитата Сообщение от CF asker Посмотреть сообщение
int num1,num2,num3,num4,a,num5,k(0),num6;
char * p1=new char [num1];
char * p2=new char [num2];
char * p3=new char [num3];
char * p4=new char [num4];
int * p5=new int [num5];
int * p6=new int [num6];
И пусть случай решит, какой размер будет у массива...
1
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,835
28.11.2014, 20:52 3
CF asker, первое, что бросается в глаза:
C++
1
2
3
4
5
6
7
8
int num1,num2,num3,num4,a,num5,k(0),num6;
 
char * p1=new char [num1];
char * p2=new char [num2];
char * p3=new char [num3];
char * p4=new char [num4];
int * p5=new int [num5];
int * p6=new int [num6];
в этом коде у тебя переменные под размерности массивов имеют неопределенные значения, т.к. ты их (размерности) ничем не инициализировал. Иными словами, в этих переменных мусор, там может оказаться в том числе и очень большое число. Попытка выделить память такого размера может завершиться исключением bad_alloc, а т.к. ты его не перехватываешь, то программе ничего не остается кроме как аварийно завершиться.
1
CF asker
0 / 0 / 1
Регистрация: 05.11.2014
Сообщений: 48
28.11.2014, 20:55  [ТС] 4
Исправил,
C++
1
int num1(30),num2(30),num3(30),num4(30),a,num5(31),k(0),num6(31);
P.S. Так вот зачем они писали макс. количество цифр
И ещё - массивы по завершении удалять не обязательно?
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,835
28.11.2014, 21:30 5
Цитата Сообщение от CF asker Посмотреть сообщение
И ещё - массивы по завершении удалять не обязательно?
Не обязательно (система заберет память обратно при завершении), но это пойдет на пользу, если хочешь научиться писать настоящие программы
Правило простое: если что-то взял, нужно потом это отдать.
0
CF asker
0 / 0 / 1
Регистрация: 05.11.2014
Сообщений: 48
28.11.2014, 22:09  [ТС] 6
DrOffset, а почему программа работала нормально при запуске через компилятор?
0
DrOffset
8919 / 4800 / 1175
Регистрация: 30.01.2014
Сообщений: 7,835
28.11.2014, 22:24 7
Лучший ответ Сообщение было отмечено CF asker как решение

Решение

Цитата Сообщение от CF asker Посмотреть сообщение
а почему программа работала нормально при запуске через компилятор?
Потому что "Неопределенное поведение" может проявляться в том числе в виде работающей программы. Использование значений неинициализированных переменных как раз является неопределенным поведением, соответственно результат работы непредсказуем. Если нам везет и в мусорных значениях оказываются не очень большие числа, то программа делает вид, что работает.

Добавлено через 7 минут
CF asker, такое может случаться достаточно часто, пока ты не научишься правильному стилю, самоконтролю и внимательности. Язык С++ не терпит невнимательности и не "поддерживает штаны" программиста. Эта свобода выбора, стрелять себе в ногу или нет, очень часто является причиной критики С++, но за это его многие любят. Поэтому отдельная глава в изучении языка - это научиться применять техники, облегчающие контроль программы (и себя, как программиста), которые позволяют получить более стабильный код и избавиться от типичных ошибок. Есть несколько книг посвященных эффективному применению С++ и умению не наступать на грабли:
Кликните здесь для просмотра всего текста
Мэйерс С. Эффективное использование С++. 35 новых способов улучшить стиль программирования.
Мэйерс С. Эффективное использование C++. 55 верных советов улучшить структуру и код ваших программ.
Александреску А. Саттер Г. Стандарты программирования на С++: 101 правило и рекомендация
Саттер Г. Решение сложных задач на С++
Саттер Г. Новые сложные задачи на С++
1
28.11.2014, 22:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 22:24

Release/Debug
Здравствуйте! Пишу сложную расчётную программу. И мне важна скорость выполнения...

Debug и Release разница?
объяснить пожалуйста разница между Debug И Release? и почему после компиляции...

difference between debug and release MVS2010
Ума не приложу в какую сторону копать:read: Следующий фрагмент кода, в Дебаге...


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

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

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