Невозможно преобразовать uint * в uint [] - PullRequest
7 голосов
/ 27 сентября 2011

У меня есть этот код, который не компилируется:

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

Теперь я знаю , почему код не скомпилируется, но я, очевидно, в тот момент, когда я слишком устал, чтобы думать, и мне нужна помощь, чтобы направить меня в правильном направлении. Некоторое время я не работал с небезопасным кодом, но я почти уверен, что мне нужно сделать Array.Copy (или Buffer.BlockCopy?) И вернуть копию массива, однако те не принимают аргументы, которые я необходимость. О чем я забыл?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 27 сентября 2011

Вы должны работать в контексте 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];
                }
            }
        }
    }
}
2 голосов
/ 27 сентября 2011

Может быть более простое решение, но это работает:

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 голосов
/ 27 сентября 2011

Работает только с int, float, byte, char и double, но вы можете использовать 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);
            }
        }
    }
}
...