2010-11-08 20 views
7

Come posso dichiarare la struttura con una matrice di dimensioni fisse al suo interno?Come posso dichiarare gli array in struct?

Ho trovato la soluzione, ma funziona solo per i tipi di dati primitivi. Ho bisogno che il mio array sia di tipo MyStruct.

Quindi, come posso dichiarare una struttura con una matrice di altre strutture in essa contenute?

ex.

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

risposta

9

Il mio collega ha trovato il modo di lavorare per farlo. Penso che sia la strada giusta.

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

Non è possibile. Gli array fissi sono limitati a bool, byte, char, short, int, long, sbyte, ushort, uint, ulong, float o double.

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

Un approccio per fare la tua interoperabilità potrebbe essere quello di codificare un gruppo di involucro in C++ che fa la traduzione di un C# struttura più -interop-friendly.

+0

Qualcuno sa perché solo i tipi primitivi e non tutti i tipi blittabili sono consentiti? – CodesInChaos

+0

Solo supposizioni: se consenti il ​​costrutto nella domanda, tutti i membri di ciascuna di queste istanze di Struct2 dovevano essere riparati implicitamente anche. Quindi, con alcuni livelli di nidificazione, sono stati sistemati gli oggetti dappertutto, il che avrebbe causato un forte mal di testa al garbage collector. – TToni

0

Non è possibile utilizzare i tipi personalizzati con array fissi. (Vedere Risposta di TT per i dettagli.)

Invece di provare a costruire una struttura in C# con uno specifico layout di memoria, penso che si dovrebbe usare l'attributo MarshalAs per specificare come devono essere ordinati i membri. Anche se riesci a ottenere membri che occupano la giusta quantità di memoria, hai ancora il riempimento tra gli elementi che causa problemi di allineamento.

È possibile avere un riferimento a un array normale nella struttura e specificare che deve essere eseguito il marshalling come ByValArray.