Есть динамическая матрица размером 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/
_http://cppstudio.com/post/860/
Бахтияр Асылбаев
А можешь пожалуйсто написать эту функцию для моей матрицы. Чтобы в итоги выделило памяти для еше 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();
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();
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();
}
Он по действию своему похож на динамический массив, только его функционал шире по сравнению с массивами. 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 =)
Похожие вопросы
- Помогите с программой на Си. (создание многомерных динамических массивов)
- Си# Найти седловые точки матрицы седловой точкой называется элемент, являющийся миним в строке и максим в столбце
- отсортировать рандомную матрицу змейкой Язык СИ
- вопрос о динамических массивах в fortran
- Как на Си написать программу, которая будет заполнять матрицу 5на5 следовательно как на картинке?
- Как в Си передать динамический адрес файла?
- Динамические массивы. СИ
- Язык си, не могу понять динамическое выделение памяти.
- динамический массив в Visual C++
- Неужели за динамическим номером IP мощные сайты могут видеть кучу информации о компе юсера?