返り値が複数ほしいような関数って皆さんならどうしますか?
例えば二次平面の座標を求めるとか、xyの連立二元方程式を解くとか。
①複数のデータを構造体でまとめてそれを返り値にする
②vector<int>を返り値にする
③引数に答えを格納する用の変数を参照渡し
ぼくは基本上の3つのうちどれかを使ってます。
座標など構造体にしやすいのは①
集合同士の計算など、ある程度どの要素に対しても同じような計算をするとき②
①②のどちらでも無い時③
のような感じです。
皆さんのお勧めを教えてください。
返り値が複数欲しい関数
Re: 返り値が複数欲しい関数
基本的にはCrさんと同じ考え方ですかね。
ただし、値を直接変更してほしい変数を参照で渡すと、関数の中身だけ見てもコピーなのか参照なのか区別がつかなってちょっと危険なので、
void calc( int& in, int* out );みたいに入力→参照、出力→ポインタとやっています。
ただし、値を直接変更してほしい変数を参照で渡すと、関数の中身だけ見てもコピーなのか参照なのか区別がつかなってちょっと危険なので、
void calc( int& in, int* out );みたいに入力→参照、出力→ポインタとやっています。
pop'n music 20 fantasia ポップンクエストPhase MAX Ⅱ ムラクモ/少年は空を辿る【Power Of Nature】
Re: 返り値が複数欲しい関数
やはり名前の付けられる①がベターなんじゃないかと思います。
std::pair<>やboost::tupple,boost::tie()なんかを使って済ませることも可能といえば可能です。
しかし多用すると可読性が落ちるので、まだポインタで受け取って出力したほうがわかりやすいかと思います。
std::vectorはメモリの動的確保が入るため、数個の戻り値のために使うには少々無駄が多い気がします。
また、入力に参照を使うときはconst 参照がお勧めです。
std::pair<>やboost::tupple,boost::tie()なんかを使って済ませることも可能といえば可能です。
しかし多用すると可読性が落ちるので、まだポインタで受け取って出力したほうがわかりやすいかと思います。
std::vectorはメモリの動的確保が入るため、数個の戻り値のために使うには少々無駄が多い気がします。
また、入力に参照を使うときはconst 参照がお勧めです。
Re: 返り値が複数欲しい関数
言語が指定されていないので、C言語で考えます。
私は(3)’です。
答えを格納するための変数のポインタを渡します。
座標のxとyのように結果が2個くらいの時は、直接変数のポインタを渡します。
結果の数が多い場合、このコードのように、構造体のポインタを渡します。
…構造体の返り値ですか…
例えばサンプルとしてはこんな感じですね。
http://ideone.com/2bUwD
私は(3)’です。
答えを格納するための変数のポインタを渡します。
座標のxとyのように結果が2個くらいの時は、直接変数のポインタを渡します。
結果の数が多い場合、このコードのように、構造体のポインタを渡します。
…構造体の返り値ですか…
例えばサンプルとしてはこんな感じですね。
#include <stdio.h>
typedef struct {
int a;
int b;
} test_t;
test_t zikken(test_t tst) {
test_t result;
result.a=2*tst.a+3*tst.b;
result.b=3*tst.a+2*tst.b;
return result;
}
int main(void) {
test_t testa;
test_t testb;
testa.a=5;
testa.b=7;
testb=zikken(testa);
printf("%d %d\n",testb.a,testb.b);
return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 返り値が複数欲しい関数
私は、時と場合によって複数の方法を使い分けます。Cr さんが書きました:返り値が複数ほしいような関数って皆さんならどうしますか?
これ、と決め打ちすることはないです。たぶん。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: 返り値が複数欲しい関数
良いですね 真似させてもらいます。SUE さんが書きました:void calc( int& in, int* out );みたいに入力→参照、出力→ポインタとやっています。
pair<>使ったこと無かったですねぇ…うしお さんが書きました:std::pair<>やboost::tupple,boost::tie()なんかを使って済ませることも可能といえば可能です。
しかし多用すると可読性が落ちるので、まだポインタで受け取って出力したほうがわかりやすいかと思います。
機能自体は知っててもどこで使っていいのか分からない物がちょこちょこあるなぁ
stackとかも使ったこと無いし
ポインタの方が分かりやすいとのことですし、今後もあまり使う機会がなさそうです。
真似させてもらいます。うしお さんが書きました:また、入力に参照を使うときはconst 参照がお勧めです。
うーむそうですか
再帰関数に③はむいてないんだよなぁ
RVO、初耳でした。beatle さんが書きました: まあ,上手く書けばRVOが働きますから,戻り値で戻しても効率は落ちなかったりしますけどね.
コンパイラ依存らしいですけど名前つけても最適化されるNRVOなんてものもあるんですね
returnのところで名前をつけてない一次オブジェかぁ…
使う機会があったら使ってみます。
結構楽ですよね、それだとみけCAT さんが書きました: 座標のxとyのように結果が2個くらいの時は、直接変数のポインタを渡します。
結果の数が多い場合、このコードのように、構造体のポインタを渡します。
構造体でポインタ渡したこと無かったかもしれません
構造体にすれば変数は一つになるんだし、じゃぁ返り値でいいやみたいな
この辺はもう好みなんですかね
なるほど…box さんが書きました: 私は、時と場合によって複数の方法を使い分けます。
これ、と決め打ちすることはないです。たぶん。
あまりテンプレ化するのも良くないんですね
その場その場であってるものはどれか考えるのも大事ですね
解答してくださった方々、ありがとうございました。
結構知らない機能とかも出てきて良かったです。
いろいろな方法が聞けたので解決にしておきます。
どうもありがとうございました。
Re: 返り値が複数欲しい関数
組み込みやってると戻り値はレジスタで返せる型を選びがちですね。
すぐにスタック溢れてしまうので。
すぐにスタック溢れてしまうので。