怎么知道寫(xiě)c語(yǔ)言程序哪里錯(cuò)誤 C語(yǔ)言小問(wèn)題,段錯(cuò)誤是什么?
C語(yǔ)言小問(wèn)題,段錯(cuò)誤是什么?1.當(dāng)您訪(fǎng)問(wèn)未提交的內(nèi)存或非法內(nèi)存時(shí),通常會(huì)產(chǎn)生段錯(cuò)誤。主要問(wèn)題是程序的內(nèi)存管理。2.其實(shí)打開(kāi)文件就是把文件指針讀入內(nèi)存進(jìn)行操作。在lz這種情況下,如果文件路徑有問(wèn)題,就會(huì)
C語(yǔ)言小問(wèn)題,段錯(cuò)誤是什么?
1.當(dāng)您訪(fǎng)問(wèn)未提交的內(nèi)存或非法內(nèi)存時(shí),通常會(huì)產(chǎn)生段錯(cuò)誤。主要問(wèn)題是程序的內(nèi)存管理。
2.其實(shí)打開(kāi)文件就是把文件指針讀入內(nèi)存進(jìn)行操作。在lz這種情況下,如果文件路徑有問(wèn)題,就會(huì)導(dǎo)致讀取程序中的內(nèi)存出現(xiàn)問(wèn)題,產(chǎn)生一個(gè)斷錯(cuò)。
3.建議lz搜索關(guān)鍵詞 "內(nèi)存管理和在互聯(lián)網(wǎng)上,然后進(jìn)一步深入這個(gè)問(wèn)題。
c語(yǔ)言寫(xiě)程序組件滾動(dòng)條怎么查看錯(cuò)誤?
您可以通過(guò)在程序中添加調(diào)試語(yǔ)句來(lái)定位組件滾動(dòng)條的錯(cuò)誤。
c語(yǔ)言編程浮點(diǎn)錯(cuò)誤怎么解決?
浮點(diǎn)錯(cuò)誤意味著數(shù)據(jù)類(lèi)型不匹配。檢查哪種數(shù)據(jù)類(lèi)型是錯(cuò)誤的并糾正它是很好的。
C語(yǔ)言程序開(kāi)發(fā)中,難免會(huì)出現(xiàn)邏輯錯(cuò)誤,怎樣讓程序自己輸出錯(cuò)誤位置呢?
謝謝邀請(qǐng)我。
在C語(yǔ)言程序的開(kāi)發(fā)中,程序員經(jīng)常把一個(gè)復(fù)雜的任務(wù)分成幾個(gè)簡(jiǎn)單的子模塊,這些子模塊可以看作是復(fù)雜任務(wù)的各個(gè)組成部分。所以程序員可以像 "積木 "來(lái)解決復(fù)雜的任務(wù)。
這樣做的原因是,如果您直接編寫(xiě)C語(yǔ)言代碼來(lái)一次性解決復(fù)雜的任務(wù),往往會(huì)使整個(gè)代碼 "皺巴巴的 ",不僅開(kāi)發(fā)時(shí)容易引入bug,后期維護(hù)起來(lái)也更痛苦。試想一下,如果把任務(wù)分成幾個(gè)子模塊,以后發(fā)現(xiàn)問(wèn)題可能只需要修改一個(gè)子模塊。但是如果你不這樣做。;不要這樣做,你必須從所有的代碼開(kāi)始尋找并解決問(wèn)題。哪種開(kāi)發(fā)風(fēng)格便于維護(hù),相信題主自然明白。
任務(wù)被分成子模塊后,每個(gè)子模塊往往被封裝成一個(gè)C語(yǔ)言函數(shù),所以最后的 "堆積木材和木材;"實(shí)際上是調(diào)用每個(gè)C語(yǔ)言函數(shù)。但每個(gè)子模塊都可能得到正常結(jié)果或異常結(jié)果,通常用C語(yǔ)言函數(shù)的返回值來(lái)區(qū)分。當(dāng)調(diào)用 "堆積木材和木材;"階段,要根據(jù)被調(diào)用函數(shù)的返回值做不同的處理。
例如,當(dāng)一個(gè)子模塊負(fù)責(zé)計(jì)算用戶(hù)輸入的數(shù)字的log(對(duì)數(shù))值時(shí),如果用戶(hù)輸入一個(gè)正數(shù),該子模塊可以得到一個(gè)正常的結(jié)果。但如果用戶(hù)輸入的是負(fù)數(shù),子模塊顯然無(wú)法得到正常的結(jié)果。
下面是一個(gè)例子。C語(yǔ)言中的代碼盡可能簡(jiǎn)單,以便專(zhuān)注于討論主題:
cond()函數(shù)產(chǎn)生一個(gè)從0到10的隨機(jī)數(shù)。如果隨機(jī)數(shù)小于5,則返回-1(模擬異常結(jié)果),否則返回0(模擬正常結(jié)果)。fun1()函數(shù)和fun2()函數(shù)都會(huì)根據(jù)cond()函數(shù)的返回值做一些進(jìn)一步的工作(上面的C語(yǔ)言代碼跳過(guò) "進(jìn)一步的工作和).在main()函數(shù)中,當(dāng) "堆疊的木材和木材調(diào)用fun1()和fun2()函數(shù),它使用if語(yǔ)句來(lái)判斷它們的返回值,并且并根據(jù)返回值進(jìn)行不同的處理。
現(xiàn)在編譯這個(gè)C語(yǔ)言程序并執(zhí)行它,得到如下結(jié)果:
從輸出結(jié)果中,我們可以發(fā)現(xiàn)C語(yǔ)言程序輸出 "cond是假的(模擬異常)。我們經(jīng)常不 t不想讓程序輸出異常結(jié)果,所以在看到異常結(jié)果后,我們需要知道為什么會(huì)出現(xiàn)這個(gè)結(jié)果。
適當(dāng)?shù)妮敵鲂畔⒂兄诙ㄎ划惓:蜋z查C語(yǔ)言的源代碼。發(fā)現(xiàn)程序輸出的異常結(jié)果是由于if(!fun1() ampamp!Fun2())為假,但無(wú)論fun1()還是fun2()返回-1,if條件表達(dá)式都會(huì)為假。在這種情況下,main()函數(shù)調(diào)用fun1()和fun2()函數(shù)是不合適的,因?yàn)槲覀兛梢?這里不繼續(xù)跟蹤異常的原因。似乎main()函數(shù)更合適。相關(guān)的C語(yǔ)言代碼如下。請(qǐng)看:
編譯并執(zhí)行修改后的C語(yǔ)言代碼,得到如下結(jié)果:
這一次,我們知道哪個(gè)函數(shù)導(dǎo)致了異常輸出,但是它 寫(xiě)這么多行代碼太麻煩了,只調(diào)用兩個(gè)函數(shù)可能都用不到。如果其他地方需要類(lèi)似的,it 這就更麻煩了。有沒(méi)有更方便的方法?我們嘗試將錯(cuò)誤消息插入fun1()和fun2()函數(shù),并將fun1()和fun2()函數(shù)的代碼修改如下:
現(xiàn)在在修改前使用main()函數(shù)如下:
編譯執(zhí)行這段C語(yǔ)言代碼并執(zhí)行,得到如下輸出:
這樣,我們不僅可以從輸出中推斷出是哪個(gè)函數(shù)導(dǎo)致了異常,還可以保持C語(yǔ)言代碼盡可能的簡(jiǎn)單。但是代碼還是有點(diǎn)羅嗦:
這兩個(gè)句子的輸出只有fun1和fun2不一樣,但是我們需要把幾乎同一個(gè)句子完整的寫(xiě)兩遍,萬(wàn)一以后需要修改,兩個(gè)地方都要修改,比較麻煩,容易出錯(cuò)。這種情況可以避免嗎?
在C語(yǔ)言程序的編譯階段使用__FUNCTION__ 、__LINE__ 、__FILE__等關(guān)鍵字,編譯器會(huì)將這些關(guān)鍵字解釋為 "函數(shù)名和, "行號(hào) "和 "文件名 "。所以有了這些關(guān)鍵詞,我們就不 不需要手動(dòng)輸入函數(shù)名。對(duì)于本節(jié)中提到的例子,我們可以完全使用上一節(jié)中介紹的define宏定義:
編譯并執(zhí)行這段C語(yǔ)言代碼,得到如下結(jié)果:
可以看到,程序不僅輸出了異常的函數(shù)名,還輸入了函數(shù)所在的文件名(t.c)和行號(hào)(lin:26,lin:41)。除此之外,這樣的調(diào)試信息看起來(lái)非常舒服,在大型項(xiàng)目開(kāi)發(fā)中非常實(shí)用。
類(lèi)似的調(diào)試宏包括時(shí)間,日期等等,所以我贏了 不要一一演示。
小結(jié)本節(jié)討論在C語(yǔ)言程序的開(kāi)發(fā)中,復(fù)雜的任務(wù)往往被分成多個(gè)子模塊,打包成函數(shù),這些子模塊可能有正常的處理結(jié)果,也可能有異常的處理結(jié)果。所以本節(jié)討論了輸出基本調(diào)試信息對(duì)于定位問(wèn)題的重要性,最后介紹了C語(yǔ)言程序開(kāi)發(fā)中常用的幾個(gè)調(diào)試宏,在大型項(xiàng)目開(kāi)發(fā)中非常實(shí)用。
歡迎在評(píng)論區(qū)一起討論提問(wèn)。這些文章都是手工原創(chuàng)的。每天都有最簡(jiǎn)單的C語(yǔ)言、linux等嵌入式開(kāi)發(fā)介紹。如果你喜歡我的文章,請(qǐng)關(guān)注一波。你可以看到最新的更新和以前的文章。