関数で行列はどう返すのでしょうか? – プログラミング – Home

関数で行列はどう返すのでしょうか?
 
通知
すべてクリア

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


Int
 Int
(@Int)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

関数から変数を返す時、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
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> ハンドルされてない例外はpp.exeにあります。0xC00000FD: Stack Overflow

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

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

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


返信引用
Int
 Int
(@Int)
ゲスト
結合: 23年前
投稿: 2
Topic starter  

YUOさん。

ありがとうございます。

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

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

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


返信引用
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

> 関数でスタックをたくさん使いすぎているのが問題だと思います。

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました