Массив в C ++ должен иметь размер, определенный во время компиляции.
Если вы хотите массив переменной длины, используйте вместо него std::vector
.
В вашем случае я бы использовал шаблон для размера матрицы и имел бы другую реализацию для другого размера матрицы (если я не понял ваши намерения).
template<int SIZE>
struct Matrix {
std::array<std::array<float, SIZE>,SIZE> m;
std::array<float,SIZE>& operator[](int a) {
if(a>=SIZE) {
throw std::out_of_range("Out of range exception");
}
return m[a];
}
};
template<int SIZE>
void calcMatrix(Matrix<SIZE>& matrixReturnAsArray );
template<>
void calcMatrix<2>(Matrix<2>& matrixReturnAsArray )
{
// Code for 2x2 Matrix
std::cout << "<2>" << std::endl;
std::cout << matrixReturnAsArray[1][1] << std::endl;
}
template<>
void calcMatrix<3>(Matrix<3>& matrixReturnAsArray )
{
// Code for 3x3 matrix
std::cout << "<3>" << std::endl;
std::cout << matrixReturnAsArray[2][2] << std::endl;
}
int main() {
std::array<float,2> a={1,2};
Matrix<2> m2;
m2.m = {a,a};
std::array<float,3> b={1,2,3};
Matrix<3> m3;
m3.m = {b,b,b};
calcMatrix(m3);
calcMatrix(m2);
}
Поскольку я не определил универсальный шаблон, использование любого другого значения, кроме 2 или 3 для размера, приведет к ошибке во время компиляции.
Редактировать: Использовать ссылку на массив std :: вместо указателя после предложения @ Калет
Редактировать 2: Добавлен оператор [] для легкого доступа и исключения для безопасности