私は、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の基本型へのバインドのエラーは何でしょうか?