找回密码
 加入
搜索
查看: 1834|回复: 10

[AU3基础] _ArrayBinarySearch 超出数组的最小/最大值【已解决】

[复制链接]
发表于 2022-1-24 07:15:59 | 显示全部楼层 |阅读模式
本帖最后由 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






[AS-ZoneID] 
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[0]
EndFunc   ;==>_IniSectionRead

  




发表于 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[0]
EndFunc   ;==>_IniSectionRead
发表于 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
 楼主| 发表于 2022-1-24 17:48:30 | 显示全部楼层

emm,a大   是这样的    因为ini数据有很多条要 而且需要反复读取, 所以我打算我把整个字段读成数组   然后用_ArrayBinarySearch查询, 我不知道什么原因报错   我之前写的这个函数都能正常用   但是不知道为什么~   这次会报错  
 楼主| 发表于 2022-1-24 18:42:03 | 显示全部楼层
就很奇怪   我把完整的接近2000条数据全部放到ini字段后   _ArrayBinarySearch 居然正常了。   但我还是不明白为什么我在ini字段值写入部分数据然后  _ArrayBinarySearch 却不行。
 楼主| 发表于 2022-1-24 18:47:10 | 显示全部楼层
我好像找到原因了  ,  是因为我把 3703=沙塔斯城 放在了第一行,  我把这个放到最后面就正常不报错了 。但还是不明白出错原理  难道这个还要按顺序的? 我还没有证实。
发表于 2022-1-24 19:33:10 | 显示全部楼层
qop1831 发表于 2022-1-24 18:47
我好像找到原因了  ,  是因为我把 3703=沙塔斯城 放在了第一行,  我把这个放到最后面就正常不报错了 。但 ...

如果使用 _ArrayBinarySearch 搜索,数组必须先按升序顺序排序,因为它是按二分模式搜索的,不排序就没意义了。帮助里有说明~
你可以先 _ArraySort
不排序的话也可以直接使用正则。
在数组中搜索肯定不是最优解,很慢的,数据越大劣势越明显。
 楼主| 发表于 2022-1-24 20:10:06 | 显示全部楼层
那么使用正则来获取文本中ID=后面的字符串应该怎么写呢。   正则对我来说简直就是天书,
 楼主| 发表于 2022-1-24 20:14:31 | 显示全部楼层
我现在用的是这样的~  也是使用了正则  但我是先将整个字段读为数组后然后使用_ArrayBinarySearch搜索字段   如果要使用正则直接在ini指定字段里搜索要怎么写呢?
$AS_Zone_Name = StringRegExpReplace($AS_ZoneID[_ArrayBinarySearch($AS_ZoneID, _Get_ZoneID())], '\V*=', '')
 楼主| 发表于 2022-1-24 21:11:57 | 显示全部楼层

A大威武
 楼主| 发表于 2022-1-24 21:33:25 | 显示全部楼层
本帖最后由 qop1831 于 2022-1-24 21:40 编辑

_IniSectionRead($sSection, $sKey)
$sSection = 字段字符串
这里是不是少了指定ini文件?  

使用IniReadSection_line读到的是一个数组。 然而这里需要的是字符串。  我是否应该把IniReadSection_line读到的数组转换成字符串?

好吧 。我把IniReadSection_line 换成   _IniReadSection_str 后 貌似可以了  真棒
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-22 21:14 , Processed in 0.082096 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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