二類編譯錯誤的解決方法
Ⅰ dev c++編譯錯誤
代碼太長,沒有注釋,你又沒有說明程序的各個結構和各個函數是做什麼的,弄懂你的代碼需要時間太長了。
不過,還是能給你的改掉以上的錯誤的,
typedef struct
{
VertexType adjvex;
VRType lowcost;
}minside[MAX_VERTEX_NUM];
改為
typedef struct
{
VertexType adjvex;
VRType lowcost;
}minside;
改minimum函數為,其他函數也類似
int minimum(minside SZ[],MGraph G)
Ⅱ 為什麼我在VB中輸入一段程序,顯示的是編譯錯誤,類型不匹配呢
Function tucengshu(y1 As Double, x0 As Double, y0 As Double, hd() As Double) As Double
Dim x() As Double, y() As Double
R = Sqr(x0 * x0 + y0 * y0)
a = 1
b = -2 * x0
c = x0 * x0 + y1 * y1 - 2 * y0 * y1 + y0 * y0 - R * R
d = b * b - 4 * a * c
x = (-b + Sqr(d)) / (2 * a)'--------------------1此處錯誤:x 應是個數組
For i = 1 To 100
x(i) = (x / 1000) * (i)『--------------------------2此處錯誤:x 應是個數組
Next i
For i = 1 To 1000
a = 1
b = -2 * y0
c = y0 * y0 + x(i) * x(i) - 2 * x0 * x(i) + x0 * x0 - R * R
d = b * b - 4 * a * c
y(i) = (-b - Sqr(d)) / (2 * a)
Next i
lowy = y(1)
For i = 1 To 1000
If m > y(i) Then'--------------3此處錯誤:if...then....使用不合法
m = y(i)
Next i
c = x0 * x0 + lowy * lowy - 2 * y0 * lowy + y0 * y0 - R * R
d = b * b - 4 * a * c
lowx = (-b + Sqr(d)) / (2 * a)
For i = 1 To n
tuchengshu = i
If hd(i + 1) <= lowy And lowy < hd(i) Then'--------------4此處錯誤:if...then....使用不合法
Exit For
Next i
End Function
Private Sub command1_click()
Dim y1 As Double, x0 As Double, y0 As Double, hd() As Double, n As Integer
y1 = InputBox("請輸入y1的值", "y1")
x0 = InputBox("請輸入x0的值", "x0")
y0 = InputBox("請輸入y0的值", "y0")
n = InputBox("請輸入土層數", "土層數")
For i = 1 To n
ReDim hd(i)
hd(i) = InputBox("請輸入第" & i & "層土的頂標高", "頂標高")
Next i
Print "土層數為" & tucengshu(y1, x0, y0, hd())
End Sub
--------------------------------------- 分析------------------------
1、2、從內容上看X應是個單一的變數(本人理解),而不是個數組變數。
解決方法:另外用一個變數名,如 e
3、4、if....then....使用方法:
一類:if .... then .....
如:
if a>b then b=a
二類:if.....then......end if
如:
if a>b then
b=a
end if
三類(請自學)
解決方法:
3、
If m > y(i) Then
m = y(i)
修改為:
If m > y(i) Then m = y(i)
4、
If hd(i + 1) <= lowy And lowy < hd(i) Then
Exit For
修改為:
If hd(i + 1) <= lowy And lowy < hd(i) Then Exit For
Ⅲ 程序編譯錯誤不知道是什麼原因
不能通編譯過的程序實際上還不是合法的程序,因為它不滿足c語言對於程序的基本要求。
檢查語法錯誤的第一要義:集中力量檢查系統發現的第一個錯誤,弄清並改正它。
在編譯過程中系統發現的錯誤主要有兩類:基本語法錯誤和上下文關系錯誤。這些錯誤都在表面上,可以直接看得見。也是比較容易弄清,比較容易解決的。關鍵是需要熟悉C語言的語法規定和有關上下文關系的規定,按照這些規定檢查程序正文,看看存在什麼問題。
編譯中系統發現錯誤都能指出錯誤的位置。不同系統在這方面的能力有差異,在錯誤定位的准確性方面有所不同。有的系統只能指明發現錯誤的行,有的系統還能夠指明行內位置。
一般說,系統指明的位置未必是真實錯誤出現的位置。通常情況是錯誤出現在前,而系統發現錯誤在後,因為它檢查到實際錯誤之後的某個地方,才能確認出了問題,因此報出錯誤信息。要確認第一個錯誤的原因,應該從系統指明的位置開始,在那裡檢查,並從那裡開始向前檢查。
系統的錯誤信息中都包含一段文字,說明它所認定的錯誤原因。應該仔細閱讀這段文字,通常它提供了有關錯誤的重要線索。但也應該理解,錯誤信息未必准確,有時錯誤確實存在,但系統對錯誤的解釋也可能不對。也就是說,在查找錯誤時,既要重視系統提供的錯誤信息,又不應為系統的錯誤信息所束縛。
發現了問題,要想清楚錯誤的真正原因,然後再修改。不要蠻干。在這時的最大誘惑就是想趕快改,看看錯誤會不會消失。但是蠻乾的結果常常是原來的錯誤沒有弄好,又搞出了新的錯誤。
另一個值得注意的地方:程序中的一個語法錯誤常常導致編譯系統產生許多錯誤信息。如果你改正了程序中一個或幾個錯誤,下面的弄不清楚了,那麼就應該重新編譯。改正一處常常能消去許多錯誤信息行。
解決語法錯誤
常見語法錯誤:
1)缺少語句、聲明、定義結束的分號。
2)某種括弧不配對。C語言中括弧性質的東西很多,列舉如下:
( ), [ ], { }, ' ', " ", /* */
在不同位置的括弧不配對可能引起許多不同的錯誤信息。
3)關鍵字拼寫錯誤。
較難認定的典型錯誤:
1)宏定義造成的錯誤。這種東西不能在源程序文件中直接看到,是在宏替換之後出現的。常見的能引起語法錯誤的宏定義錯誤:宏定義中有不配對的括弧,宏定義最後加了不該有的分號,……
解決上下文關系錯誤
1)變數沒有定義。產生這個問題的原因除了變數確實沒有大意外,還可能是變數的拼寫錯誤,變數的作用域問題(在不能使用某個變數的地方想去用那個變數)。
2)變數重復定義。例如在同一個作用域里用同樣名字定義了兩個變數,函數的局部變數與參數重名等。
3)函數的重復定義。可能是用同一個名字定義了兩個不同的函數。或者是寫出的函數原型在類型上與該函數的定義不相符。有時沒有原型而直接寫函數調用也可能導致這種錯誤信息,因為編譯程序在遇到函數調用而沒有看到函數原型或函數定義時,將給函數假定一個默認原型。如果後來見到的函數定義與假定不符,就會報告函數重復定義錯誤。
4)變數類型與有關運算對運算對象或者函數對參數的要求不符。例如有些運算(如 %)要求整數參數,而你用的是某種浮點數。
5)有些類型之間不能互相轉換。例如你定義了一個結構變數,而後要用它給整數賦值。系統容許的轉換包括:數值類型之間的轉換,整數和指針之間的轉換,指針之間的轉換。其餘轉換(無論是隱含的,還是寫出強制)都不允許。參見《C語言程序設計》(K&R)197-199頁。
如何看待編譯警告
當編譯程序發現程序中某個地方有疑問,可能有問題時就會給出一個警告信息。警告信息可能意味著程序中隱含的大錯誤,也可能確實沒有問題。對於警告的正確處理方式應該是:盡可能地消除之。對於編譯程序給出的每個警告都應該仔細分析,看看是否真的有問題。只有那些確實無問題的警告才能放下不管。
注意:經驗表明,警告常常意味著嚴重的隱含錯誤。
常見警告:
1)(局部自動)變數沒有初始化就使用。如果對局部指針變數出現這種情況,後果不堪設想。對於一般局部自動變數,沒有初始化就使用它的值也不會是有意義的。
2)在條件語句或循環語句的條件中寫了賦值。大部分情況是誤將 == (等於判斷)寫成 = 了。這是很常見的程序錯誤,有些編譯程序對這種情況提出警告。
Ⅳ 新手在學習c語言並編譯程序時編譯錯誤怎麼辦
1、確定出錯的行號
如果是一個比較好的集成編譯環境的話,一般雙擊編譯錯誤,滑鼠都會自動跳轉到該行並高亮顯示。
沒有這個功能也沒關系,編譯錯誤裡面也都會有說明某某.c,某某行出的問題
1>e:\visual studio 2005\projects\airplane\airplane\airplane.cpp(52) : error C2065: 'abc' : undeclared identifier
這個就是說明在airplane.cpp的52行有錯誤
2、多個錯誤的話,一般只處理第一個錯誤
如果一次打出很多錯誤的話,不需要每一個都處理,只處理第一個編譯錯誤,然後再次編譯。大部分的時候,都是由於第一個錯誤產生了後續很多錯誤,第一個錯誤解決之後,其他錯誤也就迎刃而解。
3、對錯誤的更改
一般就是看錯誤的編號和後續的英文說明,如上面的錯誤,錯誤編號是C2065,錯誤的解釋是'abc' : undeclared identifier,未定義的標示符,將abc定義即可。
錯誤的種類很多,一般看英文就可以解決,如果解決不了的話,推薦根據錯誤編號上網搜索一下解決方法就OK拉。
Ⅳ c++編程錯誤列表及解決方案
C++常見編譯/鏈接錯誤及其解決辦法
1. 解決error LNK2005: ___crtExitProcess 已經在 LIBCMTD.lib(crt0dat.obj) 中定義
有的時候, 在 Debug 模式下編譯沒問題, 換到 Release 模式就發生一堆問題.
典型的例子, 就是因為 c++ runtime library 設定不同, 所造成的重復定義連結錯誤.
而另一個常見的例子是 專案與 library 使用不同的字元集合設定
(如: 一個用 Unicode Character Set, 另一個用 Multi-Byte Character Set)
這個錯誤發生原因, 有可能是
1. 你 link 的 lib 使用 C++ Multi-threaded DLL (/MD)
2. 而你的 source 使用的 C++ runtime library 是 Multi-threaded (/MT)
導致重復定義
解決方法:
兩個使用相同的 C++ runtime library.例如都使用 static 的 Multi-threaded (/MT).
2. 錯誤 1error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已經在 LIBCMT.lib(typinfo.obj) 中定義 MSVCRTD.lib
項目 -> 屬性 -> c/C++ -> 代碼生成 -> 運行時庫 設置為: 多線程調試 DLL (/MDd)
被引用的庫和調用的程序編譯選項不同,需要改成一致後編譯
3.#pragma once與 #ifndef的區別
為了避免同一個文件被include多次
1 #ifndef方式
2 #pragma once方式
在能夠支持這兩種方式的編譯器上,二者並沒有太大的區別,但是兩者仍然還是有一些細微的區別。
方式一:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__
... ... // 一些聲明語句
#endif
方式二:
#pragma once
... ... // 一些聲明語句
#ifndef的方式依賴於宏名字不能沖突,這不光可以保證同一個文件不會被包含多次,也能保證內容完全相同的兩個文件不會被不小心同時包含。當然,缺點就是如果不同頭文件的宏名不小心「撞車」,可能就會導致頭文件明明存在,編譯器卻硬說找不到聲明的狀況
#pragma once則由編譯器提供保證:同一個文件不會被包含多次。注意這里所說的「同一個文件」是指物理上的一個文件,而不是指內容相同的兩個文件。帶來的好處是,你不必再費勁想個宏名了,當然也就不會出現宏名碰撞引發的奇怪問題。對應的缺點就是如果某個頭文件有多份拷貝,本方法不能保證他們不被重復包含。當然,相比宏名碰撞引發的「找不到聲明」的問題,重復包含更容易被發現並修正。
方式一由語言支持所以移植性好,方式二 可以避免名字沖突
4.error LNK2019: 無法解析的外部符號 __imp__PathCombineW
PathCombine是Shell api 需要引入庫#pragma comment( lib, "shlwapi.lib")
5.error C2662: "MyClass::GetName()」: 不能將「this」指針從「const MyClass」轉換為「MyClass &」
bool MyClass::operator==(const MyClass* n1) const
{return GetName() == n1->GetName();}
原因是不能在const函數中調用對象的非const方法,MyClass中的GetName()必須是const的。
6.template 模板
模板聲明和定義必須在同一個文件中,而且只有實例話模板類型時才編譯模板實例
7.error C2275: 「MyClass」: 將此類型用作表達式非法 MyClass.Instance();
原因:Instance是靜態方法,用.引用會出錯。應該是MyClass::Instance()
8.error LNK2019: 無法解析的外部符號 "public: __thiscall MyClass(void)
原因:只聲明了構造函數,MyClass(); ,但未定義。 可以定義空函數,或者直接注釋掉,使用默認構造函數。
9.error C2504: 「testing」: 未定義基類
class PackToolTest : testing.Test {}
原因:Test是testing命名空間下的一個類,需要用域操作符,testing::Test
還有一個問題,缺少基類繼承許可權(public、protected、private)
10.error C2864: 「MyClass::_nullpack」: 只有靜態常量整型數據成員才可以在類中初始化
class MyClass {string _nullpack = "test";}
原因:c++ 中,成員變數不能在聲明時初始化,而是在構造函數初始化列表中先初始化
11.error LNK2019: 無法解析的外部符號_WinMain@16int main()
原因:由於創建的是Win32 Project,和Win32 console Project的鏈接庫不同
方法1:在程序最開始的地方加上以下語句
#pragma comment(linker, "/subsystem:console ")
方法2:project > > setting > > 在link 的project options 中將/subsystem:windows(console)刪了
12.類似「已經在 msvcprtd.lib(MSVCP80D.dll) 中定義」問題
vs2005 Debug /Release需要分別配製
分析一下錯誤來源,會發現:
1. 錯誤來源主要是重復定義的問題,而且重復定義的基本上都是VC Runtime和Standard C++ Library中的函數
2. LIBCMT和LIBCPMT為Release下的Lib,本來不應該出現在Debug版本的鏈接的Lib中
3. 重復定義的問題主要出現在:LIBCMT, LIBCPMT, MSVCPRTD, MSVCRTD
來看看出問題的LIB是那些:
1. LIBCMT:C Runtime庫的多線程靜態鏈接的Release版本
2. LIBCPMT:C++ Standard Library的多線程靜態鏈接的Release版本
3. MSVCPRTD:C++ Standard Library的多線程DLL的Debug版本
4. MSVCRTD:C Runtime Library的多線程DLL的Debug版本
當 前我們的配置是多線程DLL的Debug版,因此3和4是應該出現在link的列表中的,不屬於多餘。而後兩者則是只是當多線程靜態鏈接Release版 中才會出現。這提示我在項目中加入的ANTLR.LIB可能是造成這個問題的根源,因為靜態庫的編譯選項很容易和主程序發生沖突,並且根據實際信息我們可 以看出ANTLR.LIB應該是用多線程靜態鏈接的Release版本來編譯的。
解決方法:
1、首先查看編譯項目依賴的其他項目的運行時庫是否一致
2、如果不一致,改為同樣的運行時庫,如在下編譯的是:「多線程調試 DLL (/MDd)」,現在需要把所有的依賴項目的運行時庫都改為一致的庫,就OK了。
13.error C2143: 語法錯誤 : 缺少「;」(在「*」的前面)
原因:產生錯誤處,某類型未include,可能頭文件名拼寫錯誤、頭文件名已更改
14.error C2572: 「MyClass::Invoke」: 重定義默認參數 : 參數 2
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type = ASYN)
原因:默認參數,只需在聲明時指定。方法定義的時候無需指定默認參數。
string MyClass::Invoke(const CParam& paraObj, INVOKETYPE type /*= ASYN*/)
{ ... }。。。。。
希望對你有用
Ⅵ EXCEL提示隱含模塊中的編譯錯誤該怎麼解決
「EXCEL隱含模塊中的編譯錯誤:設表格式」時,可能是由於如下的原因引起的。
一、錯誤的宏代碼
表格中可能引用到宏,要麼是宏代碼有錯誤,要麼是宏根本就不存在,或者是宏代碼中所引用的模塊不存在所引起的。
遇到這種情況,最好的辦法就是把宏給刪除。
方法很簡單:按下組合鍵
Alt
+
F11
進入VBA窗口,找到ThisWorkBook,接著往下找,就能找到代碼了,然後刪除。
二、重新設置系統帳戶
遇到這種問題,最麻煩的就是重新安裝OFFICE也是於事無補的,無論怎麼弄,都是原來的錯誤。
最有效的解決辦法就是,給系統重新設置一個帳戶,使用該帳戶登陸系統,就能正常使用EXCEL文件了。
三、其它的解決辦法
①恢復EXCEL到默認狀態
1、刪除C:Program
FilesMicrosoft
OfficeOFFICE11XLSTART
目錄下的宏文件(可先備份)
(OFFICE11為OFFICE2003的目錄)
2、如果1無效,刪除注冊表HKEY_CURRENT_USERSoftwareMicrosoftOffice下的EXCEL項,以及11.0下的EXCEL項,重新打開後EXCEL會恢復到新裝時的狀態下。
②讓EXCEL自動恢復默認狀態
如果您可以正常打開EXCEL,那麼,先打開EXCEL,選擇幫助里的"檢測並恢復",點"開始"就可以,這樣可以恢復。
Ⅶ 編譯器錯誤怎麼解決
1、分析原因,這樣的錯誤出現一般是由於伺服器拒絕了某一項請求,常見的是寫入,所以問題在有表單輸入的網頁中更容易出現。


