Re: [問題] 關於Class指標的觀念

看板C_and_CPP作者 (f0VMRgEBA)時間10年前 (2013/08/23 16:18), 編輯推噓14(140152)
留言166則, 15人參與, 最新討論串2/19 (看更多)
※ 引述《wope (獨立黑色色彩)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : GCC4.7.2 MinGW64 : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : NO : 問題(Question): : 想請問"寫法1"與"寫法2"的差別是什麼 : 寫法1: MF2KGMG_operator* GMG_ptr=(MF2KGMG_operator*) GMGID; : 寫法2: MF2KGMG_operator* GMG_ptr=(MF2KGMG_operator*)*GMGID; : 這是Modflow 的原始碼 : 下載時他的程式為"寫法2" : 但會出現waning: : cast from pointer to integer of different size [-Wpointer-to-int-cast] : 但 : 我改成"寫法1"時waning不見了 : 可是我不懂語法上的義意 : 問題如下 : (1)想請版上的高手這樣改裡面的值會不會一樣? : (2)語法上的義意差在哪裡? : __ : 其中 : GMGID與MF2KGMG_operator定義如下 : int* GMGID : typedef struct MF2KGMG_operator : { : r_data rd; /* Vector Data */ : r_vector r; /* Residual */ : r_vector z; /* Head-Change */ : GEN_operator CCFD; /* Cell-Centered Finite Difference Matrix */ : GEN_operator CCFDMG; /* Multilevel CCFD Operator */ : GEN_operator PCG; /* Preconditioned Conjugate Gradient */ : double w; /* Relaxation Parameter */ : CCFD_operator *CCFD_ptr; /* Pointer to access CCFD operator */ : }MF2KGMG_operator; : MF2KGMG_operator* GMG_ptr=(MF2KGMG_operator*)*GMGID; : MF2KGMG_operator* GMG_ptr=(MF2KGMG_operator*) GMGID; 我去找到了似乎是你的程式的來源 這裡的使用情境看起來 GMGID 所指向的 int 是個類似 HANDLE 之類的存在 那個 int 其實是一個 MF2KGMG_operator * 可以參看 MF2KGMG_ALLOCATE 的最後 就在你問的程式的上面幾行 (#153) *GMGID = (int)GMG_ptr; 所在做的就是這麼回事 MF2KGMG_ALLOCATE 的 GMGID 是個 "call by address" #153 就是在把做出來的東西給"回傳"回去 你問的 MF2KGMG_FREE 的這個 GMGID 其實也是一樣 所以函式裡必須要先 dereference 才能得到實際的 HANDLE 因此寫法 2 才是正確的 寫法 1 會把那個指向 HANDLE 的指標解釋成 MF2KGMG_operator 的指標 這是錯誤的 如果要消掉這個 warning 的話 照理說中間多轉一層 (intptr_t) 就可以了 不過這支程式這麼做的地方還不少 所以...我覺得放著也沒差就是了 -- LPH [acronym] = Let Program Heal us -- New Uncyclopedian Dictionary, Minmei Publishing Co. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 210.69.49.38

08/23 17:26, , 1F
感謝~~ 了解了
08/23 17:26, 1F

08/23 21:27, , 2F
其實不管用那一種寫法,編譯器只要遇到強制轉型動作的話
08/23 21:27, 2F

08/23 21:28, , 3F
會假設你知道目前正在做什麼事,所以編譯器不會出現錯誤而是
08/23 21:28, 3F

08/23 21:30, , 4F
顯示警告訊息,這個例子的 GMGID 與 MF2KGMG_operator* 都是
08/23 21:30, 4F

08/23 21:33, , 5F
32 bit 指標,它可以指向任何型態物件位址,遇到了強制轉型的
08/23 21:33, 5F

08/23 21:38, , 6F
話,編譯器仍會完成轉型動作,但結果是未知的.
08/23 21:38, 6F

08/24 14:48, , 7F
強制轉型不一定不會有 Error. 這裡是因為是指標.....
08/24 14:48, 7F

08/24 14:57, , 8F
原po用的不是mingw64嗎?那怎麼會是32bit pointer?
08/24 14:57, 8F

08/24 21:25, , 9F
這裡指的是指標的強制轉型寫法不管那一種編譯器仍會完成轉
08/24 21:25, 9F

08/24 21:26, , 10F
型動作.
08/24 21:26, 10F

08/24 21:28, , 11F
要判斷指標是不是 32 bit 可以使用 sizeof(void*) 得到結果
08/24 21:28, 11F

08/24 22:40, , 12F
樓上大大可示範一下怎麼把指標直接轉 double ?
08/24 22:40, 12F

08/24 22:41, , 13F
還是可以教教我怎麼在一般情況下讓指標轉成指標有警告訊息?
08/24 22:41, 13F

08/24 22:49, , 14F
我大概知道 gcc 怎麼開, 但是 Visual C++ 一直找不到~
08/24 22:49, 14F

08/24 23:38, , 15F
通常要刻意去寫「從語意上來看不可行,但實作上可行」的敘述
08/24 23:38, 15F

08/24 23:39, , 16F
屬高階程式設計技巧,要怎麼應用端看目的為何,以這個例子來
08/24 23:39, 16F

08/24 23:40, , 17F
喔喔. 那可以示範一下嗎?
08/24 23:40, 17F

08/24 23:40, , 18F
看, GMGID 它是 int 型態,但實際上是 MF2KGMG_operator*
08/24 23:40, 18F

08/24 23:41, , 19F
示範一下怎麼讓你的 Visual C++ 將 int* 轉成 double 可以嗎?
08/24 23:41, 19F

08/24 23:41, , 20F
用了強制轉型編譯器就有警告訊息就是一個例子.
08/24 23:41, 20F

08/24 23:42, , 21F
請問你的目的是?
08/24 23:42, 21F

08/24 23:42, , 22F
因為你說指標都能轉. 事實上就是不行
08/24 23:42, 22F

08/24 23:44, , 23F
如果是指標轉指標. 一般情況下也不會有警告.
08/24 23:44, 23F

08/24 23:45, , 24F
你可以注意看這個例子, *GMGID 轉成 MF2KGMG_operator 物件
08/24 23:45, 24F

08/24 23:45, , 25F
不就有警告訊息了嗎
08/24 23:45, 25F

08/24 23:45, , 26F
"指標的強制轉型寫法不管那一種編譯器仍會完成轉型"
08/24 23:45, 26F

08/24 23:46, , 27F
轉成 MF2KGMG_operator 指標編譯器會給你警告訊息
08/24 23:46, 27F

08/24 23:47, , 28F
int a; (double)&a; 會過嗎?
08/24 23:47, 28F

08/24 23:48, , 29F
GMGID 就不是指標. 你在說什麼.....
08/24 23:48, 29F

08/24 23:49, , 30F
Sorry 我氣到了. 說錯化.
08/24 23:49, 30F

08/24 23:50, , 31F
我是說 *GMGID 不是指標.
08/24 23:50, 31F

08/24 23:54, , 32F
GMGID 它是 int *
08/24 23:54, 32F

08/24 23:55, , 33F
這位大大您誤會我的意思了,我是指「利用指標變數可以指向
08/24 23:55, 33F

08/24 23:55, , 34F
任何型態的物件」的強制轉型.
08/24 23:55, 34F

08/24 23:58, , 35F
那哪來你說的警告,算了。不要誤人子弟
08/24 23:58, 35F

08/25 00:01, , 36F
這個例子難道你看不出來有什麼變化嗎?
08/25 00:01, 36F

08/25 00:03, , 37F
哈哈哈哈哈,你以為指標硬轉指標永遠合法嗎?
08/25 00:03, 37F

08/25 00:04, , 38F
所以才會有警告訊息的用意,這樣您懂了嗎?
08/25 00:04, 38F

08/25 00:09, , 39F
是是是,int 是指標,我懂了!
08/25 00:09, 39F
還有 87 則推文
08/26 22:46, , 127F
補充一下,Feis是指有些address大到存不進正常的整數type
08/26 22:46, 127F

08/26 23:13, , 128F
GNUCCC: 不是所有記憶體模型都是 flat 的
08/26 23:13, 128F

08/26 23:15, , 129F
標準不把話說死就是要保留高階語言的彈性. 這是C語言特性
08/26 23:15, 129F

08/26 23:34, , 130F
記憶體模型只是關係到程式的活動範圍,flat 只能在 Windows
08/26 23:34, 130F

08/26 23:39, , 131F
的保護模式下運行,它只有一個區段,裡面保存程式區段與資料
08/26 23:39, 131F

08/26 23:40, , 132F
區段也包含使用的資源,它能存取的範圍可以是整部電腦實體記
08/26 23:40, 132F

08/26 23:41, , 133F
憶體或者是透過作業系統的虛擬記憶體來決定存取的範圍,但不
08/26 23:41, 133F

08/26 23:43, , 134F
論是使用那一種記憶體模型,CPU 都是使用所謂的「區段值」與
08/26 23:43, 134F

08/26 23:46, , 135F
「位移值」的方式來存取記憶體,CPU 本身的暫存器都只能儲存
08/26 23:46, 135F

08/26 23:48, , 136F
整數而已,只有一個例外就是 CPU 本身內含的 FPU 暫存器才能
08/26 23:48, 136F

08/26 23:50, , 137F
儲存 IEEE 浮點數,CPU 在做間接取值的時候也都是使用一般用
08/26 23:50, 137F

08/26 23:53, , 138F
途的暫存器,內含的都只有整數而已,各位可以試看看這個 :
08/26 23:53, 138F

08/26 23:53, , 139F
講 C 語言可以扯到暫存器. G大也是奇葩
08/26 23:53, 139F

08/26 23:54, , 140F
你要這麼說全部格式都是整數阿. 廢話.
08/26 23:54, 140F

08/26 23:54, , 141F
在命令提示字元下輸入 : debug 然後按 Enter
08/26 23:54, 141F

08/26 23:55, , 142F
不巧影片、照片. 哇! 連我的 Word 檔都是整數型態.
08/26 23:55, 142F

08/26 23:55, , 143F
然後按 r, 可以看到 CPU 全部的暫存器 16 進元的數值
08/26 23:55, 143F

08/26 23:55, , 144F
真是太神奇了, 傑克!
08/26 23:55, 144F

08/26 23:56, , 145F
學過電腦的人都應該知道電腦本身只有 0 與 1 的數字,對吧?
08/26 23:56, 145F

08/26 23:56, , 146F
可惜你正在使用的cpu是使用 page number 跟 page offset
08/26 23:56, 146F

08/26 23:56, , 147F
(飄走
08/26 23:56, 147F

08/26 23:57, , 148F
我剛試過, Windows 7 好像不支援 debug 指令...
08/26 23:57, 148F

08/27 00:01, , 149F
F 大大,您講到重點了,全部格式都是整數,所以記憶體位址也不
08/27 00:01, 149F

08/27 00:01, , 150F
例外不是嗎?
08/27 00:01, 150F

08/27 00:03, , 151F
是是是! 您說得對! 反正不是 C 語言嘛
08/27 00:03, 151F

08/27 00:06, , 152F
我剛說的這些理論只是要說明為何記憶體位址是整數而不是其
08/27 00:06, 152F

08/27 00:08, , 153F
他非整數的表示方式,跟語言無關,必竟不管使用那一種語言最
08/27 00:08, 153F

08/27 00:09, , 154F
後都會轉為機器碼,如此而已.
08/27 00:09, 154F

08/27 00:11, , 155F
是阿 是阿 我們學機器語言就好了嘛. 哎呀呀. C 落伍了
08/27 00:11, 155F

08/27 00:12, , 156F
樓上XDDDD
08/27 00:12, 156F

08/27 00:13, , 157F
Page number 與 Page Offset 是屬於虛擬記憶體的部份,可能
08/27 00:13, 157F

08/27 00:13, , 158F
讓我想到以前直接算好IEEE754 的我要的float的表示法in
08/27 00:13, 158F

08/27 00:13, , 159F
hex 然後直接用mov塞進記憶體 XD
08/27 00:13, 159F

08/27 00:13, , 160F
要另外討論了.
08/27 00:13, 160F

08/27 00:15, , 161F
我要改行不要教 C 語言了. (失業中)
08/27 00:15, 161F

08/27 00:18, , 162F
Feis : 怎麼說呢?
08/27 00:18, 162F

08/27 00:18, , 163F
我們都改學brainfuck八 反正都turing complete
08/27 00:18, 163F

08/27 00:21, , 164F
我怕我寫一寫會罵髒話
08/27 00:21, 164F

08/27 00:21, , 165F
噗...
08/27 00:21, 165F

08/27 23:06, , 166F
寫 brainfuck 很好玩啊!
08/27 23:06, 166F
文章代碼(AID): #1I5nhch_ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1I5nhch_ (C_and_CPP)