Динамически устанавливая значение в массиве указателей на целые числа - PullRequest
3 голосов
/ 07 декабря 2009

У меня есть многомерный массив указателей на целое число (неизвестного ранга), которые передаются в мою функцию следующим образом:

    public unsafe static void MyMethod(Array source, ...)
    {
         //...
    }

Многомерные массивы указателей создаются вне метода и передаются внутрь. Вот пример:

int*[,,,] testArray = new int*[10,10,5,5];

MyMethod(testArray);

Как установить значение в индексе, вычисляемом во время выполнения в массиве? Array.SetValue (...) отлично работает для массивов без указателей, но отказывается работать для моего массива int *. Используя рефлектор, я вижу, что SetValue сводится к вызову InternalSetValue, который принимает объект за значение, но он помечен как внешний, и я не вижу реализации. Я сделал снимок в темноте и попытался передать указатель в штучной упаковке, но безуспешно.

Ответы [ 2 ]

4 голосов
/ 07 декабря 2009

Это работает:

unsafe static void MyMethod(int** array)
{
    array[10] = (int*)0xdeadbeef;
}

private static unsafe void Main()
{
    int*[, , ,] array = new int*[10, 10, 10, 10];

    fixed (int** ptr = array)
    {
        MyMethod(ptr);
    }

    int* x = array[0, 0, 1, 0]; // == 0xdeadbeef
}

Это помогает?


Вопрос к экспертам: неверно ли считать, что массив последовательно выделяется в памяти?

1 голос
/ 07 декабря 2009

Это не работает, потому что невозможно поместить указатель в .NET, поэтому вы никогда не сможете вызвать Array.SetValue и передать int*.

Можете ли вы объявить MyMethod о принятии int*[,,,] вместо этого?

Редактировать: для дальнейшего чтения, интересный недавний пост Эрика Липперта .

...