我希望有一个包含许多自变量的向量。在我的c ++标题(.h)中,我将其定义为:
private:
// static data structure holding independent variables
static vector<double>* indVariables;
并且在我的.cpp文件中定义相同,然后我必须在其他一些函数中使用此向量:
static vector<double>* indVariables;
void fun(int m, int n)
{
for (i = 0; i < m; ++i)
{
ai = indVariables[i];
temp = exp(-n * (ai - 8.0));
}
} /*fun */
现在在c#中我希望将一组数字复制到此向量并将其调用回c ++,如下所示:
var matu = new double[]{ 8.0, 8.0, 10.0, 10.0, 10.0, 10.0};
myCppClass.indVariables = matu;
谁能告诉我怎么办呢?
第一个问题是因为它是私密的我不会在c#中看到它。我是否必须公开或有其他方式?然后我该如何为这个向量赋值?
答案 0 :(得分:1)
它是私有的这个事实确实存在问题,但是,公开它不会解决你的问题我认为。理查德说,C#并不知道std :: vector是什么。我不太了解代码的结构,它的作用,它的使用方式等,但是,如果你只需要为向量分配一个列表/数组,你可以使用List&lt ;&GT;在您的C#代码中,在CLI项目/文件中包含向量的赋值:
void Assign(Collections::Generic::List<double>^ l )
{
IndVariables->clear();
for each (double i in l)
{
IndVariables->push_back(i);
}
}
然后在你的C#程序中,你要写(或者你已经宣布你的名单&lt;&gt;):
yourCppClass.Assign(new List<double>(){0.0, 42.0, 8.0});
您还可以添加其他包装器方法来操作或访问矢量。同样,这可能适合也可能不适合,具体取决于代码的结构。
答案 1 :(得分:0)
引用C ++ / CX的Collections文档:
在Visual C ++组件扩展(C ++ / CX)程序中,您可以制作 免费使用标准模板库(STL)容器或任何其他容器 用户定义的集合类型。但是,当您传回集合时 跨Windows运行时应用程序二进制接口 (ABI) - 例如,XAML控件或JavaScript客户端 - 您 必须使用Windows运行时集合类型。
因此,您可以在内部使用STL容器,但是由于它们不能跨越ABI边界,您无法在运行时组件之间传递它们。
快速解决方法是通过Vector
使用Platform::Collections
命名空间中提供的<collection.h>
类。
将标题声明更改为:
public:
static Vector<Double>^ IndVariables;
您的C#组件也需要更改:
var matu = new Double[] { 8.0, 8.0, 10.0, 10.0, 10.0, 10.0};
myCppClass.IndVariables = matu;
这是未经测试的代码,因此上面的代码段中应该出现语法错误或其他小问题。