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 |
#include <iostream.h> #include <string.h> #include <conio.h> void init_array(int* &P, const int N){ P = new int [N]; } //Функция, занимающаяся выделением памяти void fill_array(int* &P, const int N){ for (int i=0; i<N; i++) P[i] = i + 1; } //Функция, занимающаяся заполнением значений в массиве void print_array(int* P, const int N){ //Функция, занимающаяся выводом значений массива на экран for (int i=0; i<N ; i++) cout << P[i] << ' '; cout << "\n"; } void free_array(int* P){ delete []P; } //Функция, занимающаяся очисткой памяти от массива //её можно было и не писать, но мне кажется, что она поспособствует наглядности /*ФУНКЦИЯ ДОВЫДЕЛЕНИЯ ПАМЯТИ*/ void realloc_array(int* &P, int& N){ int* new_ptr = new int [N + 1]; memmove(new_ptr,P, sizeof(int) * N); //Копирование старых данных в новое формирование free_array(P); P = new_ptr; N++; //Увеличение счётчика числа ячеек массива } int main() { clrscr(); int *arr = 0; int N = 1; init_array(arr,N); for (int i=0; i<30; i++){ //Сейчас на каждом новом витке цикла к массиву будет добавлена одна ячейка fill_array(arr,N); print_array(arr,N); //На каждом новом витке получается массив на одну ячейку больше прошлого realloc_array(arr,N); } free_array(arr); cin.get(); } |
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 |
//Borland C++ 3.1 Перераспределение памяти массиву #include <iostream.h> #include <string.h> //для memmove #include <conio.h> //для clrscr() void init_array(int* &P, const int N) { P = new int[N]; } void fill_array(int* &P, const int N) { for (int i = 0; i<N; i++) P[i] = i + 1; } void print_array(int* P, const int N) { if (N) { for (int i = 0; i < N; i++) cout << P[i] << ' '; cout << "\n"; } else { cout << "empty array\n"; } } void free_array(int* P) { delete[]P; } /*ФУНКЦИЯ ДОВЫДЕЛЕНИЯ ПАМЯТИ*/ void realloc_array(int* &P, int& N) { int* new_ptr = new int[N + 1]; memmove(new_ptr, P, sizeof(int) * N); //Копирование старых данных в новое формирование free_array(P); P = new_ptr; N++; //Увеличение счётчика числа ячеек массива } /*ДОБАВИМ К КОДУ ДВЕ ФУНКЦИИ: ВЫДЕЛЕНИЕ ПАМЯТИ И ЗАПОЛНЕНИЕ*/ void realloc_array(int* &P, int &N, const int count_cell) { int* new_ptr = new int[N + count_cell]; memmove(new_ptr, P, sizeof(int) * N); free_array(P); P = new_ptr; N = N + count_cell; } /*ДОБАВИМ ФУНКЦИЮ УСЕЧЕНИЯ*/ void narrow_array(int* &P, int &N, const int count_cell) { //сначала проверяем неправильность ввода: if (count_cell > N) { //Если дано удалить больше ячеек, чем ячеек в массиве free_array(P); //Просто уничтожаем массив N = 0; //сбрасываем счётчик ячеек P = 0; //избегаем двойного delete return; } else if (count_cell < 0) { //Если приходит отрицательное число ячеек, то ничего не делаем cout << "negative count!\n"; //просто информируем return; } //Потом делаем обычные действия else { //Если задано корректное число ячеек, то int new_count = N - count_cell; //Считаем новое число ячеек int* new_ptr = new int[new_count]; //Делаем новый массив с этим числом ячеек memmove(new_ptr, P, sizeof(int) * new_count); //Копируем значения free_array(P); //Уничтожаем старый массив P = new_ptr; //Перенаправляем указатель на новый массив N = new_count; //Ставим счётчик ячеек в правильное положение } } int main() { clrscr(); int *arr = 0; int N = 1; /*вызовы функций*/ init_array(arr, N); //Создаём массив arr из N ячеек fill_array(arr, N); //Заполняем массив arr значениями print_array(arr, N); //Выводим значения массива на экран realloc_array(arr, N, 30); //Динамически добавляем массиву 30 ячеек fill_array(arr, N); //31 - 1 = 30 //Заполняем массив print_array(arr, N); //Выводим значения массива на экран narrow_array(arr, N, 10); //Отсекаем 10 хвостовых ячеек массива print_array(arr, N); //1..21 осталось, потому что усечены 22..31 free_array(arr); cin.get(); } |
В этой строчке»(*P)[N—1]=x» должно быть не N-1, а просто N
В функции my_realloc
тип счетчика i int вместо size_t