関数で行列はどう返すのでしょうか?

[戻る]
Int 2002/09/17(火) 16:17:58
関数から変数を返す時、Aと言うスカラなら、関数側でfunc( , ,float FA)
A[100]と言うベクトルならば、関数側でfunc( , ,float *FA)
と言う指定で変えるようなのですが、
行列の場合、A[100][100]という行列は、
func( , ,float *FA)、そして、MAIN側でfloat  FA[100][100];
と指定しておいても
c:\bin\pp.c(9885) : error C2109: 配列または、ポインタでない変数に添字が使われました。
それをfunc( , ,float FA[100][100])
とすればコンパイルは通るものの、
デバッグで実行すれば、
ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow
でハングです。
どうすればいいのでしょうか?
Main側で必ず、関数からの戻りも2次元で受けたいです。

YuO [E-Mail] 2002/09/17(火) 18:19:13
> ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow

これは別の問題でしょう。
関数でスタックをたくさん使いすぎているのが問題だと思います。
#または,でっかい構造体の値渡しをしているとか。


> func( , ,float FA[100][100]);

これは,
func (, , float (*FA)[100]);
つまり最後の引数はfloatの100個の配列へのポインタ型になるので,VC++だと4バイトしか使いません。

Int 2002/09/18(水) 10:23:40
YUOさん。

ありがとうございます。


大きな構造体の値渡しはしていないつもりなのですが。

func (, , float (*FA)[100]);
にしても、その[100]の数字を小さくしてみても、
ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow
と、同じ現象が出ます。

どうやって解決出来るのかな。
ベクトルでなくて1次元で関数に渡して、加工してMAINに返して、
戻ったMAINの中で、再度2次元に開くと言う手は無いのではないでしょうが。

YuO [E-Mail] 2002/09/18(水) 14:44:09
> 関数でスタックをたくさん使いすぎているのが問題だと思います。

こちらは調べましたか?
staticにしたりとかヒープにとったりとか再帰をループにしたりとか,
古典的な策で回避できるはずです。


> func (, , float (*FA)[100]);
> にしても、その[100]の数字を小さくしてみても、

引数中のfloat FA[100][100]とfloat (*FA)[100]は同じことです。
これは,float FA[100]とfloat *FAが引数中では同じ扱いなのと一緒です。
渡されるのはポインタですから,関数呼び出し時にスタックは4バイトしか使いません。

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