簡易C++除錯技巧 長庚大學機械系 101.5.17
錯誤種類 編譯錯誤 cl /EHsc file.cpp 出現error 程式錯誤 程式可執行,但是出錯
1. 編譯錯誤 常見錯誤: 忘記 ";" 忘記定義 格式錯誤 除錯方法: 找尋錯誤行數,讀錯誤訊息,再更正。
舉例 test1.cpp(8) : error C2784: 'std::basic_istream<_Elem,_Traits> &std::operator >>(std::basic_istream<_Elem,_Traits> &,_Elem *)' : 無法由 '多載函式型別',針對 'std::basic_istream<_Elem,_Traits> &' 推算 <未知> 引數 D:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\istream(934) : 請參閱 'std::operator >>' 的宣告 test1.cpp(8) : error C2676: 二元運算子 '>>' : 'std::ostream' 沒有定義此運算子或預先定義運算子可接受的型別轉換 可能是: 第8行<< >>方向相法 cin >> cout <<
舉例 test1.cpp test1.cpp(7) : error C2146: 語法錯誤 : 遺漏 ';' (在識別項 'cin' 之前) 推測 少了";",在第7行之前,也就是第6行。
2. 程式錯誤 除錯方法 思想實驗:假設輸入值,跟著指令一行一行執行。 使用debug程式。 使用cout。
例題:求陣列最小值及下標 #include <iostream> using namespace std; int main() { double A[3][2]={1.8, 4.9, 6.8, 6.2, 2.1, 3.4}; int i,j,x,y; double Min; for (i=0;i<=2; i++) for (j=0;j<=3; j++) if (Min >= A[i][j]) { Min=A[i][j]; x=i; y=j; } cout<<"最大值"<<Min<<"下標"<<x<<","<<y<<endl; return 0; }
續 test.cpp e:\tmp\cpp\test.cpp(10) : warning C4700: 使用了未初始化的區域變數 'Min' Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:test.exe test.obj 增加Min=A[0][0], x=0, y=0 在for之前
續 #include <iostream> using namespace std; int main() { double A[3][2]={1.8, 4.9, 6.8, 6.2, 2.1, 3.4}; int i,j,x,y; double Min; Min=A[0][0]; x=0; y=0; for (i=1;i<=2; i++) for (j=1;j<=3; j++) { if (Min >= A[i][j]) Min=A[i][j]; x=i; y=j; } cout<<"最小值"<<Min<<"下標"<<x<<","<<y<<endl; system ("PAUSE"); return 0;
續 答案: 最小值4.24612e-314下標2,3 →錯誤 →加cout
增加cout #include <iostream> using namespace std; int main() { double A[3][2]={1.8, 4.9, 6.8, 6.2, 2.1, 3.4}; int i,j,x,y; double Min; Min=A[0][0]; x=0; y=0; for (i=0;i<=2; i++) for (j=0;j<=3; j++) { cout << i << " "<< j << " " << A[i][j]<<endl; if (Min <= A[i][j]) Min=A[i][j]; x=i; y=j; cout << "inside if " <<i << " "<< j << " " << A[i][j] << endl; } cout<<"最小值"<<Min<<"下標"<<x<<","<<y<<endl; return 0;}
續 0 0 1.8 inside if 0 0 1.8 0 1 4.9 0 2 6.8 0 3 6.2 → 1 0 6.8 → 1 1 6.2 1 2 2.1 1 3 3.4 2 0 2.1 → 2 1 3.4 2 2 1.8 inside if 2 2 1.8 2 3 4.24612e-314 → 錯誤數字 inside if 2 3 4.24612e-314 最小值4.24612e-314下標2,3 →看出iteration錯誤
續 0 0 1.8 inside if 0 0 1.8 0 1 4.9 0 2 6.8 0 3 6.2 1 0 6.8 1 1 6.2 1 2 2.1 1 3 3.4 2 0 2.1 2 1 3.4 2 2 1.8 inside if 2 2 1.8 2 3 4.24612e-314 inside if 2 3 4.24612e-314 最小值4.24612e-314下標2,3
解 #include <iostream> using namespace std; int main() { double A[3][2]={1.8, 4.9, 6.8, 6.2, 2.1, 3.4}; int i,j,x,y; double Min; Min=A[0][0]; x=0; y=0; for (i=0;i<3; i++) for (j=0;j<2; j++) { if (Min <= A[i][j]) Min=A[i][j]; x=i; y=j; } cout<<"最小值"<<Min<<"下標"<<x<<","<<y<<endl; return 0;}
常見錯誤 if ( ); if 多加 ";" for ( ); for 多加 ";"