Вверх ↑
Этот топик читают: Гость
Ответов: 9906
Рейтинг: 351
#136: 2007-07-05 12:32:32 ЛС | профиль | цитата
Наш ответ №1
Dilma писал(а):
До слов "Оппа" понятно дальше нет. Поэтому не могу ничего тут ответить

Значит так...
Долго пришлось разбираться, конечно.
Ошибся я - НЕТ интерфейсных заморочек для пользователя 2-го уровня
Имелся в виду примерно такой пример:
Add(Button,11036070,210,49)
{
Left=100
Top=20
Caption="Hello"
Data=String(1)
link(onClick,7887576:doEvent,[])
}
Add(Message,3261178,392,126)
{
Text="1"
}
Add(StrCat,13333760,336,56)
{
Str1="1 - Оппа: "
}
Add(Hub,7887576,266,56)
{
link(onEvent1,13333760:doStrCat,[])
link(onEvent2,14835127:doEvent,[(317,69)(317,125)])
}
Add(IndexToChanel,14835127,336,119)
{
Data=Real(1.11)
Point(Data)
Point(Index)
link(onEvent2,3261178:doMessage,[])
link(Data,13333760:Result,[])
}
И поскольку напрямую его сотворить (уже сотворил) - это еще та повесть, приходилось теоретизировать. И ошибиться

Как:
Вижу в своих кодах в ReadValue приведение данных входного потока к типу св-ва точки
Вижу что при чтении с верхней точки это проигнорировано.
Понимаю, что это просто недоработка, а не глубокая задумка. Потому что пользователь 1-го уровня понятия не имеет из какого места пришли данные и должен точно знать какой у него тип.
Хорошо, делаю сам - привожу к типу св-ва, коль скоро таковое существует.
И думаю, что всенепременно случится приведение к типу Real (в вышестоящем примере), коль скоро св-во там установленно в Real
Вот именно в этом была моя ошибка - фиг там, тип данных оказался data_data
Из этой ошибки я и делал неправильный вывод о заморочках в интерфейсе пользователя 2-го уровня

Ладно, прокачался, увидел, что идеология несколько другая.
Доехало, как говорится
((как отмечал выше, заставить было это еще и заработать - отдельная песня))
Типизация точек, оказывается, это средство установить "автоматически" тип для кода в событиях.
Посмотрим, может этого и хватит на оставшуюся жизнь...

Но, тем не менее, ситуации, когда пользователь (1-го уровня) код уже сформировал, через event-ы это еще прошло, и SubType=0 при этом - несколько подозрительны.
Источники потенциальных ошибок, вроде бы...
Надо бы, чтобы в этом случае _toCode не считал это константой, а SubType бы устанавливал категорически...
Тем более, вижу по кодам, что теперь моден другой признак константы: data_type in [data_code, data_array]
Вроде бы

Вот правда одно замечание: пользователь 1-го уровня получил возможность "автоматического" приведения типа. Но он сразу же получил возможность "неаккуратности" в синхронизации типов верхней точки и одноименного св-ва...
А может и отсутствие таковой возможности для особо хитрых типов...






[size=-2]------ Добавлено в 11:20
Наш ответ №2
Dilma писал(а):
тоже не уловил смысла проблемы:
// где-то в коде программы вставлен функциональный вызов метода с данными из потока положим:
  doMethod(s23 + s34);
  ...
// далее где-то в коде тот же метод со св-ом по умолчанию:
doMethod('test');
...
// и наконец тот же метод с данными с точки:
doMethod(res4);

// в скрипте FTCG стоит:
println('doMethod(', X, ');')

// метод реализован так:
procedure doMethod(X:string);
begin
...
Message(X);
...
end;

Дык ты же все неправильно делаешь
Не имеет право CG вызывать самостоятельно event для метода.
Да, он (CG) знает каким образом для данного конкретного элемента будет определяться св-во X
Если оно вообще там потребуется.
А вот потребуется ли, и сколько раз (не факт и что один), и что перед этим будет сделано и в каком порядке (если такого безобразия несколько) - это ему знать не дано по определению

Это же суверенное право пользователя первого уровня.
Что характерно, при этом пользователь первого уровня в свою очередь не должен знать как будет употреблен тот код, который он сгенерировал нашим скриптом.
Он употребил некий макрос X, тип результата ему известен - работай дальше себе.

А пойдут ли эти коды в основное тело программы (алгоритмической ветки), или как тело некого метода объекта - это уже, в свою очередь, суверенное право CG.
Вроде - такой подход самый логичный.






[size=-2]------ Добавлено в 12:32
Наш ответ №3
Называется: "Мелкие технические детали"

  • вспомнились мелкие Дельфячие пакости с константными строками. Если сможешь "взнуздать" вышеприведенный примерчик - тоже вспомнишь Ну ладно, я радостно начинаю фиксить direct.inc
    procedure tostr_delphi(var s:string);
    var i:boolean;
    begin
    i := length(s)=1;
    replace(s, '''', '''''');
    if i then s := s+'''+''';
    end;
    и обнаруживаю, что это все равно в код не попадает
    Как проверил? Да просто попытался изменить св-во Message.Text="1'1"
    Болт с гайкою...

    Пока зафиксил так (заработало, по крайней мере):
    function TScData.toCode;
    ....
    data_str: begin
    lngs[value.lang].tostr_proc(value.sdata);
    Result := lngs[value.lang].str_del + value.sdata + lngs[value.lang].str_del;
    ....
    Но уверенности, что там где надо, и все - никакой. Шибко уж наворотил ты со своими конкатенациями

  • Надо бы как-то определиться с признаком "константы" для приведения именно константных типов в _toCode из direct.inc Как-то условие SubType=0 - подозрение вызывает... Выше отмечал...
    "Определиться" - означает добавить эти константные приведения в direct.inc

  • Мне совершенно понятно стремление не передавать тип PStream из одной dll-ки в другую. И обеими руками - ЗА
    Но я же теми же обеими руками ПРОТИВ делать GetMem в одной dll-ки, а в другой - FreeMem
    Если эти dll-ки не сделаны под одним и тем же - так же как и с PStream, никаких гарантий.
    Ну нельзя разносить конструктор и деструктор по разным кодам.
    У себя-то я пока так сделал (make_exe.dpr ты ведь и не выложил ), без утечек и без "изничтожений" в make_exe
    var ResText:string;
    function buildProcessProc(var params:TBuildProcessRec):integer; cdecl;
    ...
    ResText := lst.Text;
    params.result := PChar(ResText);
    lst.free;
    end;
    Я вообще считаю не правильным уничтожать то, чего ты не делал, или наоборот - создавать динамические объекты на каждом шагу, в рассчете, что потом мы совсем разберемся и поуничтожаем лишнее.
    Замучаемся разбираться
    Ну я даже не очень понимаю, как вот так, простенько, заблокировать эту утечку памяти
      _var_^ := _toCode(_var_, ntype)^;[/code]
    Такого же у нас - несть числа :(

    [*][b]Dilma[/b], ну никогда я не замечал, чтобы тебе нравилась именно такая система отступов :shock:
    procedure TSDK_0.btn3_onClick;
      begin
    s5 := '1 - Оппа: 1';
    MessageBox(frm2.Handle, PChar('1'+''), PChar(s5), MB_OK);
    end;
    Поэтому у себя я таки изменил немного очередность действий:
       lng_begin:
        begin
    parser.Print('begin');
    parser.codeb.level := parser.codeb.level + 1;
    parser.PrintLine;
    end;
    lng_end:
    begin
    parser.codeb.level := parser.codeb.level - 1;
    parser.Print('end;');
    parser.PrintLine;
    end;

  • карма: 9

    0
    Администрация
    Ответов: 15295
    Рейтинг: 1519
    #137: 2007-07-05 13:23:57 ЛС | профиль | цитата
    Galkov писал(а):
    Ладно, прокачался, увидел, что идеология несколько другая.
    Доехало, как говорится

    ну вот так и думал, что проблема в неоднозначной трактовке ситуации.

    Galkov писал(а):
    о он сразу же получил возможность "неаккуратности" в синхронизации типов верхней точки и одноименного св-ва...

    да, к сожалению это так. Но такие вещи потихоньку решаю автоматизациями в ECreator(редактирование ini вручную не рассматриваю впринципе).

    Galkov писал(а):
    Дык ты же все неправильно делаешь...

    опять не понятно: в чем и в каком месте ошибка? Что предлагается исправить/добавить/удалить? Пример?

    Galkov писал(а):
    Ну ладно, я радостно начинаю фиксить direct.inc

    Да действительно это работать не будет. Кроме того в классической модели Delphi 2 эта ф-ция вообще нигде не будет использоваться она вызывается только при переходе от одного языка к другому через конвертацию в строку.

    Galkov писал(а):
    Пока зафиксил так (заработало, по крайней мере):

    Да видимо это выход. Думаю наверно имеет смысл сделать сделать отдельную точку входа в direct.inc для постобработки всех св-тв, получаемых из менеджера среды. Что-то вроде:
    procedure ReadProperty(PType:byte; value:pointer);
    begin
    // TODO
    end;

    Galkov писал(а):
    Как-то условие SubType=0 - подозрение вызывает...

    в идеале надо делать проверку на GetType in [data_int, data_str, data_real] и кастить к соответсвующему типу в _toCode

    Galkov писал(а):
    У себя-то я пока так сделал (make_exe.dpr ты ведь и не выложил

    думаю сделаем немного посложнее интерфейс с добавлением точки buildCompliteProc. Тогда можно будет выделять и уничтожать память в одном месте. make_exe.dpr не выложил и не выложу - их все нужно переделать на HiAsm под пакет Modules.

    С утечкой памяти - да затычки одни стоят... Расчитанные на кратковременную работу DLL. Думаю все решиться потом.

    Galkov писал(а):
    Поэтому у себя я таки изменил немного очередность действий:

    да все верно. Немного не тот порядок был проставлен.
    карма: 27
    0
    Ответов: 9906
    Рейтинг: 351
    #138: 2007-07-05 15:22:09 ЛС | профиль | цитата
    Dilma, а вот я интересуюсь: у тебя скипы для if-ов разного калибра - правильно работают-то
    А то чего-то в таком коде для IndexToChanel
    func doEvent(_data)
      fvar(old, cur, cr, il, im, ind, dt, i)
    trace(block.cur()+" ???")
    ind = e_int(Index)
    dt = Data
    if(expof(ind))
    il = 0
    cur = block.reggen()
    trace(cur+" !")
    old = block.select(cur)
    for(i = 0; i < _event_count_; i++)
    cr = block.reggen()
    trace(cr+" !")
    block.select(cr)
    event("onEvent" + (i+1), dt)
    if(not block.Empty())
    block.select(cur)
    if(il)
    print(i, ': ')
    else
    im = i
    end
    lng.begin()
    block.copyhere(cr)
    lng.end()
    il++
    end
    block.delete(cr)
    trace(cr+" !!!")
    end
    block.select(old)
    if(il=1)
    print('if ', ind, ' = ',im, ' then ')
    block.copyhere(cur)
    else if(il>1)
    println('case ', ind, ' of')
    block.inclvl()
    print(im, ': ')
    block.copyhere(cur)
    lng.end()
    end
    block.delete(cur)
    trace(cur+" !!!")
    else if((ind>=0)and(ind<_event_count_))
    event("onEvent" + (ind+1), dt)
    end
    trace(block.cur()+" ???")
    end
    Последнего trace не вижу в упор
    карма: 9

    0
    Администрация
    Ответов: 15295
    Рейтинг: 1519
    #139: 2007-07-05 15:32:25 ЛС | профиль | цитата
    вроде правильно. Но гарантии нет... Всмысле ошибка не исключена
    карма: 27
    0
    Ответов: 9906
    Рейтинг: 351
    #140: 2007-07-05 16:25:33 ЛС | профиль | цитата
    Ну блин

    ОКАЗАЛОСЬ: что elseif и else if обладают некой невидимой разницей

    Dilma, а теперь присмотрись к коду
    Побудительным мотивом для него явился шок, мной испытанный, когда я пронаблюдал эмуляцию linked в этом же элементе (IndexToChanel) из пакета WEB

    При этом я понимаю, что использование нами linked в кодах, это просто прогноз block.Empy
    Ну я и попробовал не прогнозировать...

    НО, что получается ???
    Так ведь можно вытащить и некоторые другие параметры, ДО генерации своего кода. Ну, например, понадобились ли данные из некой моей локальной переменной, там - в event-е...
    Если нет, то может я их и считать не буду.
    В смысле - не буду генерировать коды для рассчета...

    Это все при однопроходном режиме, между прочим.
    В data, конечно, ставить чего-то придется...
    Не все однопроходный режим поднимает.

    Но уже кое-что, могло бы и свариться.

    Если бы мы застолбили некие механизмы возврата данных...
    Вот как раз в механизме-то и вопрос

    Для Empty он есть - есть и результат...
    карма: 9

    0
    Администрация
    Ответов: 15295
    Рейтинг: 1519
    #141: 2007-07-05 16:33:51 ЛС | профиль | цитата
    Galkov писал(а):
    ОКАЗАЛОСЬ: что elseif и else if обладают некой невидимой разницей

    ну так конечно в данном случае оператор If почти полностью соответствует Basic нотации.

    Galkov писал(а):
    Но уже кое-что, могло бы и свариться.
    Если бы застолбили некие механизмы возврата данных...

    предложения?
    карма: 27
    0
    Разработчик
    Ответов: 26113
    Рейтинг: 2126
    #142: 2007-07-05 18:02:43 ЛС | профиль | цитата
    А у меня вопрос? Вы это все для себя, что ли, разрабатываете? Изначально скрипты были простенькие, и мне казалось, что язык не очень сложный и разобраться вполне можно. Но во что он превратился сейчас (один элемент IndexToChanel чего стоит)...
    карма: 22

    0
    Ответов: 3655
    Рейтинг: 69
    #143: 2007-07-05 18:10:07 ЛС | профиль | цитата
    nesco писал(а):
    Но во что он превратился сейчас (один элемент IndexToChanel чего стоит)...

    "То ли ещё будет ой ё йо й " цитата
    карма: 0

    0
    Разработчик
    Ответов: 26113
    Рейтинг: 2126
    #144: 2007-07-05 18:21:09 ЛС | профиль | цитата
    А мне он перестал вообще нравится после всего этого. Ради чего весь этот гемор, ради универсальности, или получения более оптимального кода? Вот Galkov'y нравится оптимизировать код, вот пусть он этим и страдает. Чем отличается любой целевой язык, а тем, что по нему столько наработок у людей, по нему столько литературы, что ни счесть. Надо, залез в нэт и нашел все что надо. Раньше у HiAsm'a было преимущество -- это простота понимания и в визуализации и в коде, не нравятся компоненты в IC написать можно, а теперь что, монстра родили, от всего осталась толька визуализация. ИМХО.
    карма: 22

    0
    Ответов: 9906
    Рейтинг: 351
    #145: 2007-07-05 18:28:47 ЛС | профиль | цитата
    nesco, это ты сейчас с кем беседовал
    карма: 9

    0
    Ответов: 3655
    Рейтинг: 69
    #146: 2007-07-05 18:35:46 ЛС | профиль | цитата
    nesco, Дык об этом столько уже писали.
    Типа ,я постепенно возвращяюсь к Дельфям.
    карма: 0

    0
    Администрация
    Ответов: 15295
    Рейтинг: 1519
    #147: 2007-07-05 18:41:42 ЛС | профиль | цитата
    nesco,

    nesco писал(а):
    Вы это все для себя, что ли, разрабатываете?

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

    Да ладно бы еще сидел себе тихо возмущался, но ведь после
    nesco писал(а):
    Но во что он превратился сейчас (один элемент IndexToChanel чего стоит)


    люди. которые разбираются во всем этом еще меньше, начинают думать:
    Вячеслав писал(а):
    "То ли ещё будет ой ё йо й "


    Не годится так... Поэтому nesco, либо заканчивай с изучением FTCG, доводи до ума наработки в стандартном пакете и не делай выводы по кускам информации, полученной с форума, либо прежде чем высказываться в том категоричном стиле, какой был продемонстрирован выше докажи нам свое хотя бы 90% понимание ситуации и от жалоб и недовольств переходи к конкретным предложениям и решениям.
    карма: 27
    0
    Разработчик
    Ответов: 26113
    Рейтинг: 2126
    #148: 2007-07-05 21:47:23 ЛС | профиль | цитата
    Dilma писал(а):
    заканчивай с изучением FTCG

    Но я начинал его изучать м уже написал про это
    Изначально скрипты были простенькие, и мне казалось, что язык не очень сложный
    Но меня напугал приведенный здесь пример. Я помню, какой мог быть код сначала и увидел его сейчас. И как я должен на это смотреть? Я думаю, насчет предложений тут и Galkova хватит за нас всех.
    А вот тут, при удобном случае, я хочу сказать
    доводи до ума наработки в стандартном пакете
    И где мои доработки, даже те которые вы просили сделать? Тот же конвертор дат, или DatePicker (а сколько шума было, что я не хотел за них браться, я уже и не вспоминаю) и те лежат мертвым грузом, а так как они не в пакете, то их особо-то и не применяют, только дя своих нужд.
    карма: 22

    0
    Администрация
    Ответов: 15295
    Рейтинг: 1519
    #149: 2007-07-05 23:13:40 ЛС | профиль | цитата
    nesco писал(а):
    Но меня напугал приведенный здесь пример. Я помню, какой мог быть код сначала и увидел его сейчас. И как я должен на это смотреть?

    почему таких вопросов не возникало в стандартном пакете при взгляде на элементы FastMathParse, Gentee и прочие? Может быть потому, что эти элементы не были таки просмотрены? Если так, то о чем вообще тогда можно говорить?
    карма: 27
    0
    Разработчик
    Ответов: 26113
    Рейтинг: 2126
    #150: 2007-07-06 01:34:58 ЛС | профиль | цитата
    Dilma, а потому, что написаны они на знакомом языке и имееют стандартый синтаксис и логику в которых можно разобраться и не надо переводить это все с авторского на знакомый. Все это беспредметный разговор. Я не против -- создавайте все что хотите, в конце концов, это -- ваше дело.
    карма: 22

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