配列の要素数の限界はいくつ?

解決


waking-life  2003-06-07 02:29:46  No: 78177

VBで計測プログラムを作っているのですが、
ハードウェアの仕様から配列を使っています。

試したところ、
 Dim dwBuffer(0 To 32000) As Long 
で32000と33000の間に要素数の限界があるみたいです。

VBの仕様上、配列の要素数に限界はあるのでしょうか?
また限界をあげるような方法があったら教えてください。
よろしくお願いします


雨男  2003-06-08 06:12:23  No: 78178

整数(Integer)の有効範囲の限界が-32768〜32767なので、32767を超え
る数値を指定する場合、サフィックスを付ければ 32767より大きな数値
を扱えます。

Dim dwBuffer(0 To 33000#) As Long 
                  ^^^^^^


waking-life  2003-06-09 19:52:02  No: 78179

雨男さん、突然の質問にご回答ありがとうございます!

>サフィックスを付ければ 32767より大きな数値を扱えます。
ということは、サフィックスを付けた場合、負の分を合わせて、
0〜32767*2までは定義できるということになるのでしょうか?

それとも、それを超えて無限に定義できるのでしょうか?
(普通に考えて、メモリの限界などがくると思うですが、、、)


美咲  2003-06-10 21:27:49  No: 78180

VBでの配列の最大数は物理メモリの限界までです
前にRedimでバイト型をファイル容量分とるようなコードを書いたのですが、現在空いている物理メモリの限界までのようです
Redimするときに()の中の変数をLongにしたりLong型で定数を切ってそれで宣言したりするとIntegerの制限は越えれます
(配列の要素数は定数で切ることをお勧めします)


雨男  2003-06-11 14:19:40  No: 78181

当然メモリの限界を超えるような場合は実行時エラーが発生します。
要素数を定数で指定する場合、文法上は定数の限界値まで配列を定義
することはできますが、実行時にそれだけのメモリが無ければ
実行時にエラーが発生してしまいます。
Long型の場合1つで4バイトの領域を使うので、なるべく配列は小さく
なるようにしたほうがいいと思われます。

うちでは下のように書いても普通に実行できました。
  Dim dwBuffer(0 To 10000000) As Long

PCやOS等によっては同じ結果にならないこともあるので、問題部分を
はっきりさせるために、Integerの範囲外の数値を使う場合は
サフィックスを付けた方がいいと考えてます。


ぴろあき  2003-06-11 20:08:19  No: 78182

#を付けるという事は数値をDouble型にするという事だと私は認識しております。
この認識が間違っていればご指摘ください。

Double型であれば、負の値は -1.79769313486232E308 〜 -4.94065645841247E-324、正の値は 4.94065645841247E-324 〜 1.79769313486232E308までの範囲の数値を扱う事はできるので、
確かにIntegerの-32768〜32767という限界は大きく超えると思います。

が、例えばdwBuffer(5.67)のように配列の要素番号(要素数)に小数点型を設定する事はとてもおかしな事だと思います。

仮に付けるとしたら、Long型(-2,147,483,648 〜 2,147,483,647)を表す&を付けるべきではないでしょうか?
もっとも、配列の要素数は暗黙Long型なので付ける必要はないと思いますが。

やはりメモリ不足が原因と思われます。


雨男  2003-06-11 21:32:11  No: 78183

私の書き込みで誤解されないように補足しておきますが、
Dim Test(-1.79769313486231E+308 To 1.79769313486231E+308) as Long
の範囲まで編集時にはエラーにならず、この範囲を超える場合に配列の
添え字としての限界をこえるため編集時にエラーが発生することを書い
たつもりでしたが説明が足りなかったみたいですね。
配列定義の限界とメモリの限界は似ていますが、別問題と考えてください。
メモリ不足は実行環境によって限界値がちがうためもっと少ない状態でも
発生することは十分考えられます。


ぴろあき  2003-06-11 22:42:32  No: 78184

#この投稿は原因の究明によるwaking-lifeさんへの便宜を図るため、および私自身の学習を目的としております。

Dim Test(2147483647) As Long
を実行しようとした場合、私の環境では
『メモリが不足しています』
のエラーメッセージが表示されます。
ま、これは当然といった結果なのですが、

Dim Test(2147483648) As Long
を実行しようとすると、
まず#が配列要素数の数値の後に自動的に付加されました。
Long型で扱える範囲を超えたのでDouble型で扱うよといったVbからのメッセージと認識しています。
ここまではいいのですが、
『オーバーフローしました』
というメッセージが表示されます。

以上の事から私は配列の要素数はLong型の範囲までしか宣言できず、
Double型の範囲は編集時エラーになる場合があると考えます。

つまり配列定義の限界はあくまでも-2,147,483,648 〜 2,147,483,647であって、
今回の場合は『要素数 * 型のバイト数(Long = 4) > 利用可能メモリ』という原因で起きていると私は思います。

ちなみに
Dim Test(1.23) As Long
というのはエラーにはならないのですね。


魔界の仮面弁士  2003-06-12 00:24:14  No: 78185

配列の添字は、符合付き32bit整数型の制限に従って、
  最小:-2147483648
  最大:2147483647
となります。これは、SafeArrayCreateVector APIを使って
作成された配列であっても同じ制限となります。

実際には、使用可能なメモリリソースの制限などの制限も受けますので、
PCによっては、これよりも小さな配列でもエラーとなる事がありえます。


waking-life  2003-06-28 21:26:42  No: 78186

Dim dwBuffer(0 To 33000#) As Long 
                  ^^^^^^
という方法で解決です。

その後、Long型の変数で指定しているので、
#もしくは&をつける必要は無くなりました。

  最小:-2147483648  最大:2147483647
の限界まで使うことは無さそうですけど、一応納得です。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加