在函数中,我计算了两个我们要全局使用的值(Esum和Eold)(函数之外)。 我想使用指针来存储值,但是我不习惯这种技术。
这是我的函数的样子,但不能全局存储值。...不全局存储Esum和Eold ...不好!
float Eold = 0.0f;
float Esum = 0.0f;
void ConPI(float Target, float Value, float Esum, float Eold){
E = Target - Value;
Esum = Esum + E;
Eold = E;
}
现在,我正在寻找一种使用Esum和Eold指针存储全局值的解决方案。我不习惯使用指针,并且需要我的函数的帮助:
void ConPI(float Target, float Value, float Esum, float Eold, float *p, float *q){
E = Target - Value;
Esum = Esum + E;
p = &Esum;
Eold = E;
q = &Eold;
}
这实际上不起作用。退出功能Eold和Esum后,将变为0.000....。 也许有人可以帮助我了解为什么会这样。
非常感谢!
答案 0 :(得分:1)
您应该根据第一个函数定义执行以下操作:
void ConPI(float Target, float Value, float *Esum, float *Ealt){
E = Target - Value;
*Esum = *Esum + E;
*Ealt = E;
}
这样,您可以传递指向Esum和Ealt的指针。并且在函数中使用它们时可以使用解引用运算符。然后,您可以像这样呼叫ConPI
:
float Target, Value, Esum, Ealt;
...
ConPi(Target, Value, &Esum, &Ealt);
现在,每次调用ConPi时,Esum和Ealt都会更新。
答案 1 :(得分:0)
如果您尝试return
全局变量的地址,则需要一个指向该指针的指针:
void ConPI(float Target, float Value, float Esum, float Ealt, float **p, float **q)
{
E = Target - Value;
Esum = Esum + E;
*p = &Esum;
Eold = E;
*q = &Eold;
}
您将这样呼叫ConPI
:
float *copy1, *copy2;
ConPI(..., ..., ..., ..., ©1, ©2);
但是,您的代码中确实存在(潜在)问题
具有名为Esum
的全局变量和局部变量将创建所谓的变量阴影。在ConPI
中,Esum
是指本地副本(即不是全局Esum
)。
return
将此变量的地址分配给调用方会导致未定义的行为。