【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22048

多次元配列のポインタ
投稿者---joker99(2005/07/22 19:21:30)


一次元配列の場合
 double *a
a = new double [10];
for (int i=0; i<=9; i++)
fscanf(f, "%lf", a+i);
でファイルから読み込めるのですが、

二次元配列の場合
 double *a
a = new double *[10];
for (int i=0; i<=9; i++)
a[i] = new double [10];
for (i=0; i<=9; i++) {
for (int j=0; j<=9; j++)
fscanf(f, "%lf", ????);
}

????のところどう書けばよろしいでしょうか?
どなたか教えてください。





この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:多次元配列のポインタ 22049 REE 2005/07/22 20:05:08
<子記事> Re:多次元配列のポインタ 22050 shu 2005/07/22 20:37:56


No.22049

Re:多次元配列のポインタ
投稿者---REE(2005/07/22 20:05:08)


>二次元配列の場合
> double *a
> a = new double *[10];
> for (int i=0; i<=9; i++)
> a[i] = new double [10];
> for (i=0; i<=9; i++) {
> for (int j=0; j<=9; j++)
> fscanf(f, "%lf", ????);
> }
>
>????のところどう書けばよろしいでしょうか?
>どなたか教えてください。
>
一番分かりやすいのは &a[i][j] 、 1次でも &a[i]と書けます。
今の1次の書き方に合わせるなら、 (*(a+i)+j) になります



この投稿にコメントする

削除パスワード

No.22097

Re:多次元配列のポインタ
投稿者---joker99(2005/07/25 09:59:47)


単純に&a[i][j] 、 1次でも &a[i]でもいいのですね。
ありがとうございました。




この投稿にコメントする

削除パスワード

No.22050

Re:多次元配列のポインタ
投稿者---shu(2005/07/22 20:37:56)


>二次元配列の場合

二次元ではなくて、「配列の配列」


この投稿にコメントする

削除パスワード

No.22053

Re:多次元配列のポインタ
投稿者---かずま(2005/07/23 14:19:10)


>>二次元配列の場合

>二次元ではなくて、「配列の配列」。
どういう意味でしょうか?

「配列の配列」は「2次元配列」です。

規格書 JIS X3010:2003(ISO/IEC 9899:1999) に次のような記述があります。

: 6.5.2.1 配列の添字付け
:    ....
:   連続した添字演算子は、多次元配列の要素を指し示す。Eが次元 i×j×...×k
: をもつ n次元配列 (n≧2)である場合、E(左辺値以外として用いた場合。)は、
: 次元 j×...×k をもつ (n-1)次元配列へのポインタに型変換する。

また、「6.7.8 初期化」のところには、1次元配列、2次元配列、3次元配列の
初期化の例が載っています。


さて、double a[8][10]; という宣言があれば、a は「配列の配列」であり、
それは「2次元配列」です。

次のように書いた場合、a は「ポインタの配列」ですが、配列の要素は、
「2次元配列」と同じように参照できます。

    double *a[8];
    int i, j;
    for (i = 0; i < 8; i++)
        a[i] = malloc(sizeof(double) * 10);
    for (i = 0; i < 8; i++)
        for (j = 0; j < 10; j++)
            fscanf(fp, "%lf", &a[i][j]);

また、double **a = malloc(sizeof(double *) * 8); と書くと、
a は「ポインタへのポインタ」ですが、a[i][j] で参照できます。

最初の質問者は、C++ でプログラムを書いているようですが、
この件に関しては C と同じです。



この投稿にコメントする

削除パスワード

No.22056

Re:多次元配列のポインタ
投稿者---かずま(2005/07/23 15:02:06)


> また、double **a = malloc(sizeof(double *) * 8); と書くと、
> a は「ポインタへのポインタ」ですが、a[i][j] で参照できます。
誤解を与えそうなので、補足します。
当然、次の処理は必要です。

    for (i = 0; i < 8; i++)
        a[i] = malloc(sizeof(double) * 10);


また、次のように書くと、ひとつの malloc() ですみます。

    a[0] = malloc(sizeof(double) * 10 * 8);
    for (i = 1; i < 8; i++)
        a[i] = a[i-1] + 10;



この投稿にコメントする

削除パスワード

No.22059

Re:多次元配列のポインタ
投稿者---shu(2005/07/23 15:46:11)


あらためて読みかえし、考え直してみると、
どこかで見聞きした、「二次元ではなくて、配列の配列」という考えが頭に残っていて、
とくに良く考えもすることなく、条件反射的に書きこんでいました。

「xの二乗ではなくて、x * x」などと書いているような、間違った情報です。


この投稿にコメントする

削除パスワード

No.22101

Re:多次元配列のポインタ
投稿者---削除者(2005/07/25 12:02:05)


>あらためて読みかえし、考え直してみると、
>どこかで見聞きした、「二次元ではなくて、配列の配列」という考えが頭に残っていて、
&gt;とくに良く考えもすることなく、条件反射的に書きこんでいました。

要するに、C言語の初心者のくせに、生意気に人のあら探しなんかして有頂天になっていたってことだね。おおよそ、Cの入門書に書いてあったことでも思い出して、自分のちっぽけな虚栄心を満たすべく書き込んだんだろう。しかも赤文字で。そのことが逆に自分の無知を示すことになるとも知らずに。
実に滑稽だね。そんなことではいつまでたっても進歩しないよ。これはCに関してだけではなく、他の様々なことについても言えるがね。

以上、通りすがりの忠告でした。


この投稿にコメントする

削除パスワード

No.22104

Re:多次元配列のポインタ
投稿者---円零(2005/07/25 13:19:52)


有頂天の見本御苦労。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧