2012-03-16 9 views
1

私は簡単な質問があります。関数間をジャンプするか、関数から関数に値を渡す方が一般的に適していますか?関数間をジャンプするか、関数から関数に値を渡す方が良いですか? C

たとえば、私が現在取り組んでいるゲームでは、すべてのデータを含む構造体として構造体game_structureを使用すると、関数間で新しいgame_structuresを渡す方が良いでしょうか、ループとして?現在、たとえば、私はinventoryコマンドをループする関数inventory(game_structure *gs)を呼び出します。しかし、それが終了すると、それはゲームに戻って機能game_loop(game_structure *gs);を開始します。もし私がinventory(game_structure *gs)を返したら、game_structureがどこか別の場所に呼び出されるといいでしょうか?

しかし、他の場合でさえ、何がより有益でしょうか?ループ間をジャンプするか、値を返すか?

+1

コードを拡張するのは、維持しやすく、不可能ではないことを簡単に書く方が良いです。これがもっと重大な理由のために行われない限り、 (私は*私の*仕事ではまだ見つけていません) –

+0

これは何かの静的なデータ構造を作成することは悪い考えではないかもしれないと思いますが、非ローカルジャンプはスタックを破壊します。 – AoeAoe

答えて

1

私は、プログラムフローが手続き的な方法で(可能な限り)構築されていれば、メンテナンス性を助けると思う。したがって、呼び出し元が呼び出された関数の結果を気にしないときに、関数の最後に別の関数を呼び出すと、不必要に複雑になります。私のコードでは、不要な呼び出しネストと再帰を最小限に抑えようとしています。それはあなたの人生をより簡単にコードを維持することになります。

0

本当にあなたがやっていることとあなたが使っているプログラミング言語に依存します。

Cでは、構造を再利用しすぎて再帰的な処理を避ける(スタックを吹き飛ばす)のを忘れてしまいます。結局のところ、タイトなコードを書いて、少しのメモリを使用することは、今日のCの要点であり、mallocincのものは本当に面倒です。

一方、私がハスケルでこれをプログラミングしていたのであれば、私は不変なデータ構造とたくさんの再帰/尾部再帰の面で間違っていました。

0

これはスタックサイズとオブジェクトコピーの問題です。

特にCでは、値を渡すか、他の関数への参照を渡します。これはロジックを維持するだけでなく、ほぼすべてのケースに対応する正しい方法です。

returnステートメントで別の関数を呼び出すと、元のスタックは破棄されず、新しい関数の新しいスタックが作成されます。その間、関数ジャンプの間、オブジェクトは操作のために新しいスタックにコピーまたは移動されます。しかし、コンパイラに依存して、 "移動"されることは保証されていないため、関数を値渡ししてスタックにオーバーフローする可能性があります。

大きなオブジェクトのコピーを何度も心配している場合は、そのオブジェクトをそのライフスコープ内のグローバルな静的オブジェクトとして宣言することをお勧めします。関数を呼び出す際には、オブジェクトの参照を渡します。しかし、1つのキャッチがあります。データが誤って変更される可能性があるため、メモリにアクセスする際には細心の注意が必要です。

関連する問題