【发布时间】:2019-04-11 05:45:19
【问题描述】:
在尝试将数组从 C++ 传递到 C# 时,我看到了一个非常奇怪的问题。我正在使用 Marshal.Copy(特别是:https://msdn.microsoft.com/en-us/library/a53bd6cz(v=vs.110).aspx)。
问题:从 C++ 到 C# 的浮点数组在结果数组中产生了一些 NaN。
(注意:我在 Unity 游戏引擎的上下文中工作)
代码
示例 C++ 代码:
extern "C" bool UNITY_INTERFACE_EXPORT UNITY_INTERFACE_API getSomeFloats(float** points, int* count) {
std::vector<float> results;
std::vector<SOME_TYPE> key_points = <SOME_POINTS>
for (auto iter = key_points.begin(); iter < key_points.end(); iter++) {
results.push_back(static_cast<float>(iter->pt.x));
results.push_back(static_cast<float>(iter->pt.y));
}
*points = results.data();
*count = results.size();
//<Print results to csv here>
return true;
}
示例 C# 代码:
[DllImport("NativePlugin")]
private static extern bool getSomeFloats (ref IntPtr ptrResultItems, ref int resultItemsLength);
private static float[] getFloatArrayFromNative() {
IntPtr ptrResultItems = IntPtr.Zero;
int resultItemsLength = 0;
bool success = getSomeFloats (ref ptrResultItems, ref resultItemsLength);
float[] resultItems = null;
if (success) {
// Load the results into a managed array.
resultItems = new float[resultItemsLength];
Marshal.Copy (ptrResultItems
, resultItems
, 0
, resultItemsLength);
// <PRINT out resultItems to csv here>
return resultItems;
} else {
Debug.Log ("Something went wrong getting some floats");
return new float[] { -1, -2 };
}
}
输出示例: 举个例子: C++ 输出(print_out.csv):
123、456、789
C# 输出 (print_out_cs.csv):
123, 南, 789
我完全被这个难住了。我只是不明白为什么只有一些(大约 7/100)浮点数返回NaN。有没有人有任何可能有帮助的建议/见解?
谢谢!
【问题讨论】:
-
这些值是真实值吗? (示例中的那些)
-
@Gusman 是的,这些是真正的价值观。值的范围可以从 0 到 5000。