ワクワクV057回目配列完全解説3回目(2021-09-18)

配列,VBA,エクセル,
1
ほえほえ@スプシマン @hoehoe1234

ここから先は、おまけの配列の実装情報です。このようなことは知らなくても特に問題はありませんが、配列完全解説シリーズとしていますので少しだけ概要と調べたい場合の調査ポイントをおしらせしました。 pic.twitter.com/xi4vusHtEP

2021-09-21 00:33:40
拡大
ほえほえ@スプシマン @hoehoe1234

3つの配列の種類、①静的配列、②動的配列、③バリアントバインド配列の実装上の違いを解説しました。このイメージを知ることにより、配列操作関数の挙動をよりよくりかいできるようになります。あくまでも追加情報であり必須知識ではありません。 pic.twitter.com/hfHsgy5fkn

2021-09-21 00:35:42
拡大
ほえほえ@スプシマン @hoehoe1234

①の静的配列(固定配列)は宣言時に管理情報であるSAFEARRAY構造体とデータ本体の領域が確保されます。Erase時にはデータ領域がクリアされるだけで依然として管理情報、データ領域はあります。

2021-09-21 00:36:48
ほえほえ@スプシマン @hoehoe1234

②の動的配列は宣言では配列型変数(32ビットでは4バイトの参照型変数)が確保されるだけです。実態となる管理情報、データ領域はありません。なのでLbound関数などは使えません。Erase時にはこの管理情報ごとバッサリなくなります。すごい割り切りですね。 pic.twitter.com/b5mfnkiU8Z

2021-09-21 00:38:14
拡大
ほえほえ@スプシマン @hoehoe1234

③のバリアントバインド配列も動的配列なので②と同じ挙動となります。②と③の違いは、変数の型です。②の動的配列は実態がアサインされる前から「配列型」です。③のバリアントはredimされてはじめて「配列型」とみなされます。

2021-09-21 00:40:23
ほえほえ@スプシマン @hoehoe1234

コードを書く上での利便性ですが、③、②、①の順となります。もちろん、①も②もそれでしか実装できないようなこと。はあるのですが、一次元配列を使用する多くの場面ではバリアントバインド配列で十分でしょう。このあたりは自分で使い勝手を確かめてみるとよいと思います。

2021-09-21 00:41:48
ほえほえ@スプシマン @hoehoe1234

このように、種類、実装、使い方などを「比較して」覚えると効率がよいですね。個別に考えているとわけがわからないこともまとめて俯瞰すると理解できることに煮ていますね。 今回はここまでです。 おしまい。 pic.twitter.com/rZ9hqwtETt

2021-09-21 00:42:59
拡大
ほえほえ@スプシマン @hoehoe1234

ワクワクV057回目 2021-09-18 配列完全解説3回目 Jag配列を表示するループです。ポイントは外側for文中の  x = arr(i) の部分です。 配列の配列なので要素(配列)を簡単に代入で取り出すことができます。この特性は時にとても便利です。要素としての配列はレコード型ともいえますね。 pic.twitter.com/H4H6pA93Wx

2021-10-06 00:39:01
拡大
ほえほえ@スプシマン @hoehoe1234

プログラムでJag配列をつくってみます。設定している値は特に意味はありません。要素としての配列を代入することにより配列のコピーが発生して要素となります。「配列は実態は参照、挙動は値型」というおもしろい性質をもっています。 pic.twitter.com/WSDlSSVsnD

2021-10-06 00:42:29
拡大
ほえほえ@スプシマン @hoehoe1234

要素としての配列(以後、内側の配列とします)の要素数が揃っていればこのように2次元配列と同じ形式のループで内側の配列の要素にアクセスすることができます。これはとても便利な記法ですね。配列は何かと内部的に特別扱い(優遇)されているように思います。 pic.twitter.com/SIypN0FFPT

2021-10-06 00:45:13
拡大
ほえほえ@スプシマン @hoehoe1234

Jag配列を横に出力するループです。Jag配列の各要素配列は同じ要素数である必要があります。これは2次元配列を列でスライスしたイメージのJag配列となります。 pic.twitter.com/GbUQyvuMGH

2021-10-06 01:42:56
拡大
ほえほえ@スプシマン @hoehoe1234

演習12です。バリアントバインド配列の特性を利用して関数呼び出し時にコピーを発生させずにappend関数を実装することができます。このような抽象化した関数を作り込んでいくとよいでしょう。 pic.twitter.com/HhqQBG033p

2021-10-06 01:44:41
拡大
ほえほえ@スプシマン @hoehoe1234

空の配列でも  要素数=上限ー下限+1 という式が成り立っていますのでこの関数は機能します。空の配列の便利さの一面でもあります。 pic.twitter.com/4600m4fnCz

2021-10-06 01:47:05
拡大
ほえほえ@スプシマン @hoehoe1234

このような関係になっています。配列の管理構造体に上限はなく、要素数と下限のみで管理していますので上限は計算で出していると思われます(上限=下限+要素数-1)。 pic.twitter.com/6gpalcA6xq

2021-10-06 01:53:48
拡大
ほえほえ@スプシマン @hoehoe1234

「配列の最後に要素を追加する」という抽象化をすることによりJag配列の作成がわかりやすくなっています。関数は共通処理をまとめると言うよりも「どのような抽象化を行うか」という観点を持つとよい関数分割ができるように思います。 pic.twitter.com/x4CKJWXvVs

2021-10-06 01:55:37
拡大
ほえほえ@スプシマン @hoehoe1234

演習14です。配列と配列を合体させます。配列1のあとに配列2の全要素を追加するextend関数を作成します。extend関数中では同じく作成したappend関数がうまく使えますね。関数はこのように組み合わせたり、全体ー部分を構成するように設計します。 pic.twitter.com/1RmtWYlaHC

2021-10-06 01:58:23
拡大
ほえほえ@スプシマン @hoehoe1234

2次元配列をイテレートするには二重ループを構成する以外にもfor each構文が使えます。しかし、for each構文では縦-横の順番に出力されます。この理由と対応を考えます。 pic.twitter.com/yWN0ap4cTG

2021-10-06 02:02:40
拡大
ほえほえ@スプシマン @hoehoe1234

簡単な解決方法はtranspose関数の使用です。この関数は2次元配列の行と列を入れ替えます。ですから予め行列を入れ替えておけば逆の逆で2重ループと同じ出力になるというわけです。この関数には制限がありますが大きな配列でなければ問題ないでしょう。 pic.twitter.com/zGqTf2ldbY

2021-10-06 02:04:19
拡大
ほえほえ@スプシマン @hoehoe1234

順番が前後しますが演習11です。Jag配列を横に出力(1,4,7,10,2,5...12)します。どういうコードにすればよいでしょうか? pic.twitter.com/MyTOknw7w3

2021-10-06 02:06:39
拡大
ほえほえ@スプシマン @hoehoe1234

Jag配列はindex関数をつかうことにより二次元配列に変換ができます。Jag配列を二次元配列のようにあつかってスライスしてくれます。便利ですね。 pic.twitter.com/tWPfz5FG1A

2021-10-06 02:13:41
拡大
ほえほえ@スプシマン @hoehoe1234

演習12です。append関数を実装します。append関数の配列を受ける仮引数はバリアントにする必要があります。 pic.twitter.com/ZEeceS2zEF

2021-10-06 02:19:22
拡大
ほえほえ@スプシマン @hoehoe1234

仮引数に具象型配列を指定すると「その型の配列」しか受け取れなくなります。これではとても不便ですね。バリアントのポインタ参照システム(後日説明します)を利用してどのような配列でも受け入れる関数を設計することができます。配列とバリアントは相性がいいですね。 pic.twitter.com/ceuL9CW0QD

2021-10-06 02:22:22
拡大
ほえほえ@スプシマン @hoehoe1234

配列と仮引数の関係の検証を togetter.com/li/1736133 にて記事にしていますが内容がまとまっていなくてわかりにくいですね。配列と仮引数の組み合わせパターンはそれほどありません。

2021-10-06 02:40:03
ほえほえ@スプシマン @hoehoe1234

①実引数  1)具象配列(配列と宣言した配列、静的配列または動的配列)  2)バリアントバインド配列 ②仮引数  a)ByRef 具象配列  b)ByRef バリアント  c)ByVal バリアント  ※ByVal 具象配列は構文エラー 実引数と仮引数の組み合わせパターンは全部で6種類しかありません。

2021-10-06 02:46:03
ほえほえ@スプシマン @hoehoe1234

①1)-a)具象配列ーByRef具象配列 基本となるパータンです。この場合は実引数と仮引数が同じ変数(厳密に一致)である必要があるため違う型の配列を受け入れることができません。

2021-10-06 02:48:44