// // Домашняя работа №6. Динамические двумерные массивы // main.cpp // #include #include #include "crtdynmem.h" #include "hw6.h" #include "test_hw6.h" using namespace std; int main() { test_full_hw6(); setlocale(LC_ALL, "Rus"); cout << fixed << setprecision(2); // Фиксируем состояние динамической памяти _CrtMemState _ms; _CrtMemCheckpoint(&_ms); // Два возможных варианта работы // с двумерными массивами в динамической памяти: // Уплотненные double *a = nullptr; // массив хранится в непрерывном блоке памяти, // как статический двумерный массив double[][] // Плюсы: память выделяется только под элементы массива; // линейная организация позволет легко кешировать весь массив; // освобождается одним delete[]. // Минусы: нельзя использовать адресацию с двумя индексами a[i][j]; // добавление, удаление строк ведёт к пересозданию всего массива. uint rows, cols; read_new(a, rows, cols); print(a, rows, cols); cout << "В матрице есть нулевые строки: " << boolalpha << has_zero_row(a, rows, cols) << endl; cout << "В матрице есть нулевые столбцы: " << boolalpha << has_zero_col(a, rows, cols) << endl; delete[] a; a = nullptr; // Разреженные double **m = nullptr; // массив указателей на отдельные строки // Плюсы: можно адресовать с двумя индексами m[i][j]; // строками можно манипулировать как элементами m[i], // добавление, удаление одной строки не влияет на остальные. // Минусы: отдельный массив под каждую строку препятствует кешированию всей матрицы процессором // замедляя работу с большими данными; // каждую строку нужно освобождать отдельно, иначе будут утечки памяти. read_new(m, rows, cols); print(m, rows, cols); cout << "В матрице есть нулевые строки: " << boolalpha << has_zero_row(m, rows, cols) << endl; cout << "В матрице есть нулевые столбцы: " << boolalpha << has_zero_col(m, rows, cols) << endl; delete_matrix(m, rows); _CrtMemDumpAllObjectsSince(&_ms); // проверяем отсутствие утечек памяти system("pause"); return 0; }