Как отправить двойной массив из C # в C ++ - PullRequest
4 голосов
/ 27 июля 2011

В моем коде C # у меня есть следующий массив:

var prices = new[] {1.1, 1.2, 1.3, 4, 5,};

Мне нужно передать его в качестве параметра в мой управляемый модуль C ++.

var discountedPrices = MyManagedCpp.GetDiscountedPrices(prices) ;

Как должна выглядеть подпись GetDiscountedPrices? В самом тривиальном случае, когда цены со скидкой равны ценам, как должен выглядеть метод C ++ GetDiscountedPrices?

Редактировать: мне удалось собрать его. Мой код C # такой:

    [Test]
    public void test3()
    {
        var prices = new ValueType[] {1.1, 1.2, 1.3, 4, 5,};
        var t = new TestArray2(prices , 5);
    }

Мой код на C ++:

        TestArray2(     
        array<double^>^ prices,int maxNumDays)
    { 
        for(int i=0;i<maxNumDays;i++)
        {
// blows up at the line below
            double price = double(prices[i]);
        }

Однако я получаю ошибку во время выполнения:

System.InvalidCastException: указанное приведение недопустимо.

Редактировать: Решение Кевина сработало. Я также нашел полезную ссылку: C ++ / CLI ключевые слова: под капотом

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Объявление управляемой функции будет выглядеть примерно так в заголовочном файле:

namespace SomeNamespace {
    public ref class ManagedClass {
        public:
        array<double>^ GetDiscountedPrices(array<double>^ prices);
    };
}

Вот пример реализации вышеуказанной функции, которая просто вычитает жестко закодированное значение из каждой цены во входном массиве ивозвращает результат в отдельном массиве:

using namespace SomeNamespace;

array<double>^ ManagedClass::GetDiscountedPrices(array<double>^ prices) {

    array<double>^ discountedPrices = gcnew array<double>(prices->Length);
    for(int i = 0; i < prices->Length; ++i) {
        discountedPrices[i] = prices[i] - 1.1;
    }
    return discountedPrices;
}

Наконец, вызывая его из C #:

using SomeNamespace;

ManagedClass m = new ManagedClass();
double[] d = m.GetDiscountedPrices(new double[] { 1.3, 2.4, 3.5 });

** Обратите внимание, что если ваша функция Managed C ++ передает массив собственной функции, он должен будет маршалировать данные, чтобы сборщик мусора не касался их.Трудно показать конкретный пример, не зная, как выглядит ваша нативная функция, но вы можете найти несколько хороших примеров здесь .

1 голос
/ 27 июля 2011

Поскольку вы работаете в управляемом C ++, я считаю, что вы хотите, чтобы подпись GetDiscountedPrices была:

array<double>^ GetDiscountedPrices(array<double>^ prices);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...