myugaruの色々構想中・・・!

「C#」「画像処理」「XNA未対応PCでゲームIDE作りの無謀な野望」

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  98  : 記事  0  : コメント  2342  : トラックバック  59

ニュース

myugaru
仕事(昔)=ヲタク系プログラマー~マスコミ系サポートデスク
仕事(今)=電子機器系サービス業
趣味a=パズルゲーム全般、シューティングは主に見学
趣味b=画像処理関係の勉強
趣味c=プログラミング言語の勉強
趣味d=アキバ系ヲタク
趣味e=芸能アイドル系ヲタク
d,e色の強いもう一つのブログ
最新目標=シューティングゲームを作る

わんくまりんく

わんくま同盟blog C#,VB.NET掲示板

ぶろぐつーる

あわせて読みたい

はてなりんぐ

書庫

日記カテゴリ

ギャラリ

お友達

リンク

#以下はC言語、C++言語、C#言語、風に書いてますが、たぶんどの言語もほとんど言えることかなと思っている。

2次元配列を平面とみなして表現する場合の添え字は

matrix[x][y]

となっていると直感的にも数学的に理解しやすい。しかしコンピュータの世界では、ほとんどの場合

matrix[y][x]

と表現せざるを得ない。たとえばそれでも無理やりに

matrix[x][y]

でコード上推し進めても問題は起こらないように思う。しかし困るのが2次元配列を初期化をともなう場合。

byte[][] matrix = new byte[][]{
  new byte[]{ 0, 0, 0, 0, 0 },
  new byte[]{ 0, 1, 2, 3, 0 },
  new byte[]{ 0, 4, 5, 6, 0 },
  new byte[]{ 0, 7, 8, 9, 0 },
  new byte[]{ 0,10,11,12, 0 },
  new byte[]{ 0, 0, 0, 0, 0 },
};

こう書きたい。こう書いた人の”意図”というのは見た目横方向がxなのだろう。そうなるとアクセスはmatrix[y][x]にしなくてはならなくなってしまう。

こうなってしまった元をたどると2次元配列を「配列の配列」で表現しはじめた事に行き着く。

はじめに1次元配列があった。

array[x]

と表現する。これはX方向1ライン分表現している。これはこれで良いと思う。

その1次元配列がさらに配列になった。

array[x][y]

と出来なかったのはどうしてだったんだろう。もし”どっちでもよかったけどなんとなく”みたいな理由だったらやだなあ。きっと何か特別理由があったんだろう。

でも、たとえば「関数が関数のアドレスを返す」ような場合、この戻ってきたアドレスを呼び出すときには

func()()

という風に書くがこのばあいは右の方の()が後から呼び出される。右へ右へと結合ができる。()は右なのだ。

だから[]が右へ伸びるようにしてくれてても良かったように思っている。

(22時11分記事訂正[,]と[][]が混在してたので[][]に統一しました。)

投稿日時 : 2008年2月21日 20:48

コメント

# re: 配列の配列は直感に反している 2008/02/21 21:36 凪瀬
array[y,x] と array[y][x]は意味合いが違いますよ。
矩形配列なら実用上は一緒だけど。

# re: 配列の配列は直感に反している 2008/02/21 22:07 myugaru
こんばんわ、凪瀬さん
すみません上のやつは統一性が取れて無かったです。
[][]に書き換えます。


# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 0:33 siokoshou
なるほどー!考えたこともなかったけど正論かもしれません。


# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 0:49 myugaru
To siokoshouさん
こんばんわ!こっそり日記読ませてもらっていました。賛同下さってありがとうございます。まだまだ書きなれてないので変な文ですが少しずつ鍛えて(?)いますので、またぜひよろしくお願いします。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 10:07 よねけん
はじめまして。
昔、C言語を最初に覚えたときに同じことを思いました。
そして、今でもやっぱりややこしいのはややこしいです。
私も座標イメージで捉える場面が多いので。

ただ、それが直感的でないかというと必ずしもそうは言えないかなと思います。
例えば、日常に当てはめて考えると
ホテルやマンションで部屋番号は、12Fの1番目の部屋を1201と表す場合が多いです。
縦軸を先に書いて、横軸を後に記述しますね。[y][x]型です。

数字も日本では、例えば、100の位、10の位、1の位という順番で書きますね。
これを数字を1の位から記載するとどうでしょう。普段の123(ひゃくにじゅうさん)は、
321と表現することになります。

ちなみに、1次元配列で2次元配列の代用にする場合、
array[y * 10 + x] (※ xのサイズが10の場合)
と表現しませんか?私ならそのように表現します。

「matrix[y][x]と表現せざるを得ない。」の理由は上記の2次元を1次元化する
場合の計算式の表現をどのように表現するか?ということと関係があるのではないかと思っています。
#で、言語の設計者はy,xの順にしたのではないかと。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 10:34 ghost_shell
配列の配列はジャグ配列と言いますよ。

最初はコードがジャグ配列になっていることを指摘しようと思って、タイトル見たら「配列の配列」となっている... 余計に混乱。

ちなみに2次元配列とジャグ配列が違うってわかりますよね?
(必ずしも2次元配列が連続して保存されている(実装になっている)とは限りませんが。)

詳しくいことはWikipediaの「配列」の項に書いてあります。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 11:19 凪瀬
んー。
intの配列はint[]
で、int[]の配列はintと[]の間に[]が入ってint[y][x]になるってのが異様には思いますね。
int[]の後ろに[]がくっつくならint[x][y]になるだろう、と。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 11:40 シャノン
例の matrix は2次元配列ではなくて1次元配列なので、
matrix[ 2 ] は { 0, 4, 5, 6, 0 } ですよね。
このうちの 6 は、2番目のうちの3番目ですから、matrix[ 2 ][ 3 ] ですね。
これが y の方が先に来る理由ですね。

直感に反するのは、軸の向きが変わるからです。
例の matrix では、{ 0, 4, 5, 6, 0 } は x 軸方向に並んでいるように見えますが、
「1次元配列は要素を横に並べる」という決まりを作るなら、
これは縦書きで書いてあり、1本の縦軸が1つの配列であるとイメージすべきなのです(中身も1次元配列であるくせに縦書きになるので徹底できませんが)。

00000
01470
02580
03690
00000

と並んでいるとイメージすれば、matrix[ 2 ][ 3 ] は、xy 軸的にも 6 になります。
ただ、プログラミング言語というか、そもそもPCってやつは縦書きが苦手ですからね。

数学では、縦方向に 2、横方向に 3 の要素数がある行列を、「2行3列の行列」とか呼びます。
行番号は y 方向の番号ですから、やっぱり yx 順になっていますね。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 11:42 シャノン
こうしてみると、2次元配列をジャグ配列で表すと違和感が付きまとうから、.NET では多次元配列とジャグ配列の両方が用意されているのでしょうね。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 11:46 シャノン
表とグラフを混同しているのがそもそもの原因でしょうか。
表は普通、横一列をひとつのデータのまとまりとし、縦列は各データの属性ですが、グラフは、横軸にデータ、縦軸に属性をとる場合が多いですね。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 11:52 シャノン
連投失礼しますです。
配列の配列について、便宜的に、「外側の配列」と「内側の配列」という言葉を使います。
すると、int[2][3] は、直感的には、int[2] が 3 個集まったものですから、2 が内側の、3 が外側の要素数になります。
しかし、使う場合には、先の通り、「2番目のうちの3番目」と書けたほうが直感的で、この場合は最初の添字が外側の、2番目の添字が内側の配列にかかります。
この不一致を避けるために、宣言時も、int[2] が 3 こ集まったものは int[3][2] なのでしょう。

# re: コンピュータ言語の配列の配列の記述は直感に反している 2008/02/22 12:28 myugaru
こんにちわ。皆さんから色々コメントもらえて何だかとても嬉しいです。長くなりそうだったので別エントリーに私の意見は書きましたよろしくお願いします^^

To よねけんさん
はじめまして。よろしくお願いします。とても参考になりますありがとうございます。

To ghost_shellさん
ご指摘ありがとうございます。Wikipediaの配列を読みました。とても勉強になりましたありがとうございます。

To 凪瀬さん
いつもありがとうございます。

To シャノンさん
なるほど私の思っているイメージと大体同じで嬉しいです。


Post Feedback

タイトル
名前
Url:
コメント