関数に多次元配列のポインタを渡す方法について – プログラミング – Home

関数に多次元配列のポインタを渡す方法に...
 
通知
すべてクリア

[解決済] 関数に多次元配列のポインタを渡す方法について


はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

書籍に書かれてある関数のコードが
次のようになっております。

void AAA(double **xi)
{
xi[2][3] = 3.14;
}

5行5列の行列をこの関数に
渡して計算したいと思ったのですが
どう記述すれば良いのでしょうか。
試しに次のようなコードを作りましたが
間違っているでしょうか。

main()
{
double xi[5][5];
AAA((double **) xi);
}

コード自体はコンパイルされるのですが、
デバックしていくと、どうもこのあたりで
止まってしまうので間違っているような気が
するのですが。

よろしくお願い致します。

環境 VC++6.0 Win Home


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 21年前
投稿: 600
 

> 試しに次のようなコードを作りましたが
> 間違っているでしょうか。

間違っています。配列とポインタは別物です。
# 一次元だと同じに見えるのがクセモノ

main()
{
double xi[5][5];
double* arg[5];
arg[0] = xi[0];
...
arg[4] = xi[4];
AAA(arg);
}

ってやればよさげ。


返信引用
wclrp ( 'o')
 wclrp ( 'o')
(@wclrp ( 'o'))
ゲスト
結合: 18年前
投稿: 287
 

メモリの配置が違うので誤動作する。

配列は二次元だろうと連続したメモリになるので
定義が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)だと二次元配列が使えない制限が付く。


返信引用
はまち
 はまち
(@はまち)
ゲスト
結合: 23年前
投稿: 146
Topic starter  

επιστημηさま、wclrp ( 'o')さま、
ご丁寧なご指摘、ありがとうございました。

投稿後、私もいろいろ調べたのですが、
多次元配列は「ポインタの配列」を
使って記述するのですね。

教えていただいた手法(ポインタのポインタ)で
うまくAAA関数内でも動作しているのが確認できました。

調べてみると、ポインタと配列は予想以上に難しく
特に「配列へのポインタ」との区別は混乱しそうでしたが、
今回は大変勉強になりました。

επιστημηさま、wclrp ( 'o')さま、
そして、管理人のらららさま、
改めて心よりお礼申し上げます。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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