Другие языки программирования и технологии

Увиличение динамической матрицы в Си.

Есть динамическая матрица размером a x 2:

m = (int**)calloc(a, sizeof(int*));
for(i = 0; i < a; i++)
m[i]=(int*)calloc(2, sizeof(int));

Необходимо эту матрицу увеличить на b количество линии чтобы не потерять данные котороые в ней находятся.

Чтобы конечный размер был a+b x 2
см. функцию realloc

_http://cppstudio.com/post/860/
Askar Kudashov
Askar Kudashov
84 764
Лучший ответ
Бахтияр Асылбаев А можешь пожалуйсто написать эту функцию для моей матрицы. Чтобы в итоги выделило памяти для еше b количество строк
В качестве примера конечно:
SetConsoleCP(1251); SetConsoleOutputCP(1251);
int Array[10]{ 1,2,3,4,5,6,7,8,9,10 };
int * ptr = (int*)(calloc(10, 10*sizeof(int)));
memcpy(ptr, Array, 10*sizeof(int));

for (size_t i(0); i < 10; i++)
{
cout << *(ptr + i) << " ";
}cout << endl << endl;

int Array2[5]{ 1,2,3,4,5 };
realloc(ptr, 15 * sizeof(int));

memcpy(ptr + 10, Array2, 5 * sizeof(int));

for (size_t i(0); i < 15; i++)
{
cout << *(ptr + i) << " ";
}cout << endl;

free(ptr);
ptr = NULL;
_getch();
AB
Alexs Bezdushnyy
10 755
Askar Kudashov realloc(ptr, 15 * sizeof(int)); - сомнительно. н-р блок переедет.
Если писать массивами (индексированными указателями на индексированные указатели) не обязательно, то рекомендую использовать шаблонный класс vector < >.
Он по действию своему похож на динамический массив, только его функционал шире по сравнению с массивами. vector - это класс, а это означает, что к его экземплярам можно применить различные удобные методы. Например, push_back(); - вставить новый элемент в конец с автоматическим изменением размера вектора.
Вектор позволяет добавлять новые элементы, удалять и изменять элементы уже имеющиеся в контейнере. И никаких указателей.
Вот код на векторах для решения Вашей задачи. Я его проверил - работает. Если есть вопросы по коду - задавайте.

#include < iostream >
#include < windows.h >
#include < ctime >
#include < cstdlib >
#include < vector >
#include < algorithm >
#include < iomanip >

using namespace std;

void main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand(time(NULL));
system("color 0A");

cout << "Введите исходные размеры матрицы " << endl;
unsigned n, m;
cin >> n >> m;
vector horizon(m);
vector vertical(n);
generate(vertical.begin(), vertical.end(), [m]()
{
vector horizon(m);
generate(horizon.begin(), horizon.end(), []()
{
return rand() % 51;
});
return horizon;
});

cout << "Исходная матрица" << endl;
for (auto t : vertical)
{
for (auto tt : t)
{
cout << setw(4) << tt;
}
cout << endl;
}

cout << "Укажите новые размеры для этой матрицы (только уменьшение) ";
unsigned nd, md;
cin >> nd >> md;
for (unsigned u = 0; u < vertical.size(); ++u)
{
vertical[u].resize(md);
}
for (unsigned u = 0; u < nd - n; ++u)
{
vector g(md);
vertical.push_back(g);
}

cout << "Матрица с изменёнными размерами" << endl;
for (auto t : vertical)
{
for (auto tt : t)
{
cout << setw(4) << tt;
}
cout << endl;
}

cin.get(); cin.get();
}
Askar Kudashov Один только момент - автор просил C =)