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

Ошибка при запуске программы - C++

Восстановить пароль Регистрация
 
assasko
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 18
07.05.2012, 20:00     Ошибка при запуске программы #1
Сделал алгоритм слияния, нужно проверить время сортировки от 10000 элементов до 100000 (10тыс., 20тыс., ... 100тыс.) При 10 и 20 тысячах элементов все нормально работает. Но когда пытаюсь 30тыс и больше выдает ошибку.
Вот код программы:
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
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <windows.h>
 
 
using namespace std;
 
void merge(double *mas,long n,int l, int r);
 
int main(int argc, char *argv[])
{
    cout << "Zadayte chislo elementov v massive N = ";
    long n;
    cin >> n;
    double *mas=new double[n];
    srand((unsigned)time(NULL));
    for (int i=0; i<n; i++)
    { mas[i]=(int)rand()/rand()+1;
   /* cout << mas[i] <<" ";*/}
    //cout << endl;
    //cout << "==========================================="<<endl;
    double t1=clock();
    merge(mas,n,0, n-1);
    double t2=clock();
    /*for (int i=0; i<n; i++)
    {cout << mas[i] <<" ";}*/
    cout << endl;
    cout <<"t1 = "<<t1<<endl;
    cout <<"t2 = "<<t2<<endl;
    cout << "\nVremya rascheta = " <<(t2-t1)/CLOCKS_PER_SEC << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
void merge(double *mas,long n,int l, int r) {
    if (r == l)
        return;
    //если остается 2 элемента то меняем их местами
    if (r - l == 1) { 
        if (mas[r] < mas[l])
            swap(mas[r], mas[l]);
        return;
    }
    //деление массива пополам
    int m = (r + l) / 2;
    //рекурсивный вызов функции для левой и правой части массива
    merge(mas,n,l, m);
    merge(mas,n,m + 1, r);
    //массив в котором будет происходить слияние частей
    double *buf=new double[n];
    int xl = l;
    int xr = m + 1;
    int cur = 0;
    //пока существует хотябы 1 элемент выполняится слияние
    while (r - l + 1 != cur) {
        //сравнение єлементов подмассивов, процесс слияния подмассивов
        if (xl > m)
            buf[cur++] = mas[xr++];
        else if (xr > r)
            buf[cur++] = mas[xl++];
        else if (mas[xl] > mas[xr])
            buf[cur++] = mas[xr++];
        else buf[cur++] = mas[xl++];
 
    }
    for (int i = 0; i < cur; i++)
        mas[i + l] = buf[i];
}
Помогите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2012, 20:00     Ошибка при запуске программы
Посмотрите здесь:

Ошибка Windows при запуске программы C++
C++ ошибка при запуске программы
Ошибка при запуске отладки программы C++
Ошибка при запуске программы C++
C++ Ошибка при запуске программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ZiGSuN
 Аватар для ZiGSuN
27 / 27 / 2
Регистрация: 02.12.2009
Сообщений: 66
07.05.2012, 20:18     Ошибка при запуске программы #2
строка 18 в вашем коде сверху :
C++
1
2
for (int i=0; i<n; i++)
    { mas[i]=(int)rand()/rand()+1; }
- здесь возможно деление на ноль так как приоритет "/" выше, чем "-" ;
так что нужно
сделать так
C++
1
2
for (int i=0; i<n; i++)
    { mas[i]=(int)rand()/(rand()+1); }
assasko
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 18
07.05.2012, 21:26  [ТС]     Ошибка при запуске программы #3
Цитата Сообщение от ZiGSuN Посмотреть сообщение
строка 18 в вашем коде сверху :
C++
1
2
for (int i=0; i<n; i++)
    { mas[i]=(int)rand()/rand()+1; }
- здесь возможно деление на ноль так как приоритет "/" выше, чем "-" ;
так что нужно
сделать так
C++
1
2
for (int i=0; i<n; i++)
    { mas[i]=(int)rand()/(rand()+1); }
Сделал как ты написал, при 30 тыс выдает ошибку :"This application has requested the Runtime to terminate it in an unusual way."
thick_int
Заблокирован
07.05.2012, 21:34     Ошибка при запуске программы #4
По всей-видимости имеет место переполнение стека.
Попробуйте строку
C++
1
merge(mas,n,0, n-1);
выполнить в блоке try/catch.
то есть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdexcept>
...
...
 
try
{
   merge(mas,n,0, n-1);
}
catch (runtime_error &ex)
{
   cout << ex.what();
}
assasko
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 18
08.05.2012, 18:50  [ТС]     Ошибка при запуске программы #5
Цитата Сообщение от thick_int Посмотреть сообщение
По всей-видимости имеет место переполнение стека.
Попробуйте строку
C++
1
merge(mas,n,0, n-1);
выполнить в блоке try/catch.
то есть так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdexcept>
...
...
 
try
{
   merge(mas,n,0, n-1);
}
catch (runtime_error &ex)
{
   cout << ex.what();
}
Спасибо, но оно все равно выдает ту же ошибку((

Добавлено через 6 часов 54 минуты
Не могу понять что не так(
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
08.05.2012, 18:57     Ошибка при запуске программы #6
проверь хватит ли памяти (линейной) для 30к элементов?

Добавлено через 1 минуту
Цитата Сообщение от assasko Посмотреть сообщение
Не могу понять что не так(
дебаг, не?
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
08.05.2012, 19:10     Ошибка при запуске программы #7
double *mas=new double[n];
вы объявляете массив для типа double.
Цитата Сообщение от assasko Посмотреть сообщение
mas[i]=(int)rand()/rand()+1;
зачем вам тогда явно добиваетесь от рандома целочисленного типа?
C++
1
mas[i]=(double)rand()/rand()+1;
исправьте это и все заработает.
И второе, память динамическую вам выделили, а возвращать ее кто будет?
C++
1
2
delete [] mas; //в main
delete [] buf; // в merge
у вас память рекой льется.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
08.05.2012, 19:15     Ошибка при запуске программы #8
нашёл выход используй malloc и free

Добавлено через 1 минуту
модераторы и админы я специально не использовал теги чтоб было видно исправления
#include <cstdlib>
#include <iostream>
#include <ctime>
#include <windows.h>
#include "alloc.h"


using namespace std;

void merge(double *mas,long n,int l, int r);

int main(int argc, char *argv[])
{
cout << "Zadayte chislo elementov v massive N = ";
long n;
cin >> n;
double *mas=(double*)malloc(n*sizeof(double));
srand((unsigned)time(NULL));
for (int i=0; i<n; i++)
{ mas[i]=(int)rand()/(rand()+1);
cout << mas[i] <<" "; }
//cout << endl;
//cout << "==========================================="<<endl;
double t1=clock();
merge(mas,n,0, n-1);
double t2=clock();
/*for (int i=0; i<n; i++)
{cout << mas[i] <<" ";}*/
cout << endl;
cout <<"t1 = "<<t1<<endl;
cout <<"t2 = "<<t2<<endl;
cout << "\nVremya rascheta = " <<(t2-t1)/CLOCKS_PER_SEC << endl;
system("PAUSE");
free(mas);
return EXIT_SUCCESS;
}
void merge(double *mas,long n,int l, int r) {
if (r == l)
return;
//åñëè îñòàåòñÿ 2 ýëåìåíòà òî ìåíÿåì èõ ìåñòàìè
if (r - l == 1) {
if (mas[r] < mas[l])
swap(mas[r], mas[l]);
return;
}
//äåëåíèå ìàññèâà ïîïîëàì
int m = (r + l) / 2;
//ðåêóðñèâíûé âûçîâ ôóíêöèè äëÿ ëåâîé è ïðàâîé ÷àñòè ìàññèâà
merge(mas,n,l, m);
merge(mas,n,m + 1, r);
//ìàññèâ â êîòîðîì áóäåò ïðîèñõîäèòü ñëèÿíèå ÷àñòåé
double *buf=(double*)malloc(n*sizeof(double));
int xl = l;
int xr = m + 1;
int cur = 0;
//ïîêà ñóùåñòâóåò õîòÿáû 1 ýëåìåíò âûïîëíÿèòñÿ ñëèÿíèå
while (r - l + 1 != cur) {
//ñðàâíåíèå ºëåìåíòîâ ïîäìàññèâîâ, ïðîöåññ ñëèÿíèÿ ïîäìàññèâîâ
if (xl > m)
buf[cur++] = mas[xr++];
else if (xr > r)
buf[cur++] = mas[xl++];
else if (mas[xl] > mas[xr])
buf[cur++] = mas[xr++];
else buf[cur++] = mas[xl++];

}
for (int i = 0; i < cur; i++)
mas[i + l] = buf[i];
free(buf);
}
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
08.05.2012, 19:20     Ошибка при запуске программы #9
Цитата Сообщение от Van111 Посмотреть сообщение
нашёл выход используй malloc и free
у вас какой компилятор?

я у себя пробовал их использовать, но программа все равно вылетала.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
08.05.2012, 19:32     Ошибка при запуске программы #10
Цитата Сообщение от antoha398 Посмотреть сообщение
у вас какой компилятор?
я у себя пробовал их использовать, но программа все равно вылетала.
билдер 6

Добавлено через 14 секунд
Цитата Сообщение от antoha398 Посмотреть сообщение
я у себя пробовал их использовать, но программа все равно вылетала.
на какой строке?
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
08.05.2012, 19:36     Ошибка при запуске программы #11
Цитата Сообщение от Van111 Посмотреть сообщение
на какой строке?
как раз вот на этой
C++
1
mas[i]=(int)rand()/rand()+1;
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
08.05.2012, 19:44     Ошибка при запуске программы #12
блин antoha398, вам же сказали
Цитата Сообщение от antoha398 Посмотреть сообщение
mas[i]=(int)rand()/rand()+1;
mas[i]=(int)rand()/ (rand()+1);
antoha398
155 / 155 / 3
Регистрация: 29.03.2012
Сообщений: 418
08.05.2012, 19:50     Ошибка при запуске программы #13
Цитата Сообщение от Van111 Посмотреть сообщение
блин antoha398, вам же сказали
ну, во-первых я тут причем?! программа не моя.

во-вторых, если учесть это mas[i]=(int)rand()/(rand()+1), то программа работает и с new delete.

и все равно мне не понятно зачем автор пытается заполнить массив double целочисленными значениями.
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
08.05.2012, 19:59     Ошибка при запуске программы #14
antoha398, извиняюсь перепутал
Цитата Сообщение от antoha398 Посмотреть сообщение
во-вторых, если учесть это mas[i]=(int)rand()/(rand()+1), то программа работает и с new delete
у меня вылетает при 100000 в функции marge
Цитата Сообщение от antoha398 Посмотреть сообщение
и все равно мне не понятно зачем автор пытается заполнить массив double целочисленными значениями
может просто не заметил
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2012, 11:45     Ошибка при запуске программы
Еще ссылки по теме:

Ошибка при запуске программы C++
C++ Ошибка при запуске программы
Ошибка при запуске программы C++

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

Или воспользуйтесь поиском по форуму:
assasko
0 / 0 / 0
Регистрация: 20.05.2011
Сообщений: 18
09.05.2012, 11:45  [ТС]     Ошибка при запуске программы #15
Цитата Сообщение от Van111 Посмотреть сообщение
antoha398, извиняюсь перепутал

у меня вылетает при 100000 в функции marge

может просто не заметил
да не заметил, просто пробовал разные типы данных, и проглядел))

Добавлено через 2 минуты
antoha398 и Van111 вам огромное спасибо, просто забыл что нужно удалять)) Все работает даже при 1 млн. элементов.
Yandex
Объявления
09.05.2012, 11:45     Ошибка при запуске программы
Ответ Создать тему
Опции темы

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