Этот баннер — требование Роскомнадзора для исполнения 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 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Ммм, да.Согласен. Завтра буду пробовать. Спасибо за разъяснения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.04.2014, 20:51 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Тут подумал. Все-же что-то не то. Я передаю данные из C# в функцию, написанную на С++. Функция решает СЛАУ. Результат помещает в массив. Решение СЛАУ это отдельная сторонняя dll. Программа на С++ это обертка над ней. И выделение памяти под массив решений происходит именно в этой сторонней dll. Обертка имеет уже ссылку на массив решений. И понятно, что в программе на C# выделить память не получится. Отсюда выходит, что в программе на С++ нужно припиннеть массив решений. Уж не знаю как это делать. Или все-же в программе на C# как-то через fixed-unsave взять массив решений. Что скажет уважаемый мной Изопропил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 08:02 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsafИ выделение памяти под массив решений происходит именно в этой сторонней dll. ну раз так, и копировать в c# массив нежелательно, лучше остановиться на unsafe коде с указателями P.S. возвращаемый IntPtr легко приводится к double* (double*)ptr.ToPointer() P.P.S. если пишется обёртка для библиотеки решения СЛАУ - покажи оригинальные сигнатуры(а лучше ссылку на описание библиотеки дай) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 08:17 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Мы делаем LU факторизацию матрицы для дальнейшего решения СЛАУ. Для этого используем бесплатную разработку с открытым кодом. Вот ссылка на SuperLU Работаем с версией 4.3. Это первая строка на скачивание: Download software (V4.3) - Функции с которыми работаем: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Имея структуры L и U вытаскиваем матрицы L и U в координатном прадставлении: L, iL, jL - эти три массива имеют один размер sizeL U, iU, jU - эти три массива имеют другой размер sizeU Эти шесть матриц идут на выход, в C#. На на вход обертки на C++ идет матрица А тоже в координатном представлении A, iA, jA Координатное представление: A - массив ненулевых значений типа double iA - массив строк типа int jA - массив столбцов типа int Размер всех трех массивов sizeA Если еще осталось желание, то могу приложить сольюшен для Visual Studio, где мой коллега пытается написать на С++ код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 09:06 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsaf, ничего страшного нет, можно обойтись даже без обёртки, хотя обёртку может оказаться проще сделать, чем P/Invoke напрямую в случае обёртки возвращать IntPtr, входные массивы - по ссылке если есть разумная оценка размеров L и U - можно свой буфер подать (п 1.4.4 документации) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 11:52 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
Разумной оценки размерности L и U нет. Может доходить до 10 000 000. Но заранее выделять такого размера буфер нет смысла, т.к. практически 99% расчетов будут идти с размерами гораздо меньшими. Изопропил, можешь показать чем как инициализировать IntPtr в C# программе. И как без Marshal.Copy поиметь нужный массив на выходе, преобразовав intPtr, как ты писал к double* (double*)ptr.ToPointer() . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 12:57 |
|
||
|
Создание одномерного массива типа double размерности N
|
|||
|---|---|---|---|
|
#18+
vlsaf, Код: plaintext 1. 2. 3. 4. 5. 6. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. unsafe c# - давай в профильный форум ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.04.2014, 14:04 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2019515]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
71ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 279ms |
| total: | 445ms |

| 0 / 0 |
