こんにちは
VBで2次元配列に初期値をまとめて入れる方法がわからなくて困っています。
簡単なはずなのにわかりません。
教えてくれるようお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

田吾作7です。



あぁーすいません。
初期化だと思ってて、勘違いしてました。すいません。。。
初期化ではなく、初期値のセットですね。。。

Variant型でもよければ
  dim wkAryas Variant'バリアント宣言
  wkAry = Array(Array(10, 100, 42, 90), Array(50, 30, 60, 30))
といった形でできます。



もし何度も同じ初期値をセットする必要があるのであれば、メモリコピーをお勧めします。
それが一番リソースを消費しない方法だと思います。
以下にソースを記します。
手順1.二次元配列の初期値のマスタを作成(CreAryMst)
手順2.ワークの二次元配列に初期値をセット(InitAry)
手順3.ワークを使用したロジックの実行(ユーザの処理)
手順4以降は手順2または手順3の処理の繰り返し

Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

Private mstAry(1, 3)  As Long '二次元配列の初期値のマスタ
Private matrixCount   As Long '配列要素数

Sub Main()
  Dim wkAry(1, 3)   As Long '実際に操作する二次元配列
  
  '二次元配列の初期値マスタを創生
  Call CreAryMst
  
  '変数に初期値をセットする
  Call InitAry(wkAry(0, 0))
  
End Sub

'二次元配列の初期値マスタを創生
Sub CreAryMst()
  Dim dmyAry As Variant
  Dim i    As Long
  Dim j    As Long
  
  Dim min1  As Long
  Dim max1  As Long
  Dim min2  As Long
  Dim max2  As Long
  
  min1 = LBound(mstAry, 1)
  max1 = UBound(mstAry, 1)
  min2 = LBound(mstAry, 2)
  max2 = UBound(mstAry, 2)
  
  '配列要素数を取得
  matrixCount = (max1 - min1 + 1) * (max2 - min2 + 1)
  
  '初期値をダミー変数にセット
  dmyAry = Array(CLng(10), CLng(50), CLng(100), CLng(30), CLng(42), CLng(60), CLng(90), CLng(30))
  
  '初期値をセットする
  For i = min1 To max1
    For j = min2 To max2
      mstAry(i, j) = dmyAry(i * max2 + j)
    Next j
  Next i
End Sub

'変数に初期値をセット
Sub InitAry(inLngAryTop As Long)
  Call CopyMemory(inLngAryTop, ByVal VarPtr(mstAry(0, 0)), ByVal LenB(inLngAryTop) * matrixCount)
End Sub




こうすることにより、初期値のセットが一瞬で済むので、初期値セット毎にかかる負荷が抑えることができます。
    • good
    • 0

再度投稿します。

田吾作7です。

imogasiさんが
>前の方の回答は、JAVA言語などで言う初期化の回答で はないかとおもいます。
とありますが、VBですよ(^^;)
MSDNでVBのEraseの説明が見当たらなかったのですが、VBScriptのページで見つかりましたのでアドレスを記します。
http://www.microsoft.com/JAPAN/developer/library …

lmiさんは
>VBで2次元配列
と言ってましたが、宣言はどのような形でしてるのでしょう?
考えられる2次元配列の創生方法は3つあります。

(1)
Dim 変数名(5,10) As Long

(2)
Dim 変数名() As Longとしておいて
Redim 変数名(5, 10) As Longと再度配列要素を再宣言

(3)
Dim 変数名 as Vaiant
変数名 = Array(Array(3, 5, 9), Array(1, 6, 4))
として、二次元配列を創生しながら値をセット


Erase 二次元配列の処理結果は
それぞれDimで宣言したときの状態に戻ります
ですので
(1)は全て0が入ります。
(2)は配列要素未宣言の変数になります。
(3)は単なるVariant型の変数になります

メモリの開放にもつながるので、初期値が「0」もしくは、文字列なら「""」とするならEraseをお勧めします。

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0

前の方の回答は、JAVA言語などで言う初期化の回答で


はないかとおもいます。質問者は
「自分の思うリテラル値に設定したい」というのが、質問の真意では?私も初心者ですが、勘違いであればお許し下さい。実例を書きます。ご参考に。
  ・Optin Base 1は Subの外に書く
  ・下記はArray関数を使ったもの
  ・Array関数は1次元しか使えない
  ・下記プログラムはフォームをクリックして実行
   してください
  ・---は区切りに表示しただけ 
Option Base 1
Private Sub Form_Click()
Dim a(3, 4) As String
b = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", _
"10", "11", "12")
For i = 1 To 3
For j = 1 To 4
a(i, j) = b(4 * (i - 1) + j)
Next j
Next i
Rem--------
For i = 1 To 3
For j = 1 To 4
Form1.Print a(i, j)
Next j
Form1.Print "---"
Next i
End Sub
初級中級のVBの解説書には案外、初期化や2次元配列の
ことを解説してないですね。2-3日前にも類似質問
が有りました。2、3次元配列の内容を1次元配列a=Array(....)で表せると思います。
    • good
    • 0

Erase 二次元の変数名


↑ これで初期化
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しの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
のようなものだと考えてください。

QVB.netの配列とVB6の配列の違い

VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。

下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡
します。

VC6DLL側のコード----------
EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{
}

VB側のコード----------
宣言
Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long

配列宣言
Public sngDat(999,1) as single

呼び出し
TESTFUNC sngDat(0,0),1000

このように呼び出した場合、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの
ポインタをインクリメントした場合、sngDat(0,0),sngDat(1,0),sngDat(2,0)と、1次元目の添え字を
インクリメントした状態になるように、メモリに格納されています。
この動作を前提として、VB.net側でも同じように呼び出してみました。

VB.net側のコード----------
宣言
Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Integer) As Integer

配列宣言
Public sngDat(999,1) as single

呼び出し
TESTFUNC(sngDat(0,0),1000)

VC側は全く同じコードを利用するとします。

同じように、VC6のTESTFUNC にブレークポイントを設定し、停止するとpfDataの
ポインタをインクリメントした場合、sngDat(0,0),sngDat(0,1),sngDat(1,0)と,sngDat(1,1)、と1次元目の添え字を
インクリメントせず、2次元目の添え字をインクリメントした状態になるように、メモリに格納されています。

VB6→VC6のDLLの場合の配列渡しと、VB.net→VC6のDLLの場合の配列渡しで違いがあるのは
何故でしょうか?また、VB.net側の配列渡しの仕様を、VB6側の仕様に合わせる方法は無いのでしょうか?

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

VB6で画面を作成し、演算処理を行うDLLをVC6で作成しています。

下記のコードでVB6でSingle型の2次元配列を宣言しま、VCのDLLでエクスポートしている関数に渡
します。

VC6DLL側のコード----------
EXPORT void __stdcall TESTFUNC (float *pfData,long nSize{
}

VB側のコード----------
宣言
Declare Function TESTFUNC Lib "TEST.dll" (ByRef pfData As Single, ByVal nSize As Long) As Long

配列宣言
Public sngDat(999,1) as single

呼び出し
TESTFUNC sngDat(0,0),1000

このように呼び出した場合、V...続きを読む

Aベストアンサー

VB.NET (というか、.NET Framework ) の配列と、ネイティブコードの配列は別物です。.NET FrameWork では両者を

・ VB.NET で宣言する配列を 『マネージド配列』
・ C++等のネイティブコードの配列を 『アンマネージド配列』

と明確に別物として区別しており、両者を変換するためのマーシャリングをいう仕組みをわざわざ準備しています。詳細は以下を参照してください。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet28/vb6tonet28_03.html

配列のマーシャリングの方法は以下が参考になると思います。
http://msdn.microsoft.com/ja-jp/library/z6cfh6e6.aspx

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に含まれるオ...続きを読む

QVB2008での配列の初期化方法

VB2008での配列の初期化方法
様々なサイトなどを見て、配列を宣言する時に初期化する方法を知ってこんな風なコードを書いて、配列の初期化を試みました。
書いたコード
Option Strict On

Public Class Form1()
Private AImage As Image = (My.Resources.AImage1 As Image, My.Resources.AImage2 As Image,My.Resources.AImage3 As Image,My.Resources.AImage4 As Image, My.Resources.AImage5 As Image,My.Resources.AImage6 As Image, My.Resources.AImage7 As Image)
後略

もちろんAImage1~7はリソースで読み込んでありますし、End Classもずっと下の方に書いてあります。

ここで、「・・・(My.Resources.AImage1 As Image,・・・」のAsの部分にだけ波線が引かれて、「')' が必要です。」というエラーが出ました。

最後を「)」で終わっているのに、なぜこのエラーが出るのでしょうか。使用言語はVitualBasic2008です。文法等も含めて、改善点を教えていただければ幸いです。

VB2008での配列の初期化方法
様々なサイトなどを見て、配列を宣言する時に初期化する方法を知ってこんな風なコードを書いて、配列の初期化を試みました。
書いたコード
Option Strict On

Public Class Form1()
Private AImage As Image = (My.Resources.AImage1 As Image, My.Resources.AImage2 As Image,My.Resources.AImage3 As Image,My.Resources.AImage4 As Image, My.Resources.AImage5 As Image,My.Resources.AImage6 As Image, My.Resources.AImage7 As Image)
後略

もちろんAImage1~7はリソースで読み...続きを読む

Aベストアンサー

ごめんなさい。的を外しているかもしれませんが・・・
配列の初期化や文法などなどを考えずに、いつもの通りですと

Private AImage As Image() = {My.Resources.AImage1, My.Resources.AImage2, My.Resources.AImage3}

若しくは

Private AImage As Image() = New Image() {My.Resources.AImage1, My.Resources.AImage2, My.Resources.AImage3}

っていう感じで行なっています。

配列にデータ型を一個一個入れたことが無いので、なんともいえませんが・・・

的外れでしたらごめんなさい。m(_ _)m

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);...続きを読む

QVB.NET 2次元配列

二次元配列に関して質問があります。

二次元配列を定義します。
Dim a(,) As Integer = _
{{0, 0, 0, 0, 0, 0, 1, 1, 1}, _
{0, 0, 0, 0, 0, 1, 0, 0, 1}, _
{0, 0, 0, 0, 0, 0, 1, 1, 1}}

一次元配列を定義します。
Dim b() As Integer

一次元配列のb()に二次元配列a(,)の
{0, 0, 0, 0, 0, 0, 1, 1, 1}の部分を
入れようとした場合、
どのように記載すればよろしいでしょうか?
イメージ的には
b = a(0)
で出きると思ったのですが、
構文エラーとなってしまいます。

よろしくお願いします。

Aベストアンサー

  求めているものとは違く、また既にご存知のものかもしれませんが・・・。

  2次元配列の定義を以下のようにすれば、ご希望の操作が出来ます。

  ※配列の定義が(,)ではなく()()になるため、2次元配列の参照が変わります。

  '----------------------------------------------------------------------------
  Dim array_a()() As Integer = _
                {New Integer() {0, 0, 0, 0, 0, 0, 1, 1, 1}, _
                New Integer() {0, 0, 0, 0, 0, 1, 0, 0, 1}, _
                New Integer() {0, 0, 0, 0, 0, 0, 1, 1, 1}}

  Dim b() As Integer
  Dim c As Integer

  b = array_a(0)   ' {0, 0, 0, 0, 0, 0, 1, 1, 1}の部分を代入
  b = array_a(1)   ' {0, 0, 0, 0, 0, 1, 0, 0, 1}の部分を代入

  c = array_a(2)(7)  ' {0, 0, 0, 0, 0, 0, 1, 1, 1}の7番目 '1'を代入

  '----------------------------------------------------------------------------

  求めているものとは違く、また既にご存知のものかもしれませんが・・・。

  2次元配列の定義を以下のようにすれば、ご希望の操作が出来ます。

  ※配列の定義が(,)ではなく()()になるため、2次元配列の参照が変わります。

  '----------------------------------------------------------------------------
  Dim array_a()() As Integer = _
                {New Integer() {0, 0, 0, 0, 0, 0, 1, 1, 1}, _
                New Integer() {0, 0, 0, 0,...続きを読む

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バイトにアクセスする必要が出てきます。無駄ですよね。

QVBで配列の初期化について

VBやVBAで1次元・2次元配列を、プログラムの中の
値の(リテラル的)記述で初期化する方法はどうすれば良いのでしょうか。1次元配列にはx=Array()で代用してきましたが、さて、行と列がある表のような、値データを2次元配列にセットしようとして、ハテナと行き詰まりました。配列名(要素)=値を要素数だけ繰り返す方法以外に、例えば
A[][]={(a、b、c)(d、e、f)(g,h,i)}のような、書き方は出来ないのでしょうか。
複数のArrayをArreyの()内に入れてみましたがも上手く行かないようですが。
有り無しについて教えていただけたらと思います。
市販の解説書数書には触れた記述は見つかりませんでした。

Aベストアンサー

Arrayを使って多次元配列の作成はどうもできないようなのですが、
1次元配列の各要素が1次元配列というものであれば、

A = Array(Array(a,b,c), Array(d,e,f), Array(g,h,i))

というのが可能です。
A(i)(j)という形式で各要素にアクセスできます。

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を連結したものとなります。

QArrayListの初期値に二次元配列を設定したい(VB2005)

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として設定するにはどのようにすればよいか、ということが質問内容です。

試しに(b)の部分を以下のようにしてみましたが、「1次元配列の値を変換できない」とのエラーが出ました。
Dim aryhoge As New ArrayList(New TextBox() {hoge(0), hoge(1), hoge(2)})

どうぞよろしくお願い致します。

下記は、aryhogeにTextBoxオブジェクトを格納する処理です。

----------------------------------------
'a)
Dim hoge()() As TextBox = _
      {New TextBox() {txta01, txtb01, txtc01}, _
      New TextBox() {txta02, txtb02, txtc02}, _
      New TextBox() {txta03, txtb03, txtc03}}

Dim aryhoge As New ArrayList    'b)

aryhoge.Add(hoge(0))
aryhoge.Add(hoge(1))
aryhoge.Add(hoge(2))
----------------------------------------

(a)を(b)の初期値として...続きを読む

Aベストアンサー

Dim aryhoge As New ArrayList(hoge)


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

人気Q&Aランキング