こんにちは。
<Class1>
Private myData(10) as String
というクラスがあります。
Property Let とProperty Get を使って
myData()の任意の位置のデータを Let/Get したいのですが
どうやったら出来ますか?
教えてください。
よろしくお願いします。

A 回答 (1件)

配列をプロパティで使用したいなら、



Public Property Get プロパティ名() As Variant

Public Property Let プロパティ名(ByVal vNewValue As Variant)

みたいにVariant型でやり取りするか、または配列ではなくCollectionで受け渡しを行うと言う方法があります。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QCなどで要素の数が固定できない配列はどうやって実現しますか?

配列について質問します。

BASIC系では配列は動的配列で要素の数が自由に変えられます。
ですが、C等では宣言時に配列の要素の数を決めておかねばならなかったと思います。
もし、C等で要素の数がわからないけど、配列を使いたい場合、どうすればいいのでしょうか?
どのように実現するのでしょうか?
配列と同じ使い勝手なら配列でなくともかまいません。

今はVBAでプログラムを組んでいるので、動的配列を使えばすむのですが、いずれ他の言語に移植したいので、できるだけ使わないようにしたいと思っています。

よろしくお願いいたします。

Aベストアンサー

malloc等のメモリ確保はNo.1さんの回答のリンクが詳しいですね。
C言語でプログラムを組む場合は、大抵はこれらメモリ操作関数のお世話になります。

これに加えて、C++やJavaのライブラリでは、動的配列クラスというものが使えます。
C++だとvectorやlist、JavaだとVectorやArrayListあたりですね。
他にも、言語や環境に依存したライブラリ、フレームワークで
様々な動的配列の機構が用意されていたりします。

簡単にまとめると、
・malloc、free、realloc等を使う方法 → ReDim
・動的配列クラス → Collection
のようなものだと考えてください。

QEXCEL VBA でユーザー定義型データーをproperty get let を使って受け渡しをしたい

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょうか。
それとも、メンバー個別でのやり取りは仕様上できないのでしょうか。

もしできるのであれば、サンプルコードを教えていただけると助かります。
よろしくお願いします。

-------------------
Class1
-------------------
Option Explicit

Private m_xx As X

Public Property Get xx() As X
xx = m_xx
End Property

Public Property Let xx(p As X)
m_xx = p
End Property

-------------------
Module1
-------------------
Option Explicit

Type X
a As Long
b As Long
End Type


Sub main1()
'個別にやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long

cc.xx.a = 5
cc.xx.b = 2

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub


Sub main2()
'yyを用意してまとめてやり取り
Dim cc As New Class1

Dim p As Long
Dim q As Long
Dim yy As X

yy.a = 5
yy.b = 2

cc.xx = yy

p = cc.xx.a
q = cc.xx.b

MsgBox p & "," & q

End Sub

----------------------------------------

Excel2002Sp3を使用しています。
(WindowsはXpSp3です)

ユーザー定義型の各メンバーに対して、property get/let/set
を使用してデーターの受け渡しを行いたいのですが、うまくいきません。
以下に作成したプログラムを載せてみます。

main1()とmain2()がありますが、
main2()だとうまくいきます。
しかし、メンバー個別のやりとりにはなっていません。

main1()のようにメンバー個別でやりとりできるようにする方法がわかりません。

property get/let/setの書き方でできるようになるのでしょう...続きを読む

Aベストアンサー

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型が値型か参照型かです。クラスのような参照型を扱う際には、LetではなくSetを使います。

[ Class1 ]
Option Explicit

Private m_xx As New X '←クラスなのでNewでインスタンスを作成しておく

Public Property Get xx() As X
Set xx = m_xx '←戻り値の設定もSetで
End Property

Public Property Set xx(p As X)
Set m_xx = p '←ここも
End Property

#1 Wizard_Zeroです。

> これはVS2005等でもできないのでしょうか。

できません。そのようなコードを書いた時点でエラーが提示され、コンパイルできなくなります。


> Type XX・・・
> ごとにクラスを作るという理解でよろしいでしょうか。もしやるとなるとファイル数、すごく増えますね。

そうなりますね。
(クラス定義部分だけActiveX DLL化するという手もありますが・・・)


> 仮にそうした時、property get等の書き方はどのようになるでしょうか。

PropertyのLetとSetの違いは、扱う型...続きを読む

QC#かJavaで、配列の中から別の配列を探し出す

お世話になります。

C#かJava(CやC++は入れない)で、特定の配列の中に、該当する
配列があるかどうかを調べるメソッドがあれば、教えてください。

例えば…

int[] a={0,0,0,1,2,3,4,5,6,7};
int[] b={3,4,5};

ならば、『5』が返ってくるなどです。

力技では、aの配列を順にみていき、bの一番目と同じなら、
お互いの配列の次の要素を比較…などとやっていくのですが、
これらの方法を、標準のメソッドがあれば…と思い、
質問させていただきました。

以上、よろしくお願いいたします。

Aベストアンサー

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の先頭の添字だけ欲しい場合
listA.indexOf(b[index]);
オブジェクト型配列aに含まれるオブジェクト型配列bの要素の最後の添字だけ欲しい場合
listA.lastIndexOf(b[index]);

最初に見つかる添字だけ欲しいなら標準ライブラリで取得できますが、
全添字が欲しいとなると途端に泥臭くなります。

Javaだけの話です。(以下、indexはbの添字)
int型配列aに含まれるint型配列bの要素の先頭の添字だけ欲しい場合
Arrays.binarySearch(a,b[index]);
int型配列aに含まれるint型配列bの要素の全添字欲しい場合
Arrays.binarySearch(a,from,to,b[index]);//from,toは配列aの走査対象要素

配列がオブジェクト型でもいいなら、Listを実装したクラス(ArrayListなど)に放り込みます。

オブジェクト型配列aに含まれるオブジェクト型配列bの要素があるか否か
listA.contains(b[index]);
オブジェクト型配列aに含まれるオ...続きを読む

QエクセルVBA Property Let について

クラスの勉強中です。
http://excelwork.info/excel/classpropertylet/
上記URLの記述において、

Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

確認のために、Nameがプロパティの名前で、strはただの変数、ですよね?
p_Nameこれは何ですか?strを経由してここに代入される値が実際のプロパティの値になるようですが「p_NameがNameプロパティの実際の値を示す」と、どうやって分かるのですか?単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?また、なんでName=strと表現しないのですか?ややこしいだけに見えます。

Aベストアンサー

> p_Nameこれは何ですか?
> なんでName=strと表現しないのですか?

それは、クラスの内部変数(ご質問でのp_Name)が、必ずしもプロパティを介してクラス外部とやり取りする値(ご質問でのstr)と一致しないからです。

内部変数に代入する前に、Letプロパティで与えられた値が適切なものかチェックし、適切でないならデフォルト値を代入するような処理をしたりすることもあります。

また、普通はプロパティの名前や値はクラスを使用する人が、それがどの様なものか想像しやすい名前や形式をとるようにします。
でも内部変数はクラスの設計者が扱い易い形式で保存させます。その為の変換処理を行うのがPropertyで記述される処理です。


> 単に代入文の左辺にあるから?1個のLetステートメントには1個の変数しか左辺に置けないルールになってるのでしょうか?

例えば、プロパティ名は姓名であっても、クラス設計者がクラス内部では姓と名を分けて保持したければその様にすれば良いし、一つで管理したければそう管理すれば良いのです。



以下、クラス内部では西暦で保持していますが、Heiseiプロパティを使用すれば、平成の年号でやりとりができます。
-----------------------
Sub sample()
  Dim a As Object
  Set a = New Nengou
  
  MsgBox a.Heisei ' 28と表示
  
  a.Seireki = 2020
  MsgBox a.Heisei ' 32と表示
End Sub


----Nenngou-----
Private p_year As Long

Private Sub Class_Initialize()
  p_year = Year(Now)
End Sub

Property Let Seireki(y As Long)
  If y >= 1 Then
    p_year = y
  Else
    p_year = 1
  End If
End Property

Property Get Seireki() As Long
  Seireki = p_year
End Property

Property Let Heisei(y As Long)
  If y >= 1 Then
    p_year = y + 1988
  Else
    p_year = 1
  End If
End Property

Property Get Heisei() As Long
  Heisei = p_year - 1988
End Property

-----

> p_Nameこれは何ですか?
> なんでName=strと表現しないのですか?

それは、クラスの内部変数(ご質問でのp_Name)が、必ずしもプロパティを介してクラス外部とやり取りする値(ご質問でのstr)と一致しないからです。

内部変数に代入する前に、Letプロパティで与えられた値が適切なものかチェックし、適切でないならデフォルト値を代入するような処理をしたりすることもあります。

また、普通はプロパティの名前や値はクラスを使用する人が、それがどの様なものか想像しやすい名前や形式をとるようにします。
...続きを読む

QC言語の2次元配列 容量が大きすぎる場合の対処方法

私はC言語をもちいて2次元配列を作ろうとしています。

しかし、配列数が double c[10000][10000];
と大きいものにすると、エラーになってしまいます。

もちろん小さい double c[10][10];
のような配列では問題ありません。

malloc関数とかも調べたのですがなかなかいい文献が見つからずに
困っています。
どうかいいご意見があればよろしくお願いします。

Aベストアンサー

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fread(&c, 1,8, fp);
 return c;
}

void write_c(FILE *fp, double *c, int x, int y) {
 fseek(fp,(x*10000+y)*8L, SEEK_SET);
 fwrite(c, 1,8, fp);
}

int main(void)
{
 FILE *fp;
 double c,s;
 int x,y;
 int a[10000],b[10000];
 
 fp = fopen("c.dat","w+b");// double c[10000][10000]; の意味
 
 for(x=0; x<10000; x++) {
  for(y=0; y<10000; y++) {
   c=a[x]*b[y];
   write_c(fp, &c, x,y);// c[x][y]=a[x]*b[y]; の意味
  }
 }
 
 for(x=0; x<10000; x++) {
  s=0;
  for(y=0; y<10000; y++) {
   s += read_c(fp, x,y);// s += c[x][y]; の意味
  }
  b[x] = s / 10000;
 }
 
 fclose(fp);
 return 0;
}

No.5です。
>今はa[],b[]に10000個の配列があります。これをc[a][b]に格納するためにどうするか、例文を書いていただいてもよろしいでしょうか?

例文ではありませんが、感じだけ書きましたので参考にしてください。
パラメタの順序や型は正しくないと思いますので、各関数はよく調べて使ってください。あくまで、こんな感じ、ということです。
-------------------
#include <stdio.h>
#include <io.h>

double read_c(FILE *fp, int x, int y) {
 double c;
 fseek(fp,(x*10000+y)*8L, SEEK_SET);...続きを読む

QエクセルVBA Property Let とメソッドの違いは?

前回質問の続きです。
https://oshiete.goo.ne.jp/qa/9407682.html
下記Propertyプロシージャにおける、プロシージャ名、内部変数、引数の関係について説明頂きました。
Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

説明自体は分かりましたが、これ、そのまま引数付メソッドとして使えませんか?
プロパティ名はあくまで名前だけで、実際の処理内容は中身の p_Name = strなのだから、中身を変えれば何でも出来るのではないか?それってメソッドと同じでしょ?

例1
Public Property Let Name(str As String)
p_Name=str
msgbox p_Name
End Property

例2
Public Sub Name(str As String)
p_Name = str
End Sub

Property Let Name(str As String)
Sub Name(str As String)
両者の違いは何でしょうか?

前回質問の続きです。
https://oshiete.goo.ne.jp/qa/9407682.html
下記Propertyプロシージャにおける、プロシージャ名、内部変数、引数の関係について説明頂きました。
Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(str As String)
p_Name = str
End Property

説明自体は分かりましたが、これ、そのまま引数付メソッドとして使えませんか?
プロパティ名はあくまで名前だけで、実際の処理内容は中身の p_Name = strなのだから、中身...続きを読む

Aベストアンサー

Classオブジェクトについては、
メソッドが、Sub プロシージャ/Function プロシージャで
プロパティが、Property
と考えると分かりやすいです。

そして、Propertyプロシージャは、戻り値を取得せずに実行だけするということができません。Sub は、戻り値を返さないメソッドで、Functionは、戻り値を返すメソッドです。

プロパティが性質はを表し、メソッドが動的な働きを見せるわけです。

そもそも、今回のスタイルのクラスのコードというのは、カプセル化(隠蔽化)のためのコードですから、ややこしい、しかし、その意味が今ひとつはっきりしてこないというご指摘は正しいと思います。VBAでは、簡易に用いることがあるので、この手の方法を実際には使うことは少ないと思うからです。実際、たかが、Excel VBAでも、本格的にClassをオブジェクト化してしまうと、ちょっとした修正さえ手の施しようがありません。

>Property Let Name(str As String)
>Sub Name(str As String)
>両者の違いは何でしょうか?

クラス・オブジェクトとしては、プロパティとメソッドということになりますね。

ただし、VBAでは、このようなコードに出会うことは、滅多にありません。また、以下のように、Public ステートメントをつけることも少ないです。元のコードに合わせてアレンジしてみました。
Excel VBAでの、Class は、ほとんどイベントの設定に使うものだからです。

'//
Class1
'----------------------
Private p_Name As String
Private p_Age As Long

'Property Let ステートメント
Public Property Let Name(myp_Name As String)
p_Name = myp_Name
End Property

Public Property Get Name() As String
  'プロパティ
  Name = p_Name
End Property

Public Sub NameChecker()
 '半角の名前は不可とする メソッド
 If LenB(StrConv(p_Name, vbFromUnicode)) = Len(p_Name) Then
  Name = "err"
 End If
End Sub

'-------------
'標準モジュール

Dim myClass As New Class1
Sub TestNameCheck()
With myClass
  .Name = "WindFaller" ' "棚からぼたもち" '' 全角でないと通らない
  .NameChecker .Name
  Call TestOutcheck
End With
End Sub

Sub TestOutcheck()
MsgBox myClass.Name
End Sub

'画像は、プロパティとメソッドの違い

Classオブジェクトについては、
メソッドが、Sub プロシージャ/Function プロシージャで
プロパティが、Property
と考えると分かりやすいです。

そして、Propertyプロシージャは、戻り値を取得せずに実行だけするということができません。Sub は、戻り値を返さないメソッドで、Functionは、戻り値を返すメソッドです。

プロパティが性質はを表し、メソッドが動的な働きを見せるわけです。

そもそも、今回のスタイルのクラスのコードというのは、カプセル化(隠蔽化)のためのコードですから、ややこしい、しかし...続きを読む

Qc言語の配列の先頭アドレスが偶数アドレスとなる理由について

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
printf("%p\n",&nc);
printf("%p\n",&nd);


}

実行結果
0xbffff8cf
0xbffff8ce
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8b0 0xbffff8b1 0xbffff8b2 ← S配列
0xbffff8af
0xbffff8ae

c言語の配列の先頭アドレスが偶数アドレスとなる理由について

下記のように実行結果をで見ると、配列Sの先頭アドレスと配列Cの先頭アドレス共に偶数アドレスなる理由を教えて頂きたい。

/*list0105*/
#include <stdio.h>
main()
{

char na=1;
char nb=1;
char c[2] ={1,2};
char s[3] = {1,2,3};
char nc=1;
char nd=1;

printf("%p\n",&na);
printf("%p\n",&nb);
printf("%p %p \n", &c[0],&c[1] );
printf("%p %p %p \n", &s[0],&s[1] ,&s[2] );
pr...続きを読む

Aベストアンサー

メモリの配置はコンパイラとコンパイルオプションに依存します。
デフォルトだと、32ビットのメモリ処理単位=4バイトとか8バイトが多いかと。
理由は32ビットCPUが4バイト単位でメモリにアクセスするのでアクセス効率を優先したためです。

例えば、
0xbffff8cc 0xbffff8cd ← c配列
0xbffff8ce 0xbffff8cf 0xbffff8d0 ← S配列
だとしたら、S配列の内容全てを参照するためにCPUは0xbffff8ccと0xbffff8d0の合計8バイトにアクセスする必要が出てきます。無駄ですよね。

QProperty Letについて

このようなステートメントがたくさんあります。
これはいったい何をしているのでしょうか?
Property Get と Property Setについても同様に分りません。
どなたか教えていただけないでしょうか。

Aベストアンサー

理解困難ですか?

些細な事でも、わからなかったら遠慮なく聞いてくださいね。

Property関係を熟知するVBプログラマは、ぼくの周りにも少ないです。
流れがわかっていても、どうやったら効果的/有効的になるかがわかってないのです。だから、そういう人はPropertyを使用しようともしません。
むやみやたらにPropertyを使用するのはお奨めしないけど、たくさんのサンプルプログラムを作成し、慣れない関数を多用し、研究する努力が必要だと思います。
Propertyを使用しなくても済む部分をPropertyを使用してみるとかするのもいいと思います。
作成した後、本当にPropertyは必要なのか、Propertyを使用することによって、プログラミング的に効果的であったかなどの検証をして学ぶと、より早く身に着くと思います。


むずかしい分野ですが、がんばってくださいね。

QC言語でunsigned char配列を連結する方法ってありますか?

C言語でunsigned char配列を連結する方法ってありますか?

例えば
unsigned char test[]={0x00,0x02,0x03};
unsigned char test2[]={0x05,0x06};
という配列があったとして

test[]という配列のあとにtest2の配列を追加することは可能でしょうか?
{0x00,0x02,0x03,0x05,0x06}という配列になればOKです。

よろしくお願いします。

Aベストアンサー

testの領域は3バイトのため、それ以上の配列を追加することは出来ません。
もし、testのサイズが5バイト以上あれば、test2を追加することは、できます。
その場合は、memcpy(&test[3],test2,2); とすれば、
testの4バイト目からあとに、test2の2バイトが追加されます。
新たに配列を作成して良いなら、
unsigned char test3[5];として
memcpy(test3,test,3);
memcpy(&test3[3],test2,2);
とすれば、test3はtestとtest2を連結したものとなります。

QVBの「As String * 128」とは?

VBの「As String * 128」とは?

Visual Basic 2010 Expressでコンソールアプリケーションを作成しています。

OSのヴァージョンを取得する機能を作成したかったので、

http://hanatyan.sakura.ne.jp/vbhlp/Version.htm

を参考にして、OSVERSIONINFOの構造体を定義しました。

しかし
szCSDVersion As String * 128

「* 128」
の部分で、ステートメントの終わりを指定してくださいとエラーが出ます。

「* 128」とは、いったいどういう意味ですか?

また、エラーを無くす方法はありますか?

いろいろ検索しましたが、調べ方が悪いのか、分かりませんでした。

よろしくお願いします。

Aベストアンサー

参考にされたサイトはVB6.0用のソースですね。
VB6.0とVB2010(=VB.NET)は色々な部分が変わってますので、VB.NET用のサンプルを見た方が良いと思います。

http://dobon.net/vb/dotnet/system/osversion.html

ちなみに一応、質問に答えると…

> 「* 128」とは、いったいどういう意味ですか?

VB6.0(VB2010の5世代前のバージョン?)で固定長文字列を表す定義です。
* 128と記述すると128文字以上の文字列を入れても自動的に128文字でカットされます。

> また、エラーを無くす方法はありますか?

VB2010(=VB.NET)では以下のように記述します。
<VBFixedStringAttribute(128)> Private szCSDVersion As String


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング