雜~~瓦魯多~~筆記
如果程式出了語法bug,在編譯時就會被編譯器抓出來了。
不過該如何看懂編譯器給的提示呢?
在程式編寫完成,按下F11編譯之後,如果有bug,編譯器就會跳出錯誤訊息,以及bug所在的行數,如下圖:
右邊的 [Error] 'ssdr' was not declared in this scope
就是錯誤訊息。
最左邊的 6
則是錯誤出現在第 6 行,行數是按照每一行旁邊的編號顯示的。
透過這些錯誤訊息,我們能更快的找出程式的 bug 出現在哪,以及 bug 的類型,方便我們進行後續的 debug (除錯)。
若是執行以下程式碼:
Line 6: [Error] expected ',' or ';' before 'char'
翻譯: 在 'char' 之前應該要有 ',' 或是 ';'
在 Line 6 的 char
之前,也就是 Line 5 的尾端,少了一個分號,才會跳出這個訊息。
解決方法:在 Line 5 尾端補上一個 ;
。
若是執行以下程式碼:
Line 6: [Error] 'var' was not declared in this scope
翻譯: 'var' 在此區域中未被宣告
這是因為 Line 5 宣告的變數是 VAR
,但 Line 6 使用的變數 var
還沒被宣告過(名稱大小寫不同,會視為不同變數)。
解決方法:宣告變數 var
。
可以將 Line 5 的變數名稱改為 var
,或是另外宣告一個變數叫做 var
。
Line 6: [Error] redeclaration of 'int var'
Line 5: [Note] 'int var' previously declared here
翻譯:'int var' 重複宣告
、 註:'int var' 在這裡宣告過了
Line 5 中已宣告過 int var
,所以在 Line 6 再宣告一次就會造成錯誤。
解決方法:把 Line 6 或 Line 5 的 var
名字改掉。
Line 6: [Error] no match for 'operator>>' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'int')
翻譯:不與 'operator>>' (運算子 '>>')相匹配...(下略)
這種狀況通常是因為把大小於方向打反,導致編譯器找不到與該運算子匹配的元素。
解決方法:把寫錯的符號改掉即可。
Line 14: [Error] expected '}' at end of input
翻譯: 輸入的末端應該要有 '}'
由於大括號的功能是劃分區塊用,一個大括號頭就應該要配對一個大括號尾,不然會發生區塊劃分不完全的問題。
這個錯誤訊息的行數是無法參考的,因為它只會指出最後一個大括號尾的行數,因此需要自己檢查每個括號的配對。
解決方式:一個一個括號頭與括號尾配對檢查,看是哪一個括號沒配對好。
不過我個人有時是習慣直接重寫
Line 6: [Error] 'pow' was not declared in this scope
翻譯:'pow' 在此區域中未被宣告
這題所使用的pow,功能是取a的b次方,但要使用這個函式,必須引入 <cmath>
函式庫。
解決方式:在程式最上面,加上一行 #include<cmath>
,以引入 cmath>
函式庫。
[Error] ld returned 1 exit status
翻譯:連接器ld回傳狀態碼1
如果按下 F11 之後,程式無法順利運行,那可能是因為已經有一個正在執行的此程式了,需要先把其中一個視窗關掉才能再執行。
解決方式:關掉上一次運行程式的終端視窗,然後再試一次。
這裡只列出了幾個編者本人有想到的、當初還在新手期時常常犯的小錯誤,不知道這些能否幫助各位解題更順利?
當初本人也是學了好一段時間才知道有編譯器訊息這東西的,因為這實在是個很方便的功能,免去在茫茫程式海中找分號的痛苦,所以希望各位也能好好利用這個功能,來找出自己錯的地方。
只要了解編譯器訊息,對於 debug 將會有顯著的幫助。
而如果之後遇到了這篇裡沒提到的編譯器訊息,也可以直接把錯誤訊息複製到 google 上去搜尋,通常都會有人遇到一樣的問題,也會提供一些可行的解法。
不過在搜尋之前,建議自己先從字面意思,去推測看看自己錯在哪,順便練習下英文吧。