C 如何使函数中的值数组保持静态?

C 如何使函数中的值数组保持静态?,c,arrays,function,C,Arrays,Function,我在stackoverflow中读到,为了使函数中的数组保持静态,我们只需要包含函数protype/a.k.a全局作用域 这里的想法是,一旦用户输入w、a、s或d,方框将移动,并且电路板将与移动的方框一起重新打印 在这种情况下,董事会产生了一个全新的数字,我怀疑这也是为什么盒子的位置没有改变的原因 我能知道保持它静止的正确方法吗 谢谢 /*Assignment for HIT2080 Intro to Programming */ /*Num-Crash*/ /*Created by: Prin

我在stackoverflow中读到,为了使函数中的数组保持静态,我们只需要包含函数protype/a.k.a全局作用域

这里的想法是,一旦用户输入w、a、s或d,方框将移动,并且电路板将与移动的方框一起重新打印

在这种情况下,董事会产生了一个全新的数字,我怀疑这也是为什么盒子的位置没有改变的原因

我能知道保持它静止的正确方法吗

谢谢

/*Assignment for HIT2080 Intro to Programming */
/*Num-Crash*/
/*Created by: Prince of Potatoes Land*/
/*Date started: Nov 13, 2013*/
/*Date finished: ... , 2013*/

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

#define NROW 19
#define NCOL 19

/*function prototype*/
void WelcomeBoard();        /*Function 1*/
void RandomNum(); /* Keeps the numbers static no matter how many times it is called */
void display_marker( int p , int q , char Array[NROW][NCOL] ); /*This is inside RandomNum Function*/
void MoveNum(  int a, int b, char input );

int main()
{
    /*Function caller*/
    WelcomeBoard();
    RandomNum();

    char input;
    printf("\nw,a,s,d to move");
    input = getch();

    int a = 9;
    int b = 9;

    MoveNum(  a,  b,  input );
    RandomNum();
}

/*function 1*/
void WelcomeBoard()
{
    /*local variable to get the user name*/
    char name[20];

    printf("*****************************WELCOME*****************************\n");
    printf("***************************NUMBER CRASH***************************\n\n");

    printf("Please key in your name: ");
    scanf("%s",&name);
    printf("***Good day %s, let's start a new game... all the best!!!***\n\n",name);
}

/*function 2*/
void RandomNum()
{
    /*Local variable*/
    char Array[NROW][NCOL];
    int x,y,r,c; /*for loop use*/
    int p=9,q=9; /*for indicator used*/

    srand( (unsigned) time(NULL)); /*generate different seed random number everytime*/

    /*assign randon number to odd number in array*/
    for(r=0; r<NROW; r++)
    {
        for(c=0; c<NCOL; c++)
        {
            if (c%2 != 0 && r%2 != 0) /*print number in odd number*/
            {
                do
                {
                    Array[r][c]= rand()%8 +50; /*assign randum number 2 - 9 in array*/

                } while( (Array[r][c] == Array[r+2][c]) && (Array[r][c] == Array[r+4][c] && (Array[r+2][c] == Array[r+4][c])) || (Array[r][c] == Array[r][c+2]) && (Array[r][c] == Array[r][c+4]) && (Array[r][c+2] == Array[r][c+4]));
            }
            /*check either is 3 adjecent when first print*/
            else
            {
            Array[r][c]= ' '; /*for even number to print a space*/
            }
        }
    }

    display_marker( p, q, Array );

    /*print the array*/
    for(x=0; x<NROW; x++)
    {
        for(y=0; y<NCOL; y++)
        {
            printf(" %c ", Array[x][y]);
        }
    printf("\n");
    }
}

/*display_marker function*/
void display_marker( int p, int q, char Array[NROW][NCOL] )
{
    /*assign indicator to cover the middle number*/
    Array[p][q-1] = '|';
    Array[p][q+1] = '|';
    Array[p-1][q] = '-';
    Array[p+1][q] = '-';
}

/*move number function*/
void MoveNum( int p, int q, char userInput )
{
    if ( userInput == 'w' )
        p =- 2;
    else if ( userInput == 'a' )
        q =- 2;
    else if ( userInput == 's' )
        p =+ 2;
    else if ( userInput == 'd' )
        q =+ 2;
    else
        printf("\nwrong Input. Please try again");
}
HIT2080编程简介的分配*/ /*Num崩溃*/ /*创作人:土豆王国王子*/ /*开始日期:2013年11月13日*/ /*完成日期:,2013*/ #包括 #包括 #包括 #定义第19行 #定义NCOL 19 /*功能原型*/ 董事会无效()/*职能1*/ void RandomNum();/*无论调用多少次,数字都保持不变*/ 无效显示标记(int p、int q、字符数组[NROW][NCOL])/*这是RandomNum函数的内部*/ void MoveNum(int a、int b、char输入); int main() { /*函数调用者*/ 欢迎来到董事会(); RandomNum(); 字符输入; printf(“\nw,a,s,d移动”); 输入=getch(); INTA=9; int b=9; MoveNum(a,b,输入); RandomNum(); } /*职能1*/ 无效董事会() { /*获取用户名的局部变量*/ 字符名[20]; printf(“欢迎您”*********************************************************************************************\n”); printf(“******************************************************************************************************\n\n”); printf(“请输入您的姓名:”); scanf(“%s”、&name); printf(“***你好%s,让我们开始一个新游戏……祝您一切顺利!!!***\n\n”,name); } /*职能2*/ void RandomNum() { /*局部变量*/ 字符数组[NROW][NCOL]; int x,y,r,c;/*用于循环使用*/ int p=9,q=9;/*表示所用指示器*/ srand((无符号)time(NULL));/*每次生成不同的种子随机数*/ /*将randon数指定给数组中的奇数*/
对于(r=0;r您的问题令人困惑,因为
static
在C中是一个与存储初始化方式有关的反向单词

但是,在您的情况下(如果我正确阅读了您的问题),您需要在不调用RandomNum函数的情况下访问char数组

为此,将Char数组[NROW][NCOL]的声明移动到函数原型所在的位置


然后它将在所有函数中可用。请确保首先调用RandomNum来设置它

我建议您使用变量的静态扩展声明数组,如下所示:

static char Array[NROW][NCOL];
静态自动变量即使在定义它们的块终止后仍然存在。因此,函数中静态变量的值在对同一函数的重复函数调用之间保留

对于您的问题,不太优雅的解决方案是将数组声明为全局变量,然后避免交叉引用和传递它的麻烦

..
char Array[NROW][NCOL];
/*function prototype*/
void WelcomeBoard();  
...
但这是一个丑陋的工作解决方案。下面是关于静态变量的更详细信息

我在stackoverflow上读到,为了在 函数static,我们只需要包含函数protype/a.k.a 全球范围

你在哪里读到的

无论如何,您可以通过将char数组[NROW][NCOL]移动到main之外来声明其全局性。
但是,如果我错了,请纠正我,即使你的数组是全局(或静态)的,每次调用RandomNum()时它都会有不同的数字。在main中,你调用这个函数两次:一次在main的开头,在WelcomeBoard()之后另一次在用户输入后的main末尾。因此我不知道问题出在哪里。

这里是经过一些修改的程序(有关解释,请参阅答案末尾)。 我测试了它,它应该按照您的要求执行:

/*Assignment for HIT2080 Intro to Programming */
/*Num-Crash*/
/*Created by: Prince of Potatoes Land*/
/*Date started: Nov 13, 2013*/
/*Date finished: ... , 2013*/

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

#define NROW 19
#define NCOL 19

/*function prototype*/
void WelcomeBoard();        /*Function 1*/
void RandomNum(); /* Keeps the numbers static no matter how many times it is called */
void display_marker(char Array[NROW][NCOL] ); /*This is inside RandomNum Function*/
void MoveNum(char input );
void print_array(char Array[NROW][NCOL]);
void delete_prev_marker(char Array[NROW][NCOL]);

static char Array[NROW][NCOL];
static int a = 9;
static int b = 9;

int main()
{

    /*Function caller*/
    WelcomeBoard();

    RandomNum();
    display_marker(Array );
    print_array(Array);

    char input;
    printf("\nw,a,s,d to move");
    input = getch();

    MoveNum(input );
    display_marker(Array ); 
    print_array(Array);

}


/*function 1*/
void WelcomeBoard()
{
    /*local variable to get the user name*/
    char name[20];

    printf("*****************************WELCOME*****************************\n");
    printf("***************************NUMBER CRASH***************************\n\n");

    printf("Please key in your name: ");
    scanf("%s",&name);
    printf("***Good day %s, let's start a new game... all the best!!!***\n\n",name);
}

/*function 2*/
void RandomNum()
{

    int x,y,r,c; /*for loop use*/

    srand( (unsigned) time(NULL)); /*generate different seed random number everytime*/

    /*assign randon number to odd number in array*/
    for(r=0; r<NROW; r++)
    {
        for(c=0; c<NCOL; c++)
        {
            if (c%2 != 0 && r%2 != 0) /*print number in odd number*/
            {
                do
                {
                    Array[r][c]= rand()%8 +50; /*assign randum number 2 - 9 in array*/

                } while( (Array[r][c] == Array[r+2][c]) && (Array[r][c] == Array[r+4][c] && (Array[r+2][c] == Array[r+4][c])) || (Array[r][c] == Array[r][c+2]) && (Array[r][c] == Array[r][c+4]) && (Array[r][c+2] == Array[r][c+4]));
            }
            /*check either is 3 adjecent when first print*/
            else
            {
            Array[r][c]= ' '; /*for even number to print a space*/
            }
        }
    }

}

/*display_marker function*/
void display_marker(char Array[NROW][NCOL] )
{
    /*assign indicator to cover the middle number*/
    Array[a][b-1] = '|';
    Array[a][b+1] = '|';
    Array[a-1][b] = '-';
    Array[a+1][b] = '-';
}

/*move number function*/
void MoveNum(char userInput )
{
    delete_prev_marker(Array);

    if ( userInput == 'w' )
        a -= 2;
    else if ( userInput == 'a' )
        b -= 2;
    else if ( userInput == 's' )
        a += 2;
    else if ( userInput == 'd' )
        b += 2;
    else
        printf("\nwrong Input. Please try again");
}

void print_array(char Array[NROW][NCOL]){
    int x,y;
    for(x=0; x<NROW; x++)
    {
        for(y=0; y<NCOL; y++)
        {
            printf(" %c ", Array[x][y]);
        }
    printf("\n");
    }
}

void delete_prev_marker(char Array[NROW][NCOL]){
    Array[a][b-1] = ' ';
    Array[a][b+1] = ' ';
    Array[a-1][b] = ' ';
    Array[a+1][b] = ' ';
}
HIT2080编程简介的分配*/ /*Num崩溃*/ /*创作人:土豆王国王子*/ /*开始日期:2013年11月13日*/ /*完成日期:…,2013年*/ #包括 #包括 #包括 #定义第19行 #定义NCOL 19 /*功能原型*/ void WelcomeBoard();/*函数1*/ void RandomNum();/*无论调用多少次,都会使数字保持静态*/ void display_marker(字符数组[NROW][NCOL]);/*这是在RandomNum函数中*/ void MoveNum(字符输入); 无效打印数组(字符数组[NROW][NCOL]); void delete_prev_标记(字符数组[NROW][NCOL]); 静态字符数组[NROW][NCOL]; 静态INTA=9; 静态int b=9; int main() { /*函数调用者*/ 欢迎来到董事会(); RandomNum(); 显示_标记(数组); 打印数组(数组); 字符输入; printf(“\nw,a,s,d移动”); 输入=getch(); MoveNum(输入); 显示_标记(数组); 打印数组(数组); } /*职能1*/ 无效董事会() { /*获取用户名的局部变量*/ 字符名[20]; printf(“欢迎您”*********************************************************************************************\n”); printf(“******************************************************************************************************\n\n”); printf(“请输入您的姓名:”); scanf(“%s”、&name); printf(“***你好%s,让我们开始一个新游戏……祝您一切顺利!!!***\n\n”,name); } /*职能2*/ void RandomNum() { int x,y,r,c;/*用于循环使用*/ srand((无符号)time(NULL));/*每次生成不同的种子随机数*/ /*将randon数指定给数组中的奇数*/
对于(r=0;r您的数组不需要是静态的(但是如果必须的话,您可以将其设置为全局的并使用static关键字)。实际上,您应该将数组作为调用函数edit的参数传入:有时它可以工作。大多数时候它不能工作。我想可能是因为
char array[NROW][NCOL]
是数组的大小。生成的随机数也存储在其中吗?正如你所说的。那么我该怎么做呢?谢谢你送给我的圣诞礼物@condorwasabi!你太棒了!!:))
/*Assignment for HIT2080 Intro to Programming */
/*Num-Crash*/
/*Created by: Prince of Potatoes Land*/
/*Date started: Nov 13, 2013*/
/*Date finished: ... , 2013*/

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

#define NROW 19
#define NCOL 19

/*function prototype*/
void WelcomeBoard();        /*Function 1*/
void RandomNum(char Array[NROW][NCOL]); /* Keeps the numbers static no matter how many times it is called */
void display_marker(int *a, int *b, char Array[NROW][NCOL] ); /*This is inside RandomNum Function*/
void MoveNum(char input,int *a, int *b, char Array[NROW][NCOL]);
void print_array(char Array[NROW][NCOL]);
void delete_prev_marker(int *a, int *b, char Array[NROW][NCOL]);

int main()
{
    static int a = 9;
    static int b = 9;
    char Array[NROW][NCOL];

    /*Function caller*/
    WelcomeBoard();

    RandomNum(Array);
    display_marker(&a,&b,Array);
    print_array(Array);

    char input;
    printf("\nw,a,s,d to move");
    input = getch();

    MoveNum(input,&a,&b,Array);
    display_marker(&a,&b,Array); 
    print_array(Array);

}


/*function 1*/
void WelcomeBoard()
{
    /*local variable to get the user name*/
    char name[20];

    printf("*****************************WELCOME*****************************\n");
    printf("***************************NUMBER CRASH***************************\n\n");

    printf("Please key in your name: ");
    scanf("%s",&name);
    printf("***Good day %s, let's start a new game... all the best!!!***\n\n",name);
}

/*function 2*/
void RandomNum(char Array[NROW][NCOL])
{

    int x,y,r,c; /*for loop use*/

    srand( (unsigned) time(NULL)); /*generate different seed random number everytime*/

    /*assign randon number to odd number in array*/
    for(r=0; r<NROW; r++)
    {
        for(c=0; c<NCOL; c++)
        {
            if (c%2 != 0 && r%2 != 0) /*print number in odd number*/
            {
                do
                {
                    Array[r][c]= rand()%8 +50; /*assign randum number 2 - 9 in array*/

                } while( (Array[r][c] == Array[r+2][c]) && (Array[r][c] == Array[r+4][c] && (Array[r+2][c] == Array[r+4][c])) || (Array[r][c] == Array[r][c+2]) && (Array[r][c] == Array[r][c+4]) && (Array[r][c+2] == Array[r][c+4]));
            }
            /*check either is 3 adjecent when first print*/
            else
            {
            Array[r][c]= ' '; /*for even number to print a space*/
            }
        }
    }

}

/*display_marker function*/
void display_marker(int *p, int *q, char Array[NROW][NCOL] )
{
    /*assign indicator to cover the middle number*/
    Array[*p][*q-1] = '|';
    Array[*p][*q+1] = '|';
    Array[*p-1][*q] = '-';
    Array[*p+1][*q] = '-';
}

/*move number function*/
void MoveNum(char userInput, int *p, int *q, char Array[NROW][NCOL])
{
    delete_prev_marker(p,q,Array);

    if ( userInput == 'w' )
        *p -= 2;
    else if ( userInput == 'a' )
        *q -= 2;
    else if ( userInput == 's' )
        *p += 2;
    else if ( userInput == 'd' )
        *q += 2;
    else
        printf("\nwrong Input. Please try again");
}

void print_array(char Array[NROW][NCOL]){
    int x,y;
    for(x=0; x<NROW; x++)
    {
        for(y=0; y<NCOL; y++)
        {
            printf(" %c ", Array[x][y]);
        }
    printf("\n");
    }
}

void delete_prev_marker(int *p, int *q, char Array[NROW][NCOL]){
    Array[*p][*q-1] = ' ';
    Array[*p][*q+1] = ' ';
    Array[*p-1][*q] = ' ';
    Array[*p+1][*q] = ' ';
}