2013-02-16 2 views
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 라이브러리에 대한 호출입니다. 감사합니다, saroj

답변

0

.Net에서 가비지 수집기가 원하는대로 힙 공간을 압축하므로 개체가 현재 메모리 위치에 남아 있다고 보장 할 수 없습니다.

는 관리되는 개체에 당신이해야한다 "핀"객체 네이티브 포인터를 얻으려면 : 변수 pinned이 범위를 벗어나 후, 포인터가 고정 해제 될 것

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

참고 H5Literate 저장 포인터 경우 나중에 사용할 수 있도록, 당신은 다음과 같이 시스템 :: 런타임 :: 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(); 
+0

자세한 답변을 주셔서 대단히 감사합니다. 지금 당장 사용해 보겠습니다! 많은 감사합니다! saroj –

+0

GreenBoxal, 내 ret_vals를 채우기 위해 H5LIterate가 필요합니다. 예 2에서 쓰는 것처럼 그렇게 할 것입니까? (예제 1은 컴파일되지 않음). H5 함수를 호출 한 후 ret_vals에 다시 액세스하려면 어떻게해야합니까? 감사합니다, saroj –

+0

예제가 컴파일되지 않는 이유는 무엇입니까? cli :: pin_ptr을 사용하려고하면 두 예제 모두 ret_vals에 쓰고 정상적으로 액세스 할 수 있습니다. – greenboxal

관련 문제