簡體   English   中英

誰能告訴我為什么我的數組表現不一致?

[英]Can anyone tell me why my array is behaving inconsistently?

這是我的第一個非凡的VBA程序,盡管我以前在BASIC的各種方言中都使用過數組,並且在過去的三四個晚上研究了Walkenbach的“ Excel VBA for Dummies”,但我感到困惑。

我期望發現數組的一個元素的值增加了1,而在475次運行中,代碼僅按預期執行了449次。 其他26次運行產生的元素增加了2個。 更奇怪的是,此初始代碼塊訪問的十二個元素中,只有四個曾經表現出此行為,其他元素按預期返回1。

如果可以的話,我可以發布errant函數使用的兩個表,但是無論數據是什么,我都看不到這怎么發生。

'UDF to roll a number of Dice of specified size and total them
  Function Dice(NoOfDice, DiceSize)
    Dice = 0
      For i = 1 To NoOfDice
        Dice = Dice + WorksheetFunction.RandBetween(1, DiceSize)
      Next
  End Function

'UDF to generate a skill from the MOS Table
  Function MOSSkill(ArmOfService, TechLevel)
    Roll = Dice(1, 6)
      If TechLevel = 2 Then Roll = Roll + 1 'TL-11 or less = 1; TL-12+ = 2
        MOSSkill = WorksheetFunction.VLookup((WorksheetFunction.VLookup(Roll, (Range(Cells(4, 2), Cells(10, 8))), ArmOfService, False)), (Range(Cells(9, 32), Cells(39, 33))), 2, False)
  End Function

Sub MercOne()

Randomize

Dim Merc(86)

45 For i = 1 To 86
     Merc(i) = 0
  Next

TechLevel = Dice(1, 2)

Roll = Dice(2, 6)
   If Merc(2) >= 6 Then Roll = Roll + 1
   If Merc(3) >= 5 Then Roll = Roll + 2
   If Roll < 5 Then GoTo 45

ArmOfService = Dice(1, 4)
    If ArmOfService = 4 Then
       ArmOfService = ArmOfService + 2
        Else: ArmOfService = ArmOfService + 1
    End If

'Array Check 1
  For i = 7 To 37
    Debug.Print Merc(i); ",";
  Next
    Debug.Print

Merc(MOSSkill(ArmOfService, TechLevel)) = Merc(MOSSkill(ArmOfService, TechLevel)) + 1

'Array Check 2
For i = 7 To 37
    Debug.Print Merc(i); ",";
  Next
    Debug.Print

End Sub

當MOSSkill運行時,概率為1/6,它將使Roll增加,並影響查找。

因此,當您通過以下方式訪問陣列時

Merc(MOSSkill(ArmOfService, TechLevel)) 

然后增加

Merc(MOSSkill(ArmOfService, TechLevel)) + 1

第二個有可能不會與第一個相同,因此您增加了錯誤的內容。

你需要:

temp=MOSSkill(ArmOfService, TechLevel)
Merc(temp)=Merc(temp)+1

這樣他們將永遠一樣

您的代碼有時會這樣做:
(我在索引中添加了+1或+0,因為那是MOSSkill的功能)

Merc(1)=Merc(1)+1;    //Merc(1+0)=Merc(1+0)+1
Merc(3)=Merc(2)+1;    //Merc(2+1)=Merc(2+0)+1
Merc(4)=Merc(3)+1;    //Merc(3+1)=Merc(3+0)+1
Merc(5)=Merc(5)+1;    //Merc(4+1)=Merc(4+1)+1

像那樣。 所以在那種情況下Merc(4)是2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM