动态调整数组大小

时间:2016-01-04 09:15:59

标签: arrays vbscript

在处理添加到变量数组大小时遇到​​了以下问题。循环运行一次,然后它应该基本上。但我很好奇会导致这种行为的原因是什么?我不太清楚如何调用循环退出函数?

以下是代码:

Module Module1

Sub Main()
    Dim num(-1)
    Dim i = 0
    Console.WriteLine("Input numbers to be added, q to stop:")
    Dim input
    Dim total = 0
    Do
        ReDim Preserve num(UBound(num) + 1) : num(UBound(num)) = i 'resize the array each time before an element is added.
        input = Console.ReadLine
        If IsNumeric(input) Then 'attempt to break loop on non numeric input
            num(i) = CInt(input)
            i += 1
        Else
            Exit Do
        End If
    Loop
    total = 0
    For Each n In num
        total += n
    Next
    Console.WriteLine(Join(num))
    Console.WriteLine("Total: " & total)

    Console.ReadLine()

对于输入:1 2 3 4 5 q,我得到的输出是:

1 2 3 4 5 5
Total: 20

它将最后一个元素添加两次,这很有趣,因为它不仅运行了两次,而且以某种方式使用最后一个数字输入,即使最终输入不是数字。有谁知道为什么会这样?

2 个答案:

答案 0 :(得分:3)

你们两个(jnb92,PankajJaju)应该之前增加数组你确定输入是数字并且必须存储。

Dim input
Do
    input = Console.ReadLine()
    If IsNumeric(input) Then 'attempt to break loop on non numeric input
        ReDim Preserve num(UBound(num) + 1)
        num(UBound(num)) = CInt(input)
    Else
        Exit Do
    End If
Loop

更新评论:

你的

ReDim Preserve num(UBound(num) + 1) : num(UBound(num)) = i

为每个输入分配inum;您的

num(i) = CInt(input)

用数字输入覆盖,但不用终止"q"覆盖。那么对于你的(唯一的?)测试用例,虚假的最后一个元素是(意外)5。

答案 1 :(得分:0)

我已经使用了您的脚本并试图创建一个可行的解决方案

    Dim num, input,  total, i
    num = Array()

    i = 0
    Do
        input = Inputbox("Input numbers to be added, q to stop:")
        If IsNumeric(input) Then 'attempt to break loop on non numeric input
            ReDim Preserve num(UBound(num) + 1) 'resize the array each time before an element is added.
            num(i) = CInt(input)
            i = i + 1
        Else
            Exit Do
        End If
    Loop

    total = 0
    For Each n In num
        total = total + n
    Next
    msgbox Join(num)
    msgbox "Total: " & total

编辑 - 根据@ Ekkehard.Horner评论更新答案