2010-08-10 4 views
0

관리되지 않는 Aubio 라이브러리 dll (Aubio.org) 인 에 몇 가지 호출을 래핑하고 Aubio 샘플 버퍼를 처리하는 것이 좋은지 궁금합니다.C# interop : 관리되지 않는 구조체의 포인터 배열 처리

는 그것은 다음과 같이 정의되어 :

// Buffer for real values 
struct _fvec_t { 
    uint length; // length of buffer 
    uint channels; // number of channels 
    float **data; // data array of size [length] * [channels] 
}; 

Aubio가 올바르게 설정 datamembers와 나를 위해 구조체를 생성, 그래서 나는 IntPtr입니다 얻을. C# 코드에서 데이터 포인터를 읽고 쓰는 것이 필요합니다.

for (int chan_idx = 0; chan_idx < my_fvec.channels; ++chan_idx) 
    for (int i=0; i<something; i++) 
     my_fvec.data[chan_idx][i] = SomeRandomValue(); 

그것에 읽기/쓰기 그래서 제대로 데이터 멤버에 액세스 할 수 fvec_t 유형으로 C#을 구조체를 '지도'하는 올바른 방법은 무엇입니까? ,

은 (아니면 내가 Marshal.Copy를 사용해야하고, 나는 배열의-포인터? 것을 어떻게해야합니까)

+0

Marshal.Copy 메서드에 대한 간단한 아이디어입니다. 포인터의 배열 인 경우 데이터 포인터를 In의 배열로 마샬링 할 수 있습니다. tPtr을 수행 한 다음 각 IntPtr을 마샬링합니다. 비록 그것이 최선의 생각인지 확실하지 않습니다. – OregonGhost

+0

OregonGhost에 동의합니다. 즉, C#에서 안전하지 않은 코드와 "실제"포인터를 사용하십시오. –

답변

0

난 당신이 관리 구조체를 정의 할 수 있습니다 치지과 PtrToStructure 당신이 무엇을 수정, 그런 다음 동일한 위치로 돌아가서 StructureToPtr을 호출 할 수 있지만 메모리가 이미 할당되어 있고 배열의 intptr을 읽은 다음 플로트 배열을 복사하여 복사하기 때문에 간단 할 수도 있습니다.

http://msdn.microsoft.com/en-us/library/ez2e4559.aspx