引数がこう言った場合の関数の呼び方はどうするのでしょうか?

[戻る]
Tabro 2002/09/08(日) 15:44:12
WindowsVC++で使っています。今回はmainから、ある関数funcに対して
int a[10] とFILE *fmを出して
その関数内で加工して、int  b[10]とchar  C[5]を
受取りたいのですが、
main内での関数の呼び出し側と関数内の
宣言側、引数を返すreturn側はどうなるの
でしょうか?
また、a,bの配列が1次元でなく、2次元、
3次元になった時はどうなるのでしょうか?

YuO [E-Mail] 2002/09/08(日) 21:06:48
> main内での関数の呼び出し側と関数内の
> 宣言側、引数を返すreturn側はどうなるの
> でしょうか?

とりあえず,関数の宣言だけ。
int func (const int a[10], FILE * fm, int b[10], char c[5]);
int func (const int a[], FILE * fm, int b[], char c[]);
int func (const int * a, FILE * fm, int * b, char * c);
のどれかです。どれも全く同じ宣言として扱われます。
#a[0]とかが変化しない場合。変化するならconstを外すこと。

でもって,return値は自由に使えます。
よくあるのは,成功時に非0を,失敗時に0を返す方法です。
#C++ならbool型を利用。

ちなみに,最初の宣言で[]の中にある数字は無視されます。


> また、a,bの配列が1次元でなく、2次元、
> 3次元になった時はどうなるのでしょうか?

面倒なので関数を一つの二次元配列(or ポインタ)の引数aのみを渡すとします。

a) 組込配列を渡す場合
int func (int a[10][20]);
int func (int a[][20]);
int func (int (*a)[20]);

int a[10][20];
と定義された配列や,
int (*a)[20];
と定義されたポインタを扱う場合に利用します。[20]は固定になりますし,省略できません。

b) 二重ポインタを渡す場合
int func (int *a[10]);
int func (int *a[]);
int func (int **a);

int **a;
a = malloc(sizeof(int *) * 10);
a[0] = malloc(sizeof(int) * 10 * 20;
for (i = 1; i < 10; ++i) a[i] = a[i - 1] + 20;
として取得した二次元配列を扱う場合に利用します。

このあたりの話は前にも書いたことがあるので,
過去ログを二次元配列で調べると見つかります。
また,
http://www.catnet.ne.jp/kouno/c_faq/c6.html
などを参考にしてもよいでしょう。

古いスレッドには追加発言できません。