- ベストアンサー
二つ以上の値を返す関数
たとえば、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 型の値を返す外部関数と見なします。」 と出てきました。 助言をよろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 「関数 '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)
func()関数の中身については皆さんが 答えているようなことでいいと思います。 そこで、僕は関数の宣言についてちょっと疑問に思いました。 int main(void){ の行の上に void func(int* , int*); と記述されているでしょうか? 自分で作る関数は変数と同じで宣言が必要になってきます。 例えば、printfなどの関数はCに標準についている関数なので 宣言は不要なのですが、自作関数(自分で作る関数)は宣言が必要なんです。 その辺のことがまったくかかれてないので 僕が書いてることは間違ってないのですが、 エラーの原因が関数の宣言にあるとは断定できないので”自信なし”です。 その辺のところ教えてください。
- a-kuma
- ベストアンサー率50% (1122/2211)
kawa-k> これだと、値は変更されませんね。 ふっ、その通りですねえ。質問者の希望を満たすには、 (*x)++; (*y)++; などと、としなければなりませんね。 # こんなことに気がつかなかった、という意味で自信無し、にチェックしました (^^;
関数をコールできるようになっても、 void func(int *x, int *y) { *x++; *y++; } これだと、値は変更されませんね。
- a-kuma
- ベストアンサー率50% (1122/2211)
関数 func() を使う前にプロトタイプ宣言、もしくは、関数の定義が必要です。 元のソースを尊重するならば、int main(void) の前に、 void func(int*, int*); と一行入れてみてください。コンパイル時の警告は無くなります。