2

Имеется функция на с++, которая возвращает одномерный массив. Как получить этот массив в C++/CLI, чтобы потом можно было использовать в C# (имеется в виду, какие типы данных и операторы использовать)?

В CLI массив имеет тип array<double> ^, а в С++ double*. Как в CLI записать массив из C++? Мой код:

C++:

 double *func1(....){
   .........
}

C++/CLI:

array<double> ^func2(...){
//как здесь обратиться к указателю, который возвращает функция 
//func1, чтобы потом возвратить его из функции func2 для 
//дальнейшего приема в c#
}
VladD
  • 206,799
boksts
  • 65
  • 1
    Если вам дан исчерпывающий ответ, отметьте его как верный (галка напротив выбранного ответа). – Nicolas Chabanovsky Mar 25 '16 at 05:53

1 Answers1

3

Никак. Но вы можете легко сконвертировать вручную.

Например:

vector<double> nativeVector;
// ...
auto nItems = nativeVector.size();
array<Double>^ managedArray = gcnew array<Double>(nItems);
for (size_t i = 0; i < nItems; i++)
    managedArray[i] = nativeVector[i];

Документация: How to: Use Arrays in C++/CLI.


Впрочем, в C++/CLI вы можете пользоваться и нативным массивом, если вам хочется. Конвертировать можно, например, только при передаче в другую часть программы.


Если у вас есть сишный массив, вы должны точно знать, сколько в нём элементов. Если вы знаете его длину, используйте её вместо nItems, остальной код точно такой же.

Если вы не знаете — упс, с массивом работать невозможно. Сделайте так, чтобы длина стала вам известна.

VladD
  • 206,799
  • C++: double *func1(....){ ...... }

    C++/CLI: array ^func2(...){ //как здесь обратиться к указателю, который возвращает функция //func1, чтобы потом возвратить его из функции func2 для //дальнейшего приема в c# }

    – boksts Mar 24 '16 at 18:06
  • @user206138: Код в комментариях не читается, добавьте его лучше в вопрос. // обновил ответ – VladD Mar 24 '16 at 18:08
  • Длину массива я не знаю... – boksts Mar 24 '16 at 18:20
  • @user206138: Тогда узнайте как-нибудь. Кроме вас никто её узнать не может. Без этой информации ничего работать не будет, сорри. – VladD Mar 24 '16 at 18:21
  • @VladD, а тут никак с pin_ptr? и типа само все? – Grundy Mar 24 '16 at 18:42
  • @Grundy: Ну, pin_ptr — это оптимизация, чтобы можно было сделать memcpy. Тут проблема другого порядка, размер массива неизвестен. – VladD Mar 24 '16 at 19:34
  • ага, и его по идее кроме func1 никто не может знать? – Grundy Mar 24 '16 at 19:38
  • @Grundy: Ага :) – VladD Mar 24 '16 at 19:39
  • @VladD, погоди, а sizeof(arr)/sizeof(arr[0])? разве не сработает? – Grundy Mar 24 '16 at 19:42
  • @Grundy: А откуда ему знать размер? sizeof же не волшебник, и вычисляется на этапе компиляции. sizeof не знает, что за указателем спрятался массив. Так что получим просто sizeof(*arr) == sizeof(double), т. к. тип *arrdouble. – VladD Mar 24 '16 at 19:43
  • интересно :) надо бы проверить, но лень :-D – Grundy Mar 24 '16 at 19:45
  • 1
    @Grundy: http://ideone.com/h8sHM4 – VladD Mar 24 '16 at 19:47