C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 173 を表示中)
■99810 / )  Re[3]: クラスが作れません。
□投稿者/ 魔界の仮面弁士 (3387回)-(2022/06/07(Tue) 15:56:36)
No99808 (白音 さん) に返信
>>そもそもループ処理が意味不明過ぎるんですが…。
> data の中身を0で初期化するためです。

初期化も何も、Double の初期値は 0.0 ですよ。

なので、ループするまでも無く
 Private Sub Class_Initialize()
  Dim d(0 To 10) As Double
  Me.m_data = d
 End Sub
あるいは
 Private Sub Class_Initialize()
  ReDim m_data(0 To 10) As Double
 End Sub
で済む話です。


そもそも、「For Each dt In 数値の配列」のループでは
配列の中身を書き換えることはできません。使うならば
For Each〜Next ではなく、For〜Next を使うべきです。



コレクションを列挙して、個々の要素のプロパティを書き換えるような用途なら
For Each でも良いのですけれどね。



>>'--- 案1: 白音さん御自身が行われたように、「内部処理形式が Double の配列であるバリアント型」を使う
> data にデータを入れる方法がわかりません。
> nd.data(0) = 1
> 1 になりません。

他クラスのメンバーから得られるのは、元の変数への参照そのものではなく、値のコピーだからです。

※Module と違って、クラスだと配列を Public にできないのもそれが理由。

これがコピーであることは、たとえば呼び出し側で
 Debug.Print Hex(VarPtr(nd.data))
を行った結果と、クラス側で
 Debug.Print Hex(VarPtr(Me.data))
を呼び出した場合、得られるアドレスが異なることからも判断できます。


配列の一部だけを直接書き換えようとするのではなく、
配列全体のコピーをいったん変数に受け取ってから、
その変数の内容を書き換えた上で、
書き換えた新しい配列全体を、改めて渡す方法を採れます。
 
 'Dim dbl As Variant
 Dim dbl() As Double
 dbl = nd.data
 dbl(0) = 0.5
 nd.data = dbl


配列の一部だけを書き換えたい場合は、案2 のようにするか、
またはクラス側に「内容を書き換えるためのメソッド」を設けるようにします。



>>'--- 案2: 配列として公開するのではなく、添字引数付きのスカラー値プロパティの形で公開する
>>' → ActiveX 版 ListBox の List プロパティがこの形ですね。
> nd.data = Array(1,2,3,・・・)

このケースでは、左辺の data は添字引数が必須なプロパティになっています。
また、添字を指定した場合の戻り値は、As Double です。ですから Array の代入はできません。

たとえば、
 Dim dbl1() As Double
 Dim dbl2 As Double
に対して
 dbl1 = Array(1, 2)
 dbl2 = Array(1, 2)
と書けないのは自明ですよね。



もしも
 nd.Data = Array(1.2, 3.4)

 nd.Data(0) = 1.2
 nd.Data(1) = 3.4
の両方を可能にしたいのであれば、
Data プロパティの定義をそのように書き換えるか、
もしくは一括設定用に ParamArray 引数なメソッドを追加するなどしてみてください。
返信 編集キー/


管理者用

- Child Tree -