[英]How to assign to struct pointer from another method
所以我對 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);
}
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);
我了解 scope 中的double x, y, z
go,因此該結構在退出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);
}
我得到更糟糕的 output:
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
。
所有指針都必須指向有效的地方,否則當您嘗試取消引用指針時(即使用vec->x
),您將有未定義的行為。
簡單的解決方案是在setup
function 中不使用指針,而是使用普通結構 object,然后使用地址運算符&
將指針傳遞給這些結構對象:
vector eye;
newVector(&eye, 2.3, 4.1, 5.9);
d_print(&eye);
另請注意,您展示的newVector
function 的第一個版本根本不起作用。 使用第二種變體:
void newVector(vector *vec, double x, double y, double z){
vec->x = x;
vec->y = y;
vec->z = z;
d_print(vec);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.