|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
關(guān)于讓一個int型和兩個char型共用一個空間的問題 |
| 作者:cucunum 欄目:單片機 |
我編寫一個ram測試程序,類似于這種函數(shù) for(testadr = 0x0000;testadr < 0x7fff;testadr++) { code } 由于送的地址是unsigned int型的,但是如果在循環(huán)中讓地址增加,一加就是加二,因此我準備定義一個共用體,讓一個int和兩個CHAR共用空間,傳遞地址就用int,地址值的增加用CHAR(自增1)。 如下: typedef union { unsigned int testint; struct { unsigned CHAR testCHARH; unsigned CHAR testCHARL; } *testCHAR; }testtype; main() { testtype *testadr; for(testadr->testint = 0x0000;testadr->testint < 0x7fff; testadr->testCHAR->testCHARL++) { ramwrite(0x55aa,testadr->testint); if( ramread(testadr->testint) != 0x55aa ) break; else if(testadr->testCHAR->testCHARL == 0xff) testadr->testCHAR->testCHARH++; if( testadr->testCHAR->testCHARL == 0xff) testadr->testCHAR->testCHARH++; } if(testadr->testint != 0x7fff) return( false ); else return( true ); } 結(jié)果老是testadr->testint在0x0001和0xaaff之間跳,永遠就只有兩個值 我懷疑是程序的問題,就改用如下定義 #define DPTR 0x82 然后讓DPTR作為傳輸?shù)刂返募拇嫫,以DPH和DPL來進行CHAR的操作。結(jié)果相同。 然后我又轉(zhuǎn)為如下定義: unsigned int testint; #define TESTCHARL (unsigned CHAR)testint #define TESTCHARH (unsigned CHAR)(testint >> 8) 然后進行操作,這次編譯直接無法通過,說 (unsigned CHAR)(testint >> 8) = (unsigned CHAR)(testint>>8)+1; 這一句有錯誤。 最后我是這樣定義的 union { unsigned int testint; unsigned CHAR testCHAR[2]; } *testtype; 這次的結(jié)果就和第一次相同了 我感覺很奇怪,不知道各位大蝦遇到這種情況是如何處理的?該如何正確定義一個int和兩個CHAR共用的空間且可通過修改CHAR的值改變int? |
| 2樓: | >>參與討論 |
| 作者: IceAge 于 2005/6/21 0:19:00 發(fā)布:
for(testadr = 0x0000;testadr < 0x7fff;testadr++) { *(CHAR*) testadr = 0; } |
|
| 3樓: | >>參與討論 |
| 作者: IceAge 于 2005/6/21 0:21:00 發(fā)布:
unsigned int testadr; |
|
| 4樓: | >>參與討論 |
| 作者: myway 于 2005/6/21 10:37:00 發(fā)布:
union |
|
| 5樓: | >>參與討論 |
| 作者: cucunum 于 2005/6/21 11:26:00 發(fā)布:
union已經(jīng)用過兩種了 另外to IceAge testadr++,一旦testadr是unsigned int,那么還是增2 ,沒有改進阿 我就是希望循環(huán)時能夠地址只增1,而地址又可以用int范圍表示 我想能不能把地址單獨賦一個量,地址增量的工作給另外一個CHAR變量完成,每個循環(huán)中重新給地址賦值。好像比較麻煩,試試吧 還是想把union的問題搞清楚,畢竟這個是最方便的 |
|
| 6樓: | >>參與討論 |
| 作者: smartbird 于 2005/6/21 11:43:00 發(fā)布:
沒有必要 |
|
| 7樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/21 13:30:00 發(fā)布:
需要這么復(fù)雜嗎? union是可以的,但樓主對union沒必要寫的這么復(fù)雜,直接用數(shù)組不該用結(jié)構(gòu)組合: union{ unsigned int x; unsigned CHAR.html">CHAR y[2]; } 更簡單的方法,只用CHAR定義,傳地址的時候,用強行轉(zhuǎn)換方式轉(zhuǎn)INT指針: (unsigned int *)pChar |
|
| 8樓: | >>參與討論 |
| 作者: cucunum 于 2005/6/21 14:26:00 發(fā)布:
如果地址只用CHAR定義 怎么能傳0x7fff這種數(shù)值呢? 我的程序是類似于這種 for(testadr = 0x0000;testadr < 0x7fff;testadr++) { code } 還請所長繼續(xù)明示 |
|
| 9樓: | >>參與討論 |
| 作者: LPC900 于 2005/6/21 15:59:00 發(fā)布:
我的程序 //定義 union UnionInt { int i; struct { CHAR H; CHAR L; }CharPart; }; //用法舉例 union UnionInt x; x.i; x.CharPart.H; //x的高字節(jié) x.CharPart.L; //x的低字節(jié) |
|
| 10樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/21 18:51:00 發(fā)布:
ramwrite(0x55aa,(unsigned int *)testadr); ramwrite(unsigned int x, unsigned int *p) { *p = x; } |
|
| 11樓: | >>參與討論 |
| 作者: 雷風(fēng) 于 2005/6/21 19:15:00 發(fā)布:
是所長沒有理解這個問題的意思,還是我沒有理解所長的意思? 樓主的問題并不是出在函數(shù)調(diào)用的類型轉(zhuǎn)換上,而是其地址必須能達到0x7fff這種數(shù)值,所長定義一個CHAR型的testadr,ramwrite倒是匹配了,問題是testadr應(yīng)該永遠無法增到0x7fff阿。 |
|
| 12樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2005/6/21 19:43:00 發(fā)布:
那你的問題就有意思了: 0x7fff時候,不管用什么方法,你寫整數(shù)進去100%不對,因為0x8000不存在。 是你想的太復(fù)雜了,復(fù)雜過頭了。 for(testadr = 0x0000;testadr < 0x7fff;testadr+=2) //*****->2 { ramwrite(0x55aa,testadr); } 你本意是不是這樣? |
|
| 13樓: | >>參與討論 |
| 作者: IceAge 于 2005/6/21 21:16:00 發(fā)布:
要明白 int 與 int* 的區(qū)別 int a; int* b; //假定指針為16-bit 的 integer a++; b++; // a 實際+1, b 實際 + sizeof(int) 這里為2 b = (int*) a; // 把 a 強制轉(zhuǎn)換為指針; ((CHAR*) b)++; //b 實際 + sizeof(CHAR) 這里為1 ((unsigned int) b)++; //b 實際 + 1 casting 與 union 都可以完成相同的功能, union 更安全, casting 更靈活. |
|
| 14樓: | >>參與討論 |
| 作者: cucunum 于 2005/6/21 23:14:00 發(fā)布:
IceAge講得很清楚 用指針用得多了 想當然把int數(shù)值++相成加2了,低級錯誤...... 多謝各位 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |