Трудно ответить на ваш вопрос, не зная точно, какой результат вы ожидаете, но я думаю, вы хотите, чтобы "номер цикла" увеличивался при каждом вызове.Если это так, то вам нужен какой-то способ отслеживания предыдущего значения переменной.Есть несколько способов сделать это, но трудно прописать «правильный» способ, когда в структуре самого кода есть некоторые явные ошибки.
Большая ошибка здесь - это «взаимная рекурсия»который был упомянут в одном из комментариев.Представьте, что у вас есть две функции, например
void a()
{
// do something
b();
}
void b()
{
// do something
a();
}
Здесь вы можете видеть, что a
вызывает b
, а b
вызывает a
.Эта программа будет повторяться вечно.Проблема в том, что каждый раз, когда функция вызывается в C, в оперативной памяти выделяется немного памяти, чтобы отслеживать, в какой функции вы находитесь. Поскольку ни a
, ни b
не разрешено завершать, или,более формально, к «return
», эта память никогда не освобождается.Эта программа в конечном счете исчерпает память и вылетает(На самом деле это может не произойти из-за того, что называется «встраивание», но это только потому, что это надуманный пример.)
Лучший способ сделать это в C - использовать while
или for
loop.
void a()
{
// do something
}
void b()
{
// do something
}
int main()
{
while(1)
{
a()
b()
}
}
while
Циклы будут повторяться до тех пор, пока значение в скобках не равно 0
.Так как значение (1
) никогда не будет 0
, эта структура будет зацикливаться вечно, и у нее не будет той же проблемы с взаимной рекурсией, поскольку a
и b
оба могут завершаться, и, следовательно, их памятьбудет освобожден после каждого вызова.
Таким образом, чтобы решить проблему, о которой вы действительно спрашивали, можно ввести static
переменных, как это было предложено (правильно) в другом ответе, или можно было бы реструктурировать их код, не требуя их,Я предпочитаю следующий подход, где startProgram()
вызывается только один раз, и поэтому нет необходимости, чтобы cycle
был статическим.
void startProgram()
{
int statusIsGood = 1;
int cycle = 1;
while(statusIsGood)
{
int input;
scanf("%d", &input);
statusIsGood = getStatus(input);
printf("Cycle count: %d", cycle);
// In practice, it makes more sense to simply do
// cycle++; and get rid of `nextCycle()` all together
cycle = nextCycle();
}
}
int nextCycle(int cycle)
{
return cycle + 1;
}
int getStatus(int input)
{
if (input <= 0 || input >= 12)
return 1;
else
return 0;
}