2009-10-08 1 views
2

나는 .NET 클라이언트를 만들고 있는데, OPC Foundation이 제공하는 을 참조했습니다.관리되지 않는 메모리에 부동 소수점 값을 쓰고 있습니까?

[IN] IntPtr pPercentDeadBand 

문서에 언급 내가 float 값에 대한 포인터를 전달해야합니다 기능의

하나는이 매개 변수가 있습니다.

이것은 내가 투쟁하는 곳입니다. Marshall..WriteByte, .WriteInt16 및 .Writeint32를 찾았습니다.

그러나 관리되는 메모리에서 관리되지 않는 메모리로 float 값을 쓰는 것은 없습니다.

답변

1

대신 Marshal.Copy를 사용하고 단일 요소로 float []을 전달할 수 있습니다.

또는 float의 비트를 int로 채우고 Marshal.WriteInt32를 사용할 수 있습니다. 이 노동 조합과 같은 구조체 사이의 변환하는 데 사용할 수있는 두

[StructLayout(LayoutKind.Explicit)] 
struct SingleInt32Union 
{ 
    [FieldOffset(0)] 
    float s; 
    [FieldOffset(0)] 
    int i; 
} 
나는 주문, 다음 중 한 가지 방법으로 그것을 할 것
1

최선을 최악의 솔루션에서 :

  1. 변경의 상호 운용성 어셈블리 정의 이 방법. float에 대한 포인터이면 다음과 같이 선언해야합니다.

    ref float pPercentDeadBand 
    

    하지

    [In] IntPtr pPercentDeadBand 
    
  2. 사용 플로트에 대한 포인터를 전달하는 안전하지 않은 코드 :

    unsafe 
    { 
        float theValueToPass = 345.26f; 
        IntPtr thePointer = new IntPtr(&theValueToPass); 
        //pass thePointer to the method; 
    } 
    
  3. 가 Marshal.AllocHGlobal를 사용하여 메모리의 4 바이트를 할당로부터 실수 값을 복사 Marshal.Copy를 사용하는 단일 요소 플로트 배열, Marshal.AllocHGlobal에서받은 포인터를 사용하여 메서드를 호출 한 다음 Marshal.FreeHGlobal을 사용하여 메모리를 확보합니다.