2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 11:43 
Аватара пользователя


30/05/09
121
Киев
Пусть имеется функция:

function f ( x : real) : real;
begin result:= sin(x); end;

В общем дело вот в чем... Как во время работы программы (уже скомпилированного файла .exe) изменить функциию? Например, в случает с программой по нахождению приблизительного значения определённого интеграла банальным методом прямоугольников (итераций). Я попробовал поместить текст функции в текстовый файл:

begin result:= {$include function.txt}; end;

и поместил в текст программы специальную процедуру по работе с этим текстовым файлом. Однако, сама функция изменяется только при компилировании. При работе с приложением .exe содержание текстового файла изменяется, но это изменение не доходит до программы. Что делать?

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 11:59 
Заслуженный участник


11/05/08
32166
Alhimik в сообщении #236054 писал(а):
Как во время работы программы (уже скомпилированного файла .exe) изменить функциию?

Никак. Но можно предусмотреть внутри функции некие глобальные переменные (помимо собственно формальных параметров), а их уж и менять по ходу выполнения.

Или такой извращённый подход: записать функцию в строковую переменную в виде некоторого псевдокода, а потом подсовывать эту переменную отдельной процедуре-интерпретатору в качестве аргумента.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 12:06 
Аватара пользователя


30/05/09
121
Киев
Записать как строку это конечно можно:
...
var stroca : string;
...
stroca:='x'; // Путь всё очень просто и f(x)=x
...
result:= stroca; // Вот тут ОШИБКА. Думаю, что мешают ковычки, окружающие х.
....
Или я не совсем понял идею? Можете, по-подробнее. В delphi я любитель, что такое процедура - понимают, а вот процедура-интерпретатор... Никогда не слышал.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 12:36 
Заслуженный участник


11/05/08
32166
Alhimik в сообщении #236060 писал(а):
, а вот процедура-интерпретатор... Никогда не слышал.

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

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 13:06 
Аватара пользователя


31/10/08
1244
Да запросто используй процедурный/функциональный тип.

type Tfunc1R= function ( x : real) : real;

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 14:31 
Аватара пользователя


30/05/09
121
Киев
С процедурным типом не очень то и запросто:

program Console;

{$APPTYPE CONSOLE}

uses
SysUtils;

function Power(X, Y: Double): Double;
begin
Result := {$include function.txt};
end;

type
TFunc = function (X, Y: Double): Double;

var
F: TFunc;

begin
F := Power; // В переменную F заносится адрес функции Power
Writeln('2 power 4 = ', F(2, 4)); // Вызов Power посредством F
Writeln('Press Enter to exit...');
Readln;
end.

И никак. Все равно функция изменяется только при компиляции. А на счет инерпретатора, я нашел в и-нете много информации о SctiptControl. Но я так и ничего и не понял.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 17:16 
Заслуженный участник


15/05/09
1563
Alhimik в сообщении #236054 писал(а):
Как во время работы программы (уже скомпилированного файла .exe) изменить функциию?
Вы хотите добавить к существующей программе новую функциональную возможность? Или выбирать одну из заложенных при разработке (компиляции) программы?

Во втором случае наиболее подходящий инструмент - ООП, а именно - полиморфизм. Технически можно и иначе, но методически - наиболее корректный подход.

В первом случае возможны два варианта:

1) Добавление новой функции допускает компиляцию, однако не всей программы, а лишь нового текста; в этом случае используются DLL. В идеале это совмещается с использованием ООП.

2) Добавление новой функции требуется без компиляции. В этом случае возникает вопрос: каким способом "донести до компьютера" алгоритм, заложенный в новую функцию. Если без компиляции, то только интерпретором. Вы хотите описывать алгоритм на привычном Вам алгоритмическом языке? Тогда надо искать реализации интерпретатора этого языка. Нет интерпретатора? Тогда остается искать язык. :wink:

Но еще лучше - сформулировать задачу не "как это сделать", а "зачем это делать" (чего хочется достичь). После такой формулировки очень часто изменяется взгляд на "как это сделать", причем кардинально.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 17:21 
Заслуженный участник


15/05/05
3445
USA
Alhimik в сообщении #236054 писал(а):
Однако, сама функция изменяется только при компилировании. При работе с приложением .exe содержание текстового файла изменяется, но это изменение не доходит до программы. Что делать?
То, что Вы хотите получить, называется динамической компиляцией. Вам нужно в процессе выполнения ранее откомпилированной программы докомпилировать еще кусочек кода и вызвать его на исполнение.
В разных системах программирования это делается по-разному.
В Visual Basic это сделать сравнительно легко (функции Eval() и Ececute()).
В .NET есть пространства имен CodeDom.Compiler и Reflection, которые позволяют запустить компиляцию текстового файла с кодом, загрузить полученную сборку, найти адрес нужного метода и выполнить его.
На чистом C можно запустить компиляцию и построение библиотеки через командный процессор, загрузить библиотеку с помощью LoadLibrary(), найти адрес функции с помощью GetProcAddress() и выполнить ее.
Как это делается в Делфи я уже не помню - не польэуюсь уже лет 10. Но уверен, что есть что-то подобное.

В современных игровых программах такого рода вставляемые кусочки реализуются не на основном языке, а на более простом скриптовом, типа Lua.

Но...
Alhimik в сообщении #236060 писал(а):
Можете, по-подробнее. В delphi я любитель, что такое процедура - понимают, а вот процедура-интерпретатор... Никогда не слышал.
Alhimik в сообщении #236111 писал(а):
А на счет инерпретатора, я нашел в и-нете много информации о SctiptControl. Но я так и ничего и не понял.
В этом Ваша основная проблема. Но если Вы хотите это все реализовать самостоятельно, то Вам придется стать профессионалом.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 18:12 
Заслуженный участник


27/04/09
28128
Yuri Gendelman в сообщении #236158 писал(а):
В Visual Basic это сделать сравнительно легко (функции Eval() и Ececute())
Всё бы было хорошо, но... Нету там такого. Может, вы имели ввиду VBScript. Но во всех скриптовых языках такие функции есть

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 18:56 
Заслуженный участник


15/05/05
3445
USA
arseniiv в сообщении #236176 писал(а):
Yuri Gendelman в сообщении #236158 писал(а):
В Visual Basic это сделать сравнительно легко (функции Eval() и Ececute())
Всё бы было хорошо, но... Нету там такого. Может, вы имели ввиду VBScript. Но во всех скриптовых языках такие функции есть
Да, Вы правы.
В VB6 на форму кидался MS Script Control и вызывались его методы. Фактически внутри VB6 использовался скриптовый язык VBScript. В VB6 использовалось так много ActiveX, что грань между ними и собственно VB6 размывалась.
Кстати, наверное MS Script Control можно использовать и из Delphi.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 19:01 
Заслуженный участник


27/04/09
28128
Ага :) Но получается зависимость. А вот есть такой компонент для Дельфи: RemObjects Pascel Script - бесплатный и с исходным кодом (всё остальное зато у них платное). Но его тоже сначала надо поизучать, чтобы получалось гладко и без сбоев. Там а то много методов похожего названия. Но там есть демо, и всё получается нормально.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 19:40 
Заслуженный участник


15/05/05
3445
USA
arseniiv в сообщении #236183 писал(а):
Но получается зависимость.
MS Script Control с давних пор распространяется вместе с Windows.
IMHO программистам под Windows полезно знать VBScript или JScript. Ведь язык bat-файлов уж очень бедный.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение18.08.2009, 22:19 
Аватара пользователя


30/05/09
121
Киев
Всё! Нужно идти за пивом! Я так больше не вынесу! Я рыскал в и-нете на счет динамического компилирования в delphi, и нашел только о динамических библиотеках dll ! Я написал, подключил библиотеку в динамическом режиме и всё равно полнейшая лажа!
Вот так называется захотел разнообразить прогу по численному нахождению определённого интеграла чтобы пользователю предостаивть возможность задавать функцию (на языке delphi, естественно). И, труба! Редкостнейший дебилизм процветает.
Люди добрые, кто знает, как в delphi написать прогру, чтобы пользователь мог сам (в уже скомпилированном .exe файле) задавать функцию, а програ - просто выводить значение этой функции,
напишите пожалуйста, por favor, s'il vous plait, bitte , please этот грёбанный программный код!!!
Спасибо большое, muchas gracias, merci bocu, danke!, thank you!!!

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 12:47 
Заслуженный участник


27/04/09
28128
Если этот код писать сюда, страница уж очень сильно растянется. :wink: Попробуйте RemObjects PascalScript. Там и демонстрационные проекты есть. Компонент для Delphi, а язык сценариев, который он реализует, вида Pascal. И функции там можно писать, и чего угодно.

 Профиль  
                  
 
 Re: Delphi. Изменить функции во время выполнения
Сообщение19.08.2009, 13:28 
Аватара пользователя


30/05/09
121
Киев
RemObjects PascalScript for Delphi скачал, установил. Примеры нашел. Если бы еще спарвка была на русском было бы вообще жир. В и-нете не могу найти ни справки, ни вообще внятного учебника (руководства) по использованию этого компанента.
Может, у вас, arseniiv, есть какая-то инфа, желательно на русском?

Да, и вот еще, для тех, кто печётся о растянутости страницы и у кого есть текст программы для delphi, хоть в консоле, но чтобы пользователь мог ввести функцию f(x) с клавиатуры и точку x_0, а программа бы выдавала значение функции в точке f(x_0) - высылайте на мой e-mail!!!! Буду бесконечно благодарен.

e-mail: Serj_dBlanc@ukr.net

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 25 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group