質問するログイン新規登録

質問編集履歴

4

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

2021/09/09 00:11

投稿

Siroinaba
Siroinaba

スコア11

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.PtrToStructre(ptr, typeof(int));
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.PtrToStructre(ptr, typeof(int));
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#側のプログラムにミスがあったため修正・ご指摘頂いた件について追記

2021/09/09 00:11

投稿

Siroinaba
Siroinaba

スコア11

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
- A.Setup(ptr);
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のデータ設定処理再追記

2021/09/08 23:27

投稿

Siroinaba
Siroinaba

スコア11

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のデータ設定処理追記

2021/09/08 23:18

投稿

Siroinaba
Siroinaba

スコア11

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#で以下のようにして、受け取ろうと考えています。