我有一个函数,它接受一个指向浮点数组的指针。基于其他条件,我知道指针实际上指向2x2 OR 3x3矩阵。 (事实上,内存最初是这样分配的,例如float M [2] [2])重要的是我想在函数体中做出这个决定,而不是作为函数参数。
void calcMatrix( int face, float * matrixReturnAsArray )
{
// Here, I would much rather work in natural matrix notation
if( is2x2 )
{
// ### cast matrixReturnAsArray to somethingAsMatrix[2][2]
somethingAsMatrix[0][1] = 2.002;
// etc..
}
else if(is3x3)
{ //etc...
}
}
float (somethingAsMatrix)[2] = (float ()[2]) matrixReturnAsArray;
这很好用。
这里,如果我想在下标中提及值作为变量,它将根据某些条件发生变化。
如果我这样做,它会显示警告:ISO C ++禁止变长数组。从这个我怎样才能动态创造一些东西?
答案 0 :(得分:3)
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之外的任何其他值的大小将导致编译时出错。
编辑: 在@Caleth的建议之后使用了对std :: array的引用而不是指针
编辑2: 添加了operator []以便于访问和安全例外
答案 1 :(得分:1)
您可以通过引用传递数组。
void calcMatrix(float (&matrix)[2][2]) // Only binds to 2*2 matrix
{
}
void calcMatrix(float (&matrix)[3][3]) // Only binds to 3*3 matrix
{
}
int main()
{
float a[2][2] ={{1,2} , {3,4}};
calcMatrix(a);
float b[3][3] ={{1,2,3} , {4,5,6}, {7,8,9}};
calcMatrix(b);
}
如果你想要一个适用于不同尺寸的功能,你可以将它模板化:
template<int S>
void calcMatrix(float (&matrix)[S][S]) // Only binds to S*S matrix
{
}
答案 2 :(得分:0)
以下显示了如何进行演员表。
#include <stdio.h>
typedef float t2[2][2];
typedef float t3[3][3];
static void test(int is2, void * p)
{
if(is2)
{
t2 *a = (t2 *)p;
(*a)[1][1] = 1.23;
}
else
{
(*((t3*)p))[1][1] = 2.34;
}
}
int main()
{
printf("Hello World\n");
t2 test2 = {{1,2},{3,4}};
t3 test3 = {{1,2,3},{4,5,6},{7,8,9}};
test(1,(void *)test2);
printf("%g\n",test2[1][1]);
test(0,(void *)test3);
printf("%g\n",test3[1][1]);
return 0;
}