[英]Initializing a matrix (2D array) on condition or in switch case, in C
我想将矩阵(3x3数组)发送给另一个函数,以将其乘以某些东西。 但是我希望这个矩阵的内容是有条件的。
方法1:
typedef float Mat3[3][3];
void rotate(Point *p, float theta){
int choice = ((int)theta/90)%4;
switch(choice){
case 0: matMult(p, {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
case 1: matMult(p, {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
case 2: matMult(p, {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}); break;
case 3: matMult(p, {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
default: matMult(p, {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
}
}
方法2:
void rotate(Point *p, float theta){
int choice = ((int)theta/90)%4;
Mat3 matrix = NIL;
switch(choice){
case 0: matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
case 1: matrix = {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
case 2: matrix = {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}; break;
case 3: matrix = {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
default: matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
}
matMult(p, matrix);
}
方法3
void rotate(Point *p, float theta){
int choice = ((int)theta/90)%4;
switch(choice){
case 0: Mat3 matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
case 1: Mat3 matrix = {{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
case 2: Mat3 matrix = {{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}; break;
case 3: Mat3 matrix = {{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}; break;
default: Mat3 matrix = {{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}; break;
}
matMult(p, matrix);
}
他们都不工作,我收到关于}或;的大约50个错误。 放在错误的位置,我很确定这不是问题。 有任何想法吗? 谢谢
不能在C中将矩阵分配给它们,只能对其进行初始化,或者可以分配其各个组件。
您可以采用多种方法进行操作,最简单的方法可能不是switch
而是一系列Mat3
static Mat3 const matrix[] = {
{{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}},
{{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}},
{{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}},
{{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}},
};
unsigned choice = ((unsigned)(theta/90))%4u;
matMult(p, matrix[choice]);
const
因为它看起来函数的第二个参数是只读的。 static
仅分配和初始化了一次。 choice
值的unsigned
保证使用%
的算术运算实际上会产生0
到3
值,而不是负数。 从C99开始可以使用复合文字。 您可以编写如下:
void rotate(Point *p, float theta){
int choice = ((int)theta/90)%4;
switch(choice){
case 0: matMult(p, (Mat3){{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
case 1: matMult(p, (Mat3){{0.0,-1.0,0.0}, {1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
case 2: matMult(p, (Mat3){{-1.0,0.0,0.0}, {0.0,-1.0,0.0}, {0.0,0.0,1.0}}); break;
case 3: matMult(p, (Mat3){{0.0,1.0,0.0}, {-1.0,0.0,0.0}, {0.0,0.0,1.0}}); break;
default: matMult(p, (Mat3){{1.0,0.0,0.0}, {0.0,1.0,0.0}, {0.0,0.0,1.0}}); break;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.