【发布时间】:2020-04-23 07:06:10
【问题描述】:
所以我对 C/CPP 不是很精通,但我编写了这段代码:
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);
}
输出:
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 超出范围,因此结构在退出void newVector() 时存储0.0。我该如何解决这个问题?
我确实尝试了以下方法,将其分配给结构的指针:
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);
我认为这与如何在 C/CPP 中分配给结构有关,而不是与 Arduino 软件有关。
提前致谢。
【问题讨论】:
-
使用
newVector(eye, 2.3, 4.1, 5.9);,该函数将获得未初始化的eye值的副本。该函数将副本设置为特定值,它不会更改原始值。 -
但是 eye 不是向量的指针。即使它确实得到了一个指针的副本,这不会使它改变相同的内存位置吗?
-
什么是串行?它是在哪里定义的?
-
@machine_1 这是用于串行通信的标准 Arduino 类。与这个问题无关。
-
Serial 内置于 Arduino 库中,可打印到 Arduino 的串行监视器,它基本上通过串行端口与开发板通信。
标签: c++ pointers struct arduino