why can’t my normals_since function see my global variable leaps??
I can’t believe that variables declared in main aren’t available in the whole program is that what encapsulation or hiding or something means? is it accessible in some secret way like main.z or _main_z ??
my gcc error>>
yrs_since.c: In function ‘normals_since’:
yrs_since.c:40:9: error: ‘leaps’ undeclared (first use in this function)
yrs_since.c:40:9: note: each undeclared identifier is reported only once </p>
for each function it appears in
possible answer
looks like if I want all functions to see the vars, I have to move
int z; //place holder
int leaps;
int normals;
outside of main and declare them up at the top after the #defines
#include stdio.h>
#include stdlib.h>
#define START_GREG 1582
int yrs_since(int year); //type-declare the function
int leaps_since(int years);
int normals_since(int years);
int main(int argc, char* argv[]){
int year = 1599; //local var
int z; //place holder
int leaps;
int normals;
z = yrs_since(year); //call the function
leaps = leaps_since(z); //leap years move the doomsday fwd by 2 days
normals= normals_since(z); //normal years it adjusts one day
printf("blah blah %d,", z);//print the result
printf("leap years since 1582:-->> %d <<", leaps);
printf("normal years since 1582:-->> %d <<", normals);
return EXIT_SUCCESS;
}
int yrs_since(year){
int x;
x=year-START_GREG;
return x;
};
int leaps_since (years){
return years/4;
};
int normals_since(years){
int x;
x=years-leaps;
return x;
};
Right, as you have found out, variables INSIDE a function are only visible to that function.
mainis a function just like any other function, it is not treated in any special way.Global variables are declared OUTSIDE of functions (but it’s generally good advice to avoid global functions, in general.
The solution, if you want to avoid global variables, is to pass the variable from main into the function using the variable.
For example:
Note that I added “int” to the years variable. Whilst old-style C is still allowed in some compilers, it’s definitely recommended to use ANSI standard (add
-ansi -strict -Wall -std=c99to your gcc command line to give you warnings for “things you may have done wrong” and errors for not following ANSI standard)