Re: [問題] 需要高手挑戰的詭異問題

看板C_Sharp作者 (Litfal)時間7年前 (2016/09/09 16:41), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《erspicu (.)》之銘言: : 沒任何問題,但這次有使用到指標與比較進階的struct : [StructLayout(LayoutKind.Explicit, Size = 2)] : struct RegWord : { : [FieldOffset(1)] : public byte H; //heigh byte : [FieldOffset(0)] : public byte L; //low byte : [FieldOffset(0)] : public ushort X; //word : } : 除了編譯器或是 .net framework本身bug外,想不出別的理由.... : 資訊更新一:應該跟指標的使用問題有關係 但應該不是我的問題 : 後來把 Main.cs 中 : fixed (byte* P = &Reg_A.L) { Table_ByteRegs[0] = P; } : fixed (byte* P = &Reg_C.L) { Table_ByteRegs[1] = P; } : fixed (byte* P = &Reg_D.L) { Table_ByteRegs[2] = P; } : fixed (byte* P = &Reg_B.L) { Table_ByteRegs[3] = P; } : fixed (byte* P = &Reg_A.H) { Table_ByteRegs[4] = P; } : fixed (byte* P = &Reg_C.H) { Table_ByteRegs[5] = P; } : fixed (byte* P = &Reg_D.H) { Table_ByteRegs[6] = P; } : fixed (byte* P = &Reg_B.H) { Table_ByteRegs[7] = P; } : 這種寫法除掉改用別方式來處理register解碼與對應 就ok了 : 改用下面這種方式 但直接靠array來mapping指標操作解碼對應 : 不知到快了 switch有多少倍去.... 恕刪一些原文 想在C#裡面玩轉指標,當然不建議用 Managed 記憶體。 也就是,不會像下面這樣直接用 new 的方式宣告結構。 RegWord Reg_A = new RegWord(); // Managed 而是會配置 Unmanaged 記憶體 來玩弄, 宣告會改成指標,建構式使用 Marshal.AllocHGlobal 來初始化。 RegWord* Reg_A; public Apr8086Core() { Reg_A = (RegWord*)Marshal.AllocHGlobal(sizeof(RegWord)); } 然後就會跳一堆錯誤XD。 但很好解決,把結構存取方式由 .member 改成 ->member即可,跟 C 一模一樣。 沒錯,你有三個成員,就跑三次取代就好。變得像這樣: // target_ea = Reg_A.X + Reg_SI; // old target_ea = Reg_A->X + Reg_SI; // new 指標表更簡單,連 fixed 都不用了,也跟 C 一模一樣。 Table_WordRegs[0] = &Reg_A->X; Table_ByteRegs[0] = &Reg_A->L; Table_ByteRegs[4] = &Reg_A->H; 記得要實作 Dispose 與 解構式,釋放宣告的 Unmanaged 記憶體。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.135.34.240 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1473410463.A.FD6.html

09/09 17:52, , 1F
水喔 這招好用..
09/09 17:52, 1F

09/14 10:48, , 2F
感謝分享...筆記~~~
09/14 10:48, 2F

09/17 05:21, , 3F
筆記中
09/17 05:21, 3F
文章代碼(AID): #1NqdMV_M (C_Sharp)
文章代碼(AID): #1NqdMV_M (C_Sharp)