Pregunta

Tengo una matriz multidimensional de punteros a entero (de rango desconocido) que se pasa en mi función como tal:

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

Las matrices multidimensionales de punteros se construyen fuera del método y que se pasa en He aquí un ejemplo:.

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

MyMethod(testArray);

¿Cómo puedo establecer un valor en un índice de tiempo de ejecución-computados en la matriz? Array.SetValue (...) funciona perfectamente bien para las matrices no puntero, pero se niega a trabajar para mi int * array. El uso del reflector, veo FijarValor reduce a llamar InternalSetValue que toma un objeto de valor, pero está marcado como extern y no puedo ver la ejecución. Tomé un tiro en la oscuridad y trató de pasar en el puntero en caja, pero no hubo suerte.

¿Fue útil?

Solución

Esto funciona:

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
}

¿Le ayuda?


Pregunta a los expertos: ¿Es un error suponer que la matriz se asigna de forma consecutiva en la memoria

?

Otros consejos

Esto no funciona porque no es posible a la caja de un puntero en .NET, por lo que nunca puede llamar a la Array.SetValue y aprobar un int*.

¿Se puede declarar MyMethod aceptar int*[,,,] lugar?

Editar: para la lectura adicional, un reciente post interesante de Eric Lippert .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top