Статические переменные в функциях с параметрами func(uint8_t param)

Вот имеется функция, к примеру такая:

uint8_t func (uint8_t pin) {
  static uint8_t oldPinState;
  uint8_t pinState;
  pinState = digitalRead(pin);

  if  (pinState == oldPinState) {
    return 5;
  }
  oldPinState = pinState;
  return 7;
}

Пример, конечно же, чушь полная в практическом использовании (хотя может и нет?) - это не главное. Главное вот в чем. Если данную функцию вызывать с разными значениями в качестве параметра, то как будет вести себя переменная static?

  1. Она будет для всех вызовов функции одинакова?
  2. Она будет для каждого вызова функции своя?

Не могу разобраться. Пожалуйста, поясните знающие люди. Спасибо! :slight_smile:

Этот статик - тот же глобал, но видимый только внутри функции.

Самое прикольное - в метод класса статик затащить после экспериментов на простой функции, экземпляров понаделать, а потом сидеть и офигевать.

Одна переменная на всех. Значение сохраняется между вызовами. Как глобальная, только спрятана внутрь функции.

Я так и думал. Спасибо!
А как же тогда выйти из ситуации (пример выше)?

Точно перегрелся.) Из какой ситуации?

Жарко, но я вроде бы еще “огурцом” :smiley: . Это b707 немного голову напекло… :slight_smile:
Ситуация:
Пример выше читал? Как сохранять промежуточные состояния между вызовами функции с разными значениями параметров?

Так, миллион же решений. Массив, класс, что угодно. Сделайте, например класс, а в нём обычное (нестатическое) свойство.

Пример читал, но ведь вопроса то этого не было.)
Как я понял, нужно иметь pinState для каждого параметра pin?
ЕвгенийП уже ответил. Самое простое - массив состояний для каждого пина.

Спасибо всем ответившим, понял.

конечно же

Она для каждой функции своя:

void func1(uint8_t i) {
  static uint8_t j;
  Serial.print("func1 - Old value: ");
  Serial.print(j);
  Serial.print(", new value: ");
  j = i;
  Serial.println(j);
}

void func2(uint8_t i) {
  static uint8_t j;
  Serial.print("func2 - Old value: ");
  Serial.print(j);
  Serial.print(", new value: ");
  j = i;
  Serial.println(j);
}

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  func1(5);
  func2(6);
  func1(7);
  func2(8);
}

void loop() {
  // put your main code here, to run repeatedly:

}

вывод:

func1 - Old value: 0, new value: 5
func2 - Old value: 0, new value: 6
func1 - Old value: 5, new value: 7
func2 - Old value: 6, new value: 8

Я в этом и не сомневался ))))

область видимости - функция, если не было объявлена глобально о только внутри f

А в чем тогда был вопрос?

Вопрос был об одной функции и разных передаваемых в нее параметрах.

И в сходном сообщении и в моем - функции исключительно с единственным параметром.
Как один и тот же параметр может быть разным? Может, перегрузка функции или приведение типа?

Зачем усложнять “на ровном месте”?

void func (uint8_t param){
  print(param);
}

func(5);  
func(123);
func(0);

Хотя не исключаю, что плохо описал вопрос (но другие же как-то поняли!?).

Здесь вызывается 3 раза одна и та же функция с одним и тем же параметром.
В чем смысл изначального вопроса?

Забудь, это уже несколько дней как не актуально.

Чем форум отличается от чата?
Тем, что в чате сообщения ушли вверх и исчезли, а форум подразумевает, что кто-то, вероятно, будет искать на нем информацию и годы спустя.
Поэтому IMHO принцип “я задал вопрос, получил и понял ответ, а все остальное - несущественно” на форуме не работает. Нужно, чтобы “понял ответ” было не только для ТС, но и для любого, кто будет просматривать эту тему годами позже.
А я, например, до сих пор не понял даже вопроса.

1 лайк