【问题标题】:How to assign to struct pointer from another method如何从另一个方法分配给结构指针
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 啊,好吧,澄清一下,我必须用 malloc 初始化它?
  • @AnanayGupta 你可以使用它(或者new,因为标准的Arduino IDE使用的是C++),但我认为不需要它。只需使用我的答案中所示的地址运算符即可传递。
  • 我会在 2 分钟内接受答案,现在不允许我这样做
猜你喜欢
  • 2013-03-04
  • 1970-01-01
  • 2016-05-27
  • 2021-08-22
  • 2019-06-26
  • 2019-03-18
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多