0

なぜ私の normals_since 関数はグローバル変数の飛躍を認識できないのですか?? メインで宣言された変数がプログラム全体で使用できないとは信じられませんが、それはカプセル化または隠蔽または何かの意味ですか? main.z や _ main _z のような秘密の方法でアクセスできますか?? 私のgccエラー>>

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;

main の外で #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;
};
4

5 に答える 5

3

ご存知のように、関数内の変数はその関数にのみ表示されます。mainは他の関数と同じように関数であり、特別な方法で扱われることはありません。

グローバル変数は関数の外部で宣言されます(ただし、一般に、グローバル関数を避けることをお勧めします。

グローバル変数を避けたい場合の解決策は、変数を使用してmainから関数に変数を渡すことです。

例えば:

int normals_since(int years, int leaps){
    int x;
    x=years-leaps;
    return x;
};

年変数に「int」を追加したことに注意してください。一部のコンパイラでは古いスタイルのCが引き続き許可されていますが、ANSI標準を使用することを強くお勧めし-ansi -strict -Wall -std=c99ます(gccコマンドラインに追加して、「間違ったこと」に関する警告と、ANSI標準に準拠していない場合のエラーを表示します)。

于 2012-12-27T13:32:41.427 に答える
2

で宣言された変数は、それ自体にのみmain()表示されます。これらの変数をグローバル スコープ (すべての関数の外) に移動するか、変数へのポインターを他の関数に渡す必要があります。main()

于 2012-12-27T13:30:38.933 に答える
1

関数の本体で飛躍を定義したためですmain()。真にグローバルにしたい場合は、main()関数の外で定義します。たとえば、プロトタイプのすぐ下に定義します。

int normals_since(int years);
于 2012-12-27T13:32:26.057 に答える
0

考えられる答え: すべての関数に変数を表示させたい場合は、移動する必要があるようです

int z; //place holder
int leaps;
int normals;

main の外側で、 の後にそれらを宣言します#defines

于 2012-12-27T13:29:37.963 に答える
0

ブロックvar内で宣言されたものは、ブロック外では定義されません。
信じられることは何もありません。それが機能する方法です (他のプログラミング言語でも)。
グローバルが必要な場合はvar、すべてのブロックの外で宣言してください。

于 2012-12-27T13:31:10.513 に答える