找回密码
 点一下
查看: 3945|回复: 16

关于数值初始重要性的见解

[复制链接]
发表于 2008-7-12 14:21:45 | 显示全部楼层 |阅读模式
首先,请你先看看下边的一段代码,这是一段给玩家创建选取英雄的猪羊的代码.
你有没有发现什么地方出现错误的.除了里边的一些udg_开头是全局变量没定义出来,我想你不会发现错误的.
[codes=jass]function AddForce takes nothing returns nothing
    local integer i
    local location loc
    call DisplayTextToForce( GetPlayersAll(), "配置玩家" )     
    loop
        exitwhen i > 4
       if GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING then
            call ForceAddPlayer( udg_LightForce, Player(i) )
            if udg_IsRandom then
                call DisplayTextToForce( GetPlayersAll(), "光明力量1" )
                set loc=udg_CommonUsePoint[43]
                call CreateNUnitsAtLoc( 1, 'nalb', Player(i), loc, ( bj_UNIT_FACING + ( 72.00 * I2R(i) ) ) )
            else
                call DisplayTextToForce( GetPlayersAll(), "光明力量2" )               
                set loc = PolarProjectionBJ(udg_CommonUsePoint[41], 100.00, ( 90.00 + ( 72.00 *  I2R(i)  ) ))
                call CreateNUnitsAtLoc( 1, 'nalb', Player(i), loc, ( bj_UNIT_FACING + ( 72.00 * I2R(i) ) ) )
            endif
     endif
        set i = i + 1
    endloop
    set i=6
    loop
        exitwhen i > 10
        if ( GetPlayerSlotState(Player(i)) == PLAYER_SLOT_STATE_PLAYING ) then
            call ForceAddPlayer( udg_LightForce, Player(i) )
            if udg_IsRandom then
                call DisplayTextToForce( GetPlayersAll(), "黑暗力量1" )
                set loc=udg_CommonUsePoint[44]
                call CreateNUnitsAtLoc( 1, 'nvul', Player(i), loc, ( bj_UNIT_FACING + ( 72.00 * I2R(i-6) ) ) )
            else
                call DisplayTextToForce( GetPlayersAll(), "黑暗力量2" )               
                set loc = PolarProjectionBJ(udg_CommonUsePoint[42], 100.00, ( 90.00 + ( 72.00 *  I2R(i-6)  ) ))
                call CreateNUnitsAtLoc( 1, 'nvul', Player(i), loc, ( bj_UNIT_FACING + ( 72.00 * I2R(i-6) ) ) )
            endif
       endif
        set i = i + 1
    endloop
endfunction[/codes]
可是,这一段代码在我的新作品中运行时,却总是不能如愿的创建单位.
只是显示了,"配置玩家".之后这函数没什么显示..
而预期的目的是给在线玩家创建单位.
后来,我无意中给i初始值0,结果这个函数能够很好的运行..

根据我的初步分析,War3创建变量时,如果系统分配给变量的空间原先有内容,那么该变量的初始值不为空.因此这些变量在使用时可能导致不可预料的结果.
所以,我建议大家在使用变量,尤其在使用局部量时,不要为了偷懒而省下初始化数据的动作.因为没初始化导致BUG的排查时间决对比你写初始化的时间长许多倍.
布尔值设false,整数设0,实数设0.0,句柄之类一律设null
要使用变量时,再根据需要给变量赋值..

对于没初始化的问题,我有空会研究一下吧.
希望已经有研究的朋友们一起来讨论~~
发表于 2008-7-12 14:23:28 | 显示全部楼层
路过 走人……
回复

使用道具 举报

发表于 2008-7-12 15:09:45 | 显示全部楼层
整数变量也是要初始化的啊,不初始化时不能使用的
java啊C里面也是这样的吧,貌似编译都不让过的………………
回复

使用道具 举报

 楼主| 发表于 2008-7-12 15:34:13 | 显示全部楼层
可是JASS不会报错.
回复

使用道具 举报

发表于 2008-7-12 15:37:02 | 显示全部楼层
恩,不会报错,但实际还是会出错,唉唉
回复

使用道具 举报

 楼主| 发表于 2008-7-12 15:54:45 | 显示全部楼层
的确是,我已经吸取教训了...费了我很长时间排查...闷..
回复

使用道具 举报

发表于 2008-7-12 19:51:59 | 显示全部楼层
不对!只是exitwhen的要求过高罢了,你去试试吧,除了loop初始值不定义会有错,其他一律为0的
回复

使用道具 举报

发表于 2008-7-12 20:06:54 | 显示全部楼层
不初始化,貌似无法进行后续运算赋值的,我在缓存的时候遇到过………………
回复

使用道具 举报

匿名
匿名  发表于 2008-7-12 20:27:21
引用第6楼ζtormξnvoy于2008-07-12 19:51发表的  :
不对!只是exitwhen的要求过高罢了,你去试试吧,除了loop初始值不定义会有错,其他一律为0的

不是滴
不初始化会有很多问题的
回复

使用道具 举报

发表于 2008-7-13 10:18:43 | 显示全部楼层
没初始化无法判断.
但如果是整数之类的
i=i+1
会默认0
点之类
移动到点 会无法动作
回复

使用道具 举报

发表于 2008-7-14 11:04:08 | 显示全部楼层
貌似在loop之前不加
set i=1
的话,可能会强制退出……………………
回复

使用道具 举报

 楼主| 发表于 2008-7-14 12:59:14 | 显示全部楼层
引用第9楼linzefei于2008-07-13 10:18发表的  :
没初始化无法判断.
但如果是整数之类的
i=i+1
会默认0
点之类
.......
那个点没有指向吧....
回复

使用道具 举报

发表于 2008-7-14 13:00:58 | 显示全部楼层
很好很强大的楼主 支持下
回复

使用道具 举报

发表于 2008-7-14 13:09:03 | 显示全部楼层
引用第12楼bsni于2008-07-14 13:00发表的  :
很好很强大的楼主 支持下
………………………………
说这话的人也“很好很强大”。
回复

使用道具 举报

发表于 2008-12-30 17:09:39 | 显示全部楼层
也就是说以后要出现类似
local unit lu=null
local timer tm=null

这样的句子?
回复

使用道具 举报

发表于 2008-12-30 17:13:26 | 显示全部楼层
我觉得没必要每个都写,特别是之后的代码中有set xx = xx 的语句。
回复

使用道具 举报

发表于 2008-12-30 17:25:08 | 显示全部楼层
关于没有初始化的数值变量的话..
只要不直接用那个变量带入运算就可以了...
比如
local integer i
set i = 1
这样没有问题

local integer i
set i =i+1
这样估计就要出错了...
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 00:06 , Processed in 0.036298 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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