1. 易語言無法編譯
是正版易語言?如果無法編譯·無非有兩點。
一、源碼有問題!仔細檢查一下有沒有錯誤的地方。又或者是支持庫配置的問題、模塊缺失……二、易語言程序組件損壞,重裝就可以了。
2. 程序編譯錯誤不知道是什麼原因
不能通編譯過的程序實際上還不是合法的程序,因為它不滿足C語言對於程序的基本要求。
檢查語法錯誤的第一要義:集中力量檢查系統發現的第一個錯誤,弄清並改正它。
在編譯過程中系統發現的錯誤主要有兩類:基本語法錯誤和上下文關系錯誤。這些錯誤都在表面上,可以直接看得見。也是比較容易弄清,比較容易解決的。關鍵是需要熟悉C語言的語法規定和有關上下文關系的規定,按照這些規定檢查程序正文,看看存在什麼問題。
編譯中系統發現錯誤都能指出錯誤的位置。不同系統在這方面的能力有差異,在錯誤定位的准確性方面有所不同。有的系統只能指明發現錯誤的行,有的系統還能夠指明行內位置。
一般說,系統指明的位置未必是真實錯誤出現的位置。通常情況是錯誤出現在前,而系統發現錯誤在後,因為它檢查到實際錯誤之後的某個地方,才能確認出了問題,因此報出錯誤信息。要確認第一個錯誤的原因,應該從系統指明的位置開始,在那裡檢查,並從那裡開始向前檢查。
系統的錯誤信息中都包含一段文字,說明它所認定的錯誤原因。應該仔細閱讀這段文字,通常它提供了有關錯誤的重要線索。但也應該理解,錯誤信息未必准確,有時錯誤確實存在,但系統對錯誤的解釋也可能不對。也就是說,在查找錯誤時,既要重視系統提供的錯誤信息,又不應為系統的錯誤信息所束縛。
發現了問題,要想清楚錯誤的真正原因,然後再修改。不要蠻干。在這時的最大誘惑就是想趕快改,看看錯誤會不會消失。但是蠻乾的結果常常是原來的錯誤沒有弄好,又搞出了新的錯誤。
另一個值得注意的地方:程序中的一個語法錯誤常常導致編譯系統產生許多錯誤信息。如果你改正了程序中一個或幾個錯誤,下面的弄不清楚了,那麼就應該重新編譯。改正一處常常能消去許多錯誤信息行。
解決語法錯誤
常見語法錯誤:
1)缺少語句、聲明、定義結束的分號。
2)某種括弧不配對。C語言中括弧性質的東西很多,列舉如下:
( ), [ ], { }, ' ', " ", /* */
在不同位置的括弧不配對可能引起許多不同的錯誤信息。
3)關鍵字拼寫錯誤。
較難認定的典型錯誤:
1)宏定義造成的錯誤。這種東西不能在源程序文件中直接看到,是在宏替換之後出現的。常見的能引起語法錯誤的宏定義錯誤:宏定義中有不配對的括弧,宏定義最後加了不該有的分號,……
解決上下文關系錯誤
1)變數沒有定義。產生這個問題的原因除了變數確實沒有大意外,還可能是變數的拼寫錯誤,變數的作用域問題(在不能使用某個變數的地方想去用那個變數)。
2)變數重復定義。例如在同一個作用域里用同樣名字定義了兩個變數,函數的局部變數與參數重名等。
3)函數的重復定義。可能是用同一個名字定義了兩個不同的函數。或者是寫出的函數原型在類型上與該函數的定義不相符。有時沒有原型而直接寫函數調用也可能導致這種錯誤信息,因為編譯程序在遇到函數調用而沒有看到函數原型或函數定義時,將給函數假定一個默認原型。如果後來見到的函數定義與假定不符,就會報告函數重復定義錯誤。
4)變數類型與有關運算對運算對象或者函數對參數的要求不符。例如有些運算(如 %)要求整數參數,而你用的是某種浮點數。
5)有些類型之間不能互相轉換。例如你定義了一個結構變數,而後要用它給整數賦值。系統容許的轉換包括:數值類型之間的轉換,整數和指針之間的轉換,指針之間的轉換。其餘轉換(無論是隱含的,還是寫出強制)都不允許。參見《C語言程序設計》(K&R)197-199頁。
如何看待編譯警告
當編譯程序發現程序中某個地方有疑問,可能有問題時就會給出一個警告信息。警告信息可能意味著程序中隱含的大錯誤,也可能確實沒有問題。對於警告的正確處理方式應該是:盡可能地消除之。對於編譯程序給出的每個警告都應該仔細分析,看看是否真的有問題。只有那些確實無問題的警告才能放下不管。
注意:經驗表明,警告常常意味著嚴重的隱含錯誤。
常見警告:
1)(局部自動)變數沒有初始化就使用。如果對局部指針變數出現這種情況,後果不堪設想。對於一般局部自動變數,沒有初始化就使用它的值也不會是有意義的。
2)在條件語句或循環語句的條件中寫了賦值。大部分情況是誤將 == (等於判斷)寫成 = 了。這是很常見的程序錯誤,有些編譯程序對這種情況提出警告。
3. 程序無法編譯通過問題,怎麼解決
關於程序無法通過編譯的問題,其錯誤類型肯定是有很多種的。根據我多年的編程調試經驗,可以給你提供以下幾種類型的錯誤,供你參考(以下以 C 語言編程經驗為例,其他編程語言的調試思路也是同理的)。
其中最容易調試的程序錯誤類型就是:
(1)、在編寫源程序過程中出現的各種語法錯誤。這種錯誤主要是由於剛剛開始學習編程,對編程語言的語句、以及語法結構還不是很清晰造成的,這種錯誤是最容易進行調試的,因為語法錯誤,編譯器連編譯都無法通過(通常會顯示出來具體是哪一行出現錯誤),這樣的話,你就可以直接到出錯的那一行進行修改源代碼了;
(2)、若是經過一段時間的上機練習,對學習編程的初始階段已經較為熟練了、且語法錯誤較少了之後,之後就會遇到更加復雜、並且難於調試的語義錯誤。例如在 C 語言中,對於如下代碼:
void main( )
{
int n ;
scanf("%d", &n) ;
if( n == 100 )
printf(" n is 100 !\n") ;
else
printf(" n is not 100 !\n") ;
}
但是若在邏輯判斷語句:if( n == 100) 中,如果誤將「==」(邏輯等於)寫成了「=」(賦值等於),那麼在 scanf("%d", &n) 語句中,無論你輸入的 n 等於多少,一旦執行 if 語句,那麼 將 100 這個數字賦給變數 n,則該邏輯表達式的值總是 1,程序的運行結果必定總是輸出:n is 100。
而該程序的實際思路是:從鍵盤輸入一個整數,如果該整數等於 100,則輸出:n is 100 !如果輸入的整數不等於 100 的話,則輸出:n is not 100 !
像這樣的邏輯錯誤(在對 C 語言源程序進行編譯時,C 語言編譯器是檢查不出來的),如果沒有豐富的程序調試經驗,程序調試起來就是非常困難的。
(3)、其它的錯誤類型例如:數組越界、非法使用了未初始化的指針變數、未對指針變數進行有效的內存分配,就向那一塊存儲區域讀寫數據,等等。這些都會造成程序崩潰,嚴重的就會造成操作系統崩潰。
4. 代碼沒有錯誤為什麼編譯不出來
編譯器是一種翻譯程序,它用於將源語言(即用某種程序設計語言寫成的)程序翻譯為目標語言(即用二進制數表示的偽機器代碼寫成的)程序。後者在windows操作系統平台下,其文件的擴展名通常為.obj。該文件通常還要經過進一步的連接,生成可執行文件(機器代碼寫成的程序,文件擴展名為.exe)。通常有兩種方式進行這種翻譯,一種是編譯,另一種是解釋。後者並不生成可執行文件,只是翻譯一條語句、執行一條語句。這兩種方式相編譯比解釋運行的速度要快得多。
2、 編譯過程的5個階段:詞法分析;語法分析;語義分析與中間代碼產生;優化;目標代碼生成。
3、 在這五個階段中,詞法分析的任務是識別源程序中的單詞是否有誤,編譯程序中實現這種功能的部分一般稱為詞法分析器。在編譯器中,詞法分析器通常僅作為語法分析程序的一個子程序以便在它需要單詞符號時調用。在這一編譯階段中發現的源程序錯誤,稱為詞法錯誤。
4、 語法分析階段的目的是識別出源程序的語法結構(即語句或句子)是否錯誤,所以有時又常為句子分析。編譯程序中負責這一功能的程序稱為語法分析器或語法分析程序。在這一階段中發現的錯誤稱為語法錯誤。
5、 C語言的(源)程序必須經過編譯才能生成目標代碼,再經過鏈接才能運行。PASCAL語言、FORTRAN語言的源程序也要經過這樣的過程。通常將C、PASCAL、FORTRAN這樣的語言統稱為高級語言。而將最終的可執行程序稱為機器語言程序。
6、 在編譯C語言程序的過程中,發現源程序中的一個標識符過長,超過了編譯程序允許的范圍,這個錯誤應在詞法分析階段發現,這種錯誤通常被稱作詞法錯誤。
詞法分析器的任務是以詞法規則為依據對輸入的源程序進行單詞及其屬性的識別,識別出一個個單詞符號。
詞法分析的輸入是源程序,輸出是一個個單詞的特殊符號,稱為Token(標記或符號)。
語法分析器的類型有:自下而上、自上而下。常用的語法分析器有:遞歸下降分析方法是一種自上而下分析方法, 算符優先分析法屬於自下而上分析方法,LR分析法屬於自下而上分析方法等等。
通常用正規文法或正規式來描述程序設計語言的詞法規則,而使用上下文無關文法來描述程序設計語言的語法規則。
語法分析階段中,處理的輸入數據是來自詞法分析階段的單詞符號。它們是詞法分析。
5. 我用易語言編了一個小程序,但是無法編譯。點編譯以後只會閃一下,然後提示框說的用戶放棄。
無法編譯的情況,一般來說的話.有三種.
第一種是易語言許可權,(用的是正版,卻沒購買正版許可權..最簡單的識別方法是,無模塊情況下,可調試,不可編譯)
第二種是模塊許可權.(和上面差不多.不過是模塊的問題,.當然,有些模塊可編譯不可調試.比如超級模塊.有些剛好相反.,)
第三種是編譯錯誤..(易語言都會指明錯誤地方,根據提示去做相應修改就行了.)
當然.不排除其他的特殊情況..
最好截圖上來看看..
6. 我這個C語言程序為什麼不能編譯
可能的原因:
1、如果你用的是c語言編譯器,那麼io庫只有stdio.h,沒有iostream。iostream是c++的標准庫里的。
2、按照c++風格,添加頭文件的預編譯指令應該是#include
,沒有「.h」
3、如果使用iostream里的類,別忘了添加using
namespace
std;語句