[問題] 指標、fixed、Managed
我原本的做法,是傳遞變數的位址給建構子
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
→
04/18 03:22, , 1F
04/18 03:22, 1F
這個是拿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)
→
04/18 11:52, , 2F
04/18 11:52, 2F
→
04/18 11:52, , 3F
04/18 11:52, 3F
→
04/18 12:03, , 4F
04/18 12:03, 4F
→
04/18 12:06, , 5F
04/18 12:06, 5F
→
04/18 12:07, , 6F
04/18 12:07, 6F
→
04/18 13:48, , 7F
04/18 13:48, 7F
→
04/18 13:48, , 8F
04/18 13:48, 8F
→
04/18 13:59, , 9F
04/18 13:59, 9F
推
04/20 08:45, , 10F
04/20 08:45, 10F
推
04/20 08:47, , 11F
04/20 08:47, 11F
→
04/20 09:33, , 12F
04/20 09:33, 12F
→
04/20 09:33, , 13F
04/20 09:33, 13F
→
04/20 09:36, , 14F
04/20 09:36, 14F
→
04/20 09:36, , 15F
04/20 09:36, 15F
→
04/20 09:37, , 16F
04/20 09:37, 16F
推
04/20 13:37, , 17F
04/20 13:37, 17F
推
04/20 13:37, , 18F
04/20 13:37, 18F
推
04/20 13:39, , 19F
04/20 13:39, 19F
→
04/20 14:29, , 20F
04/20 14:29, 20F
→
04/21 22:07, , 21F
04/21 22:07, 21F