EMANの物理学 過去ログ No.8767 〜

 ● C

  投稿者:ヴィダル - 2010/04/10(Sat) 16:04  No.8767 
いつもお世話になっています。
今回はC言語のプログラミングに関する疑問なのですが、
どなたかお分かりの方がいらっしゃれば教えて下さい。。。

関数の呼び出しに関する質問です。
main関数の中である関数を、今回の場合は相互作用力を計算する関数を
呼び出したいのですが(分子動力学のシミュレーションで使うverlet法です)、そのときは


int main(){

〜〜〜〜〜〜〜〜〜〜

double force();

〜〜〜〜〜〜〜〜〜〜

return 0;

}

double force(){

〜〜〜〜〜〜〜〜〜〜

return 0;

}

という記述をすれば値を返してくれるでしょうか?
force関数の中身が複雑な場合は引数を入れなくても、関数内で
しっかり記述すれば問題ないのでしょうか。
もちろん、力を計算するのに必要な配列はグローバル変数にしてあります。

よろしくお願いします。
実物のプログラムは長いので大枠だけを大雑把に書きましたが、
何か不都合な点がありましたらそれも指摘して頂けるとありがたいです><

  投稿者:yuya - 2010/04/10(Sat) 17:45  No.8768  <Home>
結論から言うと可能です。

どんな計算なのか知りませんが、引数(ひきすう)の個数が多すぎて、
force()を呼ぶときに全部列挙するのが大変なんでしょうね。
グローバル変数に必要な数値を全部セットして、引数なしで関数を呼べば、
とりあえず望んだことは実現します。

ただし、いくつか注意事項があります。

(1)main()内に double force(); とありますが、この double は不要です。
単に force(); と書けば関数force()が呼び出されます。

(2)force()で値を返したいなら、force()の中で return 0; としてはいけません。
これだと値0が返ってくるだけです。返したい値を return すべきです。

(3)呼ばれる側(ここではforce())が呼ぶ側(ここではmain())よりも後ろにあるとエラーになります。
force()の定義をmain()よりも前に書けば大丈夫です。
(ということは、いろんな関数を呼ぶであろうmain()はファイルの末尾に書くことになります。)
ただし、「プロトタイプ宣言」というものを使えば、順番を気にせずに書くことも可能ですが、
それはまた別途勉強してみてください。

(4)グローバル変数は当座をしのぐのには便利ですが、長い目で見るとオススメしません。
じゃあどうすればいいのか、それは状況によりますので、
とりあえず「もっと良い方法がある」ということを頭の片隅にでも入れておいてください。

質問して回答を読んで納得、というのもいいですが、
プログラミングの場合は自分で小さなコードを書いて納得してみることが早道です。

今回の疑問に関して言えば、

#include <stdio.h>

int a = 3, b = 4; /* グローバル変数 */

int sum(void) /* 引数なし */
{
return a + b;
}

int main(void)
{
int c;
c = sum();
printf("%d",c);
return 0;
}

というコードと、

#include <stdio.h>

int sum(int p, int q) /* 引数あり */
{
return p + q;
}

int main(void)
{
int c;
c = sum(3, 4);
printf("%d", c);
return 0;
}

というコードを、それぞれコンパイル・実行してみれば、
いずれも「7」が表示されて正しく動くことが確認できます。

  投稿者:kafuka - 2010/04/13(Tue) 00:15  No.8779 
蛇足ですが、、、

>グローバル変数は当座をしのぐのには便利ですが、「もっと良い方法がある」
「その方法」を会得するには、とりあえず、引数の内で「強く関係しているもの」
を structにして、1つの引数にして、引数の数を減らす方法を
とってみては、どうでしょう。
例えば、x、y、zという引数があったら、
struct{
   double x;
   double y;
   double z;
}p1;

呼び出しは、 xxxxx(&p1、、、) とか xxxxx(&p2、、、)

で、関数宣言は、 xxxxx(*p、、、)
関数内では、
    p->x なんとか

尚、呼び出し側では、
    p1.x = 1.0 ; とか  a = p2.y; ていう具合

ちょっとわかりにくいですが、、、

  投稿者:ヴィダル - 2010/04/15(Thu) 23:08  No.8786 
返信ありがとうございます!
アドバイスを元に色々やってみたいと思います。
また何か分からないことがありましたら、
よろしくお願いします。。。