从c#

时间:2016-03-23 15:43:43

标签: c# c++ vector managed-c++

我希望有一个包含许多自变量的向量。在我的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#中看到它。我是否必须公开或有其他方式?然后我该如何为这个向量赋值?

2 个答案:

答案 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;

这是未经测试的代码,因此上面的代码段中应该出现语法错误或其他小问题。

相关问题