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

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

Войти
Регистрация
Восстановить пароль
 
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

Динамическая память массивы - C++

20.08.2015, 09:52. Просмотров 256. Ответов 10
Метки нет (Все метки)

В моем примере создаются 4 массива, в arr2[n] и arr3[n] сохраняются результаты совпадений/ не совпадений соответственно. new int создает массив размером int n, хотя полностью размер не используется, можно ли менять размер динамического массива после его создания и как?
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
#include<iostream>//hometask 2
#include<windows.h>
#include<ctime>
 
using namespace std;
void input(int*,int);
int check_match(int*,int*,int*,int);
int check_no_match(int*,int*,int*,int);
void output(int*,int);
 
int main(){
    const int n=10;
    srand(time(0));
    
    int* arr=new int[n];
    int* arr1=new int[n];
    int* arr2=new int[n]();
    int* arr3=new int[n]();
     
    input(arr,n);
    
    input(arr1,n);  
    
    int l=check_match(arr,arr1,arr2,n);
    cout<<"Array with matches "<<endl;
    output(arr2,l);
    
    int k=check_no_match(arr,arr1,arr3,n);
    cout<<"Array with mismatches "<<endl;   
    output(arr3,k);
   
    
    delete [] arr;
    delete [] arr1;
    delete [] arr2;
    delete [] arr3;
    system("pause");
    
    return 0;
}
void input(int* arr,int n){
    for(int i =0;i<n;i++){
        arr[i]=rand()%n;
        cout<<" "<<arr[i];
    } 
    cout<<endl;
}
 
int check_match(int* arr,int* arr1,int* arr2,int n){
    int size=0,counter=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr[k]==arr[i])
            counter++;      
            }
            if(counter==0){
                
                for(int j=0;j<n;j++){
                    if(arr[i]==arr1[j]){                    
                    arr2[size]=arr[i];
                    size++;
                    break;
                    }
                }
                
            }
            
    counter=0;
    }
    return size;
}
 
 
int check_no_match(int*arr,int*arr1,int*arr3,int n){
    int size=0,counter=0,counter1=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr[i]==arr[k]){
                counter++;
            }
        }
        if(counter==0){
            for(int j=0;j<n;j++){
                if(arr[i]==arr1[j])
                counter1++;
                
            }
            if(counter1==0){
                arr3[size]=arr[i];
                size++;
            }
            counter1=0;
        }
        
        counter=0;
    }
 
    counter=0;
    counter1=0;
    for(int i=0;i<n;i++){
        for(int k=0;k<i;k++){
            if(arr1[i]==arr1[k]){
                counter++;
            }
        }
        if(counter==0){
            for(int j=0;j<n;j++){
                if(arr1[i]==arr[j])
                counter1++;
                
            }
            if(counter1==0){
                arr3[size]=arr1[i];
                size++;
            }
            counter1=0;
        }
        
        counter=0;
    }
    return size;
}
 
void output(int*arr,int size){
    for(int i=0;i<size;i++){
        cout<<" "<<arr[i];
    }
    cout<<endl;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.08.2015, 09:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамическая память массивы (C++):

Динамическая память и массивы - C++
Всем доброе утро . Решил по практиковаться и задался вопросом у меня есть массив a; как ему динамическую память выделить? как понял...

Многомерные массивы и динамическая память - C++
Всем привет! Как в С++ динамически выделить двухмерный массив с заданными размерностями, при этом я не хочу использовать доисторический...

Массивы и указатели. Динамическая память - C++
Нужно вывести на экран максимальные элементы в каждом столбце двумерного массива (матрицы). Решить с помощью указателей. Ошибка...

Указатели,массивы символов и динамическая память - C++
Всем привет!!С Вашего позволения сразу к делу. Проблема: не могу освободить память выделенную в динамической памяти Предположения:...

Динамическая память. Функции. Массивы .Объекты - C++
Всем привет. Возник следующий вопрос: 1.Когда в c++ из функции возвращается объект (экземпляр какого-то класса), то насколько мне...

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
20.08.2015, 09:54 #2
Цитата Сообщение от anti-k Посмотреть сообщение
можно ли менять размер динамического массива после его создания и как?
Нет. Можно выделить новый массив с новым размером, копировать в него старый, затем старый удалить.
1
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 10:19  [ТС] #3
John Prick, очень даже не плохой вариант!! Во всяком случае мне понятный!

Добавлено через 10 минут
John Prick, Подскажите еще вот что, когда именно стоит использовать " встроенную "(inline) функцию, допустим, в моем случае, это уместно?
C++
1
2
3
4
5
inline change(int*arr,int arr1,int n, int m){
    for(int i=0;i<m;i++){
        arr1[i]=arr[i];
    }
}
0
Байт
Эксперт C
16062 / 10331 / 1540
Регистрация: 24.12.2010
Сообщений: 19,472
20.08.2015, 10:26 #4
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
anti-k, Если выделять память через malloc, то изменить размер выделенной памяти можно через realloc

Добавлено через 1 минуту
Но, возможно, в вашем случае лучше использовать vector
1
John Prick
801 / 734 / 145
Регистрация: 27.07.2012
Сообщений: 2,107
Завершенные тесты: 3
20.08.2015, 10:26 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
когда именно стоит использовать " встроенную "(inline) функцию
Умные люди говорят, что использовать inline нужно только тогда, когда будет наверняка известно, что так необходимо делать. Например, профайлер покажет, что вызов этой функции происходит гораздо более медленно, чем если бы код её был встроенным. Ну и т.д.
1
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:17  [ТС] #6
Байт, Здравствуйте!! Спасибо! Почитаю реализацию malloc.

Добавлено через 48 минут
Байт, при введении небольшого числа, до 10
Process exited after 3.613 seconds with return value 0

в случае если больше, ошибка выполнения
Process exited after 7.556 seconds with return value 255
массив рисует но программу прикрывает.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int* arr=(int*) malloc(n);
    for(int i=0;i<n;i++){
        arr[i]=1;
        cout<<" "<<arr[i];
    }
    free(arr);
    return 0;
}
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:20 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
malloc( n * sizeof( int ) );
Функция malloc принимает размер в байтах.
1
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:36  [ТС] #8
castaway, Мое почтение! Ясность 100%
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=1;
        cout<<" "<<arr[i];
    }
    free(arr);
    return 0;
}
Добавлено через 4 минуты
castaway, а как объяснить что до 10 все чикает и return value 0; Я так понимаю что происходит перебор в выделенной памяти, при чем относительно размера самого массива большой(в 4 раза!)
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:39 #9
Цитата Сообщение от anti-k Посмотреть сообщение
castaway, а как объяснить что до 10 все чикает и return value 0;
Видимо до 10 значений программа не затирала критически важные участки памяти. Просто повезло.
2
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 11:59  [ТС] #10
castaway, Посмотрите пожалуйста все ли здесь четко
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int m;
    cin>>m;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=i;
        cout<<" "<<arr[i];
    }
    cout<<endl; 
    arr=(int*)realloc(arr,m*sizeof(int));
    for(int i=0;i<m;i++)
    cout<<" "<<arr[i];
    cout<<endl;
    free(arr);
    return 0;
}
Добавлено через 2 минуты
и почему в этом случае ошибка выполнения. рисует массив первые три значения мусор, остальные совпадают. Затем закрывает программу.Потому что для arr1 не выделил память malloс-ом?
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
#include<iostream>
#include<cstdlib>
 
using namespace std;
 
int main(){
    int n;
    cin>>n;
    int m;
    cin>>m;
    int* arr= (int*)malloc(n*sizeof(int));
    for(int i=0;i<n;i++){
        arr[i]=i;
        cout<<" "<<arr[i];
    }
    cout<<endl;
    int*arr1=NULL;
    arr1=(int*)realloc(arr,m*sizeof(int));
    free(arr);
    for(int i=0;i<m;i++)
    cout<<" "<<arr1[i];
    cout<<endl;
    free(arr1);
    return 0;
}
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 15:41 #11
Во втором коде строка free(arr); не нужна, т.к. указатель arr уже не указывает на свободный блок памяти после вызова realloc.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2015, 15:41
Привет! Вот еще темы с ответами:

Динамическая память - C++
Помогите перевести массивы в динамическую память пожалуйста + почему-то не работает запись в файл(не перезаписывает). #include &lt;iostream&gt;...

Динамическая память. - C++
Всем привет! Уважаемые знатоки, можете посмотреть мою реализацию класса вектор? У меня при их большем количестве в программе вечно...

Динамическая память - C++
Всем привет!!! взникла проблема с выполнением строки K=A++; при выполнении printf(&quot;\n__________ %d\n&quot;,K.gasaaa()); получаю левые...

Динамическая память - C++
Есть 2 массива одной размерности: int *m1 = new int , *m2 = new int ; где N, M некие числа. Собственно вопрос: как...


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

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

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