2010-11-08 3 views
7

Comment puis-je déclarer une structure avec un tableau de taille fixe?Comment puis-je déclarer des tableaux dans struct?

J'ai trouvé une solution, mais cela ne fonctionne que pour les types de données primitifs. J'ai besoin que mon tableau soit de type MyStruct.

Alors, comment puis-je déclarer une structure avec un tableau d'autres structures?

ex.

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

Répondre

9

Mon collègue a trouvé le moyen de le faire. Je pense que c'est juste.

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

Vous ne pouvez pas. Les tableaux fixes sont limités à bool, byte, char, court, int, long, sbyte, ushort, uint, ulong, float ou double.

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

Une approche pour faire votre Interop pourrait être à coder un ensemble d'emballage en C++ qui fait la traduction à un plus C# structure -interop conviviale.

+0

Est-ce que quelqu'un sait pourquoi seuls les types primitifs, et pas tous les types blittables, sont autorisés? – CodesInChaos

+0

Juste deviner: si vous autorisez la construction dans la question, tous les membres de chacune de ces instances de Struct2 doivent être corrigés implicitement aussi. Donc, avec quelques niveaux de nidification, vous avez des éléments fixes partout qui donnerait un gros mal de tête au garbage collector. – TToni

0

Vous ne pouvez pas utiliser des types personnalisés avec des tableaux fixes. (Voir TTonis pour plus de détails.)

Au lieu d'essayer de construire une structure en C# avec une disposition de mémoire spécifique, je pense que vous devriez utiliser l'attribut MarshalAs pour spécifier comment les membres doivent être rassemblés. Même si vous parvenez à obtenir des membres qui occupent la bonne quantité de mémoire, vous avez toujours un remplissage entre les éléments qui vous cause des problèmes d'alignement.

Vous pouvez avoir une référence à un tableau régulier dans la structure et spécifier qu'il doit être appelé ByValArray.