VBAの参照型仮引数の話し

VBA,参照型仮引数
5
ほえほえ@スプシマン @hoehoe1234

VBAでの参照型仮引数の説明は多くの人、サイト、書籍が間違えた説明になってるんだけど今更どうでもいいかな?wwと。某有名本な書籍もこの点は間違えています。実質被害がないからどうでもいいといえばどうでもいいのですがwww。

2021-06-16 23:11:08
ほえほえ@スプシマン @hoehoe1234

実引数と仮引数の参照型での組み合わせパターンは ①具象型ー具象型 ②具象型ーバリアント型 ③バリアント型ー具象型 ④バリアント型ーバリアント型 の4つなんだけど、どの間違えも同じ間違え方をしているので、これ、自分で調べてない疑惑があるんですよね。

2021-06-16 23:16:17
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun ですです。後者は変数のエイリアスとも、同じ変数とも、変数領域を共有しているともいいますね。 識別子(変数名)と変数領域(メモリ領域)の違いがわかってないんだとおもいます。 後者は同じ変数領域に違う名前がついている状態ですね。よく言われる「同じ変数」ってやつです。w

2021-06-16 23:18:17
ほえほえ@スプシマン @hoehoe1234

自分で調べたらみながみな、こんなステレオタイプな間違え方するわけないと思うので、たぶん、有名書籍に書いてあることをそのまま引用なんだろうな。と。別にわるいとは思わないです。そういうこと、CSの世界ではたくさんありますから。ワイも2進数(補数)の原理はわかりません。

2021-06-16 23:19:50
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun 不思議なのは、よく比喩に出される「箱にラベル」がついた図で「ラベルが2つになる」でうまく説明できるのにそうしてないのはなぜ?って思います。多分、どうなっているのかがわかってないのかな?と。ただ、別段VBAでは不要なので単にそういうことがあるということだけですかね?w

2021-06-16 23:21:43
ほえほえ@スプシマン @hoehoe1234

@KotorinChunChun ライブラリ書いたりしないと不要だとおもいます。ただ、「ポインタ」が発生するのは実引数が具象型、仮引数がバリアントのケースだけなんですが。ただ、「同じ変数」を指す用語としてポインタを誤用してるのかな?と思う場合も。まあどうでもいいはなしですけどw。

2021-06-16 23:23:04
ほえほえ@スプシマン @hoehoe1234

参照型仮引数について間違った情報がよくながれていますので、VBAでは、いや多くのプログラムでは正しいことを知る意味は特にないのですが(モデルがあっていればよい)、滝lib作成過程で調査したので投稿しておきます。これは呼ばれる側の関数です。 pic.twitter.com/hwTf9G2lq0

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

パターン1。実引数は具象型、仮引数も具象型です。 この場合は「同じ変数」になります。イミデトをみると変数のアドレスが同じですね。同じ変数領域に実引数と仮引数では「ちがう変数名」でアクセスできます。仮引数は実引数のエイリアスとも言えますね。 pic.twitter.com/KlaVnSjvBi

2021-06-17 00:34:28
拡大
ほえほえ@スプシマン @hoehoe1234

パターン2。実引数は具象型、仮引数はバリアントです。 仮引数は実引数とは別の変数ですが、イミデトをみるとバリアントのlongの値が実引数のアドレスと同じとなっています。これがよく言われる仮引数が「ポインタ」ということになります。 pic.twitter.com/avyhewKo8C

2021-06-17 00:37:38
拡大
ほえほえ@スプシマン @hoehoe1234

パターン3。実引数はバリアント、仮引数は具象型です。仮引数が具象型の場合は「同じ変数」にするために「厳密な型の一致」が必要になります。このため、仮引数を具象型にすることは不自由を生みます。 pic.twitter.com/lpnTL9wlDu

2021-06-17 00:41:22
拡大
ほえほえ@スプシマン @hoehoe1234

パターン4。実引数はバリアント、仮引数もバリアントです。実引数、仮引数に双方バリアント型が指定されている場合は、実引数がどのような型(値、オブジェクト、配列、エラー)に束縛されていても「そのまま」わたせます。なぜなら「同じ変数」だからです。 pic.twitter.com/ynm6fzTV81

2021-06-17 00:44:11
拡大
ほえほえ@スプシマン @hoehoe1234

これをどう呼べばよいでしょうか?同じ変数?変数のエイリアス?変数領域を共有?違う識別子(変数名)に同じ変数領域? どう呼べば参照型仮引数がうまくつたわりますかね。個人的には「エリアス」って呼び方がしっくり来ますけど。

2021-06-17 00:45:53
ほえほえ@スプシマン @hoehoe1234

参照型仮引数の利点は「コピーが発生しない」ということです。これは配列のコピーが発生しなかったり、値の暗黙の変化が発生しないことを意味します。ですからバリアントで組んでおけばどのような深い関数ネストでも変数を「直接とどけられる」んですよね。

2021-06-17 00:47:24
ほえほえ@スプシマン @hoehoe1234

具象型の参照型仮引数はおすすめできません。厳密な型の一致が求められるので仮引数がLongである場合に実引数に例えばInteger型の変数を指定できません。無理に指定しようとすれば実引数を「()」を使って無名変数を生成するしかありません。これはあまりよくないですね。

2021-06-17 00:49:06
ほえほえ@スプシマン @hoehoe1234

一方、仮引数がバリアント型の場合は実引数への「ポインタ」が生成されるのでどのような型も受け入れることができます。実引数が具象型配列の場合もちゃんと配列へのポインタが生成されます。配列は実態は参照型なのでポインタへのポインタが生成されるイメージですね(実際にそうなっています)。

2021-06-17 00:50:43
ほえほえ@スプシマン @hoehoe1234

実際にこのような知識が必要なのは共通関数、ライブラリを作るような場合のにでしょうか?ライブラリは速度、トリック、抽象化、組み合わせ可能性、配列のコピー回避等においてバリアントを多用しますから。もし共通化でこまったことがあった場合は「バリアント型」をおもいだしてみてください。おわり

2021-06-17 00:53:04