2014-12-02 9 views
0

장치에서 데이터를 보내는 기능을 가진 C++ DLL이 있습니다. 내 관리 C# 코드에서 C++ 함수 positionCallback을 호출합니다. 여기서 포지션을 확인하십시오. pos per definition - 배열 배열을 가리키는 세 개의 포인터로 구성된 배열입니다.IntPtr 주소 증가 (값이 아님)

public void positionCallback(uint devNo,uint count,uint index,ref System.IntPtr pos,ref System.IntPtr mrk) 

이제 내 문제는 내가 그 3 개 각 배열의 데이터를 추출 할 것입니다하지만 난 단지 배열 1에 대한 데이터를 얻을 수 있으며, 나머지 2 내가 쓰레기 값을 얻고있다. 다음은 내가 코드 위

// Copy the unmanaged array to managed memory for Axis 2 
IntPtr ptr2 = IntPtr.Add(pos,2*sizeof(Int64)); 
Marshal.Copy(pos,managedArrayAxis1,0,(int)count); 
// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(ptr2, managedArrayAxis2, 0, (int)count); 

만, 쓰레기 데이터가 수집 managedArrayAxis1뿐만 managedArrayAxis2에 대한 올바른 데이터를주고 노력하고 코드입니다. 내가 pos에 대한 IntPtr 주소를 잘못 증가 시켰습니까?

도와주세요!

+0

있습니다를? Int이어야하며 Int64를 사용하면 문제가 발생할 수 있습니다. – pquest

+0

Int32는 managedArrayAxis2에 대한 가비지 값도 제공합니다. 그래서 두 가지를 모두 시도했습니다. 다른 제안이 도움이 될 것입니다! – Maverick

+0

참조로 포인터를 전달한다는 사실은 어떨까요? 나는 C++ 라이브러리에서 int **처럼 보일 것이라고 생각한다. C++ 메소드가 찾고있는 것이 맞습니까? – pquest

답변

2

pos 매개 변수는 실제로 이중 배열에 대한 포인터 배열에 대한 포인터이므로 두 번 참조 해제해야합니다. 당신의 코드로 어떤 일이 일어나고 있는지 ref은 자동으로 포인터의 배열에 대한 포인터를 역 참조하지만, pos에있는 것은 3 초 레벨 포인터 중 첫 번째 포인터이고 다른 두 포인터에 도달 할 수있는 방법은 아닙니다.

원래 포인터를 가져 오려면 pos 매개 변수에서 ref 키워드를 제거해야합니다. 그런 다음 데이터는 IntPtr의 배열에 pos가 가리키는 복사 당신은 어떤 포인터 연산이 필요하지 않습니다 : 당신은 INT64가 올바른지 확인

public void positionCallback(uint devNo,uint count,uint index,System.IntPtr pos,ref System.IntPtr mrk) 

// copy the array of pointers 
IntPtr[] arrays = new IntPtr[3]; 
Marshal.Copy(pos, arrays, 0, 3); 

// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(arrays[0],managedArrayAxis1,0,(int)count); 

// Copy the unmanaged array to managed memory for Axis 2 
Marshal.Copy(arrays[1], managedArrayAxis2, 0, (int)count); 
+0

@Ben, 왜 "아니오"입니까? 당신은 정확히 맞습니다. 단지 두 개의 레이어 만 있습니다. 맨 위 하나는'Marshal.Copy'를 사용하여'arrays'에 복사하는'double *'배열입니다. 이렇게하면 내가 질문에서 복사 한 두 개의 다른 Marshal.Copy() 호출과 함께 수행하는 3 초 레이어 배열에 액세스 할 수 있습니다. 무엇이 문제입니다? –

+0

죄송합니다. 첫 번째 문장을 트리플 포인터로 잘못 해석했습니다. –