質問編集履歴
4
ご指摘頂いたポイントの修正
title
CHANGED
File without changes
|
body
CHANGED
@@ -38,12 +38,12 @@
|
|
38
38
|
|
39
39
|
public void Setup(IntPtr ptr)
|
40
40
|
{
|
41
|
-
arrayLength = (int)Marshal.
|
41
|
+
arrayLength = (int)Marshal.PtrToStructure(ptr, typeof(int));
|
42
42
|
ptr += sizeof(int);
|
43
43
|
|
44
44
|
for(int idx = 0; idx < arrayLength; idx++)
|
45
45
|
{
|
46
|
-
dArray[idx].arrayId = (int)Marshal.
|
46
|
+
dArray[idx].arrayId = (int)Marshal.PtrToStructure(ptr, typeof(int));
|
47
47
|
ptr += sizeof(int);
|
48
48
|
|
49
49
|
dArray[idx].arrayVal = (float)Marshal.PtrToStructure(ptr, typeof(float));
|
@@ -60,7 +60,7 @@
|
|
60
60
|
}
|
61
61
|
|
62
62
|
// ptrには、DLLの受け取りたいAの先頭ポインタが入ります
|
63
|
-
public GetA(IntPtr ptr)
|
63
|
+
public void GetA(IntPtr ptr)
|
64
64
|
{
|
65
65
|
private A a = new A();
|
66
66
|
a.Setup(ptr);
|
3
C#側のプログラムにミスがあったため修正・ご指摘頂いた件について追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -62,8 +62,8 @@
|
|
62
62
|
// ptrには、DLLの受け取りたいAの先頭ポインタが入ります
|
63
63
|
public GetA(IntPtr ptr)
|
64
64
|
{
|
65
|
-
private A = new A();
|
65
|
+
private A a = new A();
|
66
|
-
|
66
|
+
a.Setup(ptr);
|
67
67
|
}
|
68
68
|
```
|
69
69
|
|
@@ -72,4 +72,8 @@
|
|
72
72
|
その下のdArrayから正しい数値を受け取ることができないようになってしまっております。
|
73
73
|
|
74
74
|
マーシャリングやC++自体不慣れでポインタ等の知識が不足している状態ですが、
|
75
|
-
何卒よろしくお願い致します。
|
75
|
+
何卒よろしくお願い致します。
|
76
|
+
|
77
|
+
《追記》
|
78
|
+
dArrayのそれぞれの要素の実体メモリ部分はnewで割り当てた別のところにあるのに、C#側でシーケンシャルなアクセスをしているからでは?というご指摘を頂き、恐らくこちらが原因だと思われます。
|
79
|
+
ただ、C#でunsafeを使うことで、ポインタを使用することができるとは思うのですが、Marshal.PtrToStructure()でポインタをマーシャリングする事ができませんでした。 もし、DLL側からポインタを受け取って、そのポインタを使用してその箇所の値にアクセスする手段がありましたら、ぜひご教授頂けないでしょうか?何卒、よろしくお願い致します。
|
2
構造体Aのデータ設定処理再追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -17,6 +17,8 @@
|
|
17
17
|
// 構造体Aのデータ設定
|
18
18
|
public void SetupA(A* a, int length)
|
19
19
|
{
|
20
|
+
a->arrayLength = length;
|
21
|
+
|
20
22
|
a->dArray = new DynamicArray[length];
|
21
23
|
for(int idx = 0; idx < length; idx++)
|
22
24
|
{
|
1
C++側の構造体Aのデータ設定処理追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -13,6 +13,17 @@
|
|
13
13
|
int arrayId;
|
14
14
|
float arrayVal;
|
15
15
|
}
|
16
|
+
|
17
|
+
// 構造体Aのデータ設定
|
18
|
+
public void SetupA(A* a, int length)
|
19
|
+
{
|
20
|
+
a->dArray = new DynamicArray[length];
|
21
|
+
for(int idx = 0; idx < length; idx++)
|
22
|
+
{
|
23
|
+
a->dArray[idx].arrayId = idx;
|
24
|
+
a->dArray[idx].arrayVal = idx % 1.5f;
|
25
|
+
}
|
26
|
+
}
|
16
27
|
```
|
17
28
|
|
18
29
|
上記の構造体をC#で以下のようにして、受け取ろうと考えています。
|