如何从函数存储全局值?

时间:2018-10-24 20:28:27

标签: c pointers

在函数中,我计算了两个我们要全局使用的值(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....。 也许有人可以帮助我了解为什么会这样。

非常感谢!

2 个答案:

答案 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(..., ..., ..., ..., &copy1, &copy2);

但是,您的代码中确实存在(潜在)问题

  1. 具有名为Esum的全局变量和局部变量将创建所谓的变量阴影。在ConPI中,Esum是指本地副本(即不是全局Esum)。

  2. return将此变量的地址分配给调用方会导致未定义的行为。