c++ - 如何从另一个方法分配给结构指针
问题描述
所以我对 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
超出范围,因此结构在退出时存储 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);
我认为这与如何在 C/CPP 中分配结构有关,而不是与 Arduino 软件有关。
提前致谢。
解决方案
所有变体的主要问题是您将未初始化的指针传递给newVector
.
所有指针都必须指向有效的地方,否则当您尝试取消引用指针(即使用)时,您将有未定义的行为。vec->x
简单的解决方案是不在setup
函数中使用指针,而是使用普通结构对象,然后使用 address-of 运算符&
将指针传递给这些结构对象:
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);
}
推荐阅读
- java - 识别数字或数学运算符应用程序
- angular - Bootstrap 多选下拉列表 [selected] 属性不适用于 [(ngModel)]
- typescript - ts-loader、antd 和 typescript - 找不到模块 index.less
- c# - 如何刷新 Microsoft Graph 的令牌
- reactjs - 错误地加载了具有创建反应应用程序 js 块的服务工作者
- java - 如何使凌空请求队列与 Java Android 异步?
- appium - Appium 测试错误:okhttp3/ConnectionPool
- php - 如何用 fopen 编写变量名称?
- sql - Postgresql,选择输出结果+1小时
- javascript - 正则表达式在有效和无效之间交替