在改变变量的值之后,如何在C中的循环中(在函数内部)重复时保持它不变回

qlvxas9a  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(107)

我是一名学生,正如你所看到的,我目前正在学习C语言。我写了一段代码,用来打印一个可以由a和d控制的滑块。B是我用来移动滑块的变量。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

int b = 2;
void slider();

int main() {
    //int Ar[5] = {};

    while (true) {
        
        slider();

    }

}

void slider() { 
    int Ar[5] = {};
    
    switch (_getch()) {
    case'a':
        Ar[b] = 0;
        b--;
        if (b <= 0)
            b = 0;
        Ar[b] = 1;
        break;
    case'd':
        Ar[b] = 0;
        b++;
        if (b >= 4)
            b = 4;
        Ar[b] = 1;
        break;
    }
    for (int i = 0; i < 5; i++) {
        if (Ar[i] == 1)
            printf("|");
        else
            printf("-");
    }
    printf("\n");
    
}

问题是,当我在没有全局变量的情况下使用这段代码,或者在一个函数中使用它,并在while循环中使用它时,我无法让它工作,因为b在每次重复之后都会返回到值2。
我真正需要的是让它像当前代码形式一样工作,但不使用全局变量,也不将代码保存在单独的函数中。全局变量在这个项目中是被禁止的(所以请告诉我在那个代码中除了int b=2;计数为全局变量),而滑块是一个更大项目的一部分,因此它将在函数内部调用。

fnvucqvd

fnvucqvd1#

问题是变量的作用域。在函数中声明和初始化的变量将在每次调用函数时使用相同的值重新初始化。在函数返回后,变量将不再有效,并且在函数调用之间没有任何跟踪。
根据您允许使用的内容,有几个选项:
1.使用静态函数变量。在函数中,将B声明为static,这将使变量值在函数调用中保持在范围内。从技术上讲,这不是一个全局变量,因此根据您指定的标准,它可能是允许的。静态变量不会像其他函数变量一样位于堆栈上,而是与实际应用程序中创建的其他全局变量位于相同的内存位置,但只有声明它的函数才能访问它。
1.不确定你是否已经做了指针,但另一个选择是在main中跟踪值,并将值作为指针传递给修改它的函数。这将允许从函数调用外部跟踪值,并在函数中修改值。如果这样做,则每次检查或修改b的值以使用*b(即,(*b)++*b<=0等)类似于:

int main() {
    int b = 2;
    while (true) {
        slider(&b);
    }
}

void slider(int *b) {
// Modify references to b to become *b
}

1.另一个不使用static或指针的选项是让main声明并跟踪B,而不是传入指针返回b的新值,以便main可以更新它。类似于:

int main() {
    int b = 2;
    while (true) {
        b = slider(b);
    }
}

int slider(int b) {
// Function unchanged
...
    return b; //return at end of last line so that main can track current value
}

相关问题