2017-03-27 22 views
-1

これはStackOverFLowの最初の投稿です!管理されていないヒープから管理されたヒープのデータを取得する

私はC++/CLIを理解しようとしていますが、2つのプロパティgetLxsetLxで管理されていない構造体があり、doubleへのポインタを取得し、それぞれdoubleへのポインタを受け取ります。 したがって、アンマネージドメソッドでsetLxの値を設定し、管理スコープのgetLxから値を取得しようとしています。管理されていないヒープに割り当てられたデータを管理されたヒープに変換または取得したい

だから基本的には例のコードの下、私はdouble^参照型ネイティブdouble*からネイティブポインタの参照型

/*Unmanaged Struct*/ 
    struct Grid2D 
     { 
     double* getLx() const { 
      return _Lx; 
      } 
     void setLx(double* val) { 
      _Lx = val; 
      } 
     private: 
      double* _Lx; 
     public: 
      int _count; 
     }; 

    #pragma unmanaged 
    void UnmanagedFillGrid(Grid2D& d) 
     { 
     printf_s("\nunmanaged"); 
     double* item = new double[d._count]; 
     int i = 0; 
      while (i++ < d._count) { 
       int r = (rand() % 100) + 1; 
       item[i] = r; 
       printf_s("array[%d] = %f\n", i, item[i]); 
       } 
      d.setLx(item); 
     } 

    #pragma managed 
    int main(array<System::String ^> ^args) 
    { 
     Grid2D d; 
     d._count = 10; 
     UnmanagedFillGrid(d); 
     Console::WriteLine("[managed] count = {0}", d._count); 
     //getLx returns pointer to double, I need to get in double^ 
     //Is this possible ? 
     double^ managedLx = d.getLx();//How to convert ?? 


     return 0; 
    } 
+1

あなたが実際にやろうとしていることは明らかではありません。 [mcve]に必要なもの以外のすべてのコードを削除してください。 –

答えて

2

まず必要があります:それはC++/CLIで有効なタイプですが、あなたはいけませんdouble^を使用してください。値の型に対する管理参照は、奇妙で不必要で、他の.Net言語(C#など)ではまったく存在しません。

あなたのdouble*は配列のようです。管理対象のアレイタイプはではなくarray<double>^です。これは管理対象側で使用する必要があります。管理対象配列には独自の長さも分かっているので、カウントを個別に公開する必要はありません。

double*からarray<double>^にデータを移動するには、コピーする必要があります。 arrayオブジェクトを作成する方法はありません。そのため、他のオブジェクトによって割り当てられたメモリが使用されるため、データのコピーが唯一の可能性があります。 Marshal::Copyメソッドを使用するか、forループを使用して、データを自分でコピーします。 (それらは同じものに沸きます。)

関連する問題