Cálculo de referencias de un puntero a una matriz de tipos (manejado C # -> C ++ no administrado)

StackOverflow https://stackoverflow.com/questions/1323206

  •  19-09-2019
  •  | 
  •  

Pregunta

Estoy teniendo algunos problemas para decidirse por una forma de representar una estructura que contiene un puntero a una matriz de pantalones cortos en mi código administrado. La estructura se parece a esto:

typedef struct
{
    short size;
    unsigned short** shortValues;
} UnmanagedStruct;

memoria para 'shortValues' se asigna dentro de código no administrado - por lo tanto, a pesar de que el campo es simplemente un puntero a una matriz de valores cortos, se añadió un nivel adicional de direccionamiento indirecto por lo que la memoria asignada es visto por la persona que llama (código administrado ) también. El campo 'size' representa el número de elementos de la matriz. ¿Cómo represento a esto en código administrado?

pensé que lo paso en apenas una IntPtr, entonces no podía encontrar la manera de acceder a los valores una vez que vuelva la llamada no administrados.

¿Fue útil?

Solución

Es código no seguro ok?

public unsafe struct UnmanagedStruct
{
    public short size;
    public ushort** shortValues;
}

[DllImport("example.dll")]
public static extern void GetUnmanagedStruct(out UnmanagedStruct s);

Si usted tiene un puntero a un array de ushorts:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        ushort x = (*s.shortValues)[i];
        Console.WriteLine(x);
    }
}

Si usted tiene una matriz de matrices de terminación nula de ushorts:

public static unsafe void WriteValues()
{
    UnmanagedStruct s;
    GetUnmanagedStruct(out s);
    for (var i = 0; i < s.size; i++)
    {
        for (ushort* p = s.shortValues[i]; p != null; p++)
        {
            ushort x = *p;
            Console.WriteLine(x);
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top