本帖最后由 afan 于 2010-8-26 14:28 编辑
很郁闷,6以内不会出错,超过6的话在第5次就会提示数组错误,我的版本是3.3.3.3,各位可以测试下以下代码:#include <Array.au3>
Dim $aArray[7] = [1, 2, 3, 4, 5, 6, 7]
For $i = 1 To UBound($aArray)
$aArrayCombo = _ArrayCombinations($aArray, $i, ",")
_ArrayDisplay($aArrayCombo, "iSet = " & $i)
Next
以上的会出错,而减到6以内都会正常返回,如以下:#include <Array.au3>
Dim $aArray[6] = [1, 2, 3, 4, 5, 6]
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[1], $aResult[1], $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[0] = $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
|