2015-09-05 112 views
0

我目前正在移植經典Moria遊戲的VMS Pascal版本,但我不確定是否理解if/then語句的限制(我從未編程過帕斯卡之前)。Pascal:理解if/then語句

我的理解到目前爲止,沒有開始/結束,然後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塊之外,也就是說即使i40ident仍然會被設置爲true

如果這是正確的,那麼它是否意味着來自UMoria(C端口)的以下代碼是錯誤的?

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; 
} 

...因爲ident = TRUE;位於if塊內部。

我在幾個地方看到過類似的例子 - 我想這可能是因爲C端口而改變的 - 但我希望在改變太多代碼之前弄清楚。

回答

2

您對流量控制的評估是正確的。但是,由於縮進,原始Pascal代碼中的縮進爲真的分配意味着在if/then語句中。

這就是爲什麼我總是在IDE中對源代碼運行自動縮進的原因。它清除這些錯誤。 (Python是對此的反應,因爲我已經看到它的縮進錯誤,它不適合自動IDE幫助。)

我懷疑C端口是否正確,如果有人校對並測試它的話。

測試驅動開發幫助這裏,因爲它有助於定義真正意圖的東西。

+0

感謝Chris,我看了一下FreePascal自動格式化器,它非常好,但肯定不是很完美(也許是因爲這是VM Pascal),但是有一些代碼部分我們肯定是不對的。 –