2011-09-23 115 views
1

現在我怎麼做真的很奇怪。可悲的是我有很多結構並經常使用它們。有沒有簡單的方法來使用F#可變結構

這裏是我如何行事了片刻:

[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>] 
type OneDevice = { 
     mutable id    : UInt16 
     mutable typeDev   : byte 
     mutable portNum   : byte 
     mutable Parity   : byte 
     mutable StopBits  : byte 
     mutable BaudRate  : byte 
     mutable addr1   : byte 
     mutable addr2   : byte 
     mutable useCanal  : byte 
     mutable idGroup1  : byte 
     mutable idGroup2  : byte 
     mutable idGroup3  : byte 
     mutable idGroup4  : byte 
     mutable idGroupSos1  : byte 
     mutable idGroupSos2  : byte 
     mutable idGroupSos3  : byte 
     mutable idGroupSos4  : byte 
     mutable idSosReserv  : byte 
     mutable addrModbus  : byte 
     mutable offsetModbus : System.UInt16 
     [<field: MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)>] 
     mutable pwd    : byte array 
     mutable offsetInModbus : UInt16 
     mutable reserv   : UInt16 } 

這是我如何定義結構。 「type str = struct ...」的作品真的不同!我需要我的結構變體。但寫這只是我麻煩的一半,後半部分是我如何創建這種結構的新元素。讓mutable dev = new OneDevice()不起作用!所以我需要做到這一點:

let mutable dev = { 
    id    = 0us 
    typeDev   = 0x00uy 
    portNum   = 0x00uy 
    Parity   = 0x00uy 
    StopBits  = 0x00uy 
    BaudRate  = 0x00uy 
    addr1   = 0x00uy 
    addr2   = 0x00uy 
    useCanal  = 0x00uy 
    idGroup1  = 0x00uy 
    idGroup2  = 0x00uy 
    idGroup3  = 0x00uy 
    idGroup4  = 0x00uy 
    idGroupSos1  = 0x00uy 
    idGroupSos2  = 0x00uy 
    idGroupSos3  = 0x00uy 
    idGroupSos4  = 0x00uy 
    idSosReserv  = 0x00uy 
    addrModbus  = 0x00uy 
    offsetModbus = 0us 
    pwd    = Array.zeroCreate 17 
    offsetInModbus = 0us 
    reserv   = 0us } 

這就是這裏最古怪的部分。我可以讓它變得更簡單嗎?

謝謝!

回答

5

問題是這些不是結構。他們是記錄類型。使用type [<Struct>] MyStruct = ...

http://msdn.microsoft.com/en-us/library/dd233233.aspxhttp://msdn.microsoft.com/en-us/library/ee340416.aspx

記錄類型:http://msdn.microsoft.com/en-us/library/dd233184.aspx

結構是值類型。記錄是引用類型,如類。

+0

不應該是'[] type MyStruct'? – ildjarn

+0

可以工作。我有時使用這種方法與遞歸定義保持一致,遞歸定義需要'和'後面的屬性。 – Daniel

相關問題