Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Программа, написанная на С# вызывает функцию из прилинкованной dll-ки, написанной на C++. Как-то так Код: c# 1. Т.е. заранее размерность массива А не известна. Программа на С++ сама его создает и той размерности, которой сочтет нужным. Сигнатура функции на С++ очень простая Код: plaintext 1. Функция на С++ должна создать одномерный массив А размерностью N и вернуть его в вызывающую функцию на C#. Подскажите, как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 09:44 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsaf, Я полагаю, это -- вопрос по C# и его API для взаимодействия с программами на С. Предлагаю перенести тему у форум по C#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 09:54 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Кто-же на С# напишет пример программы на С++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 09:58 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Может я не правильно написал сигнатуру функции? Может ее надо как-то по другому писать? Вопрос остается тот-же, как написать на С++ функцию, чтобы она возвращала массив в С# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 10:09 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafВопрос остается тот-же, как написать на С++ функцию, чтобы она возвращала массив в С# вопрос скорее - как принять результат. память выделить либо GlobalAlloc либо CoTaskMemAlloc в c# принять как [out]IntPtr - самый простой вариант освобождать память в c# Marshal.FreeHGlobal или Marshal.FreeCoTaskMem соответсвенно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 10:58 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Изопропилпамять выделить либо GlobalAlloc либо CoTaskMemAlloc Выделение памяти должно идти где? В С++? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 11:58 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafИзопропилпамять выделить либо GlobalAlloc либо CoTaskMemAlloc Выделение памяти должно идти где? В С++? да ЗЫ почему void? (private static extern void MyFunk) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 12:29 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Это я ошибся при написании. Как должна выглядеть сигнатура функции на С++? Так же, как я написал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 13:28 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafЭто я ошибся при написании. Как должна выглядеть сигнатура функции на С++? Так же, как я написал? лучше так - Код: plaintext 1. результирующий размер лучше через параметр вернуть, маршаллинг проще получится, если потребуется скопировать массив в c# ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 17:02 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Сделал. Сенкс. Но! Marshal.Copy на массиве double размерностью 10 000 000 идет 75 ms. Дофига. Что-то есть в природе такое, чтобы не копировать, а пользоваться той памятью, в которую С++ записало матрицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 18:01 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafЧто-то есть в природе такое, чтобы не копировать, а пользоваться той памятью, в которую С++ записало матрицу? unsafe код - работа с указателями в c# или выделение памяти в c# и передача указателя в C++ PS вариант без c# - рассматривался? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2014, 18:32 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Работа без C# не рассматривается. Выделение памяти в c# и передача указателя в C++ тоже отпадает, т.к. заранее неизвестно, сколько памяти выделять. unsafe код + fixed, думал над этим, но так и не придумал, как правильно это сделать. На стороннем форуме посоветовали следующее: Код: plaintext 1. 2. 3. 4. 5. 6. Для меня что-то совсем не понятное. Пишут, что через gcnew выделенная память управляется сборщиком мусора. Какая сигнатура вызова из C# тоже не ясно. Может кто знает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 10:10 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsaf, в C++ используй сигнатуру предложенную Изопропил. На стороне C# такую сигнатуру: Код: c# 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 11:14 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Тут все равно будет копирование в массив А через маршалинг, только не явное. Или я не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 11:33 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsaf, да. Этого не избежать если речь идет о взаимодействии с неуправляемым C++ кодом. Ели у тебя есть возможность использовать управляемый вариант C++ (С++/CLI), то по идее использование gcnew для выделения памяти под массив должно избавить от необходимости копировать массив т.к. массив уже находится в управляемой куче. Правда как этим пользоваться я не смогу подсказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 11:39 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafТут все равно будет копирование в массив А через маршалинг, только не явное. Или я не прав? 1)c# умеет работать с указателями в C-стиле (так называемый unsafe код) 2) Можно в MyFunc передать параметром свой(c#) аллокатор чего лучше не делать - франкенштейнв менеджед с++ сюда вовлекать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 11:45 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
bazileЕли у тебя есть возможность использовать управляемый вариант C++ (С++/CLI), то по идее использование gcnew для выделения памяти под массив должно избавить от необходимости копировать массив т.к. массив уже находится в управляемой куче. Да, возможность есть. Так и буду делать, т.к с++ код сейчас пишет коллега программист. Ему ничего не стоит в опциях компилятора поставить /clr. Изопропил1)c# умеет работать с указателями в C-стиле (так называемый unsafe код) И при выходе за пределы fixed с использованием unsafe кода мне все равно придется копировать массив, для того, чтобы его данные можно было использовать при выходе из метода, где он заполняется. Остановлюсь на С++/CLI. В понедельник будем пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 12:19 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafИ при выходе за пределы fixed с использованием unsafe кода мне все равно придется копировать массив, для того, чтобы его данные можно было использовать при выходе из метода, где он заполняется. это не так vlsafЕму ничего не стоит в опциях компилятора поставить /clr посмотрим имхо оптимальный вариант: Код: plaintext 1. 2. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 12:36 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
c# Код: c# 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 12:56 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
MasterZiv +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 14:50 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Изопропил, спасибо. Но понять тяжело. С аллокаторами в первый раз встречаюсь. Да и с понятием pinned тоже. Можешь пояснить на пальцах, как это все работает? И как будет выглядеть вызов на C#? Вот так не получается: Код: c# 1. 2. 3. 4. 5. 6. 7. Выходной параметр A должен быть вначале инициализирован. Как от Dallocator a перейти к массиву А? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.04.2014, 15:09 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Сделал-таки :) См тут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:41 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafМожешь пояснить на пальцах, как это все работает? MyFunk параметром передаётся функция, которая выделяет память в данном случае функция c# и выделяет память из кучи CLR, запоминает ссылку на массив, фиксирует массив в памяти(дабы сборщик мусора не переместил неожиданно) и возвращает указатель в C код PS CLR - это уже совсем оффтоп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 12:49 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Мне нужно было все наоборот. C# должен вызвать функцию на С++. Она в свою очередь выделила бы память массиву и вернула этот массив в С#. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 14:38 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafМне нужно было все наоборот. C# должен вызвать функцию на С++. Она в свою очередь выделила бы память массиву и вернула этот массив в С#. почему же наоборот? c# функция вызывает функцию на с++, а она вызывает callback функцию на c#, которая выделяет память из кучи c# (CLR), а для заполнения возвращает в функцию с++ обычный указатель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 15:09 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38619777&tid=2019515]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
76ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 187ms |

| 0 / 0 |
