• ベストアンサー

二つ以上の値を返す関数

たとえば、a,bという値を関数に入れて、関数の中で変わったa,bを受け取るような方法はないでしょうか。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=138798 の int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x++; *y++; } を実行してみましたが、 「関数 'func' は定義されていません。int 型の値を返す外部関数と見なします。」 と出てきました。 助言をよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • pikacchu
  • ベストアンサー率44% (11/25)
回答No.2

こんにちは。 「関数 'func' は定義されていません。int 型の値を返す外部関数と見なします。」 のメッセージは関数func()の型がわからないためコンパイラが勝手に関数func()はint型の関数として処理してしまったためです。 対処方法は以下の2通りあります。 1.明示的にプロトタイプ宣言をする。 void func(int *x, int *y); ← 追加する int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x++; *y++; } 2.関数の記述順序を入れ替える。 void func(int *x, int *y) { *x++; *y++; } int main(void) { int a=1, b=2; func(&a, &b); printf("%d, %d\n", a, b); return 0; } のどちらかでOKだと思いますよ。

その他の回答 (4)

  • tdlemon
  • ベストアンサー率37% (3/8)
回答No.5

func()関数の中身については皆さんが 答えているようなことでいいと思います。 そこで、僕は関数の宣言についてちょっと疑問に思いました。 int main(void){ の行の上に void func(int* , int*); と記述されているでしょうか? 自分で作る関数は変数と同じで宣言が必要になってきます。 例えば、printfなどの関数はCに標準についている関数なので 宣言は不要なのですが、自作関数(自分で作る関数)は宣言が必要なんです。 その辺のことがまったくかかれてないので 僕が書いてることは間違ってないのですが、 エラーの原因が関数の宣言にあるとは断定できないので”自信なし”です。 その辺のところ教えてください。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.4

kawa-k> これだと、値は変更されませんね。 ふっ、その通りですねえ。質問者の希望を満たすには、 (*x)++; (*y)++; などと、としなければなりませんね。 # こんなことに気がつかなかった、という意味で自信無し、にチェックしました (^^;

noname#1210
noname#1210
回答No.3

関数をコールできるようになっても、 void func(int *x, int *y) { *x++; *y++; } これだと、値は変更されませんね。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

関数 func() を使う前にプロトタイプ宣言、もしくは、関数の定義が必要です。 元のソースを尊重するならば、int main(void) の前に、 void func(int*, int*); と一行入れてみてください。コンパイル時の警告は無くなります。

関連するQ&A

専門家に質問してみよう