我目前正在移植经典Moria游戏的VMS Pascal版本,但我不确定我是否理解if / then语句的限制(我以前从未在Pascal中编程)。
到目前为止,我的理解是没有开始/结束,那么if / then块只包含一个后面的语句。如果是这种情况,那么在下面的代码中;
if (i4 > 0) then
with inventory[i4] do
begin
objdes(out_val,i4,false);
msg_print('Your ' + out_val + ' glows faintly!');
if (enchant(toac)) then
begin
flags := uand(%X'7FFFFFFF',flags);
py_bonuses(blank_treasure,0);
end
else
msg_print('The enchantment fails...');
end;
ident := true;
ident := true;
将在if (tval > 0) then
块之外,这意味着即使i4
为0
,ident
仍会设置为{{1} }}
如果这是正确的,那么它是否意味着来自UMoria(C端口)的以下代码是错误的?
true
...因为i_ptr = &inventory[INVEN_WIELD];
if (i_ptr->tval != TV_NOTHING) {
objdes(tmp_str, i_ptr, FALSE);
(void) sprintf(out_val, "Your %s glows faintly!", tmp_str);
msg_print(out_val);
if (enchant(&i_ptr->tohit, 10))
{
i_ptr->flags &= ~TR_CURSED;
calc_bonuses();
}
else
msg_print("The enchantment fails.");
ident = TRUE;
}
在if块内。
我在几个地方看到了类似的例子 - 我猜这些可能是为C端口改变了 - 但是我希望在我改变太多代码之前得到澄清。
答案 0 :(得分:2)
您对流量控制的评估是正确的。但是,在原始Pascal代码中将indent赋值为true很可能是由于缩进而在if / then语句中。
这就是为什么我总是在IDE中的源代码上运行自动缩进。它冲掉了这些错误。 (Python是对此的过度反应,因为我已经看到了缩进错误,并且它不适合自动IDE帮助。)
如果有人校对并对其进行了测试,我怀疑C端口是否正确。
测试驱动开发在这里有所帮助,因为它有助于定义真正意图的内容。