Как изменить значение локальной статической переменной извне функции

#include <stdio.h>

void func() {
static int x = 0;  // x is initialized only once across three calls of
//     func()
printf("%d\n", x); // outputs the value of x
x = x + 1;
}

int main(int argc, char * const argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2

// Here I want to reinitialize x value to 0, how to do that ? <-- this line
return 0;
}

В приведенном выше коде, после вызова func () 3 раза, я хочу повторно инициализировать x в ноль. Есть ли способ, чтобы повторно инициализировать его до 0?

0

Решение

Вы хотите функцию всегда сбросить счетчик после трех вызовов? или вы хотите, чтобы звонящий сбрасывал счет в произвольные моменты времени?

Если это первое, вы можете сделать это так:

void func() {
static int x = 0;
printf("%d\n", x);
x = (x + 1) % 3;
}

Если это последнее, использование локальной статической переменной, вероятно, является плохим выбором; вместо этого вы можете использовать следующий дизайн:

class Func
{
int x;
// disable copying

public:
Func() : x(0) {}

void operator() {
printf("%d\n", x);
x = x + 1;
}

void reset() {
x = 0;
}
};

Func func;

Вы должны сделать его не подлежащим копированию, чтобы избежать двух объектов, увеличивающих два разных счетчика (или сделать его одноэлементным), или сделать счетчик статическим элементом, чтобы каждый объект увеличивал один и тот же счетчик. Теперь вы используете это так:

int main(int argc, char * const argv[]) {
func(); // prints 0
func(); // prints 1
func(); // prints 2

func.reset();
return 0;
}
2

Другие решения

Ты не можешь Это локальная статическая переменная, которая невидима снаружи func(),

Вы можете использовать:

  1. Глобальная статика (обычно не рекомендуется).
  2. Передайте его через параметр ссылка / указатель или верните по ссылке.
0

Вы можете иметь func() присвойте адрес переменной указателю, который виден снаружи func(),

Или вы можете иметь специальный параметр, который вы можете передать func() сказать ему, чтобы сбросить переменную.

Но на самом деле, весь смысл декларации x внутри func() это сделать его видимым только внутри тела func(), Если вы хотите иметь возможность изменить xопределите это где-нибудь еще. Поскольку вы пишете C ++, это, вероятно, имеет смысл для x быть статическим членом некоторого класса.

0
По вопросам рекламы [email protected]