龍建源
很高興回答答主的問題,希望我的回答對答主有幫助。
根據您的描述,首先排除您的代碼語法上出現錯誤,因為這種錯誤在代碼編譯時,編譯器就會報錯,這種錯誤相對容易好找。
然後就是查找代碼邏輯上的錯誤,將自己的構思通過畫流程圖展示出來,然後將程序運行的流程和自己的構思流程對照是否吻合。
之後再查詢字段的數據類型是否正確,比如如果存儲類型為小數時,必須定義為float或double類型,否則顯示結果肯定跟預期的完全不一樣。
最後如果還是程序運行錯誤,那麼恭喜你,發現了編譯器的BUG了!🤫
星辰龍鳳寶爸
寫c語言的時候,如果代碼沒錯,這隻能說明語法沒有出錯,直接導致的結果就是能編譯通過,並不意味著執行的結果就是正確的。影響c語言代碼執行結果的因素非常多。
一、指針的不正確運用;
二、變量精度問題。char,int,unsigned int,long ,float等,如果變量精度使用不正確,也會影響運算結果;
三、運算符的應用不正確。例如除,取餘的區別;
四、正負符號位;
五、運算符的優先級使用;
六、編譯器不同。各種編譯器也可能造成結果不一致;
C語言雖然是一門比較簡單的語言,但是要掌握這些細節,其實並不容易。
重點吐槽
我想你要表達的是,編繹時,沒顯示出錯,但就是結果錯了。要細緻地找原因。
根據我以往的經驗,原因有以下幾點。
1,內存沒有釋放。
用new,malloc等分配內存,而在結束時來釋放,頻繁調用,系統崩潰。
或者根本沒使用new或malloc,在使用內存時異常。
2,變量與地址用錯。
char *p;
char cp
第一個p指地址,在程序中用錯。
3,畫筆CPen,CStatic等未恢復
如:oldpen=pdc一>SelectObject(&m_pen);
在結束,沒有pdc一>SelectObject(oldpen);
導致顏色混亂。
4,中斷使用不當,或者回調callback函數使用不當.
5,c語言對變量類型有嚴格要求,unsigned與signed區別還是很大的,詳細檢查函數原型。
6,最後檢查算法,框圖。是否基本算法有誤。這個很難做。相信大家都很自負,堅信算法沒錯。對照數學算法與你的程序算法是否一致。
7,浮點運算。相信大家認為1.0十1.0=2.0無疑。如果double與其它變量轉換出問題,沒準是這樣的結果:
1.0十1.0=1.9999999999......
beijingwanger
我是碼中尋樂,很高興能為你解答。
代碼沒錯,估計題主表達的意思是能正常編譯通過吧,只要沒有語法錯誤,都會編譯通過的,但並不代表代碼沒錯,這是兩個概念。結果總是錯,說明代碼有錯誤,需要進一步調試排查。
考慮如下代碼:
從語法上來講它們都沒有錯,能正常編譯通過,也能執行。但是輸出的結果卻跟預估的不一樣,看起來結果似乎是錯誤的?
為什麼fv的輸出不是5.567891534? 為什麼cv的輸出不是129?
其實都是有原因的,單精度浮點類型float的小數點後有效位只有6位,後面的會四捨五入; 有符號字符類型的數值表達範圍是-128~127, 而此處被賦值129,已經溢出了,按它的二進制佈局就是10000001,最高位是符號位,1是負數, 將後面7位取反再加一就是1111111,其值為127,帶上符號就是-127。
所以看似錯誤的結果其實是必然,關鍵是要自己明白究竟錯誤的是什麼。
碼中尋樂
從代碼到可執行程序包括以下幾個方面:
1.代碼編譯通過
代碼編譯通過是生成可執行程序鎖必須的,編譯不通過則說明代碼中有明顯的錯誤,比如類型轉換錯誤、返回值缺失、符號使用錯誤等等。編譯錯誤在開發環境中一般都能精確定位,是比較容易發現和解決的。代碼編譯通過,只能說明代碼中沒有明顯的語法錯誤。
2.可執行程序運行
編譯通過後,會生成可執行程序(或者動態庫,題主應該說的是可執行程序,所以此處直接說可執行程序),在開發環境中點擊“運行”,如果代碼沒有錯誤(如內存溢出),一般都能正常顯示,如果是黑窗口,則需要在main函數最後添加中斷函數,否則會一閃而過。可執行程序能跑起來,則說明代碼沒有明顯的錯誤。但不代表代碼實現了想要的功能。
3.程序的邏輯
在程序開發過程中,如果1和2都沒問題,但是程序運行達不到自己期望的結果,那有極大的概率是代碼的邏輯有問題,一個細小的邏輯錯誤,往往會導致莫名其妙的錯誤,所以,如果程序沒達到理想的結果,就仔細研究一下代碼的邏輯。
4.其它的問題
以上3個方面幾何可以解決90%以上的程序問題,但還有一些莫名其妙的情況,比如函數理解錯誤,參數設置錯誤,等等一些不常見的問題。還有一些是疏忽,編碼從來都不是一帆風順的,BUG常伴程序。
天碼行空
有一次真實的經歷,有一段代碼有多種情況分別處理,我是用switch case來寫的,結果有一個case始終執行不到,使用調試器跟蹤發現,即使條件滿足,也無法進入這個case的執行,多次檢查代碼也沒有發現什麼問題。最後從周圍找了幾個高手,也沒有發現問題。
真是困惑不解了,後來沒有辦法了,就把switch case改成if ...else if,問題居然就解決了,真是太神了。
後來想可能是編譯器有問題,我們的環境是風河嵌入式系統,編譯器也是他們提供的。
黃河邊
可能性很多,比如小數點截斷,機器位數不同,編譯器版本不同,你輸入逗號是中文字符,編譯器代碼檢查的要求不同,比如你用c語言的語法編譯器標準卻是c++11,很多語法都不允許這麼寫了。
我不是間諜
編程錯誤不一定是語法錯誤,也有可能是邏輯錯誤,語法錯誤很好排除,邏輯錯誤很難發現和排除,一行一行debug有時候比重構代碼還麻煩。如果是小項目,最好把算法流程畫清楚,框架要做到心中有數,大項目的話,老實debug吧
手工浩哥
錯誤有兩種:語法錯誤和邏輯錯誤。
前者,編譯過程中編譯器會報錯。
後者,就是程序有錯。例如,c語言不做越界檢查,數組越界不報錯,但結果不正確。還有未初始化就引用值,等等。
所以你的問題本身就是錯誤,先設定自己沒錯,再問是誰的錯。
軟件工程:沒有錯誤是不可能的,唯一不變的就是錯誤本身。
出了錯。先得懷疑一切,一步步排除錯誤,而不是堅持自己沒錯。
mubaohong
碰到過,但其實還是代碼錯,單片機msp430引腳高低的寄存器,應該用v開頭的那個修飾的,結果沒寫,被優化掉了