执行时段错误:*Bad argument 1 to random()
mud吧
全部回复
仅看楼主
level 5
suncg1019 楼主
日志中有不少这样的报错。
执行时段错误:*Bad argument 1 to random()
Expected: int Got:12678.
这里问题到底是什么呢?好像给的是整数啊。
2014年11月03日 01点11分 1
level 15
咦。。。这个好奇怪。。。出错的那部分代码是什么啊?~
如果是涉及到random()的都出错。。是不是driver里面改过什么啊
2014年11月04日 15点11分 3
Driver 直接源码编译的没动过,而且在前面加(int) 或者to_int()都没用,见鬼了。
2014年11月05日 01点11分
回复 suncg1019 :所有random()都出错?那你有重载过random()么?
2014年11月05日 03点11分
level 5
suncg1019 楼主
@zero9k 只有两处,其他地方正常,我试了下好像也不是类型不对, 也不是每次都出错。贴代码和log吧。
// 气吞山河
#include <ansi.h>
inherit SSERVER;
void free(object target);
int cast(object me, object target)
{
string msg;
int success, ap, dp, ap2, ap3, ap4, dp2, dp3, dp4,howlong;
int r1, r2;
if( !target ) target = offensive_target(me);
if (me->query("gender") != "男性")
return notify_fail("女人家用不了[气吞山河].\n");
if((int)me->query_skill("dengxian-dafa", 1) < 100 || (int)me->query_skill("spells",1) < 60)
return notify_fail("你还没用不了[气吞山河]。。。\n");
if(!("/d/guard/guard")->check_family(me, "大雪山"))
return notify_fail("[气吞山河]是大雪山不传之密!\n");
if( !target
|| !target->is_character()
|| target->is_corpse()
|| target==me)
return notify_fail("你想对谁用[气吞山河]?\n");
if(target->query_temp("no_move"))
return notify_fail(target->query("name")+"已经魂飞魄散了!\n");
if((int)me->query("mana") < 200 )
return notify_fail("你的法力不够!\n");
if((int)me->query("sen") < 10 )
return notify_fail("你的精神不够!\n");
me->add("mana", -200);
me->receive_damage("sen", 10);
msg = HIC
"$N身形扯回,猛吸一口气,朝着$n一声地裂山崩般的狂吼!\n"
NOR;
success = 1;
ap = me->query_skill("spells");
ap = to_int(ap * ap * ap /1200) ;
ap += (int)me->query("combat_exp")/100;
dp = target->query("combat_exp")/100;
ap2 = (int)me->query("str");
dp2 = (int)target->query("str");
ap3 = (int)me->query("mana");
dp3 = (int)target->query("mana");
r1 = ap + dp + 25*(ap2+dp2)+2*(ap3+dp3);
r2 = dp+25*dp2+2*dp3;
if( random(r1) < r2 ) success = 0; // 65行,此处报错!!!!!!!!!
if(success == 1 ){
msg += HIR "$n肝胆剧裂,看着$N,浑身发抖,忘了自己在战斗之中。\n" NOR;
target->set_temp("no_move", 1);
howlong = random((me->query_skill("dengxian-dafa", 1) -100))+1;
if(howlong>20) howlong=20+random(10);
call_out("free", howlong, target);
}
else {
msg += HIR "$n鄙夷地看了$N一眼: 瞎叫什么!\n" NOR;
me->start_busy(1+random(2));
if( living(target) ) target->kill_ob(me);
}
message_vision(msg, me, target);
return 3+random(3);
}
void free(object target)
{
if (target)
target->delete_temp("no_move");
return;
}
// -------------debug.log ---------------
执行时段错误:*Bad argument 1 to random()
Expected: int Got: 316280.
程序:daemon/class/yaomo/xueshan/dengxian-dafa/shanhe.c 第 65 行
物件:/daemon/class/yaomo/xueshan/dengxian-dafa/shanhe
呼叫来自:feature/command.c 的 command_hook() 第 84 行,物件: obj/user#142797 ("道逍遥")
调用参数:command_hook("shanhe")
局部变量:
呼叫来自:cmds/std/cast.c 的 main() 第 64 行,物件: cmds/std/cast
调用参数:main("shanhe")
局部变量:
呼叫来自:std/skill.c 的 cast_spell() 第 119 行,物件: daemon/skill/dengxian-dafa
调用参数:cast_spell("shanhe", 0)
局部变量:
呼叫来自:daemon/class/yaomo/xueshan/dengxian-dafa/shanhe.c 的 cast() 第 65 行,物件: daemon/class/yaomo/xueshan/dengxian-dafa/shanhe
调用参数:cast()
局部变量:
this_player: obj/user#142797 ("道逍遥")
<- d/qujing/nuerguo/shanpo
previous_object(0): daemon/class/yaomo/xueshan/dengxian-dafa/shanhe
previous_object(1): daemon/skill/dengxian-dafa
previous_object(2): cmds/std/cast
previous_object(3): obj/user#142797 ("道逍遥")
+----------------------------------------------------------------------+
2014年11月11日 01点11分 4
if( random(r1) < r2 ) success = 0; 加个else if?
2014年11月11日 02点11分
level 15
晕,太诡异了,在我看来完全没什么问题啊。这个单独的if也没必要用else来闭合啊。。。我再次确认下,你的random()没有重载过吧?
我看你里面用了to_int和(int)这种强制转换类型,这里没有任何涉及到浮点的运算为什么要这样?你的lib会有什么计算自动转为浮点运算么?如果没有的话这些应该可以去掉。
如果是我的话,我想先在65行上面插入一个debug代码,打印一下r1,r2的值,看下跟报错有什么差别。
2014年11月11日 02点11分 5
level 5
suncg1019 楼主
没重载random()。
加int类型转换就是因为这个毛病,病急乱投医,可惜没用。
算了,生命短暂,玩不过它就不跟它耗了。我决定换个判断方式,曲线救国[哈哈]
@风叛 前面已经预置success=1了所以不用else。谢谢。
2014年11月11日 05点11分 6
level 3
int success, ap, dp, ap2, ap3, ap4, dp2, dp3, dp4,howlong;
--------------
?int
if( random(r1) < r2 ) success = 0; // 65行,此处报错!!!!!!!!!
----------------
?int?
这么多高手看不出?
2019年01月05日 06点01分 7
1