2011-09-27 72 views
6

我有这样的代码不编译:不能转换UINT *为uint []

public struct MyStruct 
{ 
    private fixed uint myUints[32]; 
    public uint[] MyUints 
    { 
     get 
     { 
      return this.myUints; 
     } 
     set 
     { 
      this.myUints = value; 
     } 
    } 
} 

现在,我知道为什么代码将无法编译,但是我在点很明显我太累了想不到,需要一些帮助才能让我走向正确的方向。我有一段时间没有使用不安全的代码,但我很确定我需要做一个Array.Copy(或Buffer.BlockCopy?)并返回数组的副本,但是那些不需要我需要的参数。我忘了什么?

谢谢。

回答

4

你有一个fixed方面的工作与fixed缓冲工作时:

public unsafe struct MyStruct { 
    private fixed uint myUints[32]; 
    public uint[] MyUints { 
     get { 
      uint[] array = new uint[32]; 
      fixed (uint* p = myUints) { 
       for (int i = 0; i < 32; i++) { 
        array[i] = p[i]; 
       } 
      } 
      return array; 
     } 
     set { 
      fixed (uint* p = myUints) { 
       for (int i = 0; i < 32; i++) { 
        p[i] = value[i]; 
       } 
      } 
     } 
    } 
} 
+0

啊!我知道这会是一件令人尴尬的事情。谢谢! –

2

有可能是一个更简单的解决方案,但这个工程:

public unsafe struct MyStruct 
{ 
    private fixed uint myUints[32]; 
    public uint[] MyUints 
    { 
     get 
     { 
      fixed (uint* ptr = myUints) 
      { 
       uint[] result = new uint[32]; 
       for (int i = 0; i < result.Length; i++) 
        result[i] = ptr[i]; 
       return result; 
      } 
     } 
     set 
     { 
      // TODO: make sure value's length is 32 
      fixed (uint* ptr = myUints) 
      { 
       for (int i = 0; i < value.Length; i++) 
        ptr[i] = value[i]; 
      } 
     } 
    } 
} 
0

这适用于intfloatbyte,chardouble,但您可以使用Marshal.Copy()将数据从固定阵列移到托管阵列。

例子:

class Program 
{ 
    static void Main(string[] args) 
    { 
     MyStruct s = new MyStruct(); 

     s.MyUints = new int[] { 
      1, 2, 3, 4, 5, 6, 7, 8, 
      9, 10, 11, 12, 13, 14, 15, 16, 
      1, 2, 3, 4, 5, 6, 7, 8, 
      9, 10, 11, 12, 13, 14, 15, 16 }; 

     int[] chk = s.MyUints; 
     // chk containts the proper values 
    } 
} 

public unsafe struct MyStruct 
{ 
    public const int Count = 32; //array size const 
    fixed int myUints[Count]; 

    public int[] MyUints 
    { 
     get 
     { 
      int[] res = new int[Count]; 
      fixed (int* ptr = myUints) 
      { 
       Marshal.Copy(new IntPtr(ptr), res, 0, Count); 
      } 
      return res; 
     } 
     set 
     { 
      fixed (int* ptr = myUints) 
      { 
       Marshal.Copy(value, 0, new IntPtr(ptr), Count); 
      } 
     } 
    } 
}