_ArrayBinarySearch 超出数组的最小/最大值【已解决】
本帖最后由 qop1831 于 2022-1-24 22:17 编辑#include <Array.au3>
#include '_ini.au3'
$GPS_File = '奥山GPS.ini'
Dim Const $AS_ZoneID = _IniReadSection_line($GPS_File, "AS-ZoneID")
_ArrayDisplay($AS_ZoneID, "1D - 单数组")
$ZoneID = 3703
$s = _ArrayBinarySearch($AS_ZoneID, $ZoneID)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :$s = ' & @error & @CRLF) ;### Debug Console
3703=沙塔斯城
2597=奥特兰克山谷
2957=深铁矿洞
2958=石炉哨站
2959=丹巴达尔
2960=冰翼小径
2961=霜狼村
2962=哨塔高地
2963=冷齿矿洞
2964=冰斧要塞
2977=冰血要塞
2978=霜狼要塞
3017=霜刀小径
3057=征战平原
3058=冰翼洞穴
3297=霜狼墓地
3298=霜狼小径
3299=丹巴达尔小径
3300=冰血墓地
3301=雪落墓地
3302=石炉墓地
3303=雷矛墓地
3304=冰翼碉堡
3305=石炉碉堡
3306=蛮爪岭
3318=杜隆坦之石
3337=蛮爪洞穴
3338=迷雾裂隙
返回 -1, @error = 2 - $vValue 超出数组的最小/最大值
就不知道为什么报这个错误。
$vValue不是搜索值么,
感谢A大 问题已解决
$GPS_File = '奥山GPS.ini'
$AS_ZoneID = _IniReadSection_str($GPS_File, "AS-ZoneID")
$sss = _IniSectionRead($AS_ZoneID, 3703)
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :$sss = ' & $sss & @CRLF) ;### Debug Console
Func _IniSectionRead($sSection, $sKey) ; 读取字段中关键字的值
;~ ###(字段字符串, 关键字)
Local $aVal = StringRegExp($sSection, '(?mi)^\h*' & $sKey & '\h*\=\h*(\S*\V*?)\h*$', 1)
If @error Then Return SetError(1)
Return $aVal
EndFunc ;==>_IniSectionRead
本帖最后由 afan 于 2022-1-24 20:37 编辑
试试~
Func _IniSectionRead($sSection, $sKey) ; 读取字段中关键字的值
;~ ###(字段字符串, 关键字)
Local $aVal = StringRegExp($sSection, '(?mi)^\h*' & $sKey & '\h*\=\h*(\S*\V*?)\h*$', 1)
If @error Then Return SetError(1)
Return $aVal
EndFunc ;==>_IniSectionRead $GPS_File = '奥山GPS.ini'
$ZoneID = 3703
$s = IniRead($GPS_File, 'AS-ZoneID', $ZoneID, '')
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :$s = ' & @error & @CRLF) ;### Debug Console afan 发表于 2022-1-24 13:35
emm,a大 是这样的 因为ini数据有很多条要 而且需要反复读取, 所以我打算我把整个字段读成数组 然后用_ArrayBinarySearch查询, 我不知道什么原因报错 我之前写的这个函数都能正常用 但是不知道为什么~ 这次会报错 就很奇怪 我把完整的接近2000条数据全部放到ini字段后 _ArrayBinarySearch 居然正常了。 但我还是不明白为什么我在ini字段值写入部分数据然后_ArrayBinarySearch 却不行。 我好像找到原因了,是因为我把 3703=沙塔斯城 放在了第一行,我把这个放到最后面就正常不报错了 。但还是不明白出错原理难道这个还要按顺序的? 我还没有证实。 qop1831 发表于 2022-1-24 18:47
我好像找到原因了,是因为我把 3703=沙塔斯城 放在了第一行,我把这个放到最后面就正常不报错了 。但 ...
如果使用 _ArrayBinarySearch 搜索,数组必须先按升序顺序排序,因为它是按二分模式搜索的,不排序就没意义了。帮助里有说明~
你可以先 _ArraySort
不排序的话也可以直接使用正则。
在数组中搜索肯定不是最优解,很慢的,数据越大劣势越明显。 那么使用正则来获取文本中ID=后面的字符串应该怎么写呢。 正则对我来说简直就是天书, 我现在用的是这样的~也是使用了正则但我是先将整个字段读为数组后然后使用_ArrayBinarySearch搜索字段 如果要使用正则直接在ini指定字段里搜索要怎么写呢?
$AS_Zone_Name = StringRegExpReplace($AS_ZoneID, '\V*=', '') afan 发表于 2022-1-24 20:36
试试~
:face (1): A大威武 本帖最后由 qop1831 于 2022-1-24 21:40 编辑
afan 发表于 2022-1-24 20:36
试试~
_IniSectionRead($sSection, $sKey)
$sSection = 字段字符串
这里是不是少了指定ini文件?
使用IniReadSection_line读到的是一个数组。 然而这里需要的是字符串。我是否应该把IniReadSection_line读到的数组转换成字符串?
好吧 。我把IniReadSection_line 换成 _IniReadSection_str 后 貌似可以了真棒
页:
[1]