afan 发表于 2010-1-19 15:45:02

Combinations

本帖最后由 afan 于 2010-8-26 14:28 编辑

很郁闷,6以内不会出错,超过6的话在第5次就会提示数组错误,我的版本是3.3.3.3,各位可以测试下以下代码:#include <Array.au3>
Dim $aArray =
For $i = 1 To UBound($aArray)
        $aArrayCombo = _ArrayCombinations($aArray, $i, ",")
        _ArrayDisplay($aArrayCombo, "iSet = " & $i)
Next以上的会出错,而减到6以内都会正常返回,如以下:#include <Array.au3>
Dim $aArray =
For $i = 1 To UBound($aArray)
        $aArrayCombo = _ArrayCombinations($aArray, $i, ",")
        _ArrayDisplay($aArrayCombo, "iSet = " & $i)
Next改用30#的文件替换后解决。为使版本配套的其它函数正常使用,用旧版的替换当然不妥,现将正确的函数提取出来,大家可直接调用更名的函数 “___ArrayCombinations()”
(需注意的是,经测试,大于20仍会出错)Func ___ArrayCombinations(ByRef $avArray, $iSet, $sDelim = "")
      Local $i, $aIdx, $aResult, $iN = 0, $iR = 0, $iLeft = 0, $iTotal = 0, $iCount = 1
      If Not IsArray($avArray) Then Return SetError(1, 0, 0)
      If UBound($avArray, 0) <> 1 Then Return SetError(2, 0, 0)
      $iN = UBound($avArray)
      $iR = $iSet
      Dim $aIdx[$iR]
      For $i = 0 To $iR - 1
                $aIdx[$i] = $i
      Next
      $iTotal = ___Array_Combinations($iN, $iR)
      $iLeft = $iTotal
      ReDim $aResult[$iTotal + 1]
      $aResult = $iTotal
      While $iLeft > 0
                ___Array_GetNext($iN, $iR, $iLeft, $iTotal, $aIdx)
                For $i = 0 To $iSet - 1
                        $aResult[$iCount] &= $avArray[$aIdx[$i]] & $sDelim
                Next
                If $sDelim <> "" Then $aResult[$iCount] = StringTrimRight($aResult[$iCount], 1)
                $iCount += 1
      WEnd
      Return $aResult
EndFunc   ;==>___ArrayCombinations
Func ___Array_Combinations($iN, $iR)
      Local $i, $iNFact = 1, $iRFact = 1, $iNRFact = 1
      For $i = $iN To 2 Step -1
                $iNFact *= $i
      Next
      For $i = $iR To 2 Step -1
                $iRFact *= $i
      Next
      For $i = $iN - $iR To 2 Step -1
                $iNRFact *= $i
      Next
      Return $iNFact / ($iRFact * $iNRFact)
EndFunc   ;==>___Array_Combinations
Func ___Array_GetNext($iN, $iR, ByRef $iLeft, $iTotal, ByRef $aIdx)
      Local $i, $j
      If $iLeft == $iTotal Then
                $iLeft -= 1
                Return
      EndIf
      $i = $iR - 1
      While $aIdx[$i] == $iN - $iR + $i
                $i -= 1
      WEnd
      $aIdx[$i] += 1
      For $j = $i + 1 To $iR - 1
                $aIdx[$j] = $aIdx[$i] + $j - $i
      Next
      $iLeft -= 1
EndFunc   ;==>___Array_GetNext

水木子 发表于 2010-1-19 16:45:08

3.3.1.1 测试,一切正常!

afan 发表于 2010-1-19 16:45:53

回复 2# 水木子


    看来还是3311好哦~~

水木子 发表于 2010-1-19 16:51:04

回复 3# afan
嗯!一直用的3.3.1.1,感觉相对比较稳定,后面的版本也用过,总有些问题。

afan 发表于 2010-1-19 17:20:29

晕,换回3311还是出错:

franky 发表于 2010-1-19 17:33:20

晕 看了不能用最新的啊

afan 发表于 2010-1-19 17:34:06

回复 6# franky


    测试没?

afan 发表于 2010-1-19 18:22:21

不会只有木子一个人来帮忙测试吧~ 晕……

llztt 发表于 2010-1-19 18:36:27

我测试也是错误的,用的3.3.3.3

pusofalse 发表于 2010-1-19 18:41:58

同是3.3.1.1,同是5#的错误。

afan 发表于 2010-1-19 18:52:27

难道咱们的RP都不如木子童鞋~~~? 哈~~ 木子不是测试的第二段吧……

顽固不化 发表于 2010-1-19 18:56:09

前错后不错。测试完毕。

lchl0588 发表于 2010-1-19 19:10:33

呵呵,这是偶的测试结果,是第一个,而不是第二个!
如图:

catcher 发表于 2010-1-19 19:12:15

3.3.2.0我运行两个都没出现什么错误

afan 发表于 2010-1-19 19:18:21

回复 14# catcher


    你确定运行第一段没有错吗? 我简单的试了3320的Array.au3,仍错~
能否贴下运行到第7次的截图?
页: [1] 2 3
查看完整版本: Combinations