问题
I am a student, and I am trying to make an adventure text game, without using arrays.
This code is a function, called by main
(within another switch case statement). The problem is, the day doesn't update. It only updates when the code is included inline in main
.
int getArea (int nArea) //area and day
{
int nShisha, nBall, nLolipop, nPepsi ;
int nUser; //test variables
int nPrice; // testing variable for price
int naUser ;
int nDay;
nDay = 2;
printf("Choose your Area\n");
printf("1. Riyadh\n2. Jeddah\n3. Albaik\n4. Tazaj\n");
printf("5. Go back\n");
scanf("%d", &nArea);
//nArea
do{ //This is for the place
switch (nArea)
{
case 1 :
printf("Riyadh\n");
printf("Day %d of 15\n", nDay);
nDay ++;
if (nDay == 16) {
return 0;
}
getPrice (&nShisha , &nBall, &nLolipop, &nPepsi ) ;// add charge soon
break;
case 2 :
printf("Jeddah\n");
printf("Day %d of 15\n", nDay);
nDay ++;
if (nDay == 16) {
return 0;
}
getPrice (&nShisha , &nBall, &nLolipop, &nPepsi ); // add charge soon
break;
case 3:
printf("AlBaik\n");// add charge soon
printf("Day %d of 15\n", nDay);
nDay ++;
if (nDay == 16) {
return 0;
}
getPrice (&nShisha , &nBall, &nLolipop, &nPepsi );;
break;
case 4:
printf("Tazaj\n");// add charge soon
printf("Day %d of 15\n", nDay);
nDay ++;
if (nDay == 16) {
return 0;
}
getPrice (&nShisha , &nBall, &nLolipop, &nPepsi );;
break;
default : printf("You have entered invalid!");
break;
}
// printf("do you want to go to another place?\n"); //test code change later into better alternative
scanf("%d", &nArea);
}while (nArea!=0); //for area while
}
Can you guys please explain why is it not updating?
回答1:
Per your clarification, you are talking about variable nDay
. In the code presented in the question, this variable is local to function getArea()
. I am confident that it is successfully updated in the function, but that will have no effect on any like-named variable in main()
or elsewhere. Those are different variables with the same name. Since you describe factoring this code out of main
into its own function, I am fairly confident that this is the nature of the problem.
If you want the function to modify a variable that is local to the caller, then the caller must pass a pointer to that variable, and the function must update the caller's variable indirectly, via the pointer. For example, you might declare getArea()
like this, instead:
int getArea(int area, int *nDay) {
// ...
You would then also need to get rid of the other declaration of nDay
inside getArea()
:
int nDay;
, and all other appearances of nDay
inside the function body would need to be replaced with (*nDay)
.*
For its part, the caller would need to pass the appropriate pointer, something like:
int main(void) {
int area, rval, nDay;
// ...
rval = getArea(area, &nDay);
// ...
}
* Technically, the parentheses are needed only in some cases, but they are harmless in the rest.
回答2:
The value of a variable in a user-defined function won't be updated in main()
function as long as you are not returning it to to the main()
function or the variable is a pointer that had been passed from the main function.
In your code, even though the variable nDay
has been updated in the function getArea
, the variable won't be updated in main()
function if you don't return it. you can use
int getArea (int nArea)
{
...
...
return nDay; // Only this value will be passed to the main() function. nothing else updated here will be passed.
}
int main()
{
int x,y,z, nArea, nDay;//some variable that you declared. Assuming nDay is one of them
...
...
nDay=getArea(nArea); //value returned from the function(which is "nDay" from getArea()) will be assigned to nDay
...
}
Also, I don't see any reason for passing nArea
to getArea()
as you are overwriting/taking new input(value) of nArea
inside the function.
Note the nDay
from main()
and nDay
from getArea()
are actually different variable even though they have the same name.
来源:https://stackoverflow.com/questions/65798233/why-is-my-variable-not-updating-when-i-use-a-switch-statement