Здравствуйте!
DLL, для приёма массива, требует ввести ей указатель на этот массив. Как определить мне этот указатель?
Заранее спасибо за ответ!
Как найти указатель на массив?
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Как найти указатель на массив?
Информации от Вас конечно недостаточно
Возможно в dll есть функция, с входным параметром в виде массива. например
#ifdef _WIN32
__declspec(dllexport) void MyFunction (
#endif
#ifdef __unix__
void MyFunction (
#endif
double parameters[],
unsigned long parametersSize
){
};
В С имя массива может быть использовано в качестве указателя на его первый элемент.
Функция MyFunction получает как раз указатель на первый элемент массива - parameters[] (не копируя весь массив)
Далее в Labview используется vi Call Library Function Node, конфигурируется и собственно все
Вход parametersSize необходим для передачи размера массива. В С большинство встроенных программных средств (Страуструпп Язык С++ п5.3) не представляют никаких способов контроля границ массива.
Если вы попытаетесь в dll прочитать значение за границей массива LabView просто падает без всяких сообщений.
Выделение памяти под передаваемый массив производится LabView. Очистка памяти так же LabView.
Средства отладки обращения из Labview к dll кроме непосредственно вызова dll мне неизвестны. Результат вызова если LabView не упал и значение на выходах соответствует ожиданию то можно считать что все в порядке (без гарантии).
Возможно в dll есть функция, с входным параметром в виде массива. например
#ifdef _WIN32
__declspec(dllexport) void MyFunction (
#endif
#ifdef __unix__
void MyFunction (
#endif
double parameters[],
unsigned long parametersSize
){
};
В С имя массива может быть использовано в качестве указателя на его первый элемент.
Функция MyFunction получает как раз указатель на первый элемент массива - parameters[] (не копируя весь массив)
Далее в Labview используется vi Call Library Function Node, конфигурируется и собственно все
Вход parametersSize необходим для передачи размера массива. В С большинство встроенных программных средств (Страуструпп Язык С++ п5.3) не представляют никаких способов контроля границ массива.
Если вы попытаетесь в dll прочитать значение за границей массива LabView просто падает без всяких сообщений.
Выделение памяти под передаваемый массив производится LabView. Очистка памяти так же LabView.
Средства отладки обращения из Labview к dll кроме непосредственно вызова dll мне неизвестны. Результат вызова если LabView не упал и значение на выходах соответствует ожиданию то можно считать что все в порядке (без гарантии).
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Как найти указатель на массив?
В принципе, ujin уже всё расписал. Для передаваемого в качестве массива параметра:
Type = Array
Array format = Array Data Pointer
Ну, и остальные параметры настраиваете, как необходимо. Память под массив нужно также выделить: или с помощью Minimum size в настройках CLFN, или на БД с помощью Initialize Array.
Лучше бы, конечно, увидеть прототип функции или описание функций целиком, т.к. могут быть нюансы.
Type = Array
Array format = Array Data Pointer
Ну, и остальные параметры настраиваете, как необходимо. Память под массив нужно также выделить: или с помощью Minimum size в настройках CLFN, или на БД с помощью Initialize Array.
Лучше бы, конечно, увидеть прототип функции или описание функций целиком, т.к. могут быть нюансы.
Не считая отладчиков, есть эмпирический способ, который работает где-то на 85%. Запустить программу с вызовом библиотеки раза 3-4, если LV не вылетел, File -> Close All, если LV всё ещё не вылетел, File -> Exit. Если всё закрылось без ошибок или ворнингов, можно сказать, что настроено правильно. Однако многое также зависит от того, насколько правильно написана библиотека. При багах в коде DLL обычно никакое шаманство в не помогает.ujin писал(а):Средства отладки обращения из Labview к dll кроме непосредственно вызова dll мне неизвестны. Результат вызова если LabView не упал и значение на выходах соответствует ожиданию то можно считать что все в порядке (без гарантии).
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 6 Ответы
- 1062 Просмотры
-
Последнее сообщение JohnChaban