質問編集履歴

4

ご指摘頂いたポイントの修正

2021/09/09 00:11

投稿

Siroinaba
Siroinaba

スコア11

test CHANGED
File without changes
test CHANGED
@@ -78,7 +78,7 @@
78
78
 
79
79
  {
80
80
 
81
- arrayLength = (int)Marshal.PtrToStructre(ptr, typeof(int));
81
+ arrayLength = (int)Marshal.PtrToStructure(ptr, typeof(int));
82
82
 
83
83
     ptr += sizeof(int);
84
84
 
@@ -88,7 +88,7 @@
88
88
 
89
89
  {
90
90
 
91
- dArray[idx].arrayId = (int)Marshal.PtrToStructre(ptr, typeof(int));
91
+ dArray[idx].arrayId = (int)Marshal.PtrToStructure(ptr, typeof(int));
92
92
 
93
93
  ptr += sizeof(int);
94
94
 
@@ -122,7 +122,7 @@
122
122
 
123
123
  // ptrには、DLLの受け取りたいAの先頭ポインタが入ります
124
124
 
125
- public GetA(IntPtr ptr)
125
+ public void GetA(IntPtr ptr)
126
126
 
127
127
  {
128
128
 

3

C#側のプログラムにミスがあったため修正・ご指摘頂いた件について追記

2021/09/09 00:11

投稿

Siroinaba
Siroinaba

スコア11

test CHANGED
File without changes
test CHANGED
@@ -126,9 +126,9 @@
126
126
 
127
127
  {
128
128
 
129
- private A = new A();
129
+ private A a = new A();
130
130
 
131
- A.Setup(ptr);
131
+ a.Setup(ptr);
132
132
 
133
133
  }
134
134
 
@@ -147,3 +147,11 @@
147
147
  マーシャリングやC++自体不慣れでポインタ等の知識が不足している状態ですが、
148
148
 
149
149
  何卒よろしくお願い致します。
150
+
151
+
152
+
153
+ 《追記》
154
+
155
+ dArrayのそれぞれの要素の実体メモリ部分はnewで割り当てた別のところにあるのに、C#側でシーケンシャルなアクセスをしているからでは?というご指摘を頂き、恐らくこちらが原因だと思われます。
156
+
157
+ ただ、C#でunsafeを使うことで、ポインタを使用することができるとは思うのですが、Marshal.PtrToStructure()でポインタをマーシャリングする事ができませんでした。 もし、DLL側からポインタを受け取って、そのポインタを使用してその箇所の値にアクセスする手段がありましたら、ぜひご教授頂けないでしょうか?何卒、よろしくお願い致します。

2

構造体Aのデータ設定処理再追記

2021/09/08 23:27

投稿

Siroinaba
Siroinaba

スコア11

test CHANGED
File without changes
test CHANGED
@@ -35,6 +35,10 @@
35
35
  public void SetupA(A* a, int length)
36
36
 
37
37
  {
38
+
39
+ a->arrayLength = length;
40
+
41
+
38
42
 
39
43
  a->dArray = new DynamicArray[length];
40
44
 

1

C++側の構造体Aのデータ設定処理追記

2021/09/08 23:18

投稿

Siroinaba
Siroinaba

スコア11

test CHANGED
File without changes
test CHANGED
@@ -25,6 +25,28 @@
25
25
  int arrayId;
26
26
 
27
27
  float arrayVal;
28
+
29
+ }
30
+
31
+
32
+
33
+ // 構造体Aのデータ設定
34
+
35
+ public void SetupA(A* a, int length)
36
+
37
+ {
38
+
39
+ a->dArray = new DynamicArray[length];
40
+
41
+ for(int idx = 0; idx < length; idx++)
42
+
43
+ {
44
+
45
+ a->dArray[idx].arrayId = idx;
46
+
47
+ a->dArray[idx].arrayVal = idx % 1.5f;
48
+
49
+ }
28
50
 
29
51
  }
30
52