找回密码
 加入
搜索
查看: 13646|回复: 33

[AU3基础] Combinations

 火...   [复制链接]
发表于 2010-1-19 15:45:02 | 显示全部楼层 |阅读模式
本帖最后由 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
发表于 2010-1-19 16:45:08 | 显示全部楼层
3.3.1.1 测试,一切正常!

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

 楼主| 发表于 2010-1-19 16:45:53 | 显示全部楼层
回复 2# 水木子


    看来还是3311好哦~~
发表于 2010-1-19 16:51:04 | 显示全部楼层
回复 3# afan
嗯!一直用的3.3.1.1,感觉相对比较稳定,后面的版本也用过,总有些问题。
 楼主| 发表于 2010-1-19 17:20:29 | 显示全部楼层
晕,换回3311还是  出错:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2010-1-19 17:33:20 | 显示全部楼层
晕 看了不能用最新的啊
 楼主| 发表于 2010-1-19 17:34:06 | 显示全部楼层
回复 6# franky


    测试没?
 楼主| 发表于 2010-1-19 18:22:21 | 显示全部楼层
不会只有木子一个人来帮忙测试吧~ 晕……
发表于 2010-1-19 18:36:27 | 显示全部楼层
我测试也是错误的,用的3.3.3.3

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-1-19 18:41:58 | 显示全部楼层
同是3.3.1.1,同是5#的错误。

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

 楼主| 发表于 2010-1-19 18:52:27 | 显示全部楼层
难道咱们的RP都不如木子童鞋~~~? 哈~~ 木子不是测试的第二段吧……
发表于 2010-1-19 18:56:09 | 显示全部楼层
前错后不错。测试完毕。

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-1-19 19:10:33 | 显示全部楼层
呵呵,这是偶的测试结果,是第一个,而不是第二个!
如图:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

发表于 2010-1-19 19:12:15 | 显示全部楼层
3.3.2.0我运行两个都没出现什么错误

评分

参与人数 1金钱 +30 收起 理由
afan + 30

查看全部评分

 楼主| 发表于 2010-1-19 19:18:21 | 显示全部楼层
回复 14# catcher


    你确定运行第一段没有错吗? 我简单的试了3320的Array.au3,仍错~
能否贴下运行到第7次的截图?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-17 06:45 , Processed in 0.097827 second(s), 29 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表