Вверх ↑
Этот топик читают: Гость
Главный модератор
Ответов: 2997
Рейтинг: 395
#1: 2009-07-13 20:58:02 ЛС | профиль | цитата
Если попытаться добавить в MT поток целочисленное значение нуль первым в цепочке, то, с сожалению, это не происходит:
code_14123.txt
Компонент MT_Add
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1code_14123.txt [1.4KB] [487]
vip
#1.1контекстная реклама от партнеров
Администрация
Ответов: 15294
Рейтинг: 1518
#2: 2009-07-13 22:30:58 ЛС | профиль | цитата
в данном случае проблема не с МТ, а вот с такой записью

#hws
event(onAdd, (_data='') ? Data : (_data ^ Data))
что делает кодогенератор, когда программист просит его сравнить _data='' ? он берет и приводит второй аргумент к типу первого после чего производит сравнение. Пустая строка конвертируется в целое число как нуль, т.е. получаем сравнение 0 = 0, что есть истина.

Чтобы этого избежать, нужно вставить проверку на тип данных

#hws
(typeof(_data) = 2 and _data = '')

если бы не объявленный макрос NULL_TO_STR, то достаточно бы было сделать одну проверку типа

#hws
(typeof(_data) = 19)
------------ Дoбавленo в 22.34:
еще один совет небольшой. Вот так:

#hws
if(ES_MULTILINE='True')
лучше не делать. Лучше делать так

#hws
if(isndef(ES_MULTILINE))
карма: 26
0
Главный модератор
Ответов: 2997
Рейтинг: 395
#3: 2009-07-13 22:56:44 ЛС | профиль | цитата
Что надо делать для InputMT=SendUp?
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Администрация
Ответов: 15294
Рейтинг: 1518
#4: 2009-07-13 23:35:47 ЛС | профиль | цитата
есть сомнения в том, что этим режимом кто-то когда-то пользовался. Я к примеру из описания к свойству ничего не понял о его назначении. Судя по коду в этом режиме данные передаются наверх и могут быть использованы только совместно с EventFromData. Если очень хочется поддержать этот режим, то необходимо пользоваться конструкцией вида

#hws
Data = event(pointName, Data)
карма: 26
0
Ответов: 9906
Рейтинг: 351
#5: 2009-07-14 01:37:44 ЛС | профиль | цитата
Dilma писал(а):
есть сомнения в том, что этим режимом кто-то когда-то пользовался

Даже заморачиваться с выкладыванием других схем не буду: на скриншоте элемент EventFromData видите ???
Он сначала делает ##Select (там "все" его делают, естественно), а потом принимает данные из другого экземпляра массива мультиков
Угадайте с 3-х раз, откуда берется индекс для этого ##Select
У меня есть варианты и передачи MT (в смысле - более одного вагончика с данными) наверх с последующим возвратом результата

Хотя можно было и проще сказать - нет у меня привычки добавлять что-то "на всякий случай". Если добавил, значит есть задачи, решить которые иными средствами крайне затруднительно. Крайне - это еще мягко говоря.
карма: 9

0
Главный модератор
Ответов: 2997
Рейтинг: 395
#6: 2009-07-14 07:49:08 ЛС | профиль | цитата

#hws
func doAdd3(_data)//SendUp
fvar(mt)
if(isndef(Data) or linked(Data))
mt = Data
end
if(linked(onAdd))
event(onAdd, mt)
end
end
Не уверен, что это правильно, но принятие данных сверху работает при любых значениях InputMT
code_14127.txt
Если есть соображения как это должно работать, то просьба объяснить "на пальцах"
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
файлы: 1code_14127.txt [451B] [510]
Администрация
Ответов: 15294
Рейтинг: 1518
#7: 2009-07-14 09:02:38 ЛС | профиль | цитата
Galkov, скриншот это замечательно, но понятнее из него ничего не стало. Вот три примера
code_14128.txt

Debug - символизирует момент, в который я могу обработать поток, переданный наверх, Message - место схемы, с которого берется итог. Все три решения имеют один и тот же результат, а значит схемные изыски первого и второго случая являются лишними. Если есть иная точка зрения, просьба раскрыть ее в количестве и качестве достаточном для размещения в справке.
карма: 26
0
файлы: 1code_14128.txt [1.7KB] [456]
Главный модератор
Ответов: 2997
Рейтинг: 395
#8: 2009-07-14 10:02:28 ЛС | профиль | цитата
Dilma писал(а):
если бы не объявленный макрос NULL_TO_STR, то достаточно бы было сделать одну проверку типа


Может быть добавить функцию, которая проверяла бы поток на наличие в нём данных?
карма: 6
Дорогу осилит идущий. Install/Update HiAsm.NET
0
Администрация
Ответов: 15294
Рейтинг: 1518
#9: 2009-07-14 11:12:47 ЛС | профиль | цитата
Nic, если в пакете используется NULL_TO_STR, то данных типа NULL в потоке присутствовать вообще не может, а значит функция такая полностью бессмыслена ибо будет являться эквивалентом простого if().
карма: 26
0
Ответов: 9906
Рейтинг: 351
#10: 2009-07-14 16:31:50 ЛС | профиль | цитата
Схемные изыски во многих случаях являются излишними.
Утверждения, что схемными изысками следует пользоваться всегда - не было
Было утверждение, что существуют случаи, когда эти изыски являются наиболее рациональным решением, если не единственным
Таковыми условиями являются:
  • "верхний" объект имеет много использующих его клиентов, и эти клиенты хотят передать ему некие данные (в общем случае - MT), и в ответ получить некие результаты (аналогично, в общем случае - MT)
  • по неким объективным причинам это не может быть копия или линк объекта - результаты его работы зависят от предыстории использования, и именно это является постановкой задачи.
    Поскольку, существенным является слово "много", очень уж простой пример, да еще и обладающий неким смыслом - не получается
    Но он может выглядеть так: code_14134.txt
    Предполагаем здесь, что положение модальной формы, ее Caption - и есть те самые "параметры предыстории", которые обязаны воспроизводиться при любых запусках. Надумано, возможно, но на то он и тест

    Не надумано - это рабочая схема
    В ней "красно-восклицающий" мультик - это и есть мой "элемент", имеющий достаточное количество клиентов
    Метод doData - просто предварительная накачка данных для последующей протокольной команды. Результатов после нее еще нет.
    А вот после doCMD "выплевывается" весь пакет (начиная с самой команды), и принимается какое-то количество байт
    В принципе, в протоколе у меня есть и очень "многобайтные ответы", но в данном тесте они не используются, ограничился 4 байтами и упаковал их в одно целое.
    Приглядитесь, ничего надуманного...

    Да, на всякий случай, способу возврата данных через глобальную переменную меня учить не надо - с этого начинал....
    И потом учил iarspider-а "вертикальному программированию". Кстати, можете тоже оценить разницу (хотя данные наверх он и не передавал) http://hiasm.com/forum.html?q=3&p=89388#p89388

  • карма: 9

    0
    файлы: 2code_14134.txt [7.9KB] [579], twitest.sha [51.9KB] [482]
    Разработчик
    Ответов: 26061
    Рейтинг: 2120
    #11: 2009-07-14 16:53:58 ЛС | профиль | цитата
    Galkov писал(а):
    И потом учил iarspider-а "вертикальному программированию"

    Вообще-то, "вертикальное программирование" заслуживает отдельной темы с предоставлением определенного количества примеров для понимания пользователями, тк такой возможностью пользуются единицы, а это -- весьма перспективное направление
    карма: 22

    0
    Администрация
    Ответов: 15294
    Рейтинг: 1518
    #12: 2009-07-14 17:17:42 ЛС | профиль | цитата
    Galkov, ок, пример демонстрирует удобство использования элемента в данном случае. НО каким боком он относится к "Добавление элемента в многомерный поток" Этот режим и Nul надо было выносить в отдельный инструмент (DoDataMT к примеру). Теперь же в погоне за совместимостью эта неоправданная экономия места еще и в другие пакеты полезет...
    карма: 26
    0
    Ответов: 9906
    Рейтинг: 351
    #13: 2009-07-14 19:02:26 ЛС | профиль | цитата
    А был у нас отдельный элемент. Назывался Array, и это был не MT-вариант
    MT-вариант - в MT-элемент и попал
    Можно было вообще MT_Add разбить на 4 элемента.... Мне такое не очень нравилось
    И есть у меня сомнения, что это начнет "кочевать". Будут проблемы. А совместимость, так это св-во - последнее, между прочим

    Но вот что хочу добавить - это все безобразие я не считаю перспективным направлением.
    Схемотехническим приемом - считаю.
    Все это безобразие заменяет Pointer-элемент, и со значительно большей эффективностью.
    Посмотрите "рабочую схему"...
    Почти всякая команда является серией вызовов метода doData, и обязательно заканчивается вызовом метода doCMD
    Т.е., я обязательно тяну от всех клиентов ДВА "жгута". А ведь их могло быть и три, и пять, да и 10 - не беспредел вовсе
    А с Pointer-элементом - ОДИН, при любом раскладе.
    И выходные данные не "паковал" бы - с этого магического элемента событие возникало бы столько раз, сколько мне надо, и в нужное мне место.
    И Slave (физический адрес девайса, на который уйдет пакет данных) с Read (количество байт для чтения после окончания пакета) в глобальных переменных не передавал бы - верхние точки магического элемента спрашивали бы эти данные с нужного мне места.
    И было БЫ все это очень правильно

    Думаю, что такое качество данная схема демонстрирует в большей степени, чем SendUp

    карма: 9

    0
    Администрация
    Ответов: 15294
    Рейтинг: 1518
    #14: 2009-07-14 20:22:40 ЛС | профиль | цитата
    да никто и не спорит. Но в том, что есть сейчас расклад именно таков, как описано выше и он плох, по причинам выше так же изложенным.
    карма: 26
    0
    Ответов: 9906
    Рейтинг: 351
    #15: 2009-07-15 13:49:03 ЛС | профиль | цитата
    Если причины выше и излагались, то таким образом, что остались недоступны моему пониманию.
    В моем понимании, причин влияющих на раскладку в базовом пакете - НЕТ.

    карма: 9

    0
    Сообщение
    ...
    Прикрепленные файлы
    (файлы не залиты)