関数から変数を返す時、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次元で受けたいです。
> ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow
これは別の問題でしょう。
関数でスタックをたくさん使いすぎているのが問題だと思います。
#または,でっかい構造体の値渡しをしているとか。
> func( , ,float FA[100][100]);
これは,
func (, , float (*FA)[100]);
つまり最後の引数はfloatの100個の配列へのポインタ型になるので,VC++だと4バイトしか使いません。
YUOさん。
ありがとうございます。
大きな構造体の値渡しはしていないつもりなのですが。
func (, , float (*FA)[100]);
にしても、その[100]の数字を小さくしてみても、
ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow
と、同じ現象が出ます。
どうやって解決出来るのかな。
ベクトルでなくて1次元で関数に渡して、加工してMAINに返して、
戻ったMAINの中で、再度2次元に開くと言う手は無いのではないでしょうが。
> 関数でスタックをたくさん使いすぎているのが問題だと思います。
こちらは調べましたか?
staticにしたりとかヒープにとったりとか再帰をループにしたりとか,
古典的な策で回避できるはずです。
> func (, , float (*FA)[100]);
> にしても、その[100]の数字を小さくしてみても、
引数中のfloat FA[100][100]とfloat (*FA)[100]は同じことです。
これは,float FA[100]とfloat *FAが引数中では同じ扱いなのと一緒です。
渡されるのはポインタですから,関数呼び出し時にスタックは4バイトしか使いません。