如何从另一个方法向结构指针赋值?

问题描述 投票:-1回答:2

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

先谢谢你。

c++ c pointers struct arduino
2个回答
4
投票

所有变体的主要问题是,你通过了 未初始化 指向 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.