2012-02-16 3 views
3

을 떠 ++의 int에 투입되는 float 값이 있습니다. 값이 int 형인지 부동 형인지 여부는 런타임에 알 수 없습니다. 두 가지 옵션 모두를 고려해야합니다. 분명 int 인 경우 이미 가지고 있습니다. 그러나 그것이 float 값이라면 float 값 (캐스팅하지 않음)을 변경해야합니다. 어떻게해야합니까? 나는 C#에서 포인터를 사용하여 시도했지만 실패했다.INT 포인터 C에서

+1

1) 런타임에 유형을 어떻게 알 수 있습니까? 2) "변화"는 캐스트 해석을 다시 해석하는 것을 의미합니까? – CodesInChaos

+0

정말 이해가 안되니? 어떻게 가치를 전달합니까? 메소드 호출을 통해? 그 방법을위한 프로토 타입이 있습니까? – Sauleil

답변

1

는 C# 코드에서 반대를 수행

float myFloatValue = *(float *)(&value); 

그리고 그것이 효과가 있습니다.

EDIT (그냥 그 값은, 그 자체에 있어야합니다 관리 유형의 내부에 있지 않은지 확인) : 당신이 unsafe

8

BitConverter.GetBytesBitConverter.ToFloat().

+0

오, 그래, 나도 그게 좋아. +1 – McKay

4

은 내가 노동 조합을 추천합니다, 당신이 요구하는지 이해한다면?

[StructLayout(LayoutKind.Explicit)] 
struct IntOrFloat 
{ 
    [FieldOffset(0)] 
    public int asInt32; 
    [FieldOffset(0)] 
    public float asFloat; 
} 

나는 이것이 효과가 있다고 생각한다.

2

하나의 옵션이 BitConverter 사용하는 것입니다 : 당신은 당신이 그 메소드 호출하기 전에 값이 될 어떤 종류의 알고 있던 경우에,

// assuming 'bytes' is byte[4] 
float value = BitConverter.ToSingle(bytes); 
// or  = BitConverter.ToSingle(BitConverter.GetBytes(integer)); 

당신이 할 수있는 또 다른 것은, 운영자가 P/호출에 과부하 활용하는 것 측면 :

// [DllImport("x.dll")] 
// public static extern void YourCall(ref float value); 

// [DllImport("x.dll")] 
// public static extern void YourCall(ref int value); 

if (someCondition) 
{ 
    float value = 0.0f; 
    NativeMethods.YourCall(ref value); 
    this.frob(value); 
} 
else 
{ 
    int value = 0; 
    NativeMethods.YourCall(ref value); 
    this.frob(value); 
} 
1
으로 이것을에서 일을 당신이 코드의 몸을 선언해야합니다

BitConverter을 사용할 수는 있지만 실제로는보기 흉합니다. C++에서 C# 인터페이스로의 변환은 정말 엉망입니다. 동일한 인수에서 int 또는 float 중 하나가 될 수있는 값을 전달합니다. 나는 당신이 두 가지 중 하나를 수행 제안 :

  1. 패스 모두의 int와 플로트 및
  2. 패스 한 수를 C#에서 올바른 모든 수레를 보유 할 수있는 형태로, 어떤 결정 모든 ints - double.