牛、豚、鶏、どれか一つ食べられなくなるとしたら?

Cプログラムで関数を呼び出すたびに関数の中でカウントアップ(line変数)したいと思っています。
しかし下記記述だとカウントアップされません。
記述をどのように変更すればよいか分からないでいます。
ご助言戴ければ幸いです。
宜しくお願いします。

◉入力ファイル(aaa、3行、1行1byte)
11
11
11

◉Cプログラム
void get_bgr();

main(argc, argv)
int argc;
char **argv;
{
               int line;
line = 0;
size = 1;
num = 1;
unsigned char buf[1024];
infile[0] = fopen("aaa", "r");

while( fread(buf, size, num, infile[0]) == num){
get_bgr(line);
printf("line2=%d\n",line);
}

       void get_bgr( line )
         int line;
{
line++;
printf("line1=%d\n",line);
}

◉出力結果
  line1=1
  line2=0
  line1=1
  line2=0
  line1=1
  line2=0

◉期待値
  line1=1
  line2=1
  line1=2
  line2=2
  line1=3
  line2=3

A 回答 (1件)

とりあえず、参考にしている書籍・サイト・教科書が古すぎます。



main(argc, argv)
int argc;
char **argv;
はすごく古い書き方なので現代風に改めましょう。
int main(int argc,char **argv)
と書きます。
void get_bgr( line )

void get_bgr( int line )
です。プロトタイプ宣言も同様に直しましょう。

で問題点ですが、get_bgr関数の仮引数のlineとmain関数のローカル変数lineは実際には名前が同じだけの別の変数です。
get_bgrの呼び出しの瞬間にmain→get_bgrでlineの値はコピーされますが逆は起こりません。なのでline++;してもmainのlineには反映されないです。
反映させる方法としてはlineの値を戻り値で返してlineで受けるか、lineをポインタで渡してポインタ参照で書き換える2つの方法があります。
    • good
    • 0
この回答へのお礼

zwiさん

ご連絡遅くなり申し訳ありません。
細かいご指摘ありがとうございます。
記述方法について、古い書き方があるということで、現代風に書き換えるようにします。

>反映させる方法としてはlineの値を戻り値で返してlineで受け
>るか、lineをポインタで渡してポインタ参照で書き換える2つ
>の方法があります。

関数からの戻り値を反映させる方法として2通りあるということで、こちらでも所望の期待値を得られること確認しました。

早急にご回答いただき大変助かりました。
ありがとうございました。

お礼日時:2012/02/27 00:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報