Авто-нумерация массивов и функций - возможно ли это?
Модератор: Модераторы
pascalscript и есть ремобьект..
Но он Вам не подойдёт - там строкой задаётся только имя функции, а список аргументов передаётся через
открытый массив.
Но он Вам не подойдёт - там строкой задаётся только имя функции, а список аргументов передаётся через
открытый массив.
svk12 писал(а):Но он Вам не подойдёт - там строкой задаётся только имя функции, а список аргументов передаётся через
открытый массив.
Интересная и ясная мысль... Верю на слово... а что будет с массивом, если ему задать setlength?
svk12 писал(а):pascalscript и есть ремобьект
Странно... у меня они выглядят - совершенно по разному... т.к. pascalscript - встраивается в Лазарус, а ремобъект - это скомпилированное приложение в виде блокнота с кнопкой F9, которая - не работает...
Впрочем это радует т.к. можно: молотком, зубилом и отвёрткой - раскурочить pascalscript.pas'ы...
и узнать... как они устроены изнутри...
.
absdjfh писал(а):К функции однозначно обращаются по адресу в памяти. String - простая формальность, для удобства программиста. А в паскале string и идентификаторы разделены и трудноприводимы друг к другу. Процедура - это даже не тип данных паскаля (по крайней мере, про указатели на процедуры я не слышал, и не представляю, как узнать адрес процедуры внутри программы).
Дальше ничего не знаю. Возможно, нужно использовать ассемблер, или ищите скрипт. А, может, можно обойтись без этого?
Есть и процедурный тип в objectPascal/Delphi и тип метода объекта. И адрес процедуры/функции в программе определяется в pascal/delphi/c/c++ одинаково просто.
http://freepascal.org/docs-html/ref/refse17.html#x45-520003.6
думаю, если функцию представить как метод класса - то к ним можно обращаться по литеральным идентификаторам используя механизм RTTI
http://www.delphisources.ru/pages/faq/base/rtti_in_action.html
обратите внимание на на метод MethodAddress(name: string) - возвращает указатель на метод с именем name.
Kitayets писал(а):адрес процедуры/функции в программе определяется - одинаково просто
Кому то может и просто.., а лично я не понял как оно работает...
За исключением того что, если после названия процедуры: всё идентично, то - можно: a := @b...
Или, возможно, пытался понять(найти) там, то, чего там изначально нет...
В любом случае: ГРОМАДНОЕ СПАСИБО - информация востребована и пригодилась!
Kitayets писал(а):обратите внимание на на метод MethodAddress(name: string)
Очень удобная возможность...
Однако возник вопрос: А если, у компонента формы - нет процедуры OnMouseMove...
Можно ли..., отсутствующую процедуру - приладить к компоненту, механизмом RTTI ???
А главное... Если там будет не 'SomeName', a array of string - будет ли это работать при выполнении программы, а не во время компиляции???
Если, ответ: да... - то, это ответ на один из вопросов.
Потом - это компиляцияонное присваивание... функции: a := b... А не обращение к ней в процессе работы программы...
И параметры(переменные) для функции, я там, в виде string - задать не могу... Но действительно - могу узнать её PropInfo...
Хотя, если умудриться совместить первое и второе, то получится обращение к функции с любыми заданными переменными...
-
Последний раз редактировалось vitaly_l 30.05.2012 11:00:58, всего редактировалось 1 раз.
при использовании любого скриптового движка в тексте основной программы нужно писать определенный код, который зависит от вашей задачи. Примеры кода и назначение функций, которые нужно вызвать найдите через поиск в инете.
Добавлено спустя 7 минут 20 секунд:
Виталий, вы как всегда изобретаете велосипед. Вначале бы лучше посоветовались с путем решения вашей задачи, а потом уже копались в спецефических вопросах. Я уверен, что вы ищете неверный путь решения простой задачи.
Добавлено спустя 7 минут 20 секунд:
Виталий, вы как всегда изобретаете велосипед. Вначале бы лучше посоветовались с путем решения вашей задачи, а потом уже копались в спецефических вопросах. Я уверен, что вы ищете неверный путь решения простой задачи.
alexey38 писал(а):Я уверен, что вы ищете неверный путь решения простой задачи.
Я ничего не ищу.... я получаю знания... способ получения знаний - возможно выглядит странным, но мне так усвоить информацию проще...
Поймите правильно, здесь читают Мастера своего дела, Мастера - сразу видят каких знаний у меня нет. И заполняют пробелы в моих знаниях...
Прочитать все книги на планете - невозможно. Однако, когда есть 1000000 Мастеров прочитавших по одной книге - легко найти искомую информацию.
Это обыкновенное параллельное вычисление и обращение к знаниям, каждого из 1000000 Мастеров. При этом у меня знаний нет, но я выбираю, то что мне нужно, а до меня информацию отфильтровали 1000000 Мастеров... <=== и выбрали лучшее и 100% работоспособное... Если Вы посмотрите на статистику то увидите что данный пост прочитали 240 человек, а ответов всего 10, а ответов по существу всего только 3 и все три востребованы и привели к решению.
Возможно Вы правы и я ищу неверный путь решения простой задачи. Если это так, то в процессе я это увижу(наверное)...
В любом случае я получу востребованные знания... Собственно для этого и нужен форум. Разве это иначе?
.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Весь вопрос в том, правильно ли задан вопрос этим самым Мастерам. Образно: стоит задача выйти из комнаты, но "обучающийся" вместо вопроса "как выйти из комнаты?" спрашивает "как пробить стену?" и получает соответствующий ответ. Именно такое впечатление возникает после прочтения Вашего вопроса.
В откомпилированной программе НИ ГДЕ не хранятся исходные имена переменных, процедур и функций, поэтому обратиться к ним по имени просто невозможно. А что бы реализовать такую возможность надо каждой переменной, процедуре и функции создать связь её текстового имени и физического адреса и где-то сохранить эту таблицу. Потом при попытке обратится по имени к такой функции или переменной надо найти её имя в таблице и обратиться по указанному там адресу. Т.е. времени на поиск и обращение к нужной области памяти будет затрачиваться больше чем на выполнение полезных функций, зачем это надо? Надо решать конкретную задачу, а не городить огород из кучи никому не нужных и крайне медленных возможностей.
В откомпилированной программе НИ ГДЕ не хранятся исходные имена переменных, процедур и функций, поэтому обратиться к ним по имени просто невозможно. А что бы реализовать такую возможность надо каждой переменной, процедуре и функции создать связь её текстового имени и физического адреса и где-то сохранить эту таблицу. Потом при попытке обратится по имени к такой функции или переменной надо найти её имя в таблице и обратиться по указанному там адресу. Т.е. времени на поиск и обращение к нужной области памяти будет затрачиваться больше чем на выполнение полезных функций, зачем это надо? Надо решать конкретную задачу, а не городить огород из кучи никому не нужных и крайне медленных возможностей.
SAK писал(а):Весь вопрос в том, правильно ли задан вопрос этим самым Мастерам. Образно: стоит задача выйти из комнаты, но "обучающийся" вместо вопроса "как выйти из комнаты?" спрашивает "как пробить стену?" и получает соответствующий ответ. Именно такое впечатление возникает после прочтения Вашего вопроса. В откомпилированной программе НИГДЕ не хранятся исходные имена переменных, процедур и функций, поэтому обратиться к ним по имени просто невозможно. А что бы реализовать такую возможность надо каждой переменной, процедуре и функции создать связь её текстового имени и физического адреса и где-то сохранить эту таблицу. Потом при попытке обратится по имени к такой функции или переменной надо найти её имя в таблице и обратиться по указанному там адресу. Т.е. времени на поик и оращению к нужной области памяти будет затрачиваться больше чем на выполнение полезных функций, зачем это надо?
Спасибо.
PS: Ломание стен, это отличный способ перепланировки помещения... Особенно когда эти стены - не несущие...
Остаётся выяснить физические адреса функций и как к ним обращаться?!...
.
.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
vitaly_l писал(а):Остаётся выяснить физические адреса функций и как к ним обращаться?!...
Как и во всех остальных случаях используется оператор взятия адреса "@", например:
Код: Выделить всё
type TProcedure = Procedure;
var p: array[0..1] of TProcedure;
i: integer;
procedure pp1;
begin
writeln('Процедура 1');
end;
procedure pp2;
begin
writeln('Процедура 2');
end;
begin
p[0]:=@pp1;
p[1]:=@pp2;
for i:=0 to 1 do p[i];
end.
Добавлено спустя 2 минуты 23 секунды:
vitaly_l писал(а):Возможно это то, что хранится в PropInfo??? (см. выше (RTTI))
Это относится к классам.
SAK писал(а): используется оператор взятия адреса "@"
Спасибо - это работает. см. выше http://freepascal.org/docs-html/ref/refse17.html#x45-520003.6
Я правда немного иначе это делаю, через TMethod...
Однако Вы как и некий absdjfh - решили не ту задачу.
string... запускать функцию должен string... типа как в скриптах делают...
А вот вариант с составлением таблицы - это правильный вектор...
Если взять Ваш код, то наверно это выглядело бы так:
var FigliMigli : array [0..1] of string;
begin
FigliMigli[0] := @+'onMouseMove(1,2,3,4,5)';
FigliMigli[1] := @+'onMouseUp(1,2,3,4,5)';
p[0]:= FigliMigli[0]; //@pp1;
p[1]:= FigliMigli[1]; //@pp2;
for i:=0 to 1 do p[i];
end;
.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Вы сначала определитесь с тем, к чему именно надо обращаться по имени: переменным, процедурам, функциям или методам классов. Слишком широкий у Вас вопрос, и без конкретизации задачи Вам точный ответ никто не даст.
Я показал только как получить адрес нужной функции. Ничто не мешает сделать второй массив из соответствующих имён функций, а лучше все соответствия адресов и имён поместить в один массив из записей. Потом сделать процедуру которая будет отыскивать нужное имя и выполнять соответсвующий ему код. Но всё это только общие рассуждения, требуется уточнение задачи.
Во вложении пример реализации парсера выражений DBase. Там нужные функции и операторы отыскиваются по таблице имён.
vitaly_l писал(а):string... запускать функцию должен string... типа как в скриптах делают...
Я показал только как получить адрес нужной функции. Ничто не мешает сделать второй массив из соответствующих имён функций, а лучше все соответствия адресов и имён поместить в один массив из записей. Потом сделать процедуру которая будет отыскивать нужное имя и выполнять соответсвующий ему код. Но всё это только общие рассуждения, требуется уточнение задачи.
Во вложении пример реализации парсера выражений DBase. Там нужные функции и операторы отыскиваются по таблице имён.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Мне бы вначале, самому, определиться: что есть что... что есть функция, а что метод классов? <=== правдивый юмор...SAK писал(а):Вы сначала определитесь с тем, к чему именно надо обращаться по имени: переменным, процедурам, функциям или методам классов.
Хороший вкусный парсер... познавательный... СПАСИБО! <=== БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ!
Почему автор, парсера - никогда не ставит символ ===> ; <=== в конце функций и в случае: end end; ???!!!...
.
-
SAK
- постоялец
- Сообщения: 158
- Зарегистрирован: 17.02.2006 23:45:14
- Откуда: Тим
- Контактная информация:
Автор я, парсер не окончательно сделанный, но вычисления производит, там контроль ошибок в выражении недоделан, но это не мешает им пользоваться.
Потому как синтаксис языка не требует их там ставить, а раз не требуется, то и не ставлю. ";" требуется для разделения операторов, а "end" оператором не является также как и "until".
Метод (класса или объекта) - это функция или процедура объявленная в описании класса и отличается тем, что имеет дополнительный скрытый (неявный) параметр указывающий на экземпляр класса которому он (метод) принадлежит.
vitaly_l писал(а):Почему автор, парсера - никогда не ставит символ ===> ; <=== в конце функций и в случае: end end; ???!!!...
Потому как синтаксис языка не требует их там ставить, а раз не требуется, то и не ставлю. ";" требуется для разделения операторов, а "end" оператором не является также как и "until".
vitaly_l писал(а):что есть функция, а что метод классов?
Метод (класса или объекта) - это функция или процедура объявленная в описании класса и отличается тем, что имеет дополнительный скрытый (неявный) параметр указывающий на экземпляр класса которому он (метод) принадлежит.
