音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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 欄目:單片機
關(guān)于讓一個int型和兩個CHAR型共用一個空間的問題
我編寫一個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
for(testadr = 0x0000;testadr < 0x7fff;testadr++)
{
    *(CHAR*) testadr = 0;
}

3樓: >>參與討論
IceAge
unsigned int testadr;
 
4樓: >>參與討論
myway
union
 
5樓: >>參與討論
cucunum
union已經(jīng)用過兩種了
另外to IceAge

testadr++,一旦testadr是unsigned int,那么還是增2 ,沒有改進阿

我就是希望循環(huán)時能夠地址只增1,而地址又可以用int范圍表示

我想能不能把地址單獨賦一個量,地址增量的工作給另外一個CHAR變量完成,每個循環(huán)中重新給地址賦值。好像比較麻煩,試試吧

還是想把union的問題搞清楚,畢竟這個是最方便的 

6樓: >>參與討論
smartbird
沒有必要
 
7樓: >>參與討論
農(nóng)民講習(xí)所
需要這么復(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
如果地址只用CHAR定義
怎么能傳0x7fff這種數(shù)值呢?

我的程序是類似于這種

for(testadr = 0x0000;testadr < 0x7fff;testadr++)
         {          code         }


還請所長繼續(xù)明示

9樓: >>參與討論
LPC900
我的程序
//定義
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í)所
ramwrite(0x55aa,(unsigned int *)testadr);
ramwrite(unsigned int x, unsigned int *p)
{
    *p = x;
}

11樓: >>參與討論
雷風(fēng)
是所長沒有理解這個問題的意思,還是我沒有理解所長的意思?
樓主的問題并不是出在函數(shù)調(diào)用的類型轉(zhuǎn)換上,而是其地址必須能達到0x7fff這種數(shù)值,所長定義一個CHAR型的testadr,ramwrite倒是匹配了,問題是testadr應(yīng)該永遠無法增到0x7fff阿。

12樓: >>參與討論
農(nóng)民講習(xí)所
那你的問題就有意思了:
0x7fff時候,不管用什么方法,你寫整數(shù)進去100%不對,因為0x8000不存在。
是你想的太復(fù)雜了,復(fù)雜過頭了。

for(testadr = 0x0000;testadr < 0x7fff;testadr+=2)  //*****->2
{
    ramwrite(0x55aa,testadr);
}

你本意是不是這樣?




13樓: >>參與討論
IceAge
要明白 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
IceAge講得很清楚
用指針用得多了

想當然把int數(shù)值++相成加2了,低級錯誤......

多謝各位

參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
《MCU非典型應(yīng)用與技巧解析》選題之憂
實驗室要買仿真器,麻煩大家給我推薦一下。
求助單片機簡單實例小程序
ARM板,要是有人共同做,可以降低成本.奉送光盤(全部源文件).
電磁震動誰做過?或者知道原理阿:)指點一下。
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號