久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 解決一個(gè)C語(yǔ)言程序分號(hào)“;”引起的bug [打印本頁(yè)]

作者: f556    時(shí)間: 2022-9-13 23:45
標(biāo)題: 解決一個(gè)C語(yǔ)言程序分號(hào)“;”引起的bug
曾想也標(biāo)題黨一次,寫(xiě)成《一個(gè)C程序分號(hào)“;”引起的血案》,筆者原本厭惡標(biāo)題黨,厭惡那些“xxxx了”、“XXXX震驚,不看后悔”、“XXXX,看這個(gè)就夠了”。也就不在此惡心各位同好。
C程序的分號(hào),是任何寫(xiě)過(guò)C程序的人都明白的,很重要,用的很多。但此文將要說(shuō)明的是分號(hào)不正確的使用,導(dǎo)致一個(gè)隱藏的Bug。

一、發(fā)現(xiàn)錯(cuò)誤
家用的太陽(yáng)能熱水器控制,執(zhí)行電加熱后,本來(lái)有一個(gè)LED燈閃爍,提示電加熱是開(kāi)啟的。原來(lái)用了兩年多,一直正常,前幾天發(fā)現(xiàn)是啟動(dòng)電加熱后,閃一次LED就熄滅。全套控制、接線都是自己一點(diǎn)點(diǎn)搞起來(lái)的,所以要解決這個(gè)故障,有了優(yōu)勢(shì),但更有了苦命累積。一個(gè)同事二貨在別墅頂上裝了太陽(yáng)能熱水器,為了陰天有熱水,另外加了一個(gè)電熱水器,還要考慮閥門(mén)切換,考慮電熱水器防雨、考慮啟動(dòng)或關(guān)閉總電源等等,反正一切由安裝的說(shuō)了算,不用費(fèi)腦子。想想我布的多根網(wǎng)線、多點(diǎn)測(cè)溫、兩組太能能占據(jù)掉的位置,自己在斜的瓦屋頂上熔水管、焊接線,那么多辛苦都過(guò)去了,借肋中秋節(jié)放假而且一直下雨在家的時(shí)間,有必要把LED不指示的問(wèn)題解決。

二、查找問(wèn)題
記得LED指示燈與電加熱分別各用一個(gè)IO口,也必須如此,才可以閃爍,不然加熱時(shí)變成繼電器反復(fù)通斷。LED用9012PNP管驅(qū)動(dòng),且平時(shí)一直會(huì)微閃,這個(gè)一開(kāi)始就如此,胡亂微閃就閃吧,大概分析了一下,如果用NPN管不會(huì)微閃,PNP如果調(diào)偏置電阻也可以使全滅,涉及小小的三極管復(fù)雜的功能,在此不跑主題,也不細(xì)說(shuō)。
未連接系統(tǒng),隨意看了一下程序,程序應(yīng)該沒(méi)有動(dòng)過(guò),上月寫(xiě)兩個(gè)發(fā)明專利時(shí),為了測(cè)試幾個(gè)數(shù)據(jù),重新下載過(guò)一套改版的程序到Flash,后又恢復(fù)了。原因可能是在什么時(shí)候動(dòng)過(guò)程序,導(dǎo)致出現(xiàn)Bug。程序看不出明顯的錯(cuò)誤,必須聯(lián)機(jī)調(diào)試,監(jiān)視一下變量。
真是累不動(dòng)。還好SBW下載線制作過(guò)一根專用的,直接插上就OK,不用其它排列順序的下載線換線位。搜索全部工程文件“電加熱” “電熱”,找到以下語(yǔ)句:
#define EHeat_off   P7OUT |=  BIT0; EHisON=0  //電加熱off
#define EHeat_on    P7OUT &=~ BIT0; EHisON=1  //電加熱on
聚焦到EHeat_off語(yǔ)句,再搜EHeat_off,只有3處有過(guò):
1、              BASICTIMER_VECTOR定時(shí)器中斷250ms一次,快結(jié)束時(shí)啟動(dòng)一次測(cè)溫,在測(cè)溫程序中,結(jié)果出來(lái)后,用了以下:
  /*-----------停止電加熱-----------*/
if(UperT > EleHeatTempe*10)  EHeat_off;     //達(dá)到設(shè)置溫度(45.0---450),關(guān)閉電加熱。
2、              第二處是狀態(tài)機(jī)控制的菜單程序中,當(dāng)Cancel時(shí),關(guān)閉電加熱:
if(Menu_sel==3)   EHeat_off;
另外一處就是define處的定義了。

三、解決問(wèn)題
程序高手估計(jì)已經(jīng)發(fā)現(xiàn)問(wèn)題了,筆者愚鈍。啟動(dòng)電加熱后,中斷并監(jiān)視P7口,P70確實(shí)是0,剛好這兩周,家里主空開(kāi)被我拆了調(diào)整空開(kāi)位準(zhǔn)備在家門(mén)口接充電樁,用鉗表卡16平總進(jìn)戶線電流5A多,關(guān)閉電加熱時(shí)0.3A。證明加熱正常。僅僅是指示燈出故障。再搜索全部工程,除了3處定義,只在__interrupt void BT_ISR(void)中出現(xiàn)過(guò):
if(  EHisON) P4OUT ^=  BIT2;      //電加熱指示燈閃
else  if((P4IN & BIT2) ==0 )   P4OUT |=  BIT2;
程序前強(qiáng)加一個(gè)EHisON=1; 指示燈會(huì)閃。說(shuō)明PNP管、LED均正常。EHisON是一個(gè)標(biāo)志電加熱是打開(kāi)狀態(tài)的變量,原意是開(kāi)關(guān)電熱時(shí),一并切換此標(biāo)志是開(kāi)或關(guān)。監(jiān)視此變量總是為0。
回到if(UperT > EleHeatTempe*10)  EHeat_off;終于發(fā)現(xiàn)問(wèn)題。這個(gè)語(yǔ)句相當(dāng)于:
if(UperT > EleHeatTempe*10)  P7OUT |=  BIT0; EHisON=0;
很明顯,if執(zhí)行了“P7OUT |=  BIT0;”,而“EHisON=0;”不論if如何都會(huì)執(zhí)行,解決辦法自然是加{}。當(dāng)然還有另一個(gè)解決辦法,不用加{},看大家的興趣,我在后邊回復(fù)中說(shuō)明。

我一般寫(xiě)define時(shí),習(xí)慣是最后不加“;”而在執(zhí)行代碼中加,這樣看上去比較統(tǒng)一。此次定義是P7OUT |=  BIT0和EHisON=0兩個(gè)語(yǔ)句,故在中間順手加了一個(gè)“;”。又一個(gè)習(xí)慣是簡(jiǎn)單的if喜歡一行寫(xiě)完,不加{}。甚至長(zhǎng)一點(diǎn)的if都喜歡一行寫(xiě)完,以讓小小的屏幕好容納上萬(wàn)行代碼。各種習(xí)慣、巧合,導(dǎo)至這個(gè)Bug正常運(yùn)行了2年時(shí)間。今天回頭找最老版的程序查看,這個(gè)錯(cuò)誤一直在,不明白為什么原來(lái)可以正常閃爍,難道編譯器根據(jù)option設(shè)置修正過(guò)此錯(cuò)誤?如果有明白的大神,請(qǐng)不吝賜教,先謝謝了。主控是MSP430F4152,但I(xiàn)DE我不說(shuō)了(IXX6),涉及其它不必要的麻煩。
另外,我不喜歡那些上傳整套程序的,一般也無(wú)心看,除非是自己手上有的小模塊,而又沒(méi)有玩過(guò)的,針對(duì)此模塊的驅(qū)動(dòng)可以看看。也更喜歡關(guān)注思路、方法、原理。所以也不上傳整套程序,畢竟各種場(chǎng)合的應(yīng)用不一樣、解決方案各不同,拙作也就不傷大家眼了。

作者: wangnengjie    時(shí)間: 2022-9-14 12:56
學(xué)C語(yǔ)言的經(jīng)典 坑了。
作者: heicad    時(shí)間: 2022-9-15 20:53
對(duì)初學(xué)者很有用,當(dāng)年好像遇到過(guò)這情況
作者: wujian122656    時(shí)間: 2022-9-27 16:29
弄了個(gè)開(kāi)發(fā)板,準(zhǔn)備開(kāi)始學(xué)單片機(jī)啦,加油
作者: imxuheng    時(shí)間: 2022-10-9 09:30
別提了,我也有你提到的編程壞習(xí)慣,語(yǔ)句寫(xiě)成一行,又不加{},開(kāi)始時(shí)死活找不出bug,以后真的要注意了
作者: DoneDone    時(shí)間: 2022-10-11 07:20
后面你一定會(huì)養(yǎng)成if的內(nèi)容加花括號(hào)的習(xí)慣的
作者: zzzzz8840    時(shí)間: 2022-10-16 17:31
{}太重要了,被坑過(guò)
作者: nanjingcxy2008    時(shí)間: 2022-10-28 10:10
受教了,給大家也提了個(gè)醒,以后會(huì)注意這個(gè)問(wèn)題,養(yǎng)成良好的編程習(xí)慣。
作者: ggbob    時(shí)間: 2022-11-7 15:30
確實(shí)細(xì)節(jié)很重要

作者: Longan.Wang    時(shí)間: 2022-11-11 14:29
這個(gè)根本就不是";"號(hào)的號(hào)題!!!!
在定義多條語(yǔ)句宏的時(shí)候,至少需要用{}把語(yǔ)句框起來(lái)!
#define EHeat_off   {P7OUT |=  BIT0; EHisON=0;}  //電加熱off
#define EHeat_on    {P7OUT &=~ BIT0; EHisON=1;}  //電加熱on
如果想更加保險(xiǎn)一點(diǎn)應(yīng)用下面格式寫(xiě)更好
//電加熱off
#define EHeat_off   do {P7OUT |=  BIT0; EHisON=0;} while(0);
//電加熱on
#define EHeat_on   do {P7OUT &=~ BIT0; EHisON=1;} while(0);
為什么這樣寫(xiě),網(wǎng)上有大佬分析過(guò)。



作者: Angle145    時(shí)間: 2022-11-11 23:58
使用宏替換多行代碼時(shí),在調(diào)用養(yǎng)成加大括號(hào)后再調(diào)用的習(xí)慣
作者: Angle145    時(shí)間: 2022-11-11 23:59
Longan.Wang 發(fā)表于 2022-11-11 14:29
這個(gè)根本就不是";"號(hào)的號(hào)題!!!!
在定義多條語(yǔ)句宏的時(shí)候,至少需要用{}把語(yǔ)句框起來(lái)!
#define EHea ...

對(duì)的,用do來(lái)概括多行宏,根本不是分號(hào)問(wèn)題,給你一個(gè)贊
作者: f556    時(shí)間: 2022-11-12 01:19
Longan.Wang 發(fā)表于 2022-11-11 14:29
這個(gè)根本就不是";"號(hào)的號(hào)題!!!!
在定義多條語(yǔ)句宏的時(shí)候,至少需要用{}把語(yǔ)句框起來(lái)!
#define EHea ...

感謝回復(fù),我的解決辦法就是這樣:
#define EHeat_off   {P7OUT |=  BIT0; EHisON=0;}  //電加熱off
#define EHeat_on    {P7OUT &=~ BIT0; EHisON=1;}  //電加熱on
用do while應(yīng)該有它的好處,大佬畢竟是大佬。
基于現(xiàn)在屏幕大部分時(shí)候是橫向的,特別是對(duì)于我用筆記本來(lái)說(shuō)。更喜歡把一件事寫(xiě)在一行,好象看著更簡(jiǎn)潔,好比:
unsigned char aa,bb,cc;
至于"定義多條語(yǔ)句宏的時(shí)候,至少需要用{}把語(yǔ)句框起來(lái)",這有點(diǎn)絕對(duì)了。
實(shí)際上:
#define EHeat_off    P7OUT |=   BIT0 ,EHisON=0     //電加熱off
#define EHeat_on    P7OUT &=~ BIT0, EHisON=1  //電加熱on
上邊語(yǔ)句完全可以實(shí)現(xiàn)功能,且最后是沒(méi)有分號(hào)的,以方便按習(xí)慣在調(diào)用時(shí)后邊再加分號(hào),如:
if(...)  EHeat_off;
上邊實(shí)際上是“,”的用法,好比在寫(xiě)if時(shí)為節(jié)約行數(shù),if后同時(shí)要做的事一并寫(xiě)了,不用{}。
如:if(a>b) c=a,a=b,b=c;    //交換順序
畢竟是業(yè)余玩,不是按代碼行數(shù)拿薪水,我個(gè)人更喜歡上邊這種寫(xiě)法,當(dāng)然,壞處是出現(xiàn)了我本主題的毛病,另外也不排除在上邊if中隨手把“,”寫(xiě)成分號(hào)導(dǎo)致隱藏的錯(cuò)誤。
作者: wufa1986    時(shí)間: 2022-11-12 08:31
一般不是數(shù)值的話,我都是搞成函數(shù)的形式,而不是#define
作者: SURUBU1976    時(shí)間: 2022-11-15 15:56
Longan.Wang 發(fā)表于 2022-11-11 14:29
這個(gè)根本就不是";"號(hào)的號(hào)題!!!!
在定義多條語(yǔ)句宏的時(shí)候,至少需要用{}把語(yǔ)句框起來(lái)!
#define EHea ...

為什么這樣寫(xiě),網(wǎng)上有大佬分析過(guò)   請(qǐng)給連接想學(xué)下。謝謝
作者: 程卓    時(shí)間: 2022-11-27 20:37
B站上有c 語(yǔ)言學(xué)習(xí)視頻
作者: 明記冷氣    時(shí)間: 2023-1-11 22:17
語(yǔ)句短我一般加,號(hào)不用{}
作者: f556    時(shí)間: 2023-2-15 22:44
明記冷氣 發(fā)表于 2023-1-11 22:17
語(yǔ)句短我一般加,號(hào)不用{}

謝謝,還是找到一個(gè)知音了。
作者: 快樂(lè)眼淚    時(shí)間: 2023-4-11 20:20
以后學(xué)C語(yǔ)要細(xì)心了!
作者: Afterwards_1    時(shí)間: 2023-4-24 21:00
答主講的非常仔細(xì)
作者: Ubuntu312    時(shí)間: 2024-8-3 13:42
好多次了,IFELSE后跟一條語(yǔ)句,不加{};后來(lái)客戶提要求,加了之后出BUG,頭疼了半個(gè)多鐘頭
作者: zhangdong533    時(shí)間: 2025-4-4 01:33
哈哈,很有意思啊
作者: zyftank    時(shí)間: 2025-5-22 15:11
那個(gè)分號(hào)可以用逗號(hào)替代,就不用加花括號(hào)了




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲视频在线播放 | 国产亚洲区 | 亚洲国产成人精品久久久国产成人一区 | 超碰免费在线观看 | 天堂va在线观看 | 激情一区二区三区 | 亚洲小视频在线播放 | 国产欧美日韩综合精品一区二区 | 日韩毛片在线视频 | 中文字幕一区二区三区在线观看 | 欧美成人精品一区二区三区 | 成人免费看黄网站在线观看 | 日本特黄特色aaa大片免费 | 久久综合狠狠综合久久综合88 | 日韩电影一区二区三区 | 黄色一级电影免费观看 | 亚洲成人免费av | 久久久久久精 | 亚洲第一色av | 国产成人短视频在线观看 | 狠狠夜夜 | 99热热99| 成人亚洲视频 | 国产成人精品视频在线观看 | 国产精品无码久久久久 | 成人午夜高清 | 久草久草久草 | 视频一区二区在线观看 | 国产一区视频在线 | 91久久精品 | 国产日韩久久久久69影院 | 亚洲顶级毛片 | 亚洲综合区 | 中文字幕 在线观看 | 中文字幕综合在线 | 99国产精品久久久 | 久久久久久免费毛片精品 | 国产精品污www一区二区三区 | 老司机67194精品线观看 | 免费看片在线播放 | 美女在线观看av |