1
int atClass1::read_file
(String^ file_path, /* Path tofile */
 HdfCallVars % ret_vals)

これが私の機能です。その中には、ネイティブの C++ コードがたくさんあります。深刻な問題に遭遇しましたが、

/* Iterate through the links, filling in needed data as discovered. */
  io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE,

               &i, get_sonar_data, (void*)& ret_vals);

コンパイルされません!ret_vals は管理されており、ポインターとアンパサンドを使用することはできません。私は困っていますか?または、私のジレンマから抜け出す方法はありますか? H5 関数は、HDF5 ライブラリへの呼び出しです。ありがとう、サロジ

4

1 に答える 1

0

.Net では、必要に応じてガベージ コレクターがヒープ領域を "圧縮" するため、オブジェクトが現在のメモリ位置に残るという保証はありません。

管理対象オブジェクトへのネイティブ ポインターを取得するには、オブジェクトを「固定」する必要があります。

pin_ptr<HdfCallVars> pinned = &ret_vals;
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
                        &i, get_sonar_data, (void*)pinned);

変数pinnedがスコープ外になった後、ポインターは固定解除されることに注意してください。H5Literate が将来の使用のためにポインターを格納する場合は、次のように System::Runtime::InteropServices::GCHandle を使用して値を固定する必要があります。

GCHandle ^handle = GCHandle::Alloc(ret_vals);
io_err = H5Literate (group_id, H5_INDEX_NAME, H5_ITER_NATIVE, 
                        &i, get_sonar_data, (void*)handle->AddrOfPinnedObject());

ポインターが不要になったら、解放する必要があります。

handle->Free();
于 2013-02-16T04:59:22.707 に答える