0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 4
|
|||||||||||
1 | |||||||||||
Возврат массива неизвестного размера из DLL (C++) в C#06.11.2019, 08:08. Показов 2699. Ответов 14
Доброго дня. Есть DLL, в которой функция от аппаратуры получает набор данных заранее неизвестного размера, size определяется внутри функции:
0
|
06.11.2019, 08:08 | |
Ответы с готовыми решениями:
14
Получить изображение неизвестного размера (байтовый массив) из dll C++ Как пробежаться по элементам двумерного массива неизвестного размера по типу "по строкам-по столбцам" Массив неизвестного размера Чтение файла неизвестного размера |
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
06.11.2019, 11:10 | 2 |
qwerty-off, не создавайте, вообще в функцию передается не указатель на массив, а указатель на начало памяти которая может быть выделена как под один элемент так и под несколько, Используйте в методе импорт IntPtr а далее в цикле делайте получение нужно значения через маршалинг байт.
Добавлено через 4 минуты Выделять можно, но тогда длл обязана очищать память после обработки.
1
|
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
06.11.2019, 11:38 | 4 |
RunningMan, qwerty-off, советую почитать как устроены массивы в C#, массив в C# конечно имеет последовательность значений элементов но не с указателя
выдержка:
0
|
0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 4
|
|
06.11.2019, 13:10 [ТС] | 5 |
Насколько я понял C# сам чистит память сборщиком мусора, на данный случай это не распространяется? Выглядит довольно бредово создание еще одной функции в DLL ради того, чтобы грохнуть буфер.
Возможно мне, как "железячнику", хочется сэкономить мегабайт памяти там, где его можно и не тратить. Все-таки считаю это правильным подходом. Это значит что приведенный мной код не должен работать, так как DLL испортит служебные поля массива? Но ведь работает же. Так и не понял, в какую сторону в итоге мне копать? Получать из DLL IntPtr?
0
|
06.11.2019, 13:14 | 6 |
qwerty-off, вопрос был не вам.
вопрос был к Andreyip , зачем использовать в методе импорт IntPtr а далее в цикле делать получение значения через маршалинг байт. Но что-то он не ответил.
0
|
0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 4
|
|||||||||||
06.11.2019, 14:12 [ТС] | 7 | ||||||||||
Продвинулся до такого подхода:
0
|
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
06.11.2019, 14:23 | 8 |
qwerty-off, Да после вызова метода нужно удалить память дернув какой то метод из библиотеки, либо перед следующим вызовом данного метода и после выгрузки DLL потому что память вы можете выделять разными способами отсюда и освобождать ее нужно так как выделили.
1
|
0 / 0 / 0
Регистрация: 06.11.2019
Сообщений: 4
|
|
06.11.2019, 15:00 [ТС] | 9 |
Andreyip, понял, спасибо. Добавил еще одну функцию в DLL. Вот почему-то только не покидает ощущение, что все это решение еще более уродливное, чем изначальное выделение массивов на 65к отсчетов.
0
|
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
06.11.2019, 15:15 | 10 |
qwerty-off, это решение более правильное, если вам нужно что то передавать что то одинакового размера то делайте структуру описывающиее данные, создавайте структуру в exe и передавайте в DLL для заполнения.
Если данные не одинакового размера и размер определяется в DLL то приложение изначально не знает какой буфер выделить, тут 2 варианта использовать функцию Calback которую вызовет библиотека по переданному адресу, либо сначала дергать метод который возвращает размер, далее создаем объект в памяти и после вызываем функцию с адресом этого выделенного кусочка, ну либо как тут, вызвали получили, при следующем вызове очистили.
1
|
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
|
|
29.02.2020, 09:05 | 11 |
набросайте примером кода please - ЧТО она тогда вернёт??.. в ту память, которая была выделена приложением, но уже мала для возвращения в неё результата из dll...
Добавлено через 4 минуты из #1 от ТС Я вот тоже не знаю иного способа, кроме как выделить память изначально с запасом... но смущает такой вариант - ведь каким бы ни был запас всё равно может сложиться ситуация, когда даже его не хватит... Добавлено через 4 минуты жаль не показали в теме ?? ====================================== Добавлено через 21 минуту вот для COMdll всё как-то продумано у MS - BSTR Суть: Альтернативный вариант: Добавлено через 35 минут БЕЗ ОБЁРТКИ CComBSTR - далее, вероятно, SysReAllocString в помощь (там же по линку)... но непонятно работает ли в сторону увеличения строки (in, out) ?? надо тестить
0
|
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
02.03.2020, 21:20 | 12 |
JeyCi, вернет указатель на память, и вторым параметром вернет размер. Для такой работы есть разные способы есть. Один из способов обратный вызов, второй способ вызов с выделением памяти и очистку через другой вызов.
1
|
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
|
|
03.03.2020, 07:19 | 13 |
0
|
544 / 352 / 119
Регистрация: 17.08.2014
Сообщений: 1,335
|
|
03.03.2020, 08:02 | 14 |
JeyCi, Чуть позже скину вам примерчики. Честно я не особо за выделение памяти в библиотеке, лучше уж обратные вызовы.
0
|
51 / 149 / 33
Регистрация: 29.06.2019
Сообщений: 1,428
|
|
04.03.2020, 04:43 | 15 |
0
|
04.03.2020, 04:43 | |
04.03.2020, 04:43 | |
Помогаю со студенческими работами здесь
15
Указатель на строку неизвестного размера Массив неизвестного размера+функция Указатель на строку неизвестного размера Массив заранее неизвестного размера Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |