線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3035
推到 Plurk!
推到 Facebook!

請問有人看過PBYTE型態的變數嗎??

答題得分者是:JerryKuo
aredfish
一般會員


發表:47
回覆:41
積分:17
註冊:2002-12-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-08-15 08:29:59 IP:61.218.xxx.xxx 未訂閱
大家好,我有一支程式裡面大量用到了P開頭型態的變數,例如PBYTE,PVOID等等 根據Help裡的說明這是指標型態的unsigned char及void, 但是我無法理解這個意義. 另外,程式裡面也用到了 PBYTE pData = PVOID pBuffer; 這樣子的轉換 在這一部份我無法理解的是,這明明是兩種不同型別的轉換,為什麼組譯時不會出錯(原來的程式組譯不會錯,不過我如果把類似的邏輯寫到其他的程式裡面就會出現型別轉換的錯誤) 以上兩個問題煩請各位大大努力相告...萬分感謝
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-08-15 08:40:33 IP:203.73.xxx.xxx 未訂閱
引言: 大家好,我有一支程式裡面大量用到了P開頭型態的變數,例如PBYTE,PVOID等等 根據Help裡的說明這是指標型態的unsigned char及void, 但是我無法理解這個意義. 另外,程式裡面也用到了 PBYTE pData = PVOID pBuffer; 這樣子的轉換 在這一部份我無法理解的是,這明明是兩種不同型別的轉換,為什麼組譯時不會出錯(原來的程式組譯不會錯,不過我如果把類似的邏輯寫到其他的程式裡面就會出現型別轉換的錯誤) 以上兩個問題煩請各位大大努力相告...萬分感謝
aredfish 你好:
(1)「PBYTE」就是「BYTE*」,「PVOID」就是「VOID*」
(2)「VOID」在 C 裡面是指「Any type」,也就是可以代表任何的型態,所以
   「PVOID」代表指向任何型態的指標,因此你上面的程式碼在編譯的時候,當
   然是合法的語法
(3)你所說的類似邏輯是指什麼呢?? 是否舉一個明確的例子?? 

備註:
有關 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-08-15 09:14:15 IP:61.230.xxx.xxx 未訂閱
你好    1.我想是為讓程式更可讀性,看下面應該就比較好理解:
typedef byte  *PBYTE;
typedef void  *PVOID;
2.從上面的例子來看,PBYTE和PVOID都是指標型態,所以可以指 來指去,只是變數型態變了。
aredfish
一般會員


發表:47
回覆:41
積分:17
註冊:2002-12-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-08-15 11:26:18 IP:61.218.xxx.xxx 未訂閱
謝謝兩位的回答,不過我觀念還是有點模糊,我舉下面一個例子來看看 BYTE *pDATA 是不是就類似 PBYTE pDATA 兩個都是動態的陣列,但前者當引數 的時候用傳址呼叫(&pDATA),而後者只要直接傳遞變數名就好了. 另外,我程式中有一個按鈕,按鈕裡面什麼程式碼也沒有, 只有兩行 PVOID pBuffer; PBYTE pData = pBuffer; 這樣子編譯的話(BCB5.0)會告訴我Cannot convert 'void*'to'unsigned char' 這部分就是我所提到型別轉換的錯誤
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-08-15 11:38:36 IP:203.73.xxx.xxx 未訂閱
引言: 謝謝兩位的回答,不過我觀念還是有點模糊,我舉下面一個例子來看看 BYTE *pDATA 是不是就類似 PBYTE pDATA 兩個都是動態的陣列,但前者當引數 的時候用傳址呼叫(&pDATA),而後者只要直接傳遞變數名就好了. 另外,我程式中有一個按鈕,按鈕裡面什麼程式碼也沒有, 只有兩行 PVOID pBuffer; PBYTE pData = pBuffer; 這樣子編譯的話(BCB5.0)會告訴我Cannot convert 'void*'to'unsigned char' 這部分就是我所提到型別轉換的錯誤
aredfish 你好:
(1)「BYTE *pDATA」跟「PBYTE pDATA」這兩種寫法是一樣的,自然用法也一樣
(2)也許你可以把「PBYTE」「PVOID」看成一個較小的集合,及一個較大的集合
   如果要將較小的集合 assign 給較大的集合當然沒問題,如果要將較大的集
   合 assign 給較小的集合,當然會出問題 (像你舉的例子,就必須強制轉換
   型別 PBYTE pData=(PBYTE)pBuffer;)
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-08-15 11:41:39 IP:61.230.xxx.xxx 未訂閱
引言: 謝謝兩位的回答,不過我觀念還是有點模糊,我舉下面一個例子來看看 BYTE *pDATA 是不是就類似 PBYTE pDATA 兩個都是動態的陣列,但前者當引數 的時候用傳址呼叫(&pDATA),而後者只要直接傳遞變數名就好了. BYTE *pDATA 和 PBYTE pDATA 是一樣的,使用的方式是一樣的啊 另外,我程式中有一個按鈕,按鈕裡面什麼程式碼也沒有, 只有兩行 PVOID pBuffer; PBYTE pData = pBuffer; PBYTE pData = (PBYTE)pBuffer 這樣子編譯的話(BCB5.0)會告訴我Cannot convert 'void*'to'unsigned char' 這部分就是我所提到型別轉換的錯誤
系統時間:2024-06-24 21:34:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!