看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: Win10, Linux, ...) mplab 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) MPLAB XC8 C Compiler 問題(Question): mcu的ram塞不下想省空間把int改成char 錯誤結果(Wrong Output): 原本宣告int的程式正常,改成char後就會誤動作 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) //我宣告了int變數的陣列和long的變數 unsigned short int ck=0; unsigned int abit[25],cbit[25],dbit[25],ebit[25],i; unsigned long i1=0,j1=0,k1=0,m1=0,n1=0,bita; //我在收CODE的時候是一個BIT一個BIT塞進long的變數內 void interrupt ISR(void) //rise edge { if(INTF)//external interrupt INTF=1 { if(RB2==0 && ck<24)//ce=0 { //CK=1 RISE EDGE i=RB1; i1=(i1<<1)+i; ck++; } } } //收完code後再把long變數一個一個bit塞到int的陣列內 void HEX_TO_BIN_i() { bita=i1&0x800000; dbit[0]=bita>>23; bita=i1&0x400000; dbit[1]=bita>>22; bita=i1&0x200000; dbit[2]=bita>>21; bita=i1&0x080000; dbit[4]=bita>>19; bita=i1&0x040000; dbit[5]=bita>>18; bita=i1&0x020000; dbit[6]=bita>>17; bita=i1&0x010000; dbit[7]=bita>>16; } //最後根據陣列對應0或1來送我要的波型 void SEND_CODE()//800K { if(dbit[7]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[6]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[5]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[4]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[3]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[2]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[1]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} if(dbit[0]==0x01) {RC1=1;RC1=1;RC1=1;RC1=1;RC1=0;} else {RC1=1;RC1=0;} } 補充說明(Supplement): 陣列變數用int都能正常動作,出來的波型都正確 我想請教一下,照理說我陣列內的每個變數只需要用到1BIT 可是當我為了省空間把int改成char之後出來的波形就出錯了 整個程式沒變只int->char,但是只會用到=0或=1 我實在想不清楚char有8個bit放一個0或1應該綽綽有餘啊? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.248.158.217 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1544087455.A.410.html
commandoEX: 那乾脆改成boolean? if 內還不用判斷式 12/06 19:34
chuegou: 這樣呢 dbit[0]=(char)(bita >>23) 12/06 23:01
Lipraxde: 我感覺啊,那個 i ,放在全域變數是不是有點危險? 12/06 23:59
BaJiaJhon: mcu是幾位元系統,int與char分別是幾bits呢 12/08 18:14
a16450: 試試看 struct與union把結構做成你要的資料長度 12/13 00:04