ПРИМЕЧАНИЕ: см. Редактирование ниже для способов сделать это.Я сохраню исходное сообщение как есть.
Исходное сообщение
Чтобы оба размера были динамическими, а элементы были последовательными, у вас нет другого пути, чем ваш первый метод .( note : см. Редактирование, есть способы сделать это, но с g ++)
Подумайте об этом так: когда вы говорите компилятору вычислить массив [i] [j], он автоматически переведет его на:
*(array+i*m+j)
, если массив статичен и m
(количество столбцов) известно.Или, если массив 2D (типа type **
):
*(*(array+i)+j)
Второй случай - это то, как вы обычно делаете это с двумерными массивами, но данные НЕ являются последовательными.Это оставляет вас с первым вариантом.Теперь в первом варианте во время компиляции компилятор должен знать m
.Если вы хотите, чтобы m
был установлен во время выполнения, компилятор просто не сможет вычислить i*m+j
.
Теперь есть способы обойти это.Одним из них является использование классов, как вы упомянули, которые обертывают array = new type[n*m];
и корректно перегружают оператор []
.Другой способ сделать это, который потребовал бы больше памяти (и поэтому я лично не рекомендую), это взять второй массив типа type **
, и вместо того, чтобы устанавливать для каждого элемента значение new type[m]
, вы устанавливаете его в началострок в одномерном массиве.
Тем не менее, суть в том, что где-то вам нужно иметь new type[n*m]
Edit: методы для этого, используя g ++
Это появилось из комментариев ниже:
type *array_helper = new type[n*m];
type (*array)[m] = (type (*)[m])array_helper;
Тогда вы можете использовать массив и элементы будут последовательными.
Я тоже попробовал, и это сработало
type array[n][m];
и я распечатал адреса, специально проверил array[i][m-1]
и array[i+1][0]
и адреса последовательные.