関数の部分に、構造体で宣言した物がくる場合について

関数の部分に、構造体で宣言した物がくる場合について 例えばですが、 typedef struct { int x; int y; }POSITION; POSITION set( POSITION *pos ); 等の様に、関数の最初の処に構造体の宣言したものが くるような関数ってどういう意味があるのでしょうか? int とかじゃ駄目なのでしょうか? 馬鹿な質問ですいません。 詳しい回答の方にベストアンサー選ぼうかと思います。 よろしくおねがいします

C言語関連433閲覧xmlns="http://www.w3.org/2000/svg">250

ベストアンサー

0

関数を構造体で宣言する理由は 「複数の値を戻したいから」 です。 C言語の関数では一つの変数しか戻すことが出来ません。 これを構造体で宣言すれば複数の値を関数の戻り値とする事が出来ます。 >>int とかじゃ駄目なのでしょうか? 例えば、一つの数字だけを関数の戻り値としたい場合があったとします。 この場合はベストな方法がintによる戻り値です。 しかし、二つのintを戻り値としたい場合、又は100個のintを戻り値としたい場合は目的を達成出来ません。 そこで役に立つのが構造体による関数の戻り値です。 たとえ話 関数は一つのコップだと考えてください。 貴方は一つのコップを持ってカウンターへ出かけます。 そこで焼酎の水割りをオーダーした場合、コップの中には焼酎の水割りが入ります。 テーブルでは焼酎の水割り(しかもカウンターで決められた混合比)しか楽しむ事が出来ません。 一方、トレーにコップが二つ乗っていると考えます。 この場合、カウンターではミネと焼酎をそれぞれのコップに入れてもらえます。 そしてテーブルでは好きな比率でミネと焼酎を混ぜ合わせてみんなの好みに合わせた水割りやロック、ストレートを楽しむ事が出来ます。 関数は、コップの場合は一つ、トレーの場合は一つのトレーを戻り値として渡す事が出来ます。 トレーに相当するののが「構造体」と呼ばれる物です。 サンプル(SET関数を実行するとx、yを入れ換えます) ------------------------- #include<stdio.h> typedef struct { int x; int y; }POSITION; POSITION set( POSITION pos ){ POSITION retval; retval.x = pos.y; retval.y = pos.x; return retval; } int main() { POSITION data; data.x = 100; data.y = 200; data = set(data); printf("%d,%d\n",data.x,data.y); return 0; } -------------------------

ThanksImg質問者からのお礼コメント

皆様ありがとうございます。全ての方にコインをあげたい気持ちです。 助かりました。本当にありがとうございました。

お礼日時:2010/9/14 16:10

その他の回答(4件)

0

目的を達成すれば良いので、intでは駄目というわけではありませんが、戻り値(関数の型)を構造体にする場合のメリットを、とりあえず2つ挙げます。 1つは複数の値を戻せること。でもこれは、出力用引数として構造体のポインタを受け取っても実現できます。 もう1つは戻り値をそのまま別の関数に渡して処理を連鎖できること。 例えばあるPOSITION値に対して「move:平行移動する」「stretch:原点との距離を伸縮する」「rotate:原点を中心に回転する」などの関数があった時、それぞれが変更後のPOSITION値(のポインタ)を返せば、以下のように記述できます。 rotate( stretch( move( &position, 10, 20 ), 2.4 ), 30 ); この例は見栄えも悪くあまり良い例ではありませんが、C++であれば関数もclassに内包できるので以下のように書けます。 position.move(10, 20)->stretch(2.4)->rotate(30); 「a = b = 0;」と書けるのと同じで、プログラマの記述の幅を広げられるのがメリットです。

0

構造体そのものが返却されます。 但し、返却されるバイト数が増えるので呼び出しが遅くなったり、ヒープの確保が増えたりするので、普通は 元の構造体を呼び出すメインのプログラム内で確保して、そのアドレスを渡したのであれば、結果もそのアドレスが示す ポインタから書き込んでやって、結果だけ返却する方が標準ライブラリとかの作りに似てくると思いますけどね。

0

gannjinngyoukiさん POSITION set( POSITION *pos ); POSITION* set2( POSITION *pos ); こちらが多い??

0

戻り値がintだと1つの変数しか返せません。 構造体なら、構造体全体を返すことが出来ます。 この場合は、int x,int yの両方ですね。 もっと増やしても大丈夫ですので、色んな値を返すことが出来ます。 typedef struct { int no; char name[64]; char addr[256]; char tel[32]; }Member; こんな会員データみたいなのも戻り値に出来ます。