title: Marshalling of a c++ struct which contains pointers to another c++ struct
body: <p>I have an issue concerning the correct marshalling of c++ structs into c#. These are defined as follows:</p>
  
  <pre><code>extern "C"
  {
      //Geometry forms that could be used for envelope calculation
      enum GeometryForms  {RECTANGLE, TRIANGLE, ELLIPSE, CIRCLESECTOR};
  
      //Structure for coordinates 3D
      typedef struct Coordinates
      {
          double  longitude;      //longitude of the point in dezimal deg
          double  latitude;       //latitude of the point in dezimal deg
          double  altitude;       //heigth of the point in metres
      } Coordinates, *PCoordinates;
  
  
      //Envelope Data Struct
      typedef struct EnvelopeStruct
      {
          GeometryForms   GeometryAft;        // Geometry form of the aft section
          GeometryForms   GeometryBow;        // Geometry form of the bow section
          GeometryForms   GeometryCurve;      // Geometry form during direction change
          GeometryForms   Geometry3DAboveWL;  // Geometry form 3D under the water level
          GeometryForms   Geometry3DUnderWL;  // Geometry form 3D above the water level
          Coordinates     *PointsAft;         // Coordinates of the part of the envelope of the aft section
          Coordinates     *PointsBow;         // Coordinates of the part of the envelope of the bow section
          Coordinates     *PointsCurve;       // Coordinates of the envelope during direction change
          Coordinates     *Points3DAboveWL;   // Coordinates of the envelope above water level
          Coordinates     *Points3DUnderWL;   // Coordinates of the envelope under water level
      }EnvelopeStruct, *PEnvelopeStruct;
  
  
      //Structure includes all parameters that are used for the envelope calculation
      typedef struct CalculationParametersStruct
      {
          double  pos_long;           //Position of the vessel, longitude in decimal degree
          double  pos_lat;            //Position of the vessel, latitude in decimal degree
          double  pos_alt;            //Position of the vessel, altitude in metres
          double  pos_long_future;    //Predicted longitude of the vessel in decimal degree
          double  pos_lat_future;     //Predicted latitude of the vessel in decimal degree
          double  pos_alt_future;     //Predicted altitude of the vessel in metres
          float   pos_future_time;    //Time or timeinterval between actual position and predicted position
          double  sigma_long;         //Accuracy of actual longitude
          double  sigma_lat;          //Accuracy of actual latitude
          double  sigma_alt;          //Accuracy of actual altitude
          double  PL_long;            //Integrity value (protection level) into longitude
          double  PL_lat;             //Integrity value (protection level) into latitude
          double  length;             //length of the vessel in metres
          double  beam;               //beam of the vessel in metres
          double  draft;              //draft of the vessel in metres
          double  max_t;              //maximum trim
          double  v;                  //velocity of the vessel
          double  course;             //vessels heading
          double  rate;               //Rate of Turn of the vessel
          double  angle;              //Rudder Angle of the vessel
          double  coef;               //Maneuvering Coefficient
          double  scale;              //Dangerous Cargo Scale
          double  scale_lon;          
          double  scale_lat;
          double  wave_lon;
          double  wave_lat;
          double  ENC_reliability;            
      }CalculationParametersStruct, *PCalculationParametersStruct;
  </code></pre>
  
  <p>I tried to accomplish with the subsequent code in c#, but it does not work for now:</p>
  
  <pre><code>public enum GeometryForms { RECTANGLE, TRIANGLE, ELLIPSE, CIRCLESECTOR };
  
      [Serializable]
      [StructLayout(LayoutKind.Sequential)]
      public class Coordinates
      {
          public double longitude;        //longitude of the point in decimal deg
          public double latitude;     //latitude of the point in decimal deg
          public double altitude;     //height of the point in metres
      }
  
      [Serializable]
      [StructLayout(LayoutKind.Sequential)]
      public class EnvelopeStruct
      {
          public GeometryForms GeometryAft;       // Geometry form of the aft section
          public GeometryForms GeometryBow;       // Geometry form of the bow section
          public GeometryForms GeometryCurve;     // Geometry form during direction change
          public GeometryForms Geometry3DAboveWL; // Geometry form 3D under the water level
          public GeometryForms Geometry3DUnderWL; // Geometry form 3D above the water level
          [MarshalAs(UnmanagedType.LPStruct, SizeConst = 96)]
          public Coordinates PointsAft;           // Coordinates of the part of the envelope of the aft section
          [MarshalAs(UnmanagedType.LPStruct, SizeConst = 96)]
          public Coordinates PointsBow;           // Coordinates of the part of the envelope of the bow section
          [MarshalAs(UnmanagedType.LPStruct, SizeConst = 4320)]
          public Coordinates PointsCurve;     // Coordinates of the envelope during direction change
          [MarshalAs(UnmanagedType.LPStruct, SizeConst = 96)]
          public Coordinates Points3DAboveWL; // Coordinates of the envelope above water level
          [MarshalAs(UnmanagedType.LPStruct, SizeConst = 96)]
          public Coordinates Points3DUnderWL; // Coordinates of the envelope under water level
      }
  
      [Serializable]
      [StructLayout(LayoutKind.Sequential)]
      public class CalculationParametersStruct
      {
          public double pos_long;         //Position of the vessel, longitude in decimal degree
          public double pos_lat;          //Position of the vessel, latitude in decimal degree
          public double pos_alt;          //Position of the vessel, altitude in metres
          public double pos_long_future;  //Predicted longitude of the vessel in decimal degree
          public double pos_lat_future;       //Predicted latitude of the vessel in decimal degree
          public double pos_alt_future;       //Predicted altitude of the vessel in metres
          public float pos_future_time;   //Time or timeinterval between actual position and predicted position
          public double sigma_long;           //Accuracy of actual longitude
          public double sigma_lat;            //Accuracy of actual latitude
          public double sigma_alt;            //Accuracy of actual altitude
          public double PL_long;          //Integrity value (protection level) into longitude
          public double PL_lat;               //Integrity value (protection level) into latitude
          public double length;               //length of the vessel in metres
          public double beam;             //beam of the vessel in metres
          public double draft;                //draft of the vessel in metres
          public double max_t;                //maximum trim
          public double v;                    //velocity of the vessel
          public double course;               //vessels heading
          public double rate;             //Rate of Turn of the vessel
          public double angle;                //Rudder Angle of the vessel
          public double coef;             //Maneuvering Coefficient
          public double scale;                //Dangerous Cargo Scale
          public double scale_lon;
          public double scale_lat;
          public double wave_lon;
          public double wave_lat;
          public double ENC_reliability;
      }
  </code></pre>
  
  <p>I get an <strong>error CS0021: Cannot apply indexing with [] to an expression of type 'EnvelopeCalculatorWrapper.Coordinates'</strong> when I try to access </p>
  
  <pre><code>[MarshalAs(UnmanagedType.LPStruct, SizeConst = 96)]
              public Coordinates PointsAft;
  </code></pre>
  
  <p>as an array in c# in the manner:</p>
  
  <pre><code>calc.envelope.PointsAft[i].longitude
  </code></pre>
  
  <p>Does anybody know how to do it!</p>
  
  <p>Thanks in advance!</p>
  
  <p>Cheers, Stefan</p>