作者查詢 / GNUGCC

總覽項目: 發文 | 留言 | 暱稱
作者 GNUGCC 在 PTT 全部看板的留言(推文), 共704則
限定看板:全部
看板排序:
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]37 留言, 推噓總分: +1
作者: LPH66 - 發表於 2013/09/08 01:12(10年前)
3FGNUGCC:LPH66 大大,您的這一行 :09/08 01:32
4FGNUGCC:operator <<() 的輸出在列印 ptr 指標內容...請問這樣做的09/08 01:35
5FGNUGCC:意義是?09/08 01:35
7FGNUGCC:我很好奇的是您希望它做什麼?就以指向類別成員函式的指標來09/08 01:41
8FGNUGCC:說的話?09/08 01:41
9FGNUGCC:還有就是您的 double 資料也是用它來輸出,這個意義是什麼呢09/08 01:45
12FGNUGCC:「印出指標內容」跟「印出指標指向的內容」,您是那一個呢?09/08 01:51
13FGNUGCC:看起來比較像是「印出指標指向的內容」耶...09/08 01:54
21FGNUGCC:我在前面有說過編譯器的實作技術會有不同,LPH66 大不知道是09/08 10:16
22FGNUGCC:用那種的編譯器導致看到了「包裝後的結果」,不過我在用09/08 10:16
23FGNUGCC:Visual C++ 2008 以 Debug 模式啟動可以很清楚看到函式位址09/08 10:18
24FGNUGCC:,相信這方面 descent 大也有看過,並且也用了特殊的轉換方式09/08 10:21
25FGNUGCC:取得位址並可呼叫到該函式,即然有部份人覺得指標可能不是存09/08 10:22
26FGNUGCC:位址那也無仿,必竟這個是編譯器的職責跟使用者無直接關連,09/08 10:24
27FGNUGCC:因為我在前面也說過,「不管編譯器實作技術是什麼,都不會影09/08 10:25
28FGNUGCC:響程式執行結果」.09/08 10:25
31FGNUGCC:F 大可以用 Debug 模式啟動作細部觀察可以發現不一樣的東西09/08 10:41
33FGNUGCC:當然有關係,您看了就知道.09/08 10:45
35FGNUGCC:好吧,那就看得懂的人就學到了一門課,看不懂的人也無仿,只要09/08 13:47
36FGNUGCC:編譯器不要看不懂就好了,這部份必竟還是留給系統程式設計的09/08 13:48
37FGNUGCC:人去理解才是適合的門檻,有興趣的人可以自行研究.09/08 13:49
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]42 留言, 推噓總分: +4
作者: descent - 發表於 2013/09/07 09:40(10年前)
2FGNUGCC:看完 descent 大大公布輸出結果不知有何感想?09/07 23:09
5FGNUGCC:此話怎說?為何會覺得我主張相矛盾?09/07 23:46
8FGNUGCC:我在前面已說過,各位只是看到包裝後的結果,但實際上編譯器09/08 00:32
9FGNUGCC:還是把記憶體位址儲存在指標內,如果您反駁這項理論,那就請09/08 00:33
10FGNUGCC:您說說反對的理由是?09/08 00:33
14FGNUGCC:我覺得做為一個學術論者,應該有本身的修養才是,而不是把精09/08 00:49
15FGNUGCC:神用在無用的嘴炮上.09/08 00:50
17FGNUGCC:否則只是在「原地踏步而不知為何其所然」.09/08 00:51
19FGNUGCC:若有問題請以「不恥下問」的態度來學習.09/08 00:52
22FGNUGCC:Feis 大大,您覺得這麼多的問題我應該先回答那一個?09/08 00:55
24FGNUGCC:我覺得很奇怪的是,我只是單純的在說明一件事情,但為何會有09/08 00:57
25FGNUGCC:人喜歡用放大鏡做過度的解讀以致於今天這種場面.09/08 00:58
29FGNUGCC:呵呵~或許是吧.09/08 01:01
31FGNUGCC:您剛問「不透過整數去定義浮點數」,這個論點是您個人?09/08 01:04
34FGNUGCC:那您的問題跟想表達的事情是兩回事吧09/08 01:07
36FGNUGCC:「浮點數就是整數」這句話有誰說過?09/08 01:08
37FGNUGCC:第一個,您的問題答案是沒人有這種論點而且我也不知道為何您09/08 01:10
38FGNUGCC:會有這個問題,第二,浮點數格式跟整數格式是不相同的.09/08 01:11
39FGNUGCC:F 大,您即然否定「一定」這個定義,那您可說說指標在正常的09/08 01:13
40FGNUGCC:使用下除了記憶體位址以外還能夠存什麼呢?09/08 01:14
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]20 留言, 推噓總分: +2
作者: descent - 發表於 2013/09/06 15:16(10年前)
3FGNUGCC:descent 大大,我想有人還是不清楚為何結果如此這樣,請您說09/06 23:43
4FGNUGCC:說有何高見吧^^09/06 23:44
10FGNUGCC:F 大大,您說的指標分兩部份是指?09/07 00:17
12FGNUGCC:那「浮點數也是整數」,這個好像不是我的邏輯耶^^09/07 00:18
14FGNUGCC:一個一個慢慢來,一個問題未解又提另一個問題,descent 大大,09/07 00:21
15FGNUGCC:您怎麼說?09/07 00:21
17FGNUGCC:我該講的都講了,如果不懂的請看前面我討論過的內容,至於還09/07 00:22
18FGNUGCC:是不懂為何請教 descent 大大吧^^09/07 00:23
Nani signs new deal
[ ManUtd ]31 留言, 推噓總分: +25
作者: uranusjr - 發表於 2013/09/05 22:21(10年前)
1FGNUGCC:void main(void) 的寫法是可行的唷^^08/10 00:59
2FGNUGCC:雖然這個寫法較傳統,但是語法與文法都正確哦^^08/10 02:16
3FGNUGCC:目前我使用的 Visual C++ 都接受 void main(void) 與08/10 20:18
4FGNUGCC:int main(void),各位可以把 C++ 專案改成原生 C++ 類型來08/10 20:19
5FGNUGCC:用 void main(void) 來寫發現也可通過編譯.08/10 20:21
6FGNUGCC:這個就是 Visual C++ 的彈性.08/11 20:23
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]5 留言, 推噓總分: 0
作者: descent - 發表於 2013/08/30 11:54(10年前)
1FGNUGCC:這個敘述 :08/31 21:36
2FGNUGCC:(*(void(*)())(func_addr))();08/31 21:49
3FGNUGCC:我用 Visual C++ 2008 可以正常執行.08/31 21:50
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]0 留言, 推噓總分: 0
作者: xatier - 發表於 2013/08/27 23:23(10年前)
1FGNUGCC:那就換您說說看您的觀點如何?08/27 23:00
5FGNUGCC:那請問「指標不等同無號正整數」的觀點為何?08/27 23:16
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]176 留言, 推噓總分: +18
作者: littleshan - 發表於 2013/08/27 22:23(10年前)
9FGNUGCC:F 大大,我說的 0 與 1 跟「正整數」是無關連的,而且我也說08/27 22:47
10FGNUGCC:「它會轉呼叫輸出 BOOL 型態數值」的函式,對吧?08/27 22:47
11FGNUGCC:我不知道 F 大大去扭曲我說的話的用意何在?08/27 22:48
17FGNUGCC:你說我把東西都當整數,這句話就是在扭曲了.08/27 22:51
20FGNUGCC:我前面說了那麼多,沒想到您還是不明白08/27 22:53
22FGNUGCC:我很好奇的是,討論記憶體的問題為何要跳 Tone 到檔案上呢?08/27 22:56
25FGNUGCC:這樣偏離討論主題不知道您的用意何在?08/27 22:56
26FGNUGCC:那就換您說說看您的觀點如何?08/27 23:00
30FGNUGCC:那請問「指標不等同無號正整數」的觀點為何?08/27 23:16
35FGNUGCC:天啊!原來您的理解是在於它的「型態」,而不是它的特性...08/27 23:21
36FGNUGCC:所以我在前才會說您的誤會可深了...我來從沒有說它是「無號08/27 23:22
37FGNUGCC:正整數型態」,沒想到您的理解跟我的不同,我終於知道了.08/27 23:22
44FGNUGCC:L 大的例子是因為他的方法用錯了,至於怎麼用請看前面記錄08/27 23:43
45FGNUGCC:吧.08/27 23:44
60FGNUGCC:L 大,我想您大概沒看懂這句話的意思,我說的「記憶體位址永08/28 22:05
61FGNUGCC:遠都是無號整數型態」跟程式語言使用的資料型態無相關,請不08/28 22:08
62FGNUGCC:要移花接木.08/28 22:08
66FGNUGCC:LPH66 大大的問題很好,會問到「什麼樣子的特性」,總比某些08/29 20:21
67FGNUGCC:人刻意模糊討論主題.08/29 20:22
68FGNUGCC:我之前所說的「記憶體位址永遠都是無號整數型態」,是指記憶08/29 20:23
69FGNUGCC:體位址「編號」的特性,例如 1 條 8 G 記憶體,它的編號會從08/29 20:25
70FGNUGCC:0 ~ FFFFFFFFFFFFFFFF,這個也就是它的使用範圍,從這個數字08/29 20:28
71FGNUGCC:的特性來看它就是一個無負號的「正整數」,至於作業系統要怎08/29 20:29
72FGNUGCC:麼使用它完全根據作業系統特性決定實際能使用的範圍,但不管08/29 20:30
73FGNUGCC:使用範圍是多少,它最終都還是一個整數而已,那些位址編號就08/29 20:31
74FGNUGCC:是我們所熟知的「記憶體位址」,我們使用的指標就是儲存這種08/29 20:32
75FGNUGCC:類型的資料,不管它是屬於那一種,甚至是 void*,它儲存的都是08/29 20:33
76FGNUGCC:記憶體位址,各位應該常看到 16 進位的指標變數對吧?或者是08/29 20:34
77FGNUGCC:前幾位網友利用「強制轉型」的方式讓編譯器用不同的型態對08/29 20:37
78FGNUGCC:這個位址做不同的解讀,或甚至把它轉換成正整數型態也會發現08/29 20:39
79FGNUGCC:像是 void* 轉成 int 型態,可以發現這 2 個變數內容一樣,例08/29 20:41
80FGNUGCC:如 :08/29 20:41
81FGNUGCC:void *pv; // 這個系統會隨意給一個值08/29 20:41
82FGNUGCC:上面敘述改成這樣 :08/29 20:45
83FGNUGCC:void *pv = malloc(100);08/29 20:46
84FGNUGCC:int Address = (int)pv; // 把指標型態轉成整數08/29 20:47
85FGNUGCC:cout << pv << endl << Addres;08/29 20:47
86FGNUGCC:會發現這 2 個變數儲存的內容一模一樣,只是進位表示的方式08/29 20:48
87FGNUGCC:不同,這個就是我之前在跟大家討論的觀念.08/29 20:49
89FGNUGCC:s 大大,您說的是資料型態本身的大小,每一種編譯器給予不同08/29 20:54
90FGNUGCC:的型態會有不同的實作方式,但「資料型態大小」不管是多少它08/29 20:56
91FGNUGCC:還是只儲存記憶體位址而已,並不影響程式執行結果.08/29 20:56
93FGNUGCC:azureblaze : 怎麼說呢?08/29 21:12
94FGNUGCC:不然您覺得它應該還有儲存什麼呢?08/29 21:16
98FGNUGCC:這樣講好了,當您輸出這個「指向成員函式的指標」,請問您看08/29 21:22
99FGNUGCC:到了什麼?08/29 21:22
101FGNUGCC:先不管它的資料型態多大,您只要說出螢幕上看到的.08/29 21:23
103FGNUGCC:azureblaze : 那您可能沒看到前幾位網友的方法,請往前看記08/29 21:25
104FGNUGCC:錄唷,那裡都有詳細的說明.08/29 21:25
106FGNUGCC:F 大大,這裡純屬討論區,不是嘴炮討論區,請維持該區的品質,08/29 21:29
107FGNUGCC:謝謝!08/29 21:29
111FGNUGCC:您還沒告訴我您看到了什麼08/29 21:31
113FGNUGCC:我先問的問題,應該是您先要回答我吧08/29 21:36
115FGNUGCC:前面網友提供的方法您用過了嗎?08/29 21:53
117FGNUGCC:azureblaze : 這位大大,如果您有問題,請注意您的發問態度,08/29 22:01
118FGNUGCC:用這種口氣在質問不如自已找答案吧.08/29 22:03
141FGNUGCC:我現在才知道原來有些人喜歡移花接木.08/30 00:12
142FGNUGCC:W 大大,您如果不懂某些方面的理論可以看其他主題的文章.08/30 00:13
143FGNUGCC:這裡是屬於程式設計討論區,不是嘴炮專用討論區.08/30 00:14
144FGNUGCC:可以建議版主喜歡刻意去謀黑言論的人勿讓他再進來,以免破壞08/30 00:16
145FGNUGCC:討論區的品質.08/30 00:16
156FGNUGCC:這些問題可以去看 descent 大大發表的討論文章,裡面都有說09/04 19:45
157FGNUGCC:明,不懂理論的請以「不恥下問」的態度來發問,謝謝.09/04 19:46
161FGNUGCC:descent 大大的 code 我在 Visual C++ 2008 是沒問題的唷^^09/05 23:08
162FGNUGCC:不過不確定其他編譯器是否有問題,不過看過了 LPH66 大大給09/05 23:09
163FGNUGCC:的範例程式後發現在 Visual C++ 2008 應該是不可行,至於為09/05 23:10
164FGNUGCC:什麼我想大家都知道了,如果還是不懂為何請自行發問,至於大09/05 23:13
165FGNUGCC:家一直對於輸出結果倒底是什麼「數」可以去看 descent 大大09/05 23:17
166FGNUGCC:使用 Visual C++ 2010 與 GCC 編譯器輸出的結果應該能推測09/05 23:18
167FGNUGCC:為何輸出的結果它的「特性」會相差很大了.09/05 23:19
168FGNUGCC:本人再次強調,我討論的重點是在於記憶體位址的「特性」,跟09/05 23:22
169FGNUGCC:編譯器實作的技術並無直接關連,因為不管實作技術為何,CPU09/05 23:23
170FGNUGCC:永遠都只使用「記憶體位址」在存取資料,各位只是看到表面上09/05 23:26
171FGNUGCC:被包裝後的結果,如此而已.09/05 23:29
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]204 留言, 推噓總分: +14
作者: littleshan - 發表於 2013/08/26 23:57(10年前)
1FGNUGCC:看來各位好像不太能理解其中的道理,各位要記得,記憶體位址08/26 20:02
2FGNUGCC:永遠都是「無號數整數型態」,float 與 double 是屬於實數型08/26 20:03
5FGNUGCC:記憶體位址對任何機器來說都是屬於連續的位址編號,並不會有08/26 21:24
6FGNUGCC:所謂的違反問題,就好像住家地址不可能以自已的姓名代表一樣08/26 21:25
11FGNUGCC:其實這個例子滿有趣的,可以試看看這個 :08/27 01:01
12FGNUGCC:cout << &A::func;08/27 01:03
13FGNUGCC:會發現什麼都沒有,可以思考看看為什麼會這樣.08/27 01:04
14FGNUGCC:L 大大,一個大陣列的記憶體位址是不是連續的您應該知道吧?08/27 01:21
16FGNUGCC:Feis : 此話怎說?08/27 01:29
20FGNUGCC:L 大大,竟然您提出了問題,但您確定有思考過這個問題為什麼08/27 01:42
21FGNUGCC:會發生嗎?如果不思考而直接提問想要對方自圓其說,這樣說好08/27 01:43
23FGNUGCC:像不符合事實吧?08/27 01:44
24FGNUGCC:如果「知其然,並不知其所然」,這是每個人的必經之路,唯有抱08/27 01:46
25FGNUGCC:著一顆學習的心態才能使自已成長.08/27 01:46
27FGNUGCC:在我的電腦上,如果要輸出「類別內的函式或是資料成員」的08/27 02:55
28FGNUGCC:位址,有可能會看到不正確的結果,如果以啟動 Debug 模式,可08/27 02:56
29FGNUGCC:以看到 p 的確是有位址資料,但輸出是 0 或是 1,顯然這個跟08/27 02:57
30FGNUGCC:編譯器實作有關係,所以 p 並不是沒有資料,而是被編譯器隱藏08/27 02:58
31FGNUGCC:起來不讓您看到,為什麼會這樣說呢?當編譯器遇到這個敘述 :08/27 03:00
32FGNUGCC:void(A::*pv)(void) = &A::func;08/27 03:04
33FGNUGCC:cout << pv; // 這個敘述無義意08/27 03:05
34FGNUGCC:我用 Visual C++ 2008 編譯器對應策略是 :08/27 03:06
35FGNUGCC:取得 func() 函式的位址,再來就是比對數值是否為 008/27 03:08
36FGNUGCC:然後接著直接輸入數字 108/27 03:09
37FGNUGCC:抱歉!是輸出數字 108/27 03:09
38FGNUGCC:我的理解是 : 因為這個數字並不是 func() 函式位址,當然08/27 03:11
39FGNUGCC:編譯器也就無法讓您做所謂的「強制轉型」了.08/27 03:12
46FGNUGCC:我要您思考的是,為什麼遇到這個敘述即使用了「強制轉型」仍08/27 08:56
47FGNUGCC:無法轉換?而不是編譯器的實作原因為何,如果今天這個 pv 是08/27 08:57
51FGNUGCC:指向一般資料或是函式位址,編譯器就會做轉換?08/27 09:00
52FGNUGCC:我想要說的是,L 大大問的問題本身就違反了 C++ 規則,所以08/27 09:04
53FGNUGCC:編譯器的對應策略就是我上面說的那樣,我說過「語意上不可行08/27 09:06
54FGNUGCC:,實作上可行」的就是這個例子,您永遠看到都只是 1 而已,對08/27 09:07
56FGNUGCC:編譯器來說已實作出結果了,但這會是您想要的嗎?08/27 09:07
59FGNUGCC:F 大大,難道您還不知道答案嗎?08/27 09:11
61FGNUGCC:即然您要問我輸出結果不是 1 的例子,像這樣 :08/27 09:15
62FGNUGCC:void(*A::pv)(void) = 0;08/27 09:16
63FGNUGCC:cout << pv;08/27 09:16
64FGNUGCC:不知道這樣清楚了嗎?08/27 09:16
68FGNUGCC:今天這個例子來看的話,編譯器已遇到「違反 C++ 規則,原屬語08/27 09:19
71FGNUGCC:意上不可行,但編譯器有內定的演算法」,所以編譯器並不會出08/27 09:21
72FGNUGCC:現預期結果.08/27 09:21
74FGNUGCC:這個例子是在討論「違反 C++ 規則那一條,還是無法做強制轉08/27 09:22
75FGNUGCC:型的原因?」,請 F 大大不模糊焦點了.08/27 09:23
79FGNUGCC:呵呵...本人並沒有「救援」的想法,只是在說明事實.08/27 09:28
83FGNUGCC:為何輸出 1 我在前面已說過了,請往回看記錄唷...08/27 09:43
84FGNUGCC:而且 F 大大已說到答案了,就是因為「C++ 的標準」,導致08/27 09:44
85FGNUGCC:L 大大的例子無法使用強制轉型,這樣夠清楚了吧?08/27 09:45
87FGNUGCC:所以現在是在「考我」?08/27 09:50
89FGNUGCC:「為何不能使用強制轉型」,與「違反 C++ 規則那一條」應該08/27 09:52
90FGNUGCC:是分開討論的主題吧,F 大大請不要再模糊焦點了.08/27 09:53
96FGNUGCC:原 po 的問題我已說出答案了,至於 F 大大的問題,編譯器只是08/27 10:14
97FGNUGCC:轉呼叫「能輸出 BOOL 型態數值」的函式,所以 CaptainH 大大08/27 10:18
98FGNUGCC:您認為這樣編譯器會給您轉嗎?08/27 10:19
99FGNUGCC:C++ 規則記錄的是語法的使用規則與文法的正確性,並不包含08/27 10:20
101FGNUGCC:「電腦硬體規格」,記憶體位址為什麼要使用無號整數可以看08/27 10:21
102FGNUGCC:我在其他討論區說明的.08/27 10:22
105FGNUGCC:這個問題很有趣,因為這是編譯器遵循 C++ 規則所看到的結果.08/27 10:29
111FGNUGCC:為何 &A::func 看不到函式的位址可以往前看記錄唷...08/27 10:33
112FGNUGCC:我目前能理解的是,這個可能跟本身區段的分配有關係,因為對08/27 10:37
113FGNUGCC:一般的資料或是函式而言,都有明確的區段所在位置,各位要知08/27 10:39
114FGNUGCC:道一個完整的程式有所謂的程式區段與資料區段跟堆疊區段,那08/27 10:40
115FGNUGCC:C++ class 的資料排列方式或許跟一般資料的排列大不相同,08/27 10:41
116FGNUGCC:一般的函式在程式區段,變數是在資料區段,呼叫函式的過程就08/27 10:43
117FGNUGCC:因為參數的傳遞方式而決定要不要使用堆疊區段,但 C++ class08/27 10:44
118FGNUGCC:是屬於「資料型態」類型的變數,編譯器或許把它放在資料區段08/27 10:45
119FGNUGCC:內,但因為裡面包含了函式,編譯器絕不可能把函式也放在資料08/27 10:46
120FGNUGCC:內,或許在程式區段內儲存類別的成員函式,編譯器也許可能用08/27 10:47
122FGNUGCC:了一個「指向程式區段」指標儲存這個函式的位址,有點類似08/27 10:50
123FGNUGCC:虛擬函式的技術但不完全相同,所以應該就能理解為何 C++ 規08/27 10:55
124FGNUGCC:則為何要這樣做了...這是我個人的推斷囉.08/27 10:55
132FGNUGCC:看前面的記錄可以知道結果唷08/27 14:08
133FGNUGCC:L 大大,您可以利用下面這個敘述 :08/27 14:11
134FGNUGCC:void(A::*pv)(void) = &A::func;08/27 14:11
135FGNUGCC:利用 Debug 模式觀看 pv 變數值,那個記憶體位址就是 func()08/27 14:12
136FGNUGCC:函式的位址,不過因為 C++ 規格的關係,編譯器把它隱藏了,只08/27 14:13
138FGNUGCC:能透過 Debug 的方法來看到,但編譯器仍完成了轉型,但結果是08/27 14:13
140FGNUGCC:1,這個就是編譯器內部的演算法策略.08/27 14:14
144FGNUGCC:板主所言甚是,但電腦硬體架構是一成不變的,並不會換了軟體08/27 14:18
145FGNUGCC:而決定硬體的使用方式,我所說的「記憶體位址是連續的編號」08/27 14:19
146FGNUGCC:是指作業系統看到的,但實際上會因為記憶體的管理而讓使用者08/27 14:20
147FGNUGCC:覺得好像沒有連續,試想這樣的事情 : 宣告陣列的時候為什麼08/27 14:21
148FGNUGCC:是用連續排列的方式而儲存,而不是跳著存呢?08/27 14:22
149FGNUGCC:我們都知道,在 32 bit 作業系統下能存取的記憶體範圍是08/27 14:28
150FGNUGCC:0 ~ FFFFFFFF,這個就是能證明記憶體位址是連續的最好例子,08/27 14:29
151FGNUGCC:但有可能全部都給您程式使用嗎?當然不可能,不然作業系統就08/27 14:29
152FGNUGCC:不需要做記憶體管理了,因為我們的程式大部份都是屬於在作業08/27 14:31
153FGNUGCC:系統層次上運行,使用的權限與資源都被作業系統掌控,所以當08/27 14:32
154FGNUGCC:然看不出來它裡面的秘密了.08/27 14:33
172FGNUGCC:K 大大,我在前面說過,記憶體存取範圍會因為作業系統使用了08/27 19:55
173FGNUGCC:記憶體管理而讓使用者覺得位址好像沒有連續,前面也說到不可08/27 19:57
174FGNUGCC:能全部都給自已使用,0 ~ FFFFFFFF 只是一個範圍,從那裡開始08/27 19:58
175FGNUGCC:是作業系統自已決定,程式設計師只能使用作業系統給的有限範08/27 19:59
176FGNUGCC:圍內使用.08/27 20:00
177FGNUGCC:S 大大,即然您知道位址是 Segment 與 Offset 組成,那為什麼08/27 20:18
180FGNUGCC:不會覺得是正整數呢?可以請您說明一下嗎,謝謝08/27 20:19
183FGNUGCC:D 大大說到重點了,各位可以想看看為什麼 printf() 函式可以08/27 20:24
184FGNUGCC:看到位址?08/27 20:24
188FGNUGCC:在 16 bit 下, 0100:0000 與 0000:1000 並沒有不同,因為它08/27 20:54
189FGNUGCC:們都是代表同一個實體位址,也就是 16 進位絕對位址 100008/27 20:56
194FGNUGCC:E 大,這個問題是屬於組合語言的部份了.08/27 21:03
195FGNUGCC:這個問題可以另外討論,但我要強調的是,不管是使用那一種記08/27 21:04
196FGNUGCC:憶體表示法,它們永遠都是屬於「無號正整數」,其實我還滿想08/27 21:05
197FGNUGCC:看用負數的方式來表示記憶體位址呢!08/27 21:06
202FGNUGCC:並非計較,只是強調觀念,而且我很好奇的是,即然存取範圍是08/27 21:19
203FGNUGCC:0 ~ FFFFFFFF,那為什麼會有負數呢?08/27 21:19
204FGNUGCC:難道 FFFFFFFF 可以解釋成 -1 ?08/27 21:20
205FGNUGCC:而且您說的 0100:0000 與 0000:1000 位移 F000 後會不一樣,08/27 21:25
206FGNUGCC:可以另外討論.08/27 21:26
Re: [問題] 關於Class指標的觀念
[ C_and_CPP ]166 留言, 推噓總分: +14
作者: LPH66 - 發表於 2013/08/23 16:18(10年前)
2FGNUGCC:其實不管用那一種寫法,編譯器只要遇到強制轉型動作的話08/23 21:27
3FGNUGCC:會假設你知道目前正在做什麼事,所以編譯器不會出現錯誤而是08/23 21:28
4FGNUGCC:顯示警告訊息,這個例子的 GMGID 與 MF2KGMG_operator* 都是08/23 21:30
5FGNUGCC:32 bit 指標,它可以指向任何型態物件位址,遇到了強制轉型的08/23 21:33
6FGNUGCC:話,編譯器仍會完成轉型動作,但結果是未知的.08/23 21:38
9FGNUGCC:這裡指的是指標的強制轉型寫法不管那一種編譯器仍會完成轉08/24 21:25
10FGNUGCC:型動作.08/24 21:26
11FGNUGCC:要判斷指標是不是 32 bit 可以使用 sizeof(void*) 得到結果08/24 21:28
15FGNUGCC:通常要刻意去寫「從語意上來看不可行,但實作上可行」的敘述08/24 23:38
16FGNUGCC:屬高階程式設計技巧,要怎麼應用端看目的為何,以這個例子來08/24 23:39
18FGNUGCC:看, GMGID 它是 int 型態,但實際上是 MF2KGMG_operator*08/24 23:40
20FGNUGCC:用了強制轉型編譯器就有警告訊息就是一個例子.08/24 23:41
21FGNUGCC:請問你的目的是?08/24 23:42
24FGNUGCC:你可以注意看這個例子, *GMGID 轉成 MF2KGMG_operator 物件08/24 23:45
25FGNUGCC:不就有警告訊息了嗎08/24 23:45
27FGNUGCC:轉成 MF2KGMG_operator 指標編譯器會給你警告訊息08/24 23:46
32FGNUGCC:GMGID 它是 int *08/24 23:54
33FGNUGCC:這位大大您誤會我的意思了,我是指「利用指標變數可以指向08/24 23:55
34FGNUGCC:任何型態的物件」的強制轉型.08/24 23:55
36FGNUGCC:這個例子難道你看不出來有什麼變化嗎?08/25 00:01
38FGNUGCC:所以才會有警告訊息的用意,這樣您懂了嗎?08/25 00:04
42FGNUGCC:如果你看的出來這個例子的變化就知道我在說什麼了.08/25 00:13
43FGNUGCC:看不出來的話也沒關係,因為這個是屬於「語意不可行」.08/25 00:14
47FGNUGCC:感謝 L 大大提供的資料,不過還是老話一句也就是我說的,08/25 06:42
48FGNUGCC:「語意上不可行,但實作上可行」的作法編譯器只會給你警告訊08/25 06:43
49FGNUGCC:息,因為它假設你知道目前正在做什麼事情,強制轉型只是08/25 06:44
50FGNUGCC:完成你指定的動作,那結果必定是未知的,所以也就不符合08/25 06:47
51FGNUGCC:「可攜性」.08/25 06:47
70FGNUGCC:F 大大,我想您誤會可深了,我說的「實作上可行」是指編譯器08/25 20:03
71FGNUGCC:會完成轉換動作,但結果是未知的,可想而知結果為不確定性原08/25 20:05
72FGNUGCC:因就是「雖然已完成轉換動作,但結果可能不是您要的」,即然08/25 20:08
73FGNUGCC:編譯器會完成轉換對編譯器來就是「實作上可行」,但對結果來08/25 20:08
74FGNUGCC:說就是「實作上不可行」,不知道這樣有清楚了嗎?08/25 20:09
79FGNUGCC:指標本身是幾位元型態編譯器會依照作業系統的特性來決定,並08/25 22:12
80FGNUGCC:不影響執行結果.08/25 22:13
82FGNUGCC:這個例子就是使用 C 語言的方式在做「強制轉型」.08/25 22:14
84FGNUGCC:如果把這個敘述 (MF2KGMG_operator *) 改成08/25 22:19
85FGNUGCC:static_cast<MF2KGMG_operator *>(*GMGID);08/25 22:20
86FGNUGCC:編譯器就會出現錯誤了,但相對的改成08/25 22:21
87FGNUGCC:reinterpret_cast<MF2KGMG_operator *>(*GMGID);08/25 22:21
88FGNUGCC:這個結果跟用 C 語言的方式相同.08/25 22:21
89FGNUGCC:C 語言本身的 struct 跟 C++ 的 class 是大同小異的.08/25 22:23
102FGNUGCC:看來各位好像不太能理解其中的道理,各位要記得,記憶體位址08/26 20:02
103FGNUGCC:永遠都是「無號數整數型態」,float 與 double 是屬於實數型08/26 20:03
104FGNUGCC:態,所以編譯器就不允許把記憶體位址轉成實數型態,其實真的08/26 20:07
105FGNUGCC:不能轉嗎?當然不是,只是最後還是要透過 FPU 做實數轉整數的08/26 20:08
106FGNUGCC:過程,這樣等於畫蛇添足,與其這樣不如以整數來取位址是明智08/26 20:10
107FGNUGCC:選擇.08/26 20:10
110FGNUGCC:F 大大,並非以管窺天,只是在講解其中理論.08/26 20:58
112FGNUGCC:所以我才會說「語法上不可行,但實作上可行」.08/26 21:10
116FGNUGCC:就我一直在說的「強制轉型」,這樣想好了,之所以會強制轉型08/26 21:15
117FGNUGCC:是因為敘述不符合邏輯,如果不使用強制轉型,編譯器馬上會提08/26 21:16
118FGNUGCC:出「型態不符合」,強制轉型只是讓編譯器知道你很清楚目前正08/26 21:17
119FGNUGCC:在做什麼事情,所以編譯器仍會完成轉換,但結果是不是您要的08/26 21:18
120FGNUGCC:就不得而知了.08/26 21:19
121FGNUGCC:記憶體位址對任何機器來說都是屬於連續的位址編號,並不會有08/26 21:24
122FGNUGCC:所謂的違反問題,就好像住家地址不可能以自已的姓名代表一樣08/26 21:25
130FGNUGCC:記憶體模型只是關係到程式的活動範圍,flat 只能在 Windows08/26 23:34
131FGNUGCC:的保護模式下運行,它只有一個區段,裡面保存程式區段與資料08/26 23:39
132FGNUGCC:區段也包含使用的資源,它能存取的範圍可以是整部電腦實體記08/26 23:40
133FGNUGCC:憶體或者是透過作業系統的虛擬記憶體來決定存取的範圍,但不08/26 23:41
134FGNUGCC:論是使用那一種記憶體模型,CPU 都是使用所謂的「區段值」與08/26 23:43
135FGNUGCC:「位移值」的方式來存取記憶體,CPU 本身的暫存器都只能儲存08/26 23:46
136FGNUGCC:整數而已,只有一個例外就是 CPU 本身內含的 FPU 暫存器才能08/26 23:48
137FGNUGCC:儲存 IEEE 浮點數,CPU 在做間接取值的時候也都是使用一般用08/26 23:50
138FGNUGCC:途的暫存器,內含的都只有整數而已,各位可以試看看這個 :08/26 23:53
141FGNUGCC:在命令提示字元下輸入 : debug 然後按 Enter08/26 23:54
143FGNUGCC:然後按 r, 可以看到 CPU 全部的暫存器 16 進元的數值08/26 23:55
145FGNUGCC:學過電腦的人都應該知道電腦本身只有 0 與 1 的數字,對吧?08/26 23:56
148FGNUGCC:我剛試過, Windows 7 好像不支援 debug 指令...08/26 23:57
149FGNUGCC:F 大大,您講到重點了,全部格式都是整數,所以記憶體位址也不08/27 00:01
150FGNUGCC:例外不是嗎?08/27 00:01
152FGNUGCC:我剛說的這些理論只是要說明為何記憶體位址是整數而不是其08/27 00:06
153FGNUGCC:他非整數的表示方式,跟語言無關,必竟不管使用那一種語言最08/27 00:08
154FGNUGCC:後都會轉為機器碼,如此而已.08/27 00:09
157FGNUGCC:Page number 與 Page Offset 是屬於虛擬記憶體的部份,可能08/27 00:13
160FGNUGCC:要另外討論了.08/27 00:13
162FGNUGCC:Feis : 怎麼說呢?08/27 00:18
165FGNUGCC:噗...08/27 00:21
[問題] 將檔案內大量資料做查詢分類
[ C_and_CPP ]20 留言, 推噓總分: +4
作者: eltonjaja - 發表於 2013/08/19 11:17(10年前)
17FGNUGCC:觀察 s 的型態是 set<int> 還是 set<char*> 就能知道答案.08/19 21:21