C_Sharp 板


LINE

我原本的做法,是傳遞變數的位址給建構子 mySprite1 = new ClassSprite(texture, new Vector2(0f, 0f), &this.WindowX, &this.WindowY); 但是編譯器不給過,逼我把它改成這樣 fixed(int* WX = &this.WindowX,WY = &this.WindowY) { mySprite1 = new ClassSprite(texture, new Vector2(0f, 0f), WX, WY); } http://msdn.microsoft.com/zh-tw/library/f58wzh21.aspx 看一看MSDN的fixed說明,我也搞不太懂這是幹什麼用的..... 指標在基礎教學書上幾乎都沒提,頂多提一下下 而且又有delegate ref out可以用,幾乎都用不到 所以我對指標的概念僅止於「這是變數的位址」而已 另外,我原本的想法是: 把變數的位址傳給class,讓那個class用私有欄位把指標記錄下來 當變數改變的時候,就不用特別去更新那個class的數據 unsafe class ClassSprite { ...... public int* WindowX; public int* WindowY; public ClassSprite(Texture2D texture, Vector2 position, int* WindowX, int* WindowY) { ...... this.WindowX = WindowX; this.WindowY = WindowY; } ...... 到目前為止,寫幾個小程式來測試都OK 但是看到MSDN這句: 如果沒有 fixed,Managed 變數的指標也許沒有多大用處,因為記憶體回收可能 會在非預期下重新配置變數。C# 編譯器只能讓您將指標指派到 fixed 陳述式中 的 Managed 變數。 我請問..... 這是不是說..... 我想出來的那種方法有機綠會發生意外,只是我還沒遇到? 如果是,那有辦法可以解決嗎? -- 我... 我一點都不糟糕啦!>///< --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.27.109.99
1F:→ james732:比較好奇的是你想要做什麼事呢? 04/18 03:22
這個是拿xna書上的教學範例來改的,他原本是用vector2記錄 視窗的寬跟高,然後在update裡記算撞到視窗後的反彈 我試著把視窗改成可變動大小,因此,需要讓遊戲原件裡記錄的 視窗寬高跟著變。 方法一:是採用this.Window.ClientSizeChanged事件,在視窗 變動時,從程式主體去修改原件的變數,這很簡單,我也試成功 了。 但是考慮到,如果遊戲變大的話,場上會有一大堆的遊戲原件, 逐一修改很費事,就打算用指標(方法二)。 雖然有遇到視窗寬高是屬性不能傳位址的狀況,但那個拐個彎就 能解決。 this.Window.ClientSizeChanged += new EventHandler(Window_ClientSizeChanged); void Window_ClientSizeChanged(object sender, EventArgs e) { this.WindowX = this.graphics.GraphicsDevice.Viewport.Width; this.WindowY = this.graphics.GraphicsDevice.Viewport.Height; } 然後,把this.WindowX、this.WindowY的位址傳出去就好。 ※ 編輯: F23ko 來自: 163.27.109.99 (04/18 03:39) ※ 編輯: F23ko 來自: 163.27.109.99 (04/18 03:40)
2F:→ jhchou:fixed就是叫CLR暫時不要動fixed變數在記憶體中的位置 04/18 11:52
3F:→ jhchou:這樣才能用指標直接操作 04/18 11:52
4F:→ jhchou:通常會用到指標都是要對記憶體大量讀寫 04/18 12:03
5F:→ jhchou:你的例子看起來沒有用到指標的必要啊 讓ClassSprite直接存 04/18 12:06
6F:→ jhchou:現在window的reference就好了 04/18 12:07
7F:→ F23ko:咦? 實執型別的指標跟參考型別的refernce是不一樣的意思喔? 04/18 13:48
8F:→ F23ko:我還以為是類似的東西.... 04/18 13:48
9F:→ F23ko:謝謝,我覺得我需要去讀一些基層的東西.... 04/18 13:59
10F:推 horngsh:要弄清楚何謂value type variable and reference variable 04/20 08:45
11F:推 horngsh:C#裡是用ref or out加在實際參數前作call by address. 04/20 08:47
12F:→ F23ko:對,但是使用ref跟out,都沒辦法儲存變數的參考位址,一定要 04/20 09:33
13F:→ F23ko:用指標.... 04/20 09:33
14F:→ F23ko:例如 04/20 09:36
15F:→ F23ko:void Func1(ref int X){ 04/20 09:36
16F:→ F23ko:int X2 = X; //存的是「值」而不是參照 04/20 09:37
17F:推 horngsh:C#裡用ref or out的最大目的是產生side effect, 也就是要 04/20 13:37
18F:推 horngsh:改變原呼叫方法中的實際參數的內容... 04/20 13:37
19F:推 horngsh:最簡單的例子是寫一個MySwap(int x, int y)..實作看看就知 04/20 13:39
20F:→ F23ko:msdn這個方面寫的蠻清楚的。 04/20 14:29
21F:→ help0430:你會不會想的太複雜了~要比較的時候再取得畫面長寬即可 04/21 22:07







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP