2014-04-10 3 views
0

일부 비 관리 코드의 경우 C# 래퍼에 다음과 같은 구조체가 있습니다. 포인터를 사용하여 일부 데이터를 넘기려고합니다. ushort * 및 byte * 부분에서는 문제가되지 않지만 고정 된 int에서는 작동하지 않습니다.int * 포인터가 컴파일되지 않는 반면 ushort * 및 byte *는 괜찮습니다.

[StructLayout(LayoutKind.Sequential)] 
unsafe public struct IMAGE 
{ 
    public fixed int nSize[2]; 
    public ushort* pDepthIm; 
    public byte* pColorIm; 
} 

몇 가지 정보를이 구조체를 채우려면, 내가 사용

당신은 고정되지 않은에 포함 된 고정 된 크기의 버퍼를 사용할 수 없습니다 _im.nSize = pSize;에서

unsafe public void LoadImage(ushort[] depthImage, byte[] rgbImage, int[] size) 
{   
    unsafe 
    { 
     fixed (int* pSize = size) 
     fixed (ushort* pDepth = depthImage) 
     fixed (byte* pRGB = rgbImage) 
     { 
      _im.nSize = pSize; 
      _im.pColorIm = pRGB; 
      _im.pDepthIm = pDepth; 

      ... 
     } 
    } 
} 

컴파일러는 진술에 오류가 표시 표현. 고정 된 명령문을 사용해보십시오.

나는 이미 int이 (그러나 fixed int뿐만 아니라 포인터 타입 *과) 다른 방식으로 초기화되는 것으로 나타났습니다,하지만 난 값을 넘겨하는 방법을 알아낼 수 없습니다. 변수 유혹 할 때, ... int*

업데이트 주심 : 내가 언급 한 메시지의 MSDN error reference을 가로 질러왔다. 이제는 IMAGE 구조체의 fixed 문과 관련이 있다고 확신하지만 아직 해결 방법을 모르고 있습니다.

+0

표시된 모든 코드는 C#입니다. 관리되지 않는 C++ 라이브러리에 액세스하기 때문에 C++ 태그를 추가했습니다. – DIF

답변

0

: 이것은 좋은 방법의 경우, 또는

public unsafe void LoadImage(ushort[] depthImage, byte[] rgbImage, int[] size) 
{ 
    unsafe 
    { 
     fixed (int* pSize = _im.nSize) 
     fixed (ushort* pDepth = depthImage) 
     fixed (byte* pRGB = rgbImage) 
     fixed (S_IMAGE* pim = &_im) 
     { 
      pSize[0] = size[0]; 
      pSize[1] = size[1]; 

      _im.pColorIm = pRGB; 
      _im.pDepthIm = pDepth; 
     } 
    } 
} 

임 확실하지 않은이 될 운명, 그러나 적어도이 예상대로 작동하는 방법을 경우. ..

1

배열에 포인터를 할당 할 수 없습니다. memcpy을 사용해야합니다.

memcpy(_im.nSize, size, sizeof(_im.nSize)); 

실제로 배열에 아무 것도 지정할 수 없습니다. 배열의 값을 수정할 수는 있지만 재 할당 할 수는 없습니다.

또한 배열 길이를 확인하거나 매개 변수로 전달하거나 languge에서 허용하는 경우 .length을 확인하십시오. 이 같은 fixed int[2]에 액세스 할 수있는 방법을 발견하는 경우

+0

'크기'를 고칠 필요조차 없습니다. 두 개의 할당 또는 작은 for 루프를 사용하여 두 요소를 복사하십시오. – usr

+0

@usr 크기가 잘못되면 비즈니스 로직 오류입니다. 입력 내용이 입력하기 전에 의도 한대로 입력되었는지 확인하는 것은 좋은 방법이며 때로는 많은 시간을 절약 할 수 있습니다. – Dariusz

+0

제안 해 주셔서 감사합니다. 'memcpy'는 C++ 함수처럼 보입니다. C#을 사용하고 있습니다. (미안하지만 질문이 명확하지 않은 경우). – DIF

관련 문제