首页 > 解决方案 > 如何从另一个方法分配给结构指针

问题描述

所以我对 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 软件有关。

提前致谢。

标签: c++pointersstructarduino

解决方案


所有变体的主要问题是您将未初始化的指针传递给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);
}

推荐阅读