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

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

Войти
Регистрация
Восстановить пароль
 
 
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
#1

Сложности распределения памяти - C++

12.12.2013, 20:51. Просмотров 439. Ответов 15
Метки нет (Все метки)

Ребят, никогда не писал под студию, всё время на Dev C++, там проблем с изначальным кодом не было, программа работала прекрасно, а вот в студии ругается на то что переменная в массиве, только с динамическими массивами пока как то не очень получается, ругается на неверное распределение памяти
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include <stdio.h>
#include <ctime>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#define A  10000
using namespace std;
int arr[10000];
void Quick(int l,int r,int*arr);
void Random(int*arr,int num)
{
            for (int n=0; n<num ; n++) arr[n]=0+rand()%10;
}
int Time(int t1,int t2)
{
    return t2-t1;
}
void Scaler(int  &num)
{
    num*=10;
}
int Bubble(int num)
{
    int t1=clock();
    for (int p=0;p<A;p++)
    {
         int *arr = new int[num];
    Random(arr,num);
    
    int temp;
            for (int i=1; i<=num ; i++)
              {
                for (int j=1; j<=num-i; j++) 
                    {
                        if (arr[j]>arr[j+1]) 
                            {
                                 temp=arr[j]; 
                                 arr[j]=arr[j+1];
                                 arr[j+1]=temp;
                            }
                    }
               }
                delete [] arr;
               }
    
               int t2=clock();
                return Time(t1,t2);
}
int Shell(int num)
{
int t1=clock();
    for (int p=0;p<A;p++)
    {
         int *arr = new int[num];
                Random(arr,num);
        int step = num / 2;
        while (step > 0)
    {
      for (int i = 0; i < (num - step); i++)
                {
                    int j = i;
                    while (j >= 0 && arr[j] > arr[j + step])
                    {
                        int temp = arr[j];
                        arr[j] = arr[j + step];
                        arr[j + step] = temp;
                        j--; 
                    }
                }
                step = step / 2;
                delete[] arr;   
            }
         
}
    
   int t2=clock();
               return   Time(t1,t2);
}
int QuickTime(int l,int r,int num)
{
    
        int t1=clock();
            for (int o=0;o<A;o++)
{   
    int *arr = new int[num];
    Random(arr,num);
        Quick(0,num-1,arr);
        delete [] arr;
    }
                
         int t2=clock();
   return Time(t1,t2);
}
void Quick(int l,int r,int*arr)
{   
    int x = arr[l + (r - l) / 2];
    int i = l;
    int j = r;
    while(i <= j)
    {
        while(arr[i] < x) i++;
        while(arr[j] > x) j--;
        if(i <= j)
        {
            swap(arr[i], arr[j]);
            i++;
            j--;
        }
    }
    if (i<r)
                Quick(i, r,arr);
    
    if (l<j)    
        Quick(l, j,arr);   
}
 
void Merge(int l, int r,int num) {
 
   
    if (r == l)
        return;
    if (r - l == 1) { 
        if (arr[r] < arr[l])
            swap(arr[r], arr[l]);
        return;
    }
    int m = (r + l) / 2;
    Merge(l, m, num);
    Merge(m + 1, r, num);
   int *buf = new int[num];
    int xl = l;
    int xr = m + 1;
    int cur = 0;
    while (r - l + 1 != cur) {
        if (xl > m)
            buf[cur++] = arr[xr++];
        else if (xr > r)
            buf[cur++] = arr[xl++];
        else if (arr[xl] > arr[xr])
            buf[cur++] = arr[xr++];
        else buf[cur++] = arr[xl++];
 
    }
    for (int i = 0; i < cur; i++) arr[i + l] = buf[i];
}
 
int MergeTime(int l,int r,int num)
{
    
 
    int t1=clock();
        for (int o=0;o<A;o++)
{
        Random(arr,num);
    Merge(0,num-1,num);
    
    delete [] &arr;
}
        int t2=clock();
        return Time(t1,t2);
}
int main()
{
    
    cout << "\\\Cycles ="<<A<<"///";
    int num=10;
    for(int i=0;i<4;i++)
    {
     int *arr = new int[num];
cout << "\n///Bubble Sort/// \n--------------------\nNumber of elements = "<<num<<"\nTime of work = " << Bubble(num)<<"ms\n-------------------";
cout << "\n///Shell Sort/// \n--------------------\nNumber of elements = "<<num<<"\nTime of work = " << Shell(num)<<"ms\n-------------------";
cout << "\n///Merge Sort/// \n--------------------\nNumber of elements = "<<num<<"\nTime of work = " << MergeTime(0,num-1,num)<<"ms\n-------------------";      
cout << "\n///Quick Sort/// \n--------------------\nNumber of elements = "<<num<<"\nTime of work = " << QuickTime(0,num-1,num)<<"ms\n-------------------";      
Scaler(num);
}
cout << "\\\END///";
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2013, 20:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сложности распределения памяти (C++):

С Паскаля на С++. Реализация модели распределения памяти. - C++
Задание. Программа реализация модели распределения памяти перемещаемыми разделами. Program Model_raspredelenia_pameati; uses crt; ...

Как работает strcpy с точки зрения распределения памяти? - C++
Уважаемые знатоки С++, объясните, пожалуйста, как работает strcpy с точки зрения распределения памяти? Ламерский вопрос, но все-таки...

Модель распределения памяти разделами переменного размера с общей очередью, стратегия "наименее подходящий" - C++
Здравствуйте. Получил следующее задание: Для каждой поступающей программы выделяется один из свободных участков памяти. Таким образом,...

Разработать собственные функции динамического распределения памяти - C++
Разработать собственные функции динамического распределения памяти, используя в качестве “кучи” динамический массив, создаваемый обычной...

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти)) - C++
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Можно ли разместить переменную в нужную ячейку памяти и реально ли хранить данные, разбросанными по памяти? - C++
Добрый день. Не могу найти информацию по двум вопросам : 1) могу ли я разместить переменную в нужную ячейку памяти. Например: int a...

15
zss
Модератор
Эксперт С++
6403 / 5969 / 1945
Регистрация: 18.12.2011
Сообщений: 15,370
Завершенные тесты: 1
12.12.2013, 21:13 #2
Так вроде все нормально.
У меня компилятор VS 2008 выдает только предупреждение на строки типа
C++
1
cout << "\\\END///";
Неизвестная escape - последовательность.
Не хватает обратных слашей, надо
C++
1
cout << "\\\\\\END///";
0
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 21:20  [ТС] #3
выдаёт heap corruption detected

Добавлено через 3 минуты
вероятно он думает что arr уже удалён, но я вроде как его пересоздаю же
0
Croessmah
Эксперт CЭксперт С++
13415 / 7566 / 855
Регистрация: 27.09.2012
Сообщений: 18,618
Записей в блоге: 3
Завершенные тесты: 1
12.12.2013, 21:23 #4
C++
1
2
3
            for (int i=1; i<=num ; i++)
              {
                for (int j=1; j<=num-i; j++)
уверены в правильности индексации?

и утечки памяти
0
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 21:26  [ТС] #5
да, это конечно ошибка, да только вылетает он на функции Shell
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 21:46 #6
Цитата Сообщение от BlackDay28 Посмотреть сообщение
только вылетает он на функции Shell
Виснет в Bubble(), после delete [] arr. В циклах где-то выход за пределы (в arr, в одном из элементов, мусор).
0
Миниатюры
Сложности распределения памяти  
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 21:51 #7
И зачем эта функция, если потом массив удаляется?
0
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 21:57  [ТС] #8
мне нужно исключительно замерить время сортировки

Добавлено через 3 минуты
и дело не в этом, уже поправил, останавливает не из за этого
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 22:00 #9
Цитата Сообщение от BlackDay28 Посмотреть сообщение
уже поправил
Если поправили, то и код было бы неплохо увидеть (что поправили? как поправили?). Ясновидящих тут нет.
0
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 22:09  [ТС] #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
      int Bubble(int num)
{
    int t1=clock();
    for (int p=0;p<A;p++)
    {
   int *arr = new int[num];
    Random(arr,num);
            for (int i=0; i<num ; i++)
              {
                for (int j=0; j<num-i; j++) 
                    {
                        if (arr[j]>arr[j+1]) 
                            {
                                 swap(arr[j],arr[j+1]);
                            }
                    }
               }
                delete [] arr;
               }
    
               int t2=clock();
                return Time(t1,t2);
}
Добавлено через 2 минуты
я о счётчике, баг остался

Добавлено через 1 минуту
сомневаюсь что теперь он хоть как то способен выйти из пределов

Добавлено через 3 минуты
а нет, сортировка неправильная, счётчик второй точно, но всё же не работает даже после правки
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 22:11 #11
Всё равно выход в Bubble (j = 9, а значит j + 1 = 10 - выход за пределы), и зависание при delete [] arr.
0
Миниатюры
Сложности распределения памяти  
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 22:25  [ТС] #12
теперь выводит это... _Block_Type_Is_Valid (pHead->nBlockUse)

Добавлено через 51 секунду
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int Bubble(int num)
{
    int t1=clock();
    for (int p=0;p<A;p++)
    {
         int *arr = new int[num];
    Random(arr,num);
            for (int i=0; i<num ; i++)
              {
                for (int j=num-1; j>i; j--) 
                    {
                        if (arr[j]<arr[j-1]) 
                            {
                                 swap(arr[j],arr[j-1]);
                            }
                    }
               }
                delete [] arr;
               }
    
               int t2=clock();
                return Time(t1,t2);
}
вот верный алгоритм он то точно не глючит
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
12.12.2013, 22:40 #13
Вы в Shell(), в while(), delete[] arr делаете? И что потом в этом цикле делать?

Добавлено через 2 минуты
А это что (в MergeTime): delete [] &arr? Освобождение памяти под массивом на стеке?
1
BlackDay28
0 / 0 / 0
Регистрация: 12.12.2013
Сообщений: 8
12.12.2013, 22:44  [ТС] #14
тот баг я уже заметил, но зависает всё ещё в bubble

Добавлено через 4 минуты
а всё, вроде теперь всё в норме хотя на 1000 элементов вылет, кажется я не прописал удаление buf
0
DU
1483 / 1129 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
12.12.2013, 22:54 #15
замерять время сортировки и при этом учитывать время на создание и удаление диманического массива - это неправильно. динамическое выделение может быть сильно больше времени сортировки маленького массива.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.12.2013, 22:54
Привет! Вот еще темы с ответами:

резервирование памяти/освобождение памяти для трехмерного массива - C++
Необходимо создать трехмерный массив (A), в котором элементы вдоль направления Z выли бы выровнены по 16 байт. Есть две проблемы: ...

Возникли сложности - C++
По ходу изучения возник вопрос: Данное объявление - легально для объявления С String? char test = { 'a', 'b', 'c', '\0' }. ...

Сложности со структурами - C++
Проблема в том, что структура students ch работает только с (а), которая была введена через константу, а через ввод с клавиатуры нет. ...

Сложности в изучении С++ - C++
Всем привет! Решил изучить С++. В интернете рекомендуют почитать Страуструпа. Скачал, читаю, но сложно воспринимаю. Очень много...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
12.12.2013, 22:54
Ответ Создать тему
Опции темы

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