- ベストアンサー
関数の配列はできないでしょうか。
ひとつの関数で、出力を配列のように複数させたいのですが、できないでしょうか。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
戻り値では1つの値しか返せないので、引数に配列のポインタを渡し、関数内で値をセットするという方法を取ります。 int main(void) { int i, array[10]; func(array); /* 配列のアドレスを渡す */ for (i = 0; i < 10; i++) printf("%d:%d\n", i, array[ i ]); return 0; } void func(int p[ ]) /* pは配列のアドレスを受け取るポインタ */ { int i; for (i = 0; i < 10; i++) p[ i ] = i * i; /* 適当に値をセット */ } 必要な宣言等は、適宜行って下さい。 配列を受け取るポインタの宣言には人それぞれ好みがあるのですが、私は「単なる変数のアドレスを受け取るのではない」ということを主張している、この方法を取っています。 ちなみに「構造体なら返せる」と言って、配列メンバを持った構造体を返してる人を見たことがありますが、できたとしてもこんな方法はやめましょう。
その他の回答 (3)
- mkii
- ベストアンサー率40% (43/105)
No.3の方のソースを元にしてみました。 struct int_array { int size; int *pi; }; struct int_array *func() { struct int_array *p = (struct int_array *)malloc(sizeof(struct int_array)); int *pil = (int*)malloc(sizeof(int[2])); pil[0] = 10; pil[1] = 20; p->pi = pil; p->size = 2; return p; } int main(void) { struct int_array *p = func(); /* 処理 */ free(p->pi); free(p); return 0; } こんな感じでどうでしょうか。 C++ならば、struct int_arrayはクラスにしてデストラクタで領域を解放させるべきですが。 (さらに言えばSTLやクラスライブラリを使ったっていいんですけどね)
お礼
ありがとうございました。 うーん、わたしにはちょっと複雑です。(^^; 「->」あたりからよくわからないです… 安直にはいかないということがわかっただけでも、収穫でした。
- ranx
- ベストアンサー率24% (357/1463)
お勧めはしませんが、こんなやり方もあります。 #include <stdlib.h> int * func() { int *p; p = (int*)malloc(sizeof(int[2])); p[0] = 10; p[1] = 20; } int main(void) { int *a; a = func(); printf("%d, %d\n", a[0], a[1]); free((void*)a); return 0; } 呼び出された関数の内部でメモリーを確保して、そのポインタを返しています。 一般的には、そのポインタはプログラム内で明示的に解放する必要があります。
お礼
ありがとうございます。(^O^) 良し悪しがわからないので、お勧めしないなら、あまり使ってみる気がしないです…(^^; ともかくありがとうございました。
- leaz024
- ベストアンサー率75% (398/526)
> y = f(x); の形で複数の値を返すことはできません。返したい値が2つか3つ程度であれば、 int main(void) { int a, b; func(&a, &b); printf("%d, %d\n", a, b); return 0; } void func(int *x, int *y) { *x = 10; *y = 20; } のようにして、値をセットするのが普通です。 > void main(void) main関数は、終了時にシステムに終了コードを返すべきなので、戻り型をint宣言するのが正しい宣言方法です。(引数はvoidでもOKです。) で、このvoidというのは、戻り値や引数が「ない」ことを示すために使う型です。 void型自体は、関数プロトタイプくらいでしか見ることはないでしょう。(まれにvoidキャストを使うことはありますが。) メモリ確保などを行う場合、void * というポインタ型が出てきたりもするので、参考書などで調べてみるとよいでしょう。
お礼
ありがとうございました。 これからは int main(void) で行こうとおもいます。
補足
「お礼する」で登録してしまったので、こちらに書きます。 >> y = f(x); >の形で複数の値を返すことはできません。 そんなうまい話はないですね。(^^; ありがとうございました。
お礼
ありがとうございます。 ところで、厚かましい質問かも知れませんが、私はいつも double f(double x) { double out_put; out_put = x * x; return(out_put); } という関数で、 y = f(x); のようにしてyに出力させています。 この形が慣れ親しんでいるのですが、このような形で複数の出力はできないでしょうか。 あと、お時間があれば、もうひとつお願いします。 私はいつも、mainを void main(void) としているのですが、これらのvoidとはどういう意味なのでしょうか。 よろしくお願いします。