qop1831 发表于 2022-1-24 07:15:59

_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:36:40

本帖最后由 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

afan 发表于 2022-1-24 13:35:20

$GPS_File = '奥山GPS.ini'
$ZoneID = 3703
$s = IniRead($GPS_File, 'AS-ZoneID', $ZoneID, '')
ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') :$s = ' & @error & @CRLF) ;### Debug Console

qop1831 发表于 2022-1-24 17:48:30

afan 发表于 2022-1-24 13:35


emm,a大   是这样的    因为ini数据有很多条要 而且需要反复读取, 所以我打算我把整个字段读成数组   然后用_ArrayBinarySearch查询, 我不知道什么原因报错   我之前写的这个函数都能正常用   但是不知道为什么~   这次会报错

qop1831 发表于 2022-1-24 18:42:03

就很奇怪   我把完整的接近2000条数据全部放到ini字段后   _ArrayBinarySearch 居然正常了。   但我还是不明白为什么我在ini字段值写入部分数据然后_ArrayBinarySearch 却不行。

qop1831 发表于 2022-1-24 18:47:10

我好像找到原因了,是因为我把 3703=沙塔斯城 放在了第一行,我把这个放到最后面就正常不报错了 。但还是不明白出错原理难道这个还要按顺序的? 我还没有证实。

afan 发表于 2022-1-24 19:33:10

qop1831 发表于 2022-1-24 18:47
我好像找到原因了,是因为我把 3703=沙塔斯城 放在了第一行,我把这个放到最后面就正常不报错了 。但 ...

如果使用 _ArrayBinarySearch 搜索,数组必须先按升序顺序排序,因为它是按二分模式搜索的,不排序就没意义了。帮助里有说明~
你可以先 _ArraySort
不排序的话也可以直接使用正则。
在数组中搜索肯定不是最优解,很慢的,数据越大劣势越明显。

qop1831 发表于 2022-1-24 20:10:06

那么使用正则来获取文本中ID=后面的字符串应该怎么写呢。   正则对我来说简直就是天书,

qop1831 发表于 2022-1-24 20:14:31

我现在用的是这样的~也是使用了正则但我是先将整个字段读为数组后然后使用_ArrayBinarySearch搜索字段   如果要使用正则直接在ini指定字段里搜索要怎么写呢?
$AS_Zone_Name = StringRegExpReplace($AS_ZoneID, '\V*=', '')

qop1831 发表于 2022-1-24 21:11:57

afan 发表于 2022-1-24 20:36
试试~

:face (1): A大威武

qop1831 发表于 2022-1-24 21:33:25

本帖最后由 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]
查看完整版本: _ArrayBinarySearch 超出数组的最小/最大值【已解决】