을 떠 ++의 int에 투입되는 float 값이 있습니다. 값이 int 형인지 부동 형인지 여부는 런타임에 알 수 없습니다. 두 가지 옵션 모두를 고려해야합니다. 분명 int 인 경우 이미 가지고 있습니다. 그러나 그것이 float 값이라면 float 값 (캐스팅하지 않음)을 변경해야합니다. 어떻게해야합니까? 나는 C#에서 포인터를 사용하여 시도했지만 실패했다.INT 포인터 C에서
3
A
답변
1
는 C# 코드에서 반대를 수행
float myFloatValue = *(float *)(&value);
그리고 그것이 효과가 있습니다.
EDIT (그냥 그 값은, 그 자체에 있어야합니다 관리 유형의 내부에 있지 않은지 확인) : 당신이 unsafe
8
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 중 하나가 될 수있는 값을 전달합니다. 나는 당신이 두 가지 중 하나를 수행 제안 :
- 패스 모두의 int와 플로트 및
- 패스 한 수를 C#에서 올바른 모든 수레를 보유 할 수있는 형태로, 어떤 결정 모든 ints -
double
.
1) 런타임에 유형을 어떻게 알 수 있습니까? 2) "변화"는 캐스트 해석을 다시 해석하는 것을 의미합니까? – CodesInChaos
정말 이해가 안되니? 어떻게 가치를 전달합니까? 메소드 호출을 통해? 그 방법을위한 프로토 타입이 있습니까? – Sauleil