Member 13542806 Ответов: 3

Хранение значений в функциях при многократном вызове


2/* сомнение относительно программы на языке Си, как хранить значения в функции,если я вызываю функцию, переменные инициализируются, а предыдущие значения удаляются, так как же я могу хранить значения в функциях*/

#include <avr io.h="">
#include <util delay.h="">
#include "buzzer.h"

void ReachDestinationAvoidingNode(unsigned char Xd,unsigned char Yd,unsigned char Xn,unsigned char Yn)
{

}


//Do not make changes in main function

int main(void)
{
       ReachDestinationAvoidingNode(5,'D',6,'D');
       buzzer_on();
       _delay_ms(500);
       buzzer_off();
       ReachDestinationAvoidingNode(2,'F',2,'D');
       buzzer_on();
       _delay_ms(500);
       buzzer_off();
       ReachDestinationAvoidingNode(2,'A',2,'C');
       buzzer_on();

}


теперь, когда функция ReachDestinationAvoidingNode(5,'D', 6,'D') называется 5, значения D должны храниться и снова, когда функция ReachDestinationAvoidingNode(2,'F',2,'D') называется 5,значения D должны использоваться. как это сделать,
не нарушая основной код

Что я уже пробовал:

я пробовал брать переменные в функции ReachDestinationAvoidingNode() и хранить значения, но когда функция вызывается снова, переменные инициализируются, а значение удаляется;

3 Ответов

Рейтинг:
1

phil.o

Если вы хотите сохранить эти значения между вызовами метода, вы можете отложить их из метода и сделать их глобальными.


Рейтинг:
1

KarstenK

Держитесь подальше от статических переменных, потому что они часто приводят к странному поведению, если функции вызываются в другом месте.

Лучше использовать ссылочную семантику. Важно, что все значения ref должны быть переменными.

void ReachDestinationAvoidingNode(unsigned char &Xd,unsigned char &Yd,unsigned char &Xn,unsigned char &Yn)
{
   Xd = 0;// the original Xd gots set
 }
Это означает, что память исходных переменных используется, и поэтому вы можете записывать в них.

Примечание: аналогичная причина заключается в работе с указателями, но в этом сценарии она становится немного более распространенной.


Рейтинг:
0

CPallini

Если вам нужно сохранить только параметры последнего вызова, то вы можете использовать локальные статические переменные, например

void ReachDestinationAvoidingNode(unsigned char Xd,unsigned char Yd,unsigned char Xn,unsigned char Yn)
{
  static unsigned char lastXd, lastYd, lastXn, lastYn;


  //..


  lastXd = Xd;
  lastYd = Yd;
  lastXn = Xn;
  lastYn = Yn;
}