es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo convertir un IntPtr en un array de structs

Tengo un IntPtr que es un puntero a un array de estructuras, y estoy tratando de convertirlo en un array.

He intentado

Marshal.Copy(srcIntPtr, destIntPtrArray, 0, destIntPtrArray.Length);

pero después de hacer la copia, no puedo convertir los IntPtr dentro del array de destino a la estructura deseada, mientras que puedo convertir el srcIntPtr a la estructura, lo cual por supuesto solo me da los datos del primer índice. Parece que después de hacer la copia, el array de destino contiene un montón de IntPtr rotos.

También he intentado

var size = Marshal.SizeOf(Marshal.ReadIntPtr(myIntPtr));

for (int i = 0; i < length; i++)
{
    IntPtr iP = new IntPtr(myIntPtr.ToInt64() + i * size);

    MyStruct ms =
        (MyStruct)Marshal.PtrToStructure(iP, typeof(MyStruct));
}

que no muestra ningún error, pero los datos del array de estructuras que obtengo de mi source IntPtr no son precisos.

Esta es la estructura a la que estoy tratando de convertir:

struct MyStruct
{
    public Categories categories;  
    public Dimensions dimensions;
}

public struct Categories {
    public double d;
    public double c;
    public double b;
    public double a;
}

struct Dimensions {
    public double v;
    public double e;
}

Tengo [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] en la parte superior de las estructuras, pero eliminar eso no rompe mi código.

Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que puede haber un problema con la forma en que se crea o accede al conjunto de estructuras después de la copia de IntPtr. Un enfoque para probar sería crear una nueva instancia del conjunto de estructuras y luego iterar a través del conjunto de IntPtr y utilizar Marshal.PtrToStructure para poblar cada elemento del conjunto de estructuras. Aquí tienes un ejemplo:

    // suponiendo que srcIntPtr apunta a un conjunto de MyStruct
    int longitud = <longitud del="" conjunto="">;
    MyStruct[] destArray = new MyStruct[longitud];
    
    // iterar a través del conjunto y poblar el conjunto de estructuras
    int tamañoEstructura = Marshal.SizeOf(typeof(MyStruct));
    for (int i = 0; i < longitud; i++)
    {
        IntPtr currentIntPtr = IntPtr.Add(srcIntPtr, i * tamañoEstructura);
        destArray[i] = Marshal.PtrToStructure<mystruct>(currentIntPtr);
    }
    

    Esto creará un nuevo conjunto de MyStruct y poblará cada elemento con datos del conjunto original de IntPtr. Si aún hay problemas con los datos que no son precisos, podría valer la pena comprobar si el conjunto original de IntPtr se está utilizando correctamente en otros lugares del código, o si hay alguna incompatibilidad entre las definiciones de las estructuras y los datos en el conjunto de IntPtr.

Comments are closed.