C#コードからC++コードに配列を含む構造体の配列を渡したいです。
手始めに配列を含む構造体を単体で渡そうとしたところ、C++側で正しく値が受け取れていませんでした。
具体的には、PointsArrayのpoints_numには値5が入っていることが確認できましたが、 Pointsのpointsのx,yにはC#で格納した値ではない、
大きな値が入っていました。
この処理のどこが悪いかわかる方いましたら教えていただきたいです。
C#
1構造体の定義 2 3 public class PointsArray 4 { 5 public int points_num; 6 public IntPtr points; 7 } 8 9 [StructLayout(LayoutKind.Sequential)] 10 public class VectorPoint 11 { 12 public int x; 13 public int y; 14 } 15
C#
1構造体のメモリを確保し、C++のインタフェースに引数を与える処理 2 3 var pointsArray = new PointsArray(); 4 pointsArray.points_num = 5; 5 6 IntPtr lst_p = Marshal.AllocCoTaskMem((Marshal.SizeOf(new VectorPoint()) * (int)pointsArray.points_num)); 7 pointsArray.points = lst_p; 8 9 VectorPoint[] vectorPoints = new VectorPoint[pointsArray.points_num]; 10 IntPtr lstPtr = pointsArray.points; 11 12 for (int i = 0; i < pointsArray.points_num; i++) 13 { 14 vectorPoints[i] = new VectorPoint(); 15 vectorPoints[i].x = 2; 16 vectorPoints[i].y = 3; 17 18 vectorPoints[i] = (VectorPoint)Marshal.PtrToStructure(lstPtr, typeof(VectorPoint)); 19 lstPtr = (IntPtr)((int)lstPtr + Marshal.SizeOf(vectorPoints[i])); 20 } 21 22 MyWrapper.TestStruct(handle, pointsArray);
C#
1C#側のインタフェース 2 3 [DllImport(DllName, EntryPoint = "MyStructTest")] 4 internal static extern int TestStruct(MyMobileSafeHandle ptr, [In]PointsArray ptsArray); 5
C++
1C++側のインタフェースと構造体 2 3extern "C" void MyStructTest( 4 MyMobile_SharedLib * pObject, //!<[in] オブジェクトポインタ 5 const PointsArray * pointsArray 6) 7{ 8 int tmp1 = pointsArray->points[0].x; 9 int tmp2 = pointsArray->points[0].y; 10 int tmp3 = pointsArray->points[1].x; 11 int tmp4 = pointsArray->points[1].y; 12 int tmp5 = pointsArray->points[4].x; 13 int tmp6 = pointsArray->points[4].y; 14 15 return; 16 17} 18 19struct VectorPoint 20{ 21 int x; 22 int y; 23}; 24 25struct PointsArray 26{ 27 int points_num; 28 VectorPoint* points; 29}; 30 31 32
PointsArrayはStructLayoutを指定していますか?
はい、指定しています。
前回の質問が解決しているならクローズしてください。
https://teratail.com/questions/363309
回答しても長期放置、クローズしないでは今後回答しようという気も失せます。
ていうか、classは構造体じゃないですが。
回答1件
あなたの回答
tips
プレビュー