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

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

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

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

Сообщение vitaly_l » 28.05.2012 17:26:16

В других языках есть возможность задавать и вызывать через string название функции и массива.

Пример примерно требуемого:
var
array1 : array of array of TOpenDialog;
array2 : array of array of TOpenDialog;
array3 : array of array of TOpenDialog;
......etc
array10000 : array of array of TOpenDialog;
begin
for i := 1 to 10000 do SomeFunction('array'+IntToStr(i)); <=== Так, в Pascal'e - очевидно нельзя подгрузить массив... или можно??? Если можно, то как?

или тоже самое относительно функций...
for i := 1 to 10000 do
begin
arrFunctionName[i] := 'SomeFunction' + IntToStr(i) +'(array'+IntToStr(i)+ ',' + true+')');
Run(arrFunctionName[i]); <=== Но там (в теле функции) - нельзя использовать case SomeName of 1,2,3,4...10000 end;
end;

:arrow: Изначально вопрос звучал, так: Авто-нумерация массивов и функций - это возможно?
:!: Более правильно вопрос прозвучит, так: Можно ли задавать и вызывать через string название функции и массива???


end;


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

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

Сообщение absdjfh » 29.05.2012 15:16:03

Возможно, я плохо понял вопрос.
Что мешает создать
type SomeArray = array of array of TOpenDialog
var Arr: array [1..10000] of SomeArray?
и вызывать for i := 1 to 10000 do SomeFunction(Arr[i])
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

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

Сообщение vitaly_l » 29.05.2012 15:48:43

Вы совершенно правильно поняли и решили. Но не ту задачу...
Вторая суть задачи была в создании и переборе функций таким методом...
Однако и это решаемо (примерно также), как Вы предложили...

Однако... Суть вопроса намного иная и сложнее(мне так кажется), а именно:

Основная суть(идея) задачи сделать var FigliMigli : string;
которому можно было бы присваивать нужное название функции с нужными параметрами
и потом, некий Run(FigliMigli); - должен запускать функцию с параметрами, которые присвоены FigliMigli...

А в FigliMigli может быть, всё что угодно, хоть: onClick или onMouseMove или SomeFunction.... вот примерно так...
Так, по идее, в скриптах можно делать... но я не нашёл работающего скрипта для лазаруса. :(

вопрос звучит, так: Можно ли задавать и вызывать через string название функции и массива???



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

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

Сообщение absdjfh » 29.05.2012 16:26:42

Такое вроде как невозможно (всмысле прямое приведение типа string к идентификатору процедуры). Но реализация такого с точки зрения компилятора представляется мне несложной, особенно если имена ваших процедур с параметрами - константы. А если это не константы (например, имена процедур читаются Read'ом), то это даже в некоторой степени противоречит идеологии паскаля.

Для первого случая можно составить программу, которая преобразует код с запускамии вроде RunProc('SomeProc' + IntToStr(i)) и открытиями новых процедур вроде CreateProc('SomeProc' + IntToStr(i)) в правильный код.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

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

Сообщение vitaly_l » 29.05.2012 16:40:30

absdjfh писал(а):Для первого случая можно составить программу, которая преобразует код с запускамии вроде RunProc('SomeProc' + IntToStr(i)) и открытиями новых процедур вроде CreateProc('SomeProc' + IntToStr(i)) в правильный код.

ПОЖАЛУЙСТА, чуть-чуть более открыто и развёрнуто, если можно...

:arrow: Что значит: Составить программу вроде RunProc??? (Что она должна уметь? В смысле куда обращаться?!)
:arrow: Что значит: Открытиями новых процедур вроде CreateProc??? <=== для меня - это звучит так как мне надо, но как это реализовать????!
:arrow: Что значит: в правильный код? (возможно это именно, то, что мне нужно...)



.
Последний раз редактировалось vitaly_l 29.05.2012 16:52:55, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение svk12 » 29.05.2012 16:52:17

absdjfh писал(а):но я не нашёл работающего скрипта для лазаруса.


Ну, дык: http://www.remobjects.com/ps.aspx
svk12
постоялец
 
Сообщения: 409
Зарегистрирован: 09.06.2008 18:42:47

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

Сообщение vitaly_l » 29.05.2012 17:00:25

svk12 писал(а):Ну, дык: http://www.remobjects.com/ps.aspx


Я это вчера уже устанавливал.
При установке Лазарус орал как резаный - мол не могу найти функции.
Закоментил три ссылки. Установилось. Вверху на панели Лазаруса - появилась закладка.
Обрадовался. Там есть примеры. Загрузил первый. При попытке компиляции пишет - не могу найти *.*...
При этом, при клике с Ctrl в uses по *.* - сам файл открывает... Но Лазарус его не воспринимает...
Короче там сбой и этот код нерабочий, или точнее я не умею его запускать. :cry: :cry: :cry:

.........................................

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



.
.
Последний раз редактировалось vitaly_l 29.05.2012 17:12:36, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение absdjfh » 29.05.2012 17:08:30

vitaly_l писал(а):Открытиями новых процедур вроде CreateProc??? <=== для меня - это звучит так как мне надо, но как это реализовать????!

Это значит, что программа получает код, содержащий процедуры RunProc и CreateProc, а выдает код, который компилируется FPC.
vitaly_l писал(а):Что значит: Составить программу вроде RunProc??? (Что она должна уметь? В смысле куда обращаться?!)

Предположим, программа, которая преобразует код (дальше - интепретатор) находит в вашей программе строчку:
for i := 1 to 10000 do CreateProc('SomeProc' + IntToStr(i), 'param1: integer; param2: real', '{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}');
дальше интерпретатор удаляет эту строчку, а вместо нее в соответствующем месте пишет:
procedure SomeProc1(param1: integer; param2: real);
begin
{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}
end;
procedure SomeProc2(param1: integer; param2: real);
begin
{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}
end;
...
procedure SomeProc9999(param1: integer; param2: real);
begin
{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}
end;
procedure SomeProc10000(param1: integer; param2: real);
begin
{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}
end;

Дальше: процедура RunProc('SomeProc' + IntToStr(364), '65, 36.44')
эта строчка заменяется на
SomeProc364(65, 36.44);

Не исключено, что это можно реализовать проще.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

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

Сообщение vitaly_l » 29.05.2012 17:14:20

absdjfh писал(а):эта строчка заменяется на
SomeProc364(65, 36.44);

Это то что нужно...

Как эту строчку запустить, чтобы она обратилась к функции???



.

Добавлено спустя 2 минуты 49 секунд:
absdjfh писал(а):дальше интерпретатор удаляет эту строчку, а вместо нее в соответствующем месте пишет
procedure SomeProc9999(param1: integer; param2: real);
begin
{здесь операторы, с которыми нужно создать процедуру, могут включать i или каким то образом от этого зависеть}
end;

Это мне тоже непонятно. Где такое соответствующее место??? Предположим в памяти...

Однако: Как к этой функции обратиться???


.
Последний раз редактировалось vitaly_l 29.05.2012 17:21:45, всего редактировалось 1 раз.
Аватара пользователя
vitaly_l
долгожитель
 
Сообщения: 3333
Зарегистрирован: 31.01.2012 16:41:41

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

Сообщение absdjfh » 29.05.2012 17:21:15

vitaly_l писал(а):Как эту строчку запустить, чтобы она обратилась к функции???

Не уверен, что это именно то, что вам нужно.
Строчки не запускают :)
Суть заключается в том, что код преобразует другая программа (опять же - интерпретатор), которая преобразует строчку.
Но параметры RunProc должны быть констанстами, т. е. если
for i := 1500 to 6520 do RunProc('SomeProc' + IntToStr(i), '65, 36.44')
реализовать можно, то
Readln(i);
RunProc('SomeProc' + IntToSTr(i), '65, 36.44')
по моему способу реальзовать уже никак.
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

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

Сообщение vitaly_l » 29.05.2012 17:27:47

Почему нет???
В памяти сформировалась функция.
Технически её можно запустить, если программа будет уметь её интерпретировать.

Скрипт для Лазаруса - умеет, но он не работает.
Однако он скрипт... Как-то это делает... Значит есть возможность...
Вот как он(скрипт) запускает функцию, которая по сути string???
Как он(скрипт) к ней обращается???


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

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

Сообщение absdjfh » 29.05.2012 17:44:31

К функции однозначно обращаются по адресу в памяти. String - простая формальность, для удобства программиста. А в паскале string и идентификаторы разделены и трудноприводимы друг к другу. Процедура - это даже не тип данных паскаля (по крайней мере, про указатели на процедуры я не слышал, и не представляю, как узнать адрес процедуры внутри программы).
Дальше ничего не знаю. Возможно, нужно использовать ассемблер, или ищите скрипт. А, может, можно обойтись без этого?
absdjfh
новенький
 
Сообщения: 60
Зарегистрирован: 21.01.2012 13:59:00

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

Сообщение vitaly_l » 29.05.2012 17:56:32

Ассемблер - это единственный язык, который я интуитивно - не понимаю...
Более того он у меня не работает в Лазарусе... или точнее я его не умею запускать...
на директиву asm мой Лазарус начинает орать и топать ногами... короче - отказывается компилировать asm...

absdjfh писал(а):про указатели на процедуры я не слышал, и не представляю, как узнать адрес процедуры внутри программы

Но ведь скрипт - это умеет...


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

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

Сообщение alexey38 » 29.05.2012 18:06:52

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

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

Сообщение vitaly_l » 29.05.2012 18:19:27

alexey38 писал(а):Используйте скрипты от ремобьекта

Я не понимаю как этим ремобьектом пользоваться...
У меня устанавливается блокнот, в который можно скопировать текст на паскале. И всё...
Что с этим делать непонятно... Как этот блокнот приладить к программе?

Мне больше понравилось то что предлагает pascalscript... Но у меня и не только у меня он не работает.
Брал тут: http://freepascal.ru/forum/viewtopic.php?f=5&t=5732&p=41794&hilit=pascalscript#p41794


Как этим ремобьектом пользоваться??? Как его в Лазарус приладить???



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

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 254

Рейтинг@Mail.ru