書籍に書かれてある関数のコードが
次のようになっております。
void AAA(double **xi)
{
xi[2][3] = 3.14;
}
5行5列の行列をこの関数に
渡して計算したいと思ったのですが
どう記述すれば良いのでしょうか。
試しに次のようなコードを作りましたが
間違っているでしょうか。
main()
{
double xi[5][5];
AAA((double **) xi);
}
コード自体はコンパイルされるのですが、
デバックしていくと、どうもこのあたりで
止まってしまうので間違っているような気が
するのですが。
よろしくお願い致します。
環境 VC++6.0 Win Home
> 試しに次のようなコードを作りましたが
> 間違っているでしょうか。
間違っています。配列とポインタは別物です。
# 一次元だと同じに見えるのがクセモノ
main()
{
double xi[5][5];
double* arg[5];
arg[0] = xi[0];
...
arg[4] = xi[4];
AAA(arg);
}
ってやればよさげ。
メモリの配置が違うので誤動作する。
配列は二次元だろうと連続したメモリになるので
定義がxi[5][5]でのメモリの配置:
xi[1][0]はx[0][0]から6番目の位置にある。
定義がxi[5][6]でのメモリの配置:
xi[1][0]はx[0][0]から7番目の位置にある。
ポインタのポインタでは
以下は動作確認していないので間違えているかもしれないが
double hoge[7];
double *xi[2];
xi[0] = &hoge[0];
xi[1] = &hoge[2];
って書けばxi[0][2]とxi[1][0]が同じメモリを指すようにもできてしまう。
たぶん以下でいいと思うが未確認。
void AAA(double (*xi)[5])
{
xi[2][3] = 3.14;
}
このAAAでは
double xi[?][5]という形式の配列しか使えないという制限がつくよ。
void AAA(double **xi)だと二次元配列が使えない制限が付く。
επιστημηさま、wclrp ( 'o')さま、
ご丁寧なご指摘、ありがとうございました。
投稿後、私もいろいろ調べたのですが、
多次元配列は「ポインタの配列」を
使って記述するのですね。
教えていただいた手法(ポインタのポインタ)で
うまくAAA関数内でも動作しているのが確認できました。
調べてみると、ポインタと配列は予想以上に難しく
特に「配列へのポインタ」との区別は混乱しそうでしたが、
今回は大変勉強になりました。
επιστημηさま、wclrp ( 'o')さま、
そして、管理人のらららさま、
改めて心よりお礼申し上げます。
ありがとうございました。