configurar dinámicamente el valor en la matriz de punteros a enteros
-
13-09-2019 - |
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.
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 .