ページ 11

C言語 グローバル変数を避ける方法

Posted: 2012年4月25日(水) 22:20
by takumi@0832080.com
C言語で関数を作る際に例えばtest関数を作るとする.
[test関数の処理内容]
条件がTUREならtest_sub関数を呼び出しリターン文する.
条件がFALSEならtest関数を再帰呼び出しする.

[test_sub関数の処理内容]
条件がTUREならcounter,counter2を加算してリターン文
条件がFALSEならリターン文

コード:


void test(){
if(条件文){
test_sub();
return ;
}
test();

}

void test_sub(){
if(条件文){
counter++;
counter2++;
}
return ;
}

この状況でcounter,counter2で計算した値を関数定義の存在するファイルと別のファイルで使いたいとします.
counter,counter2を外部結合の変数(extern )で解決しますが,staticやreturn を使ってうまく出来そうな気もするのですが,スマートなやり方はありませんか?(グローバル変数を使いたくない)
C++でクラスを使うといいとかもありますが,それは最終手段ということでお願いします.
(出来たらC言語文法で)

Re: C言語 グローバル変数を避ける方法

Posted: 2012年4月25日(水) 22:32
by beatle

コード:

void test(int* counter, int* counter2)
{
    if (...) {
        test_sub(counter, counter2);
    } else {
        test(counter, counter2);
    }
}

void test_sub(int* counter, int* counter2)
{
    if (...) {
        (*counter)++;
        (*counter2)++;
    }
}
基本的にポインタを渡すようにすればいいのではないでしょうか。

Re: C言語 グローバル変数を避ける方法

Posted: 2012年4月26日(木) 12:05
by softya(ソフト屋)
counter,counter2をstaticなファイル・スコープにして、counter,counter2をの値を外部に返す関数を用意するのが良いかと思います。

Re: C言語 グローバル変数を避ける方法

Posted: 2012年4月28日(土) 19:10
by takumi@0832080.com
beatle さんが書きました:

コード:

void test(int* counter, int* counter2)
{
    if (...) {
        test_sub(counter, counter2);
    } else {
        test(counter, counter2);
    }
}

void test_sub(int* counter, int* counter2)
{
    if (...) {
        (*counter)++;
        (*counter2)++;
    }
}
基本的にポインタを渡すようにすればいいのではないでしょうか。
beatle さんが書きました: counter,counter2をstaticなファイル・スコープにして、counter,counter2をの値を外部に返す関数を用意するのが良いかと思います。
ご解説有難う御座います。
再帰プログラムはあまり使わないので得意じゃなくて・・・^^;
参考にしてみます。

Re: C言語 グローバル変数を避ける方法

Posted: 2012年4月28日(土) 19:52
by 初級者
FALSE(偽)の反対語はTRUEです。
TUREではなく。

Re: C言語 グローバル変数を避ける方法

Posted: 2012年4月28日(土) 22:19
by beatle
引用元は正確にしてください。2つめの引用は僕が書いたものではなくてsoftyaさんの投稿です。