Flatten To String баг или фича?

Простейшие вопросы в области инженерной разработки
Ответить
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Flatten To String баг или фича?

Сообщение Juri »

На вход подаем кластер с пустым массивом или кластер с пустой строкой. На выходе получаем какие-то левые 4 байта. Как так то? Можно вылечить?

upd: решение - http://labviewportal.org/viewtopic.php? ... 195#p76195
Вложения
Screenshot_3.png
1.vi
(8.08 КБ) 132 скачивания
Последний раз редактировалось Juri 16 сен 2017, 12:53, всего редактировалось 3 раза.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение dadreamer »

Usss писал(а):какие-то левые 4 байта
Это размер массива.

Код: Выделить всё

typedef struct {
	int32 dimSize;
	uInt8 Numeric[1];
	} TD2;
typedef TD2 **TD2Hdl;

typedef struct {
	TD2Hdl Array;
	} TD1;
How LabVIEW Stores Data in Memory
Flattened Data
Usss писал(а):Можно вылечить?
В виде кластера - нет. В виде массива - вход prepend array or string size? А что конкретно требуется?
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Flatten To String баг или фича?

Сообщение Juri »

Требуется преобразовать кластер в массив байт. Кластеров много разных, содержимое у каждого свое, в том числе числа, массивы и строки. Пока не придумал ничего лучше чем преобразовывать каждый элемент кластера отдельно
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение dadreamer »

Usss писал(а):массивы и строки
Из-за того, что :labview: хранит массивы и строки иначе, чем это делают многие текстовые среды, кластер с массивами и/или строками придётся разбирать поэлементно. И это, похоже, единственный способ: https://forums.ni.com/t5/LabVIEW/What-i ... -p/3175307 Ну, то есть, либо вы делаете то же, что и сейчас, либо вы преобразуете ваши кластеры так, чтобы они не содержали нативные массивы/строки :labview: , а вместо них содержали фиксированные по длине (числу байтов) кластеры из элементов U8, которые и будут представлять собой массив или строку в привычной нотации. Если используете TypeDef'ы, то это требуется сделать один раз. Есть, правда, и минус у последнего подхода - ухудшается читаемость содержимого кластеров.
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение AndreyDmitriev »

Usss писал(а):Требуется преобразовать кластер в массив байт. Кластеров много разных, содержимое у каждого свое, в том числе числа, массивы и строки. Пока не придумал ничего лучше чем преобразовывать каждый элемент кластера отдельно
Это не то чтобы баг, просто при использовании Flatten To String предполагается, что вы будете восстанавливать данные обратно из строки используя Unflatten From String. Если вы подсоединяете на вход "чистый" массив или строку, то в этом случае информация о длине избыточна - вы можете управлять добавлением четырёх байтов длины, используя ключ prepend array or string size? (T) и data includes array or string size? (T) в этих элементах. Однако ситуация меняется, если используется кластер - в него вы можете положить две строки или два массива и в этом случае без информации о том, где заканчивается один массив или строка и начинается другой восстановление из строки станет невозможным, поэтому LabVIEW и добавляет четыре байта длины независимо от установленного переключателя "prepend array or string size?". Если вам эти четыре байта "мешают", то это говорит о том, что вы используете свой собственный формат данных, ну соответственно и сериализатор должен быть свой, что вы собственно и реализовали поэлементным преобразованием.
Why does a String in a Cluster have Four Extra Bytes?
http://digital.ni.com/public.nsf/allkb/ ... 32005C5B14
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Flatten To String баг или фича?

Сообщение Juri »

Решено!
Было ощущение, что изобретаю велосипед. Не понятно, почему такой vi нет по умолчанию в LV.
Я разобрал только нужные мне типы: все integer, Uinteger, double, массивы из этих типов, кластеры, массив кластеров. Если кому, нужны остальные типы, тот без труда дополнит.
Вложения
333.png
Any data to binary string.vi
(33.64 КБ) 137 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение dadreamer »

Usss писал(а):Не понятно, почему такой vi нет по умолчанию в LV.
Ну, потому что такой функционал уже присутствует, хотя для вашей задачи он даёт избыточный результат. Речь о Flatten To String, само собой. В большинстве случаев достаточно было бы модифицировать собственные структуры данных, чтобы они учитывали или включали в себя длину/размер массивов и строк, предваряющий этот массив (строку). У вас, видимо, иной случай. Вообще, и во внешний код :labview: отправляет кластеры так, как сам их хранит, предоставляя программисту самому разбирать элементы. Правда, там ещё чуть сложнее получается - вместо массивов приходят указатели на них. Естественно, длина массива предваряет данные.
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Flatten To String баг или фича?

Сообщение Juri »

Вот щас ваще красоту навел. На самом деле мне надо эти данные передавать по TCP, принимающая сторона имеет протокол данных и сможет их расшифровать. Так что мне совсем не нравится что Flatten To String передает всякие мета данные
Вложения
11111.png
Flatten To String II.llb
(73.82 КБ) 119 скачиваний
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение Kosist »

Usss писал(а):Вот щас ваще красоту навел. На самом деле мне надо эти данные передавать по TCP, принимающая сторона имеет протокол данных и сможет их расшифровать. Так что мне совсем не нравится что Flatten To String передает всякие мета данные
Конвертируйте все в JSON строку (либа от JKI прекрасно с этим справляется), и пусть принимающая сторона ее обрабатывает. Универсальный формат, все как надо :wink: И нет лишних мета данных - лишь параметры, и их значения.
Мы делили апельсин - много наших полегло...
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2210
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: Flatten To String баг или фича?

Сообщение Borjomy_1 »

Вообще-то flatten To string это чемпион по компактности. И ежели у вас размер массива фиксированный, то обычно делают кластер с заданным количеством элементов. Передавать динамический массив без размера - глупость. Если размер массива находится не перед ним в посылке, то совершенно не возбраняется закидывать элементы в строку раздельно, а потом их собрать в одну строку. И разбор можно делать также, последовательно.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение Kosist »

Borjomy_1 писал(а):Вообще-то flatten To string это чемпион по компактности. И ежели у вас размер массива фиксированный, то обычно делают кластер с заданным количеством элементов. Передавать динамический массив без размера - глупость. Если размер массива находится не перед ним в посылке, то совершенно не возбраняется закидывать элементы в строку раздельно, а потом их собрать в одну строку. И разбор можно делать также, последовательно.
TCP/IP само по себе уже должно обеспечивать целостность передаваемых данных, т.е. при передаче сообщений (конечно, если "разумных" размеров), можно не проверять ее целостность, или размер. Если данных реально много, то тогда без склеивания не обойтись... Но это уже смахивает на собственный протокол, если посылка может разбиваться на части при передаче, собираться при приеме; а все это будет контролироваться проверочными суммами, и т.д.
Используя Network Streams можно вообще не париться, а передавать, скажем, кластер с именем/типом пакета, и вариантом для данных - и запихивать туда все, что угодно. Главное, знать как парсить...
Для более высокого уровня коммуникации - как мне кажется - этот момент можно опустить...
Недавно столкнулся с MQTT протоколом для "общения" с "облаком". На низком уровне данные передаются посредством TCP/IP - там идет преобразование в массив байтов, контролируется размер сообщения, и т.д. Но на "высшем" уровне уже есть просто JSON строка, которая содержит данные...
Но согласен, что следуя Вашему совету можно быть уверенным, что все данные не потеряются, и будут целостными. Но экстра работы добавится... Поэтому опять же, почему не использовать те же вышеупомянутые Network Streams, если они уже содержат нужный функционал? (при условии, что получателем будет тоже :labview: приложение...).
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение dadreamer »

Usss писал(а):На самом деле мне надо эти данные передавать по TCP, принимающая сторона имеет протокол данных и сможет их расшифровать.
А мне вдруг стало интересно, как всё-таки принимающая сторона будет расшифровывать динамический массив, если нигде нет его размера? А если все массивы имеют фиксированные размеры, тогда не было смысла изобретать велосипед. Даже если учесть, что принимающая сторона имела бы "устаканившийся" протокол, который она не могла или не хотела бы менять.
Аватара пользователя
Juri
I/O
I/O
Сообщения: 263
Зарегистрирован: 19 апр 2017, 23:06
Версия LabVIEW: 2021
Благодарил (а): 13 раз
Поблагодарили: 6 раз

Re: Flatten To String баг или фича?

Сообщение Juri »

Длина данных от пользователя к серверу всегда известна, а длина данных от сервера к пользователю вычисляется исходя из параметров, которые пользователь ему отправляет. ПО сервера написано не на LAbview, но его позже тоже надо будет переписать на Labview
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Flatten To String баг или фича?

Сообщение Blackman »

...Было ощущение, что изобретаю велосипед....
Вложения
Flatten2String.png
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Flatten To String баг или фича?

Сообщение dadreamer »

Хотя при первом взгляде кажется, что решение Usss выглядит малость "велосипедно", что-то в нём есть. Если представить, что есть превеликое множество кластеров с совершенно различными типами данных в них, включая вложенные кластеры, то конвертация в поток байтов может быть изрядным "гемором" - каждый кластер надо разобрать на элементы, каждый элемент прогнать через Type Cast, затем все эти выходы объединить в одно целое. Это займёт ощутимое время и не менее ощутимое место на БД. ВИ-айка Usss практически могла бы обеспечить компактность на диаграмме и простоту преобразования, а также универсальность, что немаловажно. Другое дело, что её потребуется допилить, чтобы она "ела" все возможные типы данных :labview: . Ну, и нельзя не заметить, что случай, когда потребуется подобное преобразование без "левых" данных, может вовсе не представиться. На мой практике я припоминаю ровно один такой случай - нужно было преобразовать несколько кластеров в массив U8 для отправки через Profinet плату. Мне было проще разобрать кластеры, благо что их было не более 5 штук.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»