Создание собственных переменных в run-time
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Создание собственных переменных в run-time
Добрый день!
Требуется дать возможность пользователю создавать свои переменные во время выполнения. Причем теоритически данные могут быть как простых типов (int, string и т.п) так и сложных(cluster, vaweform).
Была идея реализовать внутреннюю структуру с помощью массива с типом variant, но возникает вопрос как сохранить совместимость с уже существующими функциями, например если в варианте лежит кластер с нумериками то теоритически его можно сложить с кластером такого же типа, но функция сложения не работает с типом данных вариант?
Можно ли сделать так, чтобы забота о типе лежала на labview, а не перебирать все типы вручную и выполнять действие если тип подходит? Также хотелось бы вызывать функции из библиотек и подставлять туда значения из этого массива.
Есть у кого-нибудь идеи как реализовать такое?
Требуется дать возможность пользователю создавать свои переменные во время выполнения. Причем теоритически данные могут быть как простых типов (int, string и т.п) так и сложных(cluster, vaweform).
Была идея реализовать внутреннюю структуру с помощью массива с типом variant, но возникает вопрос как сохранить совместимость с уже существующими функциями, например если в варианте лежит кластер с нумериками то теоритически его можно сложить с кластером такого же типа, но функция сложения не работает с типом данных вариант?
Можно ли сделать так, чтобы забота о типе лежала на labview, а не перебирать все типы вручную и выполнять действие если тип подходит? Также хотелось бы вызывать функции из библиотек и подставлять туда значения из этого массива.
Есть у кого-нибудь идеи как реализовать такое?
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 88 раз
Re: Создание собственных переменных в run-time
Автоматом наверное не получится.
Можно написать полиморфные функции, которые в зависимости от типа входных данных будут работать по разному, если делать проще, то Case. Но этот тип в любом случае необходимо предварительно определить.
Как правило при передаче разнородных данных, делают это в кластере, т.е.:
1 параметр определяет тип данных и что с ним делать
2 параметр Variant в который и пихают данные
При необходимости можно сделать массив кластеров.
Можно написать полиморфные функции, которые в зависимости от типа входных данных будут работать по разному, если делать проще, то Case. Но этот тип в любом случае необходимо предварительно определить.
Как правило при передаче разнородных данных, делают это в кластере, т.е.:
1 параметр определяет тип данных и что с ним делать
2 параметр Variant в который и пихают данные
При необходимости можно сделать массив кластеров.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Создание собственных переменных в run-time
То, что вы хотите, относится уже к функциям компилятора. Т.е вам самому придется разбирать переменные и определять алгоритмы обработки. Это в общем случае (что может запретить пользователю в таком случае попытаться waveform сложить со строкой?). Если вы определите границы возможностей, тогда уже можно говорить о практической реализации. В принципе, Variant можно разобрать на составные, если его покопаться в его структуре, которую можно выдрать с помощью Variant To Flattened String, однако тут могут возникнуть сложности, ибо открытой информации нет. Более надежно описывать структуру Variant через аттрибуты. Ну тогда уже вам определять список поддерживаемых типов, уровень вложенности и прочее.
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
IvanLis, А если есть необходимость со временем расширять набор типов, то и все функции придется дописывать и компилировать поновой?
Последний раз редактировалось joonio 11 июл 2014, 09:04, всего редактировалось 1 раз.
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
Borjomy_1, Так вот с уровнями вложенности и проблема... У меня еще получается представить тип кластер как дерево... но как потом передать это дерево в функцию dll как структуру я не представляю
-
- VIP
- Сообщения: 1338
- Зарегистрирован: 03 фев 2010, 00:42
- Награды: 6
- Версия LabVIEW: 6.1 - 2024
- Откуда: Германия
- Благодарил (а): 1 раз
- Поблагодарили: 44 раза
- Контактная информация:
Re: Создание собственных переменных в run-time
У вас какая-то мегасложная архитектура. Как бы то ни было, можно сделать Flatten to XML, передать строку в DLL, ну и парсить её там - это уже дело техники. Обратно отдавать результат тоже XML строкой ну и преводить обратно в структуры LabVIEW через Unflatten. Можно и Flatten to String использовать, но тут разбор такой строки будет чуть сложнее.joonio писал(а):Borjomy_1, Так вот с уровнями вложенности и проблема... У меня еще получается представить тип кластер как дерево... но как потом передать это дерево в функцию dll как структуру я не представляю
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
AndreyDmitriev, Проблема в том, что зачастую библиотеки сторонние и входные параметры функций уже описаны заранее. Если бы библиотеки писал я другое дело.
Необходим аналог того, что происходит при добавлении на блок диаграмму объекта "call library function node" только в runtime. Т.е пользователь создает переменную, с которой он может производить конкретные манипуляции: сложение, вычитание, деление и т. п. для чисел, конкатенацию, извлечение подстроки для строк, операции булевой алгебры для типа boolean, также можно складывать массивы и кластеры чисел и т.д . А потом с этими переменными в качестве параметров вызывать функции из уже готовых DLL динамически.
Необходим аналог того, что происходит при добавлении на блок диаграмму объекта "call library function node" только в runtime. Т.е пользователь создает переменную, с которой он может производить конкретные манипуляции: сложение, вычитание, деление и т. п. для чисел, конкатенацию, извлечение подстроки для строк, операции булевой алгебры для типа boolean, также можно складывать массивы и кластеры чисел и т.д . А потом с этими переменными в качестве параметров вызывать функции из уже готовых DLL динамически.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Создание собственных переменных в run-time
Хотелось-бы знать, как вы собираетесь проверять допустимость параметров при вызове dll. Как вы собираетесь разруливать ситуацию, когда пользователь создает кластер с разнотипными данными, а dll, например, в качестве параметра требует только число?
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
Borjomy_1, Соответствие типов при вызове сторонних библиотек остается на пользователе
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Создание собственных переменных в run-time
Каким образом вам доступна информация о типах параметров, при вызове, сторонних библиотек?
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
Ну как минимум описание библиотеки должно быть иначе просто напросто какой смысл её использовать
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Создание собственных переменных в run-time
Передать кластер в структуру dll возможно только разбирая переменную, созданную пользователем, вручную и формируя байтовый массив. А вот что делать с ним дальше?...
-
- interested
- Сообщения: 8
- Зарегистрирован: 09 апр 2014, 12:25
- Версия LabVIEW: 13.1
- Откуда: Екатеринбург
- Контактная информация:
Re: Создание собственных переменных в run-time
Borjomy_1, Массив обрабатывается некой библиотечной функцией и она возвращает какое либо значение, которое необходимо парсить в тип данных Labview...Как сформировать байтовый массив понятно, а вот как подставить в качестве параметра не очень... Т.к. стандартных средств для передачи параметров динамически не предусмотрено... Есть лишь возможность задать их статически на этапе разработки....
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Создание собственных переменных в run-time
joonio, напишите свою библиотеку-враппер, передавайте в неё созданные пользователем параметры (например, байтовые массивы), порядок их следования, выбранную функцию, соглашение о вызове, а затем во враппере пробуете вызвать эту функцию с параметрами. Но если пользователь ошибётся хотя бы в соглашении о вызове, то вся ваша программа упадёт.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение