Вы используете две конфликтующих реализации в вашем моделировании матрицы: в main
, можно использовать массивы массивов, с каждой строкой в отдельной памяти; и в func
вы принимаете одиночный плоский массив из rows * columns
элементов, отображающих два индекса на один. Вы должны выбрать тот или другой.
В C++, конечно, вы должны написать класс Matrix
, чтобы инкапсулировать этот выбор. Например, если вы хотите единственный плоский массив (обычно предпочтительно), вы бы написать что-то вроде:
class Matrix
{
int myRowCount;
int myColumnCount;
std::vector<int> myData;
public:
Matrix(int rows, int columns)
: myRowCount(rows)
, myColumnCount(columns)
, myData(rows * columns)
{
}
int& operator()(int row, int column)
{
assert(row >= 0 && row < myRowCount
&& column >= 0 && column < myColumnCount);
return myData[row * myColumnCount + column];
}
int const& operator()(int row, int column) const
{
assert(row >= 0 && row < myRowCount
&& column >= 0 && column < myColumnCount);
return myData[row * myColumnCount + column];
}
};
Вы обратите внимание, что я использовал std::vector
вместо того, чтобы делать какие-либо динамическое распределение сам. В этом случае разница не огромна, но на практике опытный программист на C++ не использовал новый массив, за исключением исключительных случаев; один иногда удивляется, почему это даже на языке.
Вы также заметите, что я перегрузил оператора ()
для индексации . Вы не можете предоставить два индекса для []
, и это одно из решений этой проблемы. В качестве альтернативы operator[]
возьмет один индекс и вернет прокси-объект , который также примет один индекс. Хотя это решение , которое я предпочитаю, это сложнее.
Благодарим за сообщение! – Vasily
Благодарим за сообщение! Да, но есть ли байты после каждой строки, выделенной случайным образом? Если я изменил тип массива, то я мог видеть, что их число фиксировано до 8 + sizeof (type). И у меня 64-битная система, так что это может быть что-то вроде sizeof (pointer) + sizeof (type)? – Vasily
@Vasily Если я правильно вас понимаю, вы спрашиваете об относительном расположении каждого динамически выделенного массива в памяти. Такие детали не указаны стандартом и не соответствуют реализации компилятора. – user2079303