所以我对CCPP不是那么精通,但我曾编过这段代码。
struct vector{
double x;
double y;
double z;
};
void d_print(vector *v){
Serial.print("(");
Serial.print(v->x);
Serial.print(", ");
Serial.print(v->y);
Serial.print(", ");
Serial.print(v->z);
Serial.println(");");
}
void newVector(vector *vec, double x, double y, double z){
vector a;
a.x = x;
a.y = y;
a.z = z;
vec = &a;
d_print(vec);
}
当我调用这些方法时(是的,这是在arduino上调用的,所以有一个... ... void setup()
不是 int main()
, 它的工作并没有像预期的工作 :
void setup() {
Serial.begin(9600);
vector* eye, *center, *up;
newVector(eye, 2.3, 4.1, 5.9);
newVector(center, 0.0,0.0,-1.0);
newVector(up, 0.0,1.0,0.0);
d_print(eye);
d_print(center);
d_print(up);
}
OUTPUT:
12:22:42.198 -> (2.30, 4.10, 5.90);
12:22:42.232 -> (0.00, 0.00, -1.00);
12:22:42.232 -> (0.00, 1.00, 0.00);
12:22:42.267 -> (0.00, 0.00, 0.00);
12:22:42.300 -> (0.00, 0.00, 0.00);
12:22:42.300 -> (0.00, 0.00, 0.00);
我明白, double x, y, z
的范围外,所以结构体存储了0.0,以备退出时使用。void newVector()
. 如何解决这个问题?
我确实尝试了下面的方法,把它赋值给结构的指针。
void newVector(vector *vec, double x, double y, double z){
vec->x = x;
vec->y = y;
vec->z = z;
d_print(vec);
}
我得到了一个更糟糕的输出。
12:32:31.164 -> (0.00, 0.00, 0.00);
12:32:31.201 -> (0.00, 0.00, 0.00);
12:32:31.201 -> (0.00, 0.00, 0.00);
12:32:31.236 -> (0.00, 0.00, 0.00);
12:32:31.273 -> (0.00, 0.00, 0.00);
12:32:31.273 -> (0.00, 0.00, 0.00);
我想这更多的是与CCPP中如何分配给结构有关,而不是与Arduino软件有关。
先谢谢你。
所有变体的主要问题是,你通过了 未初始化 指向 newVector
.
所有的指针必须指向有效的地方,否则你会有 未定义行为 当你试图取消引用指针时(即用 vec->x
).
简单的解决方法是不在 setup
函数,而不是使用普通结构对象,然后使用地址运算符 &
来传递指向这些结构对象的指针。
vector eye;
newVector(&eye, 2.3, 4.1, 5.9);
d_print(&eye);
还要注意的是,第一个版本的 newVector
的函数根本无法使用。使用第二个变体。
void newVector(vector *vec, double x, double y, double z){
vec->x = x;
vec->y = y;
vec->z = z;
d_print(vec);
}