Как хранить глобальные значения из функции? - PullRequest
0 голосов
/ 24 октября 2018

В моей функции я вычисляю два разных значения (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 becom 0,000 .... Может быть, кто-то может помочь мне понять, почему это происходит.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы должны сделать что-то вроде этого, основываясь на вашем первом определении функции:

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 обновляются.

0 голосов
/ 24 октября 2018

Если вы пытаетесь 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 передача адреса этой переменной вызывающей стороне приводит к неопределенному поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...