2010-11-08 35 views
7

¿Cómo puedo declarar la estructura con una matriz de tamaño fijo en ella?¿Cómo puedo declarar matrices en struct?

Encontré solución, pero solo funciona para tipos de datos primitivos. Necesito que mi matriz sea del tipo MyStruct.

Entonces, ¿cómo puedo declarar una estructura con una matriz de otras estructuras en ella?

ex.

unsafe struct Struct1{ 
     fixed int arrayInt[100]; // works properly 
     fixed Struct2 arrayStruct[100]; //not compile 
    } 

Respuesta

9

Mi colega encontró la manera de hacerlo. Creo que es correcto.

[StructLayout(LayoutKind.Sequential)] 
    public struct Struct1 
    { 
      [MarshalAs(UnmanagedType.ByValArray, SizeConst = sizeOfarray)] 
      private Struct2[] arrayStruct; 
    } 
5

No puede. Las matrices fijas están restringidas a bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float o double.

Ver http://msdn.microsoft.com/en-us/library/zycewsya%28v=VS.80%29.aspx

Un enfoque para hacer su interoperabilidad podría ser la de codificar un ensamblado de contenedor en C++ que realiza la traducción a una estructura más C# -interop ambiente.

+0

¿Alguien sabe por qué solo se permiten los tipos primitivos, y no todos los tipos blittables? – CodesInChaos

+0

Simplemente adivinando: si permite la construcción en la pregunta, todos los miembros de cada una de esas instancias de Struct2 también se deben corregir implícitamente. Por lo tanto, con algunos niveles de anidación, ha arreglado elementos en todo el lugar, lo que le daría al colector de basura un gran dolor de cabeza. – TToni

0

No puede usar tipos personalizados con arreglos fijos. (Consulte TTonis answer para más detalles.)

En lugar de intentar construir una estructura en C# con un diseño de memoria específico, creo que debe usar el atributo MarshalAs para especificar cómo se deben organizar los miembros. Incluso si logras obtener miembros que ocupen la cantidad correcta de memoria, todavía tienes relleno entre los elementos que te causa problemas de alineación.

Puede hacer referencia a una matriz normal en la estructura y especificar que se debe agrupar como ByValArray.