【问题标题】:How to represent System.double in unmanaged C++?如何在非托管 C++ 中表示 System.double?
【发布时间】:2018-07-26 05:40:17
【问题描述】:

我正在使用非托管 C++ 中的 API 为 Solidworks 编写一个独立的应用程序,但遇到了一些问题。 在图纸上获取注解位置坐标的方法有 IGetPosition 和 GetPosition。两者都声明具有 3 个元素的数组作为 RetVals。但 Visual Studio 不接受我将双精度数组传递给 IGetPosition。

Pic1

同时,API 帮助中有 C# 和 C++/CLI 中的定义示例:

System.double IGetPosition(); 

System.doubleSW API IGetPosition 正如我所知道的,System.double 不仅仅是一个双精度数,而是托管 C++ 中的一个结构。我对这些东西不熟悉,因为我只是一个初学者。 所以问题是:如何在非托管代码中表示 System.double 以被接受为 IGetPosition &parameter?

顺便说一句:GetPosition 方法采用 VARIANT,但返回 rank1 的安全数组,这似乎与 XYZ 的 3 个值不兼容。 还发现了一些关于编组的东西。那是正确的方法吗?如果是这样,你能提供一个例子吗?

【问题讨论】:

  • 什么是非托管C++?请clarify。标准 C++ 中有一个类型 double
  • 在C#中有doubleSystem.Double没有System.double
  • 未指定时,C++ 是非托管 C++,编译为机器码。在非托管 C++ 中,您必须手动管理内存分配。 ©stackoverflow.com/questions/114238/…
  • @keith 我不使用 C#,System.double 是我在 SW API 帮助中写的。我已经用网址和屏幕截图更新了帖子。
  • @Sergey Kolesnik,该文档可能是错误的。它可能意味着double,它是一个值类型System.Double 不是值类型,它是 structSystem.double 是错误的:docs.microsoft.com/en-us/dotnet/csharp/language-reference/…。正如@Ron 所说,使用 C++ double.

标签: c++ c++-cli unmanaged managed


【解决方案1】:

这里的问题是 C++ 不允许数组作为函数参数或返回值。但是,它允许指针和数组decay 指向指针。其实new double[3]创建了一个数组并返回一个指针。

特别是,数组衰减到指向其第一个元素的指针。也就是说,double XYZ[3] 衰减为指向XYZ[0]double*

你使用了&XYZ。这也是一个有效的表达式,但它给了你一个指向数组的指针——而不是它的第一个元素。只需删除&,然后使用pAnnf->IGetPosition(XYZ)

【讨论】:

  • 感谢您的解释,我对数组一无所知。它接受 XYZ 作为参数。但这并没有让事情变得更好。它退出了一个 0.1 0 0 的数组。首先,为什么它会改变精度,因为之前它是 0.12****(如果有的话)。其次,返回 1 的值 3 可以确认这个库实际上是搞砸了,但仍然是可疑的。
猜你喜欢
  • 2011-10-14
  • 2016-02-21
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
相关资源
最近更新 更多