Я не буду повторять свой полный ответ о том, почему динамические двумерные матрицы (и это явно одно) не являются способом перехода на C++.
Answer on: 1D or 2D array, what's faster? (Начать чтение @длинный ответ, или почему динамическая 2 мерная хранения данных (указатель на указатель или вектор-из-вектора) является «плохой» для простых/небольших матриц.)
вы найдете:
- довольно подробное объяснение, почему вы не хотите использовать указатель на указатель динамические массивы
- пример класса для простой матрицы Объекты
Вам даже не нужна функция, которая инициализирует ваши данные до нуля. Просто напишите
matrices::simple<int> matrix_object(6, 6);
, чтобы получить нулевой инициализированному матрицу размером 6x6.
Теперь вы можете получить доступ к элементам через
matrix_object(0,1) = 2; // sets 2nd element of first row to 2
«C++ путь» писать матрицу в поток будет включать определение operator<<
для этого класса, как:
template<typename T>
std::ostream & operator<< (std::ostream &stream, matrices::simple<T> const & matrix)
{
typedef typename matrices::simple<T>::size_type size_type;
for (size_type i(0u); i<matrix.rows(); ++i)
{
for (size_type j(0u); j<matrix.cols(); ++j)
stream << std::setw(4) << std::right << matrix(i,j);
stream << std::endl;
}
return stream;
}
Вы могли бы легко вывести ваша матрица таким образом, написав:
std::cout << matrix_object << std::endl;
Вместе с предыдущей средой PTEs этот выход будет:
0 2 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
Если вы хотите, чтобы продолжать идти по указателям вам придется решить несколько проблем в вашем коде. Я добавил два параметра для других размеров, но при необходимости их можно заменить на 6.
int** new_initialized_array (size_t const rows, size_t const cols)
{
typedef int* rollarray;
rollarray *m = new rollarray[rows];
size_t allocated_arrays(0u);
try
{
for (size_t i(0u); i < rows; ++i)
{
m[i] = new int[cols];
++allocated_arrays;
for (size_t j(0u); j<cols; ++j) m[i][j] = 0;
}
}
catch (std::bad_alloc & e)
{
for (size_t i(0u); i < allocated_arrays; ++i) delete[] m[i];
delete[] m;
throw;
}
return m;
}
Вопросы, я обратился:
- Чтобы вернуть указатель, функция должна иметь тип возвращаемого значения, что на самом деле является указателем (долго это значение без знака).
- Вам необходимо отследить выделение. Если один из них не работает, вам придется откатить все остальное, чтобы избежать утечек памяти.
- Вам не нужен цикл двойного цикла. У вас уже есть внешний контур (тот, который вы назначаете), поэтому вам нужно только внутренний цикл для установки начальных значений для вашего массива.
- И последнее, но не менее важное. Я переименовал функцию. Он фактически не «инициализирует» существующий массив, а создает новый, инициализированный.
Я могу рекомендовать только прочитать ссылку (или любой другой ресурс о том, как обрабатывать 2D-данные в соответствии с RAII).
Это C++ не использовать указатели, используйте СТЛ контейнеры – aaronman
Вы можете просто передать указатель; В вашем текущем случае вы используете локальную переменную '* m' и возвращаете ее без смысла. – ludesign
Где ваше заявление 'return' или ваш параметр? Трудно вернуть что-либо без того или другого. – jxh