Авто-нумерация массивов и функций - возможно ли это?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение svk12 » 29.05.2012 19:51:06

pascalscript и есть ремобьект..
Но он Вам не подойдёт - там строкой задаётся только имя функции, а список аргументов передаётся через
открытый массив.
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 29.05.2012 20:38:23

svk12 писал(а):Но он Вам не подойдёт - там строкой задаётся только имя функции, а список аргументов передаётся через
открытый массив.

Интересная и ясная мысль... Верю на слово... а что будет с массивом, если ему задать setlength?
svk12 писал(а):pascalscript и есть ремобьект

Странно... у меня они выглядят - совершенно по разному... т.к. pascalscript - встраивается в Лазарус, а ремобъект - это скомпилированное приложение в виде блокнота с кнопкой F9, которая - не работает...

Впрочем это радует т.к. можно: молотком, зубилом и отвёрткой - раскурочить pascalscript.pas'ы...
и узнать... как они устроены изнутри...



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение Kitayets » 30.05.2012 00:14:31

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
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 30.05.2012 08:45:40

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 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение alexey38 » 30.05.2012 10:21:10

при использовании любого скриптового движка в тексте основной программы нужно писать определенный код, который зависит от вашей задачи. Примеры кода и назначение функций, которые нужно вызвать найдите через поиск в инете.

Добавлено спустя 7 минут 20 секунд:
Виталий, вы как всегда изобретаете велосипед. Вначале бы лучше посоветовались с путем решения вашей задачи, а потом уже копались в спецефических вопросах. Я уверен, что вы ищете неверный путь решения простой задачи.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 30.05.2012 10:44:41

alexey38 писал(а):Я уверен, что вы ищете неверный путь решения простой задачи.

Я ничего не ищу.... я получаю знания... способ получения знаний - возможно выглядит странным, но мне так усвоить информацию проще...
Поймите правильно, здесь читают Мастера своего дела, Мастера - сразу видят каких знаний у меня нет. И заполняют пробелы в моих знаниях...
Прочитать все книги на планете - невозможно. Однако, когда есть 1000000 Мастеров прочитавших по одной книге - легко найти искомую информацию.

Это обыкновенное параллельное вычисление и обращение к знаниям, каждого из 1000000 Мастеров. При этом у меня знаний нет, но я выбираю, то что мне нужно, а до меня информацию отфильтровали 1000000 Мастеров... <=== и выбрали лучшее и 100% работоспособное... Если Вы посмотрите на статистику то увидите что данный пост прочитали 240 человек, а ответов всего 10, а ответов по существу всего только 3 и все три востребованы и привели к решению.

Возможно Вы правы и я ищу неверный путь решения простой задачи. Если это так, то в процессе я это увижу(наверное)...
В любом случае я получу востребованные знания... Собственно для этого и нужен форум. Разве это иначе?



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение SAK » 30.05.2012 13:27:31

Весь вопрос в том, правильно ли задан вопрос этим самым Мастерам. Образно: стоит задача выйти из комнаты, но "обучающийся" вместо вопроса "как выйти из комнаты?" спрашивает "как пробить стену?" и получает соответствующий ответ. Именно такое впечатление возникает после прочтения Вашего вопроса.
В откомпилированной программе НИ ГДЕ не хранятся исходные имена переменных, процедур и функций, поэтому обратиться к ним по имени просто невозможно. А что бы реализовать такую возможность надо каждой переменной, процедуре и функции создать связь её текстового имени и физического адреса и где-то сохранить эту таблицу. Потом при попытке обратится по имени к такой функции или переменной надо найти её имя в таблице и обратиться по указанному там адресу. Т.е. времени на поиск и обращение к нужной области памяти будет затрачиваться больше чем на выполнение полезных функций, зачем это надо? Надо решать конкретную задачу, а не городить огород из кучи никому не нужных и крайне медленных возможностей.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 30.05.2012 13:33:25

SAK писал(а):Весь вопрос в том, правильно ли задан вопрос этим самым Мастерам. Образно: стоит задача выйти из комнаты, но "обучающийся" вместо вопроса "как выйти из комнаты?" спрашивает "как пробить стену?" и получает соответствующий ответ. Именно такое впечатление возникает после прочтения Вашего вопроса. В откомпилированной программе НИГДЕ не хранятся исходные имена переменных, процедур и функций, поэтому обратиться к ним по имени просто невозможно. А что бы реализовать такую возможность надо каждой переменной, процедуре и функции создать связь её текстового имени и физического адреса и где-то сохранить эту таблицу. Потом при попытке обратится по имени к такой функции или переменной надо найти её имя в таблице и обратиться по указанному там адресу. Т.е. времени на поик и оращению к нужной области памяти будет затрачиваться больше чем на выполнение полезных функций, зачем это надо?


Спасибо.
PS: Ломание стен, это отличный способ перепланировки помещения... Особенно когда эти стены - не несущие...


Остаётся выяснить физические адреса функций и как к ним обращаться?!...
:!: :?: :arrow: Возможно это то, что хранится в PropInfo??? (см. выше (RTTI)) :cry:



.



.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение SAK » 30.05.2012 15:23:11

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
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 30.05.2012 15:45:07

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;

.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение SAK » 30.05.2012 16:30:22

Вы сначала определитесь с тем, к чему именно надо обращаться по имени: переменным, процедурам, функциям или методам классов. Слишком широкий у Вас вопрос, и без конкретизации задачи Вам точный ответ никто не даст.
vitaly_l писал(а):string... запускать функцию должен string... типа как в скриптах делают...

Я показал только как получить адрес нужной функции. Ничто не мешает сделать второй массив из соответствующих имён функций, а лучше все соответствия адресов и имён поместить в один массив из записей. Потом сделать процедуру которая будет отыскивать нужное имя и выполнять соответсвующий ему код. Но всё это только общие рассуждения, требуется уточнение задачи.

Во вложении пример реализации парсера выражений DBase. Там нужные функции и операторы отыскиваются по таблице имён.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение vitaly_l » 30.05.2012 17:22:56

SAK писал(а):Вы сначала определитесь с тем, к чему именно надо обращаться по имени: переменным, процедурам, функциям или методам классов.
Мне бы вначале, самому, определиться: что есть что... что есть функция, а что метод классов? <=== правдивый юмор...

Хороший вкусный парсер... познавательный... СПАСИБО! <=== БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ!

Почему автор, парсера - никогда не ставит символ ===> ; <=== в конце функций и в случае: end end; ???!!!...




.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

Re: Авто-нумерация массивов и функций - возможно ли это?

Сообщение SAK » 30.05.2012 19:13:28

Автор я, парсер не окончательно сделанный, но вычисления производит, там контроль ошибок в выражении недоделан, но это не мешает им пользоваться.
vitaly_l писал(а):Почему автор, парсера - никогда не ставит символ ===> ; <=== в конце функций и в случае: end end; ???!!!...

Потому как синтаксис языка не требует их там ставить, а раз не требуется, то и не ставлю. ";" требуется для разделения операторов, а "end" оператором не является также как и "until".

vitaly_l писал(а):что есть функция, а что метод классов?

Метод (класса или объекта) - это функция или процедура объявленная в описании класса и отличается тем, что имеет дополнительный скрытый (неявный) параметр указывающий на экземпляр класса которому он (метод) принадлежит.
SAK
постоялец
 
Сообщения: 158
Зарегистрирован: 18.02.2006 00:45:14
Откуда: Тим

Пред.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 249

Рейтинг@Mail.ru