У меня есть базовый класс матрицы шаблонов:
template<class T, unsigned N>
class Matrix {
private:
static const unsigned Stride = N;
static const unsigned Size = Stride * Stride;
T data[Size] = {};
public:
Matrix() {};
Matrix( const T* dataIn ) {
fillMatrix( dataIn );
}
void fillMatrix( const T* dataIn );
void printMatrix();
};
template<class T, unsigned N>
void Matrix<T, N>::fillMatrix( const T* dataIn ) {
for( unsigned int i = 0; i < Size; i++ ) {
this->data[i] = dataIn[i];
}
}
template<class T, unsigned N>
void Matrix<T, N>::printMatrix() {
for( unsigned int i = 0; i < Stride; i++ ) {
for( unsigned int j = 0; j < Stride; j++ ) {
std::cout << this->data[i*Stride + j] << " ";
}
std::cout << '\n';
}
}
Который работает отлично!Данные заполнены правильно и отображаются правильно.Однако, когда я пытаюсь расширить вышеуказанную квадратную 2D-матрицу до MxN-матрицы следующим образом:
template<class T, unsigned M, unsigned N>
class Matrix {
private:
static const unsigned Row = M;
static const unsigned Col = N;
static const unsigned Size = M * N;
T data[Size] = {};
public:
Matrix() {};
Matrix( const T* dataIn ) {
fillMatrix( dataIn );
}
void fillMatrix( const T* dataIn );
void printMatrix();
};
template<class T, unsigned M, unsigned N>
void Matrix<T,M,N>::fillMatrix( const T* dataIn ) {
for( unsigned int i = 0; i < Size; i++ ) {
this->data[i] = dataIn[i];
}
}
template<class T, unsigned M, unsigned N>
void Matrix<T,M,N>::printMatrix() {
for( unsigned int i = 0; i < Row; i++ ) {
for( unsigned int j = 0; j < Col; j++ ) {
std::cout << this->data[i*Row + j] << " ";
}
std::cout << '\n';
}
}
Я не получаю правильные значения: например, если я передам в этот шаблон класса массив как таковойdouble data[6] = { 1,2,3,4,5,6 };
С экземпляром матрицы Matrix<double, 2,3>
, равной 2x3
, я получаю значения и распечатку в виде:
1 2 3
3 4 5
Я ожидаю, что данные и выходные данные будут.
1 2 3
4 5 6
По какой-то причине он применяет 3 раза дважды и вообще не добавляет 6 к матрице.
Я неправильно заполнил эту матрицу MxN в функции fillMatrix()
или неправильно ее отображаюиндексация в функции printMatrix()
.Я знаю, что это довольно тривиально, но я пропускаю это и не могу найти то, что мне не хватает.
РЕДАКТИРОВАТЬ
Я работал сотладчик и глядя на члена класса data[Size]
, и он был заполнен правильными значениями, так что это привело меня к мысли или подозрению, что проблема в функции printMatrix()
.Когда я делал это, несколько пользователей разместили полезные ответы!Поначалу моя логика казалась правильной, но порядок был неправильным.
Пользователь: Ответ RandomBits фактически решает проблему.Пользователь: Ответ Матье Брухера объясняет проблему.
Я хотел бы принять оба ответа, но могу принять только один.Спасибо вам обоим за информативную информацию.Я пока оставлю этот вопрос открытым.