0

私は、C ++ cliを使用して、管理されていない世界から管理された世界まで、いくつかの科学ライブラリ(http://root.cern.ch)の薄いラッパーを実行します。

特別なファイル形式(主な目標)の読み取りは、次の方法で実装されます。1) SetBranchAddress(const char name、void * outputVariable)
を 一生呼び出して、変数のアドレスを通知します 。2)N回以上呼び出します。GetEntry(ulong numberOfRow)は、この void*outputVariableを適切な値で埋めます。

私はこの使用例を置きます:

double myValue; //this field will be filled

//We bind myValue to the 'column' called "x" stored in the file"
TTree->SetBranchAddress("x", &myValue); 

// read first "entry" (or "row") of the file
TTree->GetEntry(0); 

// from that moment myValue is filled with value of column "x" of the first row
cout<<"First entry x = "<<myValue<<endl; 

TTree->GetEntry(100); //So myValue is filled with "x" of 101 row
...

したがって、C ++ / CLIコードでは、管理対象の基本型をこのvoid*ポインターにバインドすることに問題があります。

私は3つのアプローチを試しました:

namespace CppLogicLibrary {
public ref class SharpToRoot
{        
       double mEventX;
       double *mEventY;
       IntPtr memEventZ;

       ///Constructor
       SharpToRoot()
       {
          mEventy = new double();
          memEventZ= Marshal::AllocHGlobal(sizeof(double));
       }

       void SetBranchAddresses()
       {
           pin_ptr<double> pinnedEventX = &mEventX;
           mTree->SetBranchAddress("ev_x", pinnedEventX);
           mTree->SetBranchAddress("ev_y", mEventY);
           mTree->SetBranchAddress("ev_z", memEventZ.ToPointer());
           ...
           //now I read some entry to test... just in place
           mTree->GetEntry(100);
           mTree->GetEntry(101);
           double x = mEventX;
           double y = *mEventY
           double z = (double)Marshal::PtrToStructure(memEventZ, Double::typeid);
       }

       ...

3つのバリアントはすべてエラーなしでコンパイルされ、例外はありません...しかし、その(void *)値は、 5,12331E -305のようなゴミの値で埋められます。アンマネージコードでは、すべて正常に機能します。

このようなvoid*からC++/ CLIの基本型へのバインドのエラーは何でしょうか?

4

1 に答える 1

0

問題は、内部データがこのライブラリ内のフロートによって提示されることでした。そのため、C# 側で double としてマップおよび処理すると、5,12331E-305 になりました。

この 3 つのバリエーションのそれぞれが機能しました。そして、私の観点からは、 pin_ptr pinnedEventX = &mEventX; を使用します。関数の実行間で保持されないため、この場合は不適切でした。

なぜこの「フロート」状況がネイティブ C++ で処理されたのか、よくわかりません。前にも書きましたが、特に問題はありませんでした。

于 2011-05-25T13:50:36.620 に答える