早速質問ですが,
要素が何個かわかっていない配列の最大値はどうやって指定すればいいでしょうか?
ReDim Preserve a(0 To 50)
としたのですが,50のところがループするごとに変わるプログラムを組んでいるため,
ReDim Preserve a(0 To UBound(a))
としたのですが,インデックスが有効範囲にありませんというエラーが
出てしまいます.
どうすればいいでしょうか?
なんの問題も無いです。+ 1 を忘れてるとかでは?
[VB6.0]
Private Sub Command1_Click()
Dim a() As Integer
Dim i As Integer
ReDim a(0)
For i = 0 To 3
a(i) = i
ReDim Preserve a(0 To UBound(a) + 1)
Next i
For i = 0 To UBound(a)
Debug.Print a(i)
Next i
End Sub
+ 1 しないといけませんよね。
ReDim Preserve ArrayVar(UBound(ArrayVar()) + 1)
# どうせゼロからなので、「0 To」は不要ですね。
また、パフォーマンスを上げるなら、+100単位とかで再定義しておいて、
最後のループを抜ける時に、データが入っている位置まで縮小して再定義するべきですね。
要素数ががわかっていないのであれば指定できませんよね?
わかった時点でRedimするなどをし、指定してください。
ReDim Preserve a(0 To UBound(a)+1)
とか。
気が合いますなぁ... (訳:被ってしまって申し訳ありません m(_ _)m )
三人かぶるとはこれまためずらしい。
>気が合いますなぁ... (訳:被ってしまって申し訳ありません m(_ _)m )
…ま、それほど間違うパターンが明白な質問と言う事でしょう(^^;)。
(訳:ボクはメモ帳に文章書いて、送信ボタン押す直前に更新して
被らないようにしてます。…結構、ここに居座って長いですからw )
> # どうせゼロからなので、「0 To」は不要ですね。
Option Base 1 などとしていた場合はあるべきかな
と言ってみる
>いな さん:
いなさんとは、別の掲示板で被ってしまったことがあったり...(w
>特攻隊長まるるう さん:
私も普段、更新してから投稿するようにしております。
ですが、よく忘れちゃいますね... ディスプレイに貼っておかないと (w
>Kara さん (ん? 私の知っている「かる」さんかな?):
う、そ、そうですね...
大変失礼しました m(_ _)m
>じゃんぬねっとさん
そそ、よく別の掲示板でかぶったり、
自分は、何か目新しい考え方や面白いロジックはないかなぁ〜と、巡回してます。
> (ん? 私の知っている「かる」さんかな?):
「かる」と名乗ったことは無いので、おそらく別の人かと思われます
# 当方いくつかの掲示板でkaraを名乗っているのですが、MS MVPの辛島さんとかぶっていることに最近気づきました
それはそうと、じゃんぬねっとさんってmixiの「C言語とC++言語」コミュの「ひどい! ソース!」トピックの47さんですよね?
私は53にて発言した虎( ´;゜;ё;゜;)です
以後お見知りおきを
ってここで雑談してどうする>俺
> MS MVPの辛島さんとかぶっていることに最近気づきました
あ、私のしっている「かる」さんはその「辛島」さんでございます。
> それはそうと、じゃんぬねっとさんってmixiの「C言語とC++言語」コミュの
>「ひどい! ソース!」トピックの47さんですよね?
> 私は53にて発言した虎( ´;゜;ё;゜;)です
> 以後お見知りおきを
うわっ!! 世界は狭い... マイミクしましょー
ってここで、マイミク申請してどうするw > じゃんぬ
# 皆さま、スレ汚しお許しくださいませ m(_ _)m
返信ありがとうございます.
ReDim a(0)
For i = 0 To 3
a(i) = i
ReDim Preserve a(0 To UBound(a) + 1)
Next i
1.a(0)なのに,どうしてiに0から3を入れることができるのですか?
2.皆様,かぶるくらい常識なことなのですが,どうしてUBoundに1を足すのでしょうか?
>2.皆様,かぶるくらい常識なことなのですが,どうしてUBoundに1を足すのでしょうか?
Private Sub Form_Load()
Dim a() As String
ReDim a(5) 'aの要素数は5
ReDim Preserve a(UBound(a)) 'aの要素数を、aの要素数に拡張
End Sub
もともと有るa()の要素数は5なのに、Redimする意味はあるのでしょうか?
>>1.a(0)なのに,どうしてiに0から3を入れることができるのですか?
る〜ぷを考えてみましょう
ReDim a(0)
For i = 0 To 3
a(i) = i ...(i)
ReDim Preserve a(0 To UBound(a) + 1) ...(ii)
Next i
1.a(0)で宣言
2.For文開始、i=0
3.(i)の処理でI=0のためa(0)=0が入る
4.(ii)の処理でUBound(a) = 0のためa(1)ができる
5.For文にもどり、 i=1
6.(i)の処理でI=1のためa(1)=1が入る
7.(ii)の処理でUBound(a) = 1のためa(2)ができる
8.For文にもどり、 i=2
9.(i)の処理でI=2のためa(2)=2が入る
10.(ii)の処理でUBound(a) = 2のためa(3)ができる
11.For文にもどり、 i=3
12.(i)の処理でI=3のためa(2)=3が入る
13.(ii)の処理でUBound(a) = 3のためa(4)ができる
14.Exit Sub
以上ですが、不明点は?
激しく誤爆
>>12.(i)の処理でI=3のためa(2)=3が入る
12.(i)の処理でI=3のためa(3)=3が入る
です。
なんだか人の揚げ足とりばっかりしている気がしますが・・・
いなさん
> ReDim a(5) 'aの要素数は5
Option Baseが指定されていない限り、要素数は6ではないでしょうか?(0,1,2,3,4,5)
5は添字の最大数ですね
じゃんぬねっとさん
> うわっ!! 世界は狭い... マイミクしましょー
では、mixiで会いましょう
# 被るのを覚悟の上で回答。
> 1.a(0)なのに,どうしてiに0から3を入れることができるのですか?
For〜Nextのループ中で、毎回 ReDim しなおして、
配列のサイズを、一つずつ増やしているからです。
『ReDim a(0)』が実行された直後は、a(0) しか使えません。
『ReDim a(1)』が実行されれば、a(0)とa(1)が指定可能になります。
『ReDim a(2)』であれば、a(0)〜a(2)が指定可能になるわけです。
ただし、「ReDim a(2)」を実行すると、配列のサイズは変更されますが、
既存のデータまでクリアされてしまいます。それを防ぐために、
「ReDim Preserve a(1)」のように、Preserveをつけて処理する事になります。
もっとも、提示されたコードでは「0 から 3まで」という事が明らかなので、
毎回 ReDim Preserve するのではなく、
ReDim a(3)
For i = 0 To 3
a(i) = i
Next
のようにした方が、効率が良いです。
> 2.皆様,かぶるくらい常識なことなのですが,どうしてUBoundに1を足すのでしょうか?
例えば、
ReDim a(2)
で宣言された配列は、a(0)〜a(2) までが使えますね。
この配列に対して、新たに a(3) も使えるようにするなら、
ReDim Preserve a(3)
のように、上限値に「3」を指定する必要があります。
(ここまでは分かりますよね?)
一方、UBound関数は、添字の最大値を返す関数なので、
ReDim a(2) '←これだと、a(0)〜a(2) しか使えない
n = UBound(a) '←この時、n には 2 という値が入る
ReDim Preserve a(n + 1) '←これにより、a(3) まで使えるようになる
のように処理されます。
そしてこれを、変数 n を使わずにまとめて書くと、
ReDim a(2)
ReDim Preserve a(UBound(a) + 1)
となりますね。
karaさん
そうですね。
どうやら、疲れてるようです。
> どうやら、疲れてるようです。
今日は至るところで、いなさんを見かけますからね(ぇ
なんか静かな死闘を垣間見た気がしたぞw>( ´Д`)
…で、もともとの質問もオモロイしw
ツイート | ![]() |