C 如何使函数中的值数组保持静态?
我在stackoverflow中读到,为了使函数中的数组保持静态,我们只需要包含函数protype/a.k.a全局作用域 这里的想法是,一旦用户输入w、a、s或d,方框将移动,并且电路板将与移动的方框一起重新打印 在这种情况下,董事会产生了一个全新的数字,我怀疑这也是为什么盒子的位置没有改变的原因 我能知道保持它静止的正确方法吗 谢谢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
/*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] = ' ';
}