Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

C++ небольшой вопрос

Максим Грищук Гуру (4493), закрыт 11 лет назад
Я столкнулся с проблемой - лишь объявив массив в динамической памяти можно задать его размерность во время выполнения программы ...то есть такой код не прокатит:
unsigned short int n,m,i,j;
float mass[n][m];
где значения n,m вводятся с клавы во время выполнения программы

Покажите пожалуйста пример размещения массива в динамической памяти, а то я в книге нашёл лишь бесполезных полстраницы...
Лучший ответ
Андрей Hot Профи (704) 15 лет назад
Динамическое выделение памяти под двумерный массив осуществляется следующим образом
(нумерация строк (столбцов) от нуля до n-1 ( m-1)):
int i;
float ** mass = new float*[n];
for(i=0; i<n;i++)> = new float[m];
Андрей HotПрофи (704) 15 лет назад
не знаю, почему неправильно отображаются символы, должно быть

int i;
float ** mass = new float*[n];
for(i=0; i<n;i++)> = new float[m];
Максим ГрищукГуру (4493) 15 лет назад
Спасибо, выручил.
Остальные ответы
лео нео Мастер (1113) 15 лет назад
float mas[] = new float[10][n];

например так. поправьте если что, сейчас в основном ява и C# занимаюсь.
ignat Гуру (3663) 15 лет назад
ищи на тег указатели
если n,m объявляются и получают значение раньше массива, то сработает
Голый Мужик Мыслитель (9632) 15 лет назад
Двумерный массив (в понимании C++) в динамической памяти создать не удастся. Двумерные массивы хранят данные последовательно: такой массив можно представить в виде одномерного длиной N x M (N - длина, M - высота) , в котором индекс элемента (i, j) вычисляется по формуле i * M + j. Очевидно, что для фунциклирования индексации в двумерных массивах необходима информация о количестве строк. Массивы C++ хранят размеры только на этапе компиляции, в процессе выполнения получить эту информацию невозможно.
Таким образом, в динамической памяти C++ можно создавать лишь ступенчатые (jagged) массивы, а вернее блоки памяти, содержащие указатели на блоки памяти.

int ** array = new int* [M];

for (int i = 0; i < M; i++)
array[ i ] = new int[N];

Память освобождается аналогично, но в обратном порядке:

for (int i = 0; i < M; i++)
delete[] array[ i ];

delete[] array;

Но лучше воспользоваться STL и создавать векторы векторов:

#include <vector>
using namespace std;
// Пробелы после < и > обязательны
typedef vector< vector<int> > Array;

void main()
{
int m = 10;
int n = 20;

// Создаём вектор M элементов и прототипиуем его элементы вектором N элементов
Array a(m, vector<int>(n));
a[1][2] = 3;
}

Плюсы: можно увеличивать размерность и не нужно освобождать память.
Похожие вопросы