MATLAB 程式設計/除錯 M 檔案
本節解釋瞭如果您修復了所有語法錯誤(導致實際錯誤訊息的錯誤),程式執行......但它給出了您不想要的結果,您可以執行的操作。也許它進入了無限迴圈,也許它迴圈執行的次數少了一個或多了一個,也許您的“if”語句之一不起作用,也許程式給了您“infinity”或“NaN”作為答案(通常這不太有用!)......出錯的可能性與程式碼中的行數一樣多。幸運的是,有一些技術可以用來修復和改進工作中的 MATLAB 程式碼。
使用除錯工具可以讓您在程式執行過程中停止以檢查變數和其他內容,這可以幫助您找到程式中的錯誤。
M 檔案程式在“斷點”處停止。要建立斷點,只需按 F12,游標所在行的旁邊就會出現一個紅點。您也可以單擊 M 檔案視窗左側行號旁邊的破折號來實現相同的效果。
然後按 F5 或從選單中選擇除錯->執行來執行程式。它將在斷點處停止,斷點旁邊有一個綠色箭頭。然後,您可以使用除錯選單檢查工作區中變數的內容、單步執行、繼續或停止程式。要檢查變數的內容,只需在工作區中鍵入它的名稱,但請注意:您只能檢視停止所在的 檔案 中變數的值,這意味著您可能需要多個斷點才能找到問題的根源。
從斷點開始,您可以透過多種方式遍歷程式。一種方法是逐行遍歷整個程式,進入呼叫的每個函式。如果您不知道問題出在哪裡,這很有效,但由於它會進入每個函式(包括 MATLAB 函式,如 ode45),因此您可能並不想一直使用它。幸運的是,還有一種方法可以只逐行遍歷當前正在停止的函式,而不是逐行遍歷子函式,MATLAB 將簡單地為您提供這些函式的結果。
最後,請注意,在儲存 M 檔案之前,您無法設定斷點。如果您更改了某些內容,則必須在斷點“注意到”您的更改之前儲存。MATLAB 透過將點從紅色更改為灰色來描述這種情況。有時,您會儲存,但點仍然是灰色;當您在多個檔案中有多個斷點時,就會發生這種情況。要解決這個問題(這真的很煩人),您必須繼續“退出除錯模式”,直到它變為灰色。完全退出除錯模式後,您的檔案將儲存,您就可以開始新一輪除錯了。
如果您想測試刪除某些程式碼行(例如,檢視刪除它們後程序是否仍然返回 Inf)的效果,您可以註釋掉這些程式碼。要執行此操作,請突出顯示程式碼,然後轉到
Text -> Comment
或按 CTRL+R。這將簡單地在每行前面新增一個'%';如果該行已被註釋掉,它將在那裡新增另一個'%',因此當您取消註釋它們時,註釋行的模式不會改變。註釋行將被編譯器忽略,因此效果是程式將執行而不包含它們。
要取消註釋一行,請轉到
Text -> Uncomment
或按 CTRL+T。
註釋的另一個用途是測試兩組不同程式碼執行某項操作的效果(例如,您可能想測試使用 ODE113 而不是 ODE45 求解微分方程的效果,因此您將有一行呼叫每個函式)。您可以透過註釋掉其中一個並執行程式來測試差異,然後取消註釋該一個並註釋掉另一個,然後再次呼叫程式。
如果您的程式長時間沒有執行,它可能只是執行緩慢(MATLAB 會產生很多開銷,如果您沒有明智地使用陣列,它會變得非常非常慢),但如果您正在測試一個小模組,則更有可能是您有無限迴圈。雖然 MATLAB 無法直接告訴您存在無限迴圈,但它確實會嘗試提供一些提示。第一個提示是在您終止程式時出現的。透過按 CTRL+C 終止程式,MATLAB 將顯示一條訊息,告訴您確切地停止在哪一行。如果您的程式運行了很長時間,則您停止的這一行很可能位於無限迴圈的中間(但請注意,如果迴圈呼叫子函式,則您很可能會在子函式中停止,而不是在父函式中。但是,MATLAB 也會告訴您父函式的行,以便您可以輕鬆地找到迴圈)。
但是,有時 MATLAB 甚至不會讓您返回主視窗以按 CTRL-C。在這種情況下,您可能必須終止整個 MATLAB 程序。之後,在您懷疑是無限迴圈的迴圈中新增“pause (0.001)”或類似的小值。每當 MATLAB 執行此指令時,您將能夠與 MATLAB 互動(時間非常短),例如,轉到主視窗並按 CTRL-C,MATLAB 將能夠響應您的命令。
在函式內部、迴圈內或指令碼中的任何位置,請使用特殊的註釋語法。 %% 是 Cell-mode 註釋。透過在感興趣程式碼的上面新增 %%,並在程式碼下面新增另一個 %%,就可以建立一個單元。現在,這個單元可以執行並在記憶體中修改,而無需儲存程式碼、指令碼或函式。透過在 %% 後面新增一些文字,就可以為該單元部分建立一個標題。例如 %% 開始除錯無限迴圈
另一種方法是進入斷點,選擇感興趣的部分並將其複製到一個新檔案中。現在,可以在這個新檔案中更改和測試程式碼。當修改後的程式碼按預期工作時,除錯會話就可以結束。來自臨時檔案中的程式碼可以複製回來,並替換除錯後的程式碼。這種方法讓使用者可以多次執行這段程式碼片段,包括 %%,如果該程式碼應該在 Cell-mode 中執行的話。
除了使用 IDE 執行程式碼、除錯程式碼或選擇斷點之外,還可以使用命令列函式。只需輸入 db 並按 TAB 鍵選擇函式即可。函式 dbstatus 和 dbstack 是兩個可用的函式。使用這些函式進行實驗,並使用 help 函式名或選擇函式名並按 F1 鍵。
最後一個除錯技巧是在註釋中新增可能的程式碼。例如 % plot(x,y); % 此除錯繪圖函式使用輸入 x 繪製值向量 y 現在,選擇 plot(x,y),帶或不帶 ;,然後按 F9(執行選定的程式碼)。使用 help 和首選項查詢和修改鍵盤快捷鍵(如有必要)。在選定的 y 變數上按 CTRL+D 將在變數編輯器中開啟它,不要忘記將滑鼠懸停在任何變數上,如果可能,將會顯示其內容。即使 plot 命令本身也是一個很好的除錯工具,因為它可以用來視覺化變數。
最後的技巧實際上是一個總結。使用上述方法進行實驗,甚至將它們結合起來,以便除錯後的程式碼既能高效執行,又能有有價值的註釋,並在需要時提供除錯手段。透過添加註釋和輔助函式來為編碼錯誤做好計劃。建立執行其設計功能的小函式,然後將該函式在完整的程式或指令碼中實現。在函式內部,使用 try、catch me 和 me.getReport;如果存在重複的錯誤,請預期它們會發生並相應地進行程式設計。無限迴圈是一個非常常見的錯誤,因此透過新增功能來發現這個錯誤可以節省大量時間。另一個技巧可能是單元測試。