❶ 程序編譯錯誤不知道是什麼原因
不能通編譯過的程序實際上還不是合法的程序,因為它不滿足C語言對於程序的基本要求。
檢查語法錯誤的第一要義:集中力量檢查系統發現的第一個錯誤,弄清並改正它。
在編譯過程中系統發現的錯誤主要有兩類:基本語法錯誤和上下文關系錯誤。這些錯誤都在表面上,可以直接看得見。也是比較容易弄清,比較容易解決的。關鍵是需要熟悉C語言的語法規定和有關上下文關系的規定,按照這些規定檢查程序正文,看看存在什麼問題。
編譯中系統發現錯誤都能指出錯誤的位置。不同系統在這方面的能力有差異,在錯誤定位的准確性方面有所不同。有的系統只能指明發現錯誤的行,有的系統還能夠指明行內位置。
一般說,系統指明的位置未必是真實錯誤出現的位置。通常情況是錯誤出現在前,而系統發現錯誤在後,因為它檢查到實際錯誤之後的某個地方,才能確認出了問題,因此報出錯誤信息。要確認第一個錯誤的原因,應該從系統指明的位置開始,在那裡檢查,並從那裡開始向前檢查。
系統的錯誤信息中都包含一段文字,說明它所認定的錯誤原因。應該仔細閱讀這段文字,通常它提供了有關錯誤的重要線索。但也應該理解,錯誤信息未必准確,有時錯誤確實存在,但系統對錯誤的解釋也可能不對。也就是說,在查找錯誤時,既要重視系統提供的錯誤信息,又不應為系統的錯誤信息所束縛。
發現了問題,要想清楚錯誤的真正原因,然後再修改。不要蠻干。在這時的最大誘惑就是想趕快改,看看錯誤會不會消失。但是蠻乾的結果常常是原來的錯誤沒有弄好,又搞出了新的錯誤。
另一個值得注意的地方:程序中的一個語法錯誤常常導致編譯系統產生許多錯誤信息。如果你改正了程序中一個或幾個錯誤,下面的弄不清楚了,那麼就應該重新編譯。改正一處常常能消去許多錯誤信息行。
解決語法錯誤
常見語法錯誤:
1)缺少語句、聲明、定義結束的分號。
2)某種括弧不配對。C語言中括弧性質的東西很多,列舉如下:
( ), [ ], { }, ' ', " ", /* */
在不同位置的括弧不配對可能引起許多不同的錯誤信息。
3)關鍵字拼寫錯誤。
較難認定的典型錯誤:
1)宏定義造成的錯誤。這種東西不能在源程序文件中直接看到,是在宏替換之後出現的。常見的能引起語法錯誤的宏定義錯誤:宏定義中有不配對的括弧,宏定義最後加了不該有的分號,……
解決上下文關系錯誤
1)變數沒有定義。產生這個問題的原因除了變數確實沒有大意外,還可能是變數的拼寫錯誤,變數的作用域問題(在不能使用某個變數的地方想去用那個變數)。
2)變數重復定義。例如在同一個作用域里用同樣名字定義了兩個變數,函數的局部變數與參數重名等。
3)函數的重復定義。可能是用同一個名字定義了兩個不同的函數。或者是寫出的函數原型在類型上與該函數的定義不相符。有時沒有原型而直接寫函數調用也可能導致這種錯誤信息,因為編譯程序在遇到函數調用而沒有看到函數原型或函數定義時,將給函數假定一個默認原型。如果後來見到的函數定義與假定不符,就會報告函數重復定義錯誤。
4)變數類型與有關運算對運算對象或者函數對參數的要求不符。例如有些運算(如 %)要求整數參數,而你用的是某種浮點數。
5)有些類型之間不能互相轉換。例如你定義了一個結構變數,而後要用它給整數賦值。系統容許的轉換包括:數值類型之間的轉換,整數和指針之間的轉換,指針之間的轉換。其餘轉換(無論是隱含的,還是寫出強制)都不允許。參見《C語言程序設計》(K&R)197-199頁。
如何看待編譯警告
當編譯程序發現程序中某個地方有疑問,可能有問題時就會給出一個警告信息。警告信息可能意味著程序中隱含的大錯誤,也可能確實沒有問題。對於警告的正確處理方式應該是:盡可能地消除之。對於編譯程序給出的每個警告都應該仔細分析,看看是否真的有問題。只有那些確實無問題的警告才能放下不管。
注意:經驗表明,警告常常意味著嚴重的隱含錯誤。
常見警告:
1)(局部自動)變數沒有初始化就使用。如果對局部指針變數出現這種情況,後果不堪設想。對於一般局部自動變數,沒有初始化就使用它的值也不會是有意義的。
2)在條件語句或循環語句的條件中寫了賦值。大部分情況是誤將 == (等於判斷)寫成 = 了。這是很常見的程序錯誤,有些編譯程序對這種情況提出警告。
❷ 程序編譯完出現下面的警告,是什麼原因啊怎麼改
剛剛看到你給樓上那位的代碼了,你看看你的表定義的列有哪些項目,然後按類型要求全部寫上,肯定出錯。兩種寫法:(1)insert into tablename (item1,item2,...) values (value1,value2, ...),這種是一一對應,有選擇的插入(2)insert into tablename values (所有列的值).而你剛剛是按照第二種方式,第二種方式也不用全寫,因為有些列有默認值或者其他約束
❸ 怎樣解決s7-200編譯後出現820故障 正在編譯程序塊...14086個位元組
有非法指令
我有詳細的表格,索取:[email protected]
❹ 為什麼c程序每次編譯都有一個警告
你好!
是這個警告嗎 ?warning: no newline at end of file
如果是,那麼你在最後一個 } 的後面,按一下回車就好了,也就是結尾出現一個空號
❺ 在C++6.0的環境中,編輯好程序後,在編譯時提示有一個警告,應該怎麼處理啊
一般的話,警告出現,可能不會影響程序運行,但可能失去程序的精度,當然你不處理程序照樣能夠正常運行。如果出現警告,可能是你的程序當中的數據類型,或者其他的一些原因,還是要看提示。
❻ 程序出現警告,編譯完成後沒有了,求解釋謝謝。
看一下工程配置里C/C++頁面,你應該是挑上了「Split Load and Store Multiple"選項,它對應著編譯器的--split_ldm選項。詳細的解釋,你搜一下」--split_ldm「,armdeveloper上有詳盡的解釋,確定一下你是不是需要挑這個選項。
如果不需要這個選項,設置里取消就行了;
如果確定自己需要,就可以不理會對應的warning,編譯警告類信息不影響編譯結果和後面的連接。
❼ 西門子300plc編譯下載時提示警告,塊ob1已在cpu中存在,結果並未下載。是什麼原因該怎麼解
1,檢查cpu的開關撥到了STOP狀態
2,用PLC的撥碼清空程序。也可以點S7的在線按鈕(會顯示PLC裡面的程序塊和程序塊存儲位置)看下是不是真的有組態程序
3,你的程序定址范圍或I/O過程映像超出CPU的范圍。檢查方法如下:SIMATIC管理器,打開你要下載的程序,選擇菜單「Optionals」/Reference Data/Display「(選項/參考數據/顯示),在出現的對話框中,在」Customize「(顧客化)中選擇」Cross Reference「(交叉參考表),在出現的參考表中檢查相應的位存儲器區地址和I/O映像輸入輸出是否真的超出范圍
4,OB1里調用了CPU不支持的程序或指令。
5,調用了不支持的SFC/SFB
6,變數地址超出了范圍
先檢查這些吧。看下問題可以解決不(最多發生的是3)
❽ KEIL中編譯匯編程序出現警告,如何處理
「請不要告訴我刪除startup.a51。刪除該程序警告雖然消除了,但運行結果是錯誤的。」
運行結果錯誤在別的方面。
從模擬結果來看,30H~3FH放置從00H到0FH的數,這不就是你所需的運行結果嗎?
❾ 西門子數控編譯錯誤802,程序塊過大
我用的是802D和S的,沒用過C的,也沒遇到過這種情況,這個錯誤是編程時出現的么,你可以查下程序,鎖定不了就只能重頭查,西門子的問題不是很多,系統還算可以,先重自己的操作編程查起吧,