Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как создать массив и вернуть ссылку на него? 
V
    Опции темы
vlsaf
Дата 18.4.2014, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Программа, написанная на С# вызывает функцию из прилинкованной dll-ки. Как-то так
Код

private static extern void MyFunk([Out] out double[] A);

Т.е. заранее размерность массива А не известна. Программа на С++ сама его создает и той размерности, которой сочтет нужным.
Сигнатура функции на С++ очень простая
Код

int MyFunk(double *A)


Функция на С++ должна создать одномерный массив А размерностью N и вернуть его  в вызывающую функцию на C#.

Подскажите, как это сделать?
PM   Вверх
borisbn
Дата 18.4.2014, 08:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Есть подозрение, что это не получится. Никак. Массив в до-диезе это не просто указатель как в Си++.
И в любом случае в функцию на Си нужно передавать указатель на указатель.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
vlsaf
Дата 18.4.2014, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Может я не правильно написал сигнатуру функции?
Может ее надо как-то по другому писать?

Вопрос остается тот-же, как написать на С++ функцию, чтобы она возвращала массив в С# 
PM   Вверх
borisbn
Дата 18.4.2014, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Код
extern static public int MyFunk( out IntPtr result );
...
IntPtr ptr;
int size = MyFunk( ptr );
int[] managedArray = new int;
Marshal.Copy( ptr, managedArray, 0, size );

Код
int MyFunk( int ** p ) {
    int N = 42;
    *p = new int[ N ];
    return N;
}

Может быть как-то так получится... Не проверял

Это сообщение отредактировал(а) borisbn - 18.4.2014, 12:43


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Guinness
Дата 18.4.2014, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



Цитата(borisbn @  18.4.2014,  13:42 Найти цитируемый пост)
Не проверял

Там вроде managed C++ нужно использовать. М.б. с gcnew взлетит.
PM MAIL   Вверх
vlsaf
Дата 18.4.2014, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Цитата(borisbn @ 18.4.2014,  12:42)
Может быть как-то так получится... Не проверял

Оно наверняка получится, но если использовать Marshal.Copy, то при достаточном частом обращении к функции и большому объему копируемой матрицы, будет тратиться заметное время. Нужно разместить возвращанмую матрицу в памяти, доступной для C# кода, чтобы не копировать. В другом форуме подсказали использовать выдение памяти в С++ либо через GlobalAlloc либо через CoTaskMemAlloc. Пока не знаю как это все должно крутиться :(
PM   Вверх
DarthTon
Дата 18.4.2014, 15:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 106
Регистрация: 7.2.2009

Репутация: 1
Всего: 6



Код

int MyFunk( array<double>^% result )
{
    int N = 42;
    result = gcnew array<double>( N );    // allocate double[] array
    return N;
}

Компилить с /clr.
PM MAIL   Вверх
vlsaf
Дата 18.4.2014, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Спасибо. В понедельник попробую. 

Понимаю так, что dll уже надо засовывать в C# проекте, 
как обычно, в reference (т.е. это уже управляемый код)? 
ImportDll уже не нужен. 

Сигнатура вызова этой функции из C# уже обычная?
Код

var n = MyFunk(out A);


Это сообщение отредактировал(а) vlsaf - 20.4.2014, 11:22
PM   Вверх
vlsaf
Дата 21.4.2014, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Попробывал. Код на C# подцепил управляемую сборку. Увидел функцию MyFunk, но студия определила сигнатуру вот так:
Код

int MyFunk(ref double[] А);


Этого мне нужно было избежать, т.к. ref нужно заранее инициализировать.
PM   Вверх
Guinness
Дата 21.4.2014, 09:51 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 21.6.2009
Где: Зеленоград

Репутация: 2
Всего: 10



PM MAIL   Вверх
vlsaf
Дата 21.4.2014, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 9.5.2007

Репутация: нет
Всего: 1



Guinness, супер!

на плюсах нужен был параметр [Оut]

Код

double[] A;


Потом вызываю функцию:
Код

var err = MyFunk(out A);


Все идет на ура! Массив А становится размером такой, как нужно!!!

Всем спасибо за подсказки.

Это сообщение отредактировал(а) vlsaf - 21.4.2014, 10:46
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1414 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.