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

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

Восстановить пароль Регистрация
 
anti-k
 Аватар для anti-k
226 / 74 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
20.08.2015, 09:52     Динамическая память массивы #1
В моем примере создаются 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
20.08.2015, 09:54     Динамическая память массивы #2
Цитата Сообщение от anti-k Посмотреть сообщение
можно ли менять размер динамического массива после его создания и как?
Нет. Можно выделить новый массив с новым размером, копировать в него старый, затем старый удалить.
anti-k
 Аватар для anti-k
226 / 74 / 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];
    }
}
Байт
 Аватар для Байт
13951 / 8782 / 1221
Регистрация: 24.12.2010
Сообщений: 15,891
20.08.2015, 10:26     Динамическая память массивы #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
anti-k, Если выделять память через malloc, то изменить размер выделенной памяти можно через realloc

Добавлено через 1 минуту
Но, возможно, в вашем случае лучше использовать vector
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
20.08.2015, 10:26     Динамическая память массивы #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от anti-k Посмотреть сообщение
когда именно стоит использовать " встроенную "(inline) функцию
Умные люди говорят, что использовать inline нужно только тогда, когда будет наверняка известно, что так необходимо делать. Например, профайлер покажет, что вызов этой функции происходит гораздо более медленно, чем если бы код её был встроенным. Ну и т.д.
anti-k
 Аватар для anti-k
226 / 74 / 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;
}
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:20     Динамическая память массивы #7
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
malloc( n * sizeof( int ) );
Функция malloc принимает размер в байтах.
anti-k
 Аватар для anti-k
226 / 74 / 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 раза!)
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 11:39     Динамическая память массивы #9
Цитата Сообщение от anti-k Посмотреть сообщение
castaway, а как объяснить что до 10 все чикает и return value 0;
Видимо до 10 значений программа не затирала критически важные участки памяти. Просто повезло.
anti-k
 Аватар для anti-k
226 / 74 / 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2015, 15:41     Динамическая память массивы
Еще ссылки по теме:

C++ Динамическая память с++
Массивы и указатели. Динамическая память C++
Динамическая память C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4839 / 2978 / 367
Регистрация: 10.11.2010
Сообщений: 11,012
Записей в блоге: 10
Завершенные тесты: 1
20.08.2015, 15:41     Динамическая память массивы #11
Во втором коде строка free(arr); не нужна, т.к. указатель arr уже не указывает на свободный блок памяти после вызова realloc.
Yandex
Объявления
20.08.2015, 15:41     Динамическая память массивы
Ответ Создать тему
Опции темы

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