找回密码
 点一下
查看: 3948|回复: 1

[翻译] Jass的已知 bug

[复制链接]
发表于 2007-10-16 11:46:03 | 显示全部楼层 |阅读模式
General bugs
http://www.wc3campaigns.net/showthread.php?t=80693

漏写endif和endlopp导致崩溃

对于没有结尾的loop或者if,WE有可能在存盘时崩溃。
出现该情况时(或者WE因为别的原因崩溃),你可以这样来挽救:在地图的目录下找到一个名为<地图名>的临时目录,在里面找到脚本,然后导入到别的地图之中。注意:对

于某些需要地图自动产生的全局变量,这样做本身同样存在问题。
我还是建议使用JassCraft。

无效整数导致存盘时崩溃
无效的整数值,比如原始代码,有可能在WE存盘时导致崩溃。'&Atilde;&#8224;&Atilde;&#732;po'就是一个会导致崩溃的例子,'&Atilde;&#8224;'和'&Atilde;&#732;'也同样是不能接受的(兔子:难道有人会在触发里使用这么古怪的代码?)。

调用文件名时使用了单斜线,会在存盘时导致崩溃
无论什么时候,在字符串中使用\\而不是\,单\是用于控制的。程序在使用字符串时会把其中一个\删除。

函数被指定需要返回某值,却没有返回
以上行为会导致存盘时崩溃。

错误被移到下一行
WE有时不能检测一些bugs,也因此其分析器可能会把bug的位置报告低了一行。对这个问题没有解决方案,它只是告诉你编写错误,以及错误的位置,对WE来说,这不是一个

bug,你必须检查错误报告的上一行。这个bug通常在你写错endfunction时发生。

字符串字符数限制
单个字符串的字符数超过860个会造成崩溃。要解决这个问题,使用字符串相连吧。

The return bug
一个著名的,很有用的bug。WE分析器只检查一个函数的最后一个返回值类型是否正确,你可以用此bug来转换对象类型,比如,一个handle转换成一个整数,很传奇的,函数



function H2I takes handle h returns integer
    return h
    return 0
endfunction

这个bug应该说是一种幸运多于是一个bug,因为你可以用它将某些类型存储在其他变量里,给予你很多自由。

[b]”使用return bug时把变量设置成null”-bug

在极少数情况下,设置一个变量(多数是计时器),而这个变量又被你连同return bug一起使用,会产生问题。它看起来像是重设了某对象的handle id。
解决此问题有很多方案:

不要把变量设置成null。这是最容易的方案,但会造成(轻微)内存泄漏。
另建一个函数用于输入这个计时器(或者造成该问题的其他类型)。此时你可以把null值传递给那个函数,也可以在这个函数中将变量作为参数使用,而不需要把它设置成

null。比如:

function X2 takes timer t returns nothing
    call DoSomethingWith(t)
    call DoSomethingElseWith(t)
endfunction

function X takes nothing returns nothing
    call X2(GetExpiredTimer())
endfunction

...
call TimerStart(yourTimer, duration, periodic, function X)
...

最后,你可以使用全局变量来临时储存这个对象。
除非你的脚本里有这个问题,否则我建议你不需要太关心这个bug。

变量使用相同名字会互相覆盖
这个bug很讨厌,你很容易就会碰到。比如,一个参数使用了某名字,然后一个本地变量使用相同的名字。最后声明的变量,也就是本地那个,将会成为唯一可以正确调用的。

这会令你的脚本完全乱套,如果你不清楚这个问题的话。

然而,该bug也可令GUI变得可使用多实例(对于某个级别来说)

某些使用特定系统的用户,自定义脚本有限制
对某些操作系统,自定义脚本是有限制的。如Windows 98和ME,或者其他版本。
解决方法是,另外建立一个触发来放自定义脚本。有个工具能做到这点,也因此你可以用一个地方来存放很多触发。

First Trigger Adder

Windows XP Service Pack 2 vs. Windows XP 没有 SP2

是的,这是真实的,而且可能是最无聊的bug了。
很多东西在这两种系统上显得不一样。我们没有很好的解释。更糟糕的是有时两种系统上的游戏还会导致不同步。

单个%会在地图保存时从自定义脚本移除
这只会发生在自定义脚本区域。解决方案是,使用两个连续的%%,而不是一个。


声音第一次无法播放
在Jass里,某个声音的第一次播部出来。实际上第一次它被“载入”,第二次才正常播放。


Native 相关 bugs


IsUnitType boolexpr bug

IsUnitType(whichUnit, whichUnitType)当单独用在boolexpr时会产生bug,不会返回true或false。

游戏缓存限制
游戏缓存有256个限制。当你有256个缓存存在 campaigns.w3v文件中时,会令你的地图出现问题。

Destroyed 计时器仍然会过期(Expired)
如果在expiration函数以外的函数去destroy计时器,它仍然会过期。解决方法是,在destroy之前,先停下它(PauseTimer)。

SetUnitX 和 SetUnitY 崩溃
如果坐标在地图之外(bj_mapInitialPlayableArea),地图会崩溃。解决方法是别这么干。

在可玩地图区域之外创建单位,导致崩溃
同上。


RestoreUnit 忽略类型保护
该native会忽略返回对象的类型,因此会产生错误(兔子:如不同的两个对象同时附加到同一个对象上时,如果使用了相同的文本标签,那么即使两个附加对象的类型完全不

同,这个native也不会区分,从而导致崩溃。)

GroupEnumUnitsInRectCounted 和 GroupEnumUnitsInRangeCounted
当单位很多的时候,这两个native会出现不正常行为。

在ForForce中调用 ForForce导致问题
比如:

function X3 takes nothing returns nothing
    call BJDebugMsg("2")
endfunction

function X2 takes nothing returns nothing
    call BJDebugMsg("1")
    call ForForce(udg_f, function X3)
    call BJDebugMsg("3")
endfunction

function X1 takes nothing returns nothing
    call ForceAddPlayer(udg_f, Player(0))
    call ForceAddPlayer(udg_f, Player(1))
    call ForForce(udg_f, function X2)
endfunction
正确应该显示 1, 2, 2, 3, 1, 2, 2, 3, 但结果却是 1, 2, 2, 3, 2.

GetExpiredTimer()崩溃
有时当没有到期计时器的时候,调用到期计时器会导致讨厌的崩溃。
如果“一个单位死了”事件调用一个触发“开火”,然后触发调用了 GetExpiredTimer(),如果死了的单位属于计算机用户,此时会发生崩溃。相反如果属于玩家,就不会发

生崩溃。
发表于 2011-9-16 12:31:11 | 显示全部楼层
声音那个问题偶也发现了~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-5-2 14:40 , Processed in 0.157949 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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