簡體   English   中英

如何從另一個方法分配給結構指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM