• 締切済み

C言語のローカル変数の使い方について質問です。

C言語の変数に関しての質問です。 グローバル変数を使わずに、関数内で宣言したローカルの変数を別のソースファイルで使用することって可能ですか? 例えば、a.cというソースファイルと、b.cというソースファイルがあります。 a.cの関数内で"FILE *fp;"と宣言したローカル変数を、b.cの関数内で共有して使うことはできるのでしょうか。 また、"fp"に直接アクセスはできなくても、間接的にアクセスできる方法があれば教えてください。 下に記述しているのは例え用に適当に書いたプログラムです。 --------------------- a.cのソースファイル --------------------- void Temp(void) { char file_name[128] = {}; errno_t error; FILE *fp; // ←この変数を別のソースで使いたいです scnaf_s("%s", file_name, 128); if(error = fopen_s(&fp, fname, "rb") != 0) { printf("ファイルがオープンできません"); return 0; } fclose(fp); } --------------------- b.cのソースファイル --------------------- void Temp2(void) { int size; // ここでa.cのTemp関数で宣言されている"fp"を使いたい fseek( fp, 0, SEEK_END ); fsize = ftell( fp ); fseek( fp, 0, SEEK_SET ); }

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.6

#5 の方が既に書かれてますけどTemp()でfclose()してるので、例えグローバル変数にしたところでTemp2()がTemp()処理中に呼び出されない限り、意味のない値を持つfpにしかアクセスできませんが。 引数や戻り値も含めて設計見直した方がいいと思いますよ。

momoiropuccho
質問者

お礼

#5でも書きましたが、プログラムの例題として取り急ぎ適当に作ったので、fclose()されている部分はあまり気にしないでください(-_-;) fpを受け取る方法を思いついたのでそれを組み込んでいくことにします。 ご回答ありがとうございました。

回答No.5

グローバル変数をつかうにしても、Temp()内で、fclose(fp)しているんだから、 fp変数をTemp2から参照できても 意味ないんじゃないですかね。 Temp()もTemp2()からも使える ファイルの操作をする共有の関数を作るか Temp(),Temp2()それぞれで独立して、fopenするか って感じでは?

momoiropuccho
質問者

お礼

プログラムの例題として形式的に適当に作ったので、fclose()されている部分はあまり気にしないでください(^_^;) 色々と意見ありがとうございます。 考え方を変えて、別の方向でfpを受け取る方法を思いついたのでそれを組み込んでいくことにします。 ご回答ありがとうございました。

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.4

>今書いてるプログラムの構造上、返り値や引数にできそうにないので、間接的な方法は使えないですね。 設計が良くなさそうですね。 その割にグローバル変数の使い方にこだわるのはどうかと。 できれば、設計されている方に、交渉して再利用できるようなものにしてもらうべきですよ。

momoiropuccho
質問者

お礼

やはり設計にも無理がありますよね・・・ とりあえず、一度交渉してみます。 それが無理そうであれば、一からプログラムを組み直してみます。 ご回答ありがとうございました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「共有する」とは言っても, 結局のところ「相手に値を渡したい」だけでしょ? だったら, #1 でも言われるように引数で渡せばいいだけじゃないの?

momoiropuccho
質問者

お礼

現在のプログラムの設計上では、"fp"とは別の返り値を返すことになっているので、"fp"を返り値にすることができないのです。 返り値で渡せたら一番よかったんですけどね。 ご回答ありがとうございました。

回答No.2

どのような手段でも出来ません。 ローカル変数がどこに置かれているかを理解していれば解ることです。 理解出来なければローカルなのだから余所からはアクセスできないという決め事と覚えるべき。

momoiropuccho
質問者

お礼

やはりグローバルでないと他のファイルからはアクセスできないですよね。 分かっていたんですが、グローバル変数は一切使うなと言われたので何とかならないかと迷っていました。 しかしグローバルでないと組めそうにないので、もうこれだけはグローバル変数で押し通すようにします。 ご回答ありがとうございました。

  • akouryy
  • ベストアンサー率100% (3/3)
回答No.1

・呼び出し元が同じならば、呼び出し元から引数として渡し、返り値として呼び出し元に返す。(間接的な方法) ・そうでなければ、グローバル変数を使用する。(直接的な方法) だけしか方法は無いと思います。 引数/返り値は、(恐らく)そのためにあるのでしょうから。

momoiropuccho
質問者

お礼

今書いてるプログラムの構造上、返り値や引数にできそうにないので、間接的な方法は使えないですね。 グローバルで使うしか方法がないっぽいので、今回はグローバル変数として使うことにします。 ご回答ありがとうざいました。