добрый день!
возможно ли такое:
1) имеется исходник кода, необходимо чтобы при его открытии он сам компилировался (не нажимая F9) (ВАЖНО чтобы он проверял TPU файлы привазаные к нему!!!!).
2) если сохранить этот файл в exe то при его запуске он компилировался и запускался (ВАЖНО чтобы он проверял TPU файлы привазаные к нему!!!!).
И зачем это тебе, можно уточнить? Саму задачу озвучь, возможно она решается более стандартными средствами.
Потому как для решения того, что ты написал, надо как минимум знать, ЧЕМ будет открываться исходник... Вот я, например, открываю SciTE-ом, хоть занажимайся F9 - ничего не будет компилироваться. Хотя нажатие на другую клавишу (или выбор пункта меню) прекрасно компилирует/билдит программу...
в общем я написал программу для построения графиков. ввод ф-ии осуществляется непосредственно в исходнике, я хочу скрыть код программы, для этого я создал модуль usONE.pas в котором написал ф-ию в которой будет написана ф-ия, создал 2ой модуль usWTO.pas в котором скрыты основные процедуры и ф-ии, он будет откомпилирован паскалем в TPU файл, после чего исходник удалю, также осталась часть программы от Begin до end. в которой происходит вызов всех процедур и 2х модулей.
Планирую написать программу загрузчик которая выполняет: 1) маленькую программу для изменения ф-ии в usONE.pas пользователь вводит ф-ию в формат string после чего она как текстовый файл сохрананяется в usONE.pas 2) после чего программа загрузчик после завершения работы маленькой программы должна открывать программу которая, как раз, и должна компилироваться сама в начале (тем самым она обновляет usONE.pas в котором будет уже написана новая информация о ф-ии) желательно сама запускаться и строить график. тобишь
1) пользователь запускает файл
2) открывается прога 1 которая просит ввести ф-ию, после ввода записывает ф-ию в usONE.pas закрывается и запускает
3) прогу 2 которая читает TPU с веденой в него ф-ей, сама запускается и строит график
Не мучайся... Напиши парсер, который позволит вычислять значение функции, заданной строкой. То есть, пользователь вводит функцию в строку, и твой парсер вычисляет значение этой функции (что-то подобное на форуме выкладывалось, см. в поиске по ключевому слову "интерпретатор"). Тогда не понадобится ничего "скрывать", достаточно будет только TPU-файла, в котором будут необходимые средства для вычисления значения функции.
"Скрывать" - в кавычках. Потому, что это не сокрытие. Кому надо - все равно сломает, а себе ты наживешь проблемы.
я нашел интерпретатор http://pascal.sources.ru/parsing/swexpr.htm он находится в модуле, как подключить этот модуль то?
вот имеется строка и как ее прогнать через этот модуль то??
модуль стал нормально компилироваться
млин не пруха
пример не работает
вылазит ошибка Type mismatch на GetVariable:=GetX;
Ты сообщения мои вообще читаешь? Я же написал:
{$F+}
Function GetX(Code:LongInt):Real; { <--- Изменить }
begin
GetX:=X;
end;
{$F-}
млин я не могу понять пример, я понимаю только где происходит ввод ф-ии а где выводится значение ф-ии не могу понять.
вот скажем прога:
program Integrator;
uses swexpr;
var X,Y,Fxy:Real;
F,Code:String;
i,n:integer;
{$F+}
Function GetX(Code:longint):Real;
begin
GetX:=X;
end;
Function GetY(Code:longint):Real;
begin
GetY:=Y;
end;
{$F-}
begin
AddVariable('X',1);
GetVariable:=GetX;
AddVariable('Y',2);
GetVariable:=GetY;
repeat
Writeln('введите ф-ию с использованеим x и y '); {надо ввести к примеруF=x+y) }
Write('f(X,Y)=');
Readln(F);
if F='' then halt;
Code:=CompileExpression(F);
until not CompileError;
Fxy:=InterpreteExpression(Code);
end.
Please help!
Попробуй вот так:
{$F+}
Function GetXY(Code:LongInt):Real;
begin
Case Code of
1: GetXY := X;
2: GetXY := Y;
end;
end;
{$F-}
...
AddVariable('X',1);
AddVariable('Y',2);
GetVariable:=GetXY;
...
АААААААААААААААААААААААААААААААААААААААА
ААААААААААА
СПАСИБА!!
очень классно!!! все работает!!! не представляешь как помог!
Добавлено через 1 мин.
давай кошелек webmoney положу 50wmr
млин опять ничего не работает
короче у меня есть ф-ия "BBog_xy" в которую вводится значения x y и по сути она должна вставлять их в введеную ф-ию и выводить ответ
вот тут то и возникла проблема. к ней идет 100500 запросов а прогонять 100500 раз модуль не возможно.
как вот сделать чтобы скажем процедурка "TEST" для ввода ф-ии сохраняла результат из переменных x y (к примеру было введено "x+y" и она должна хранить этот результат !не в формате стринг!, без знания значений x y.
а ф-ия "BBog_xy" зная значения x y както обращалась к гдето хранившемся результате из процедурки "TEST" подставляла значения x y и выводила ответ.
ваще такое возможно?
Volvo я наверное тебя уже измучил со своими вопросами но все же хочу доделать начатое дело до конца.
матри,
вводим "x+y"
--------------------------------------------
procedure interpretator(st,var F) - она переводит введеную строку st (x+y) из string в F:=x+y; в переменные тобишь.
--------------------------------------------
procedure rez_xy(x,y) процедура должна вычислять значение ф-ии F:=x+y; НО. к ней будет 100500 обращений и нельзя ее прогонять через interpretator вот таким образом:
--------------------------------------------
procedure rez_xy(x,y)
(знаем x y)
interpretator(st, var F) (вычисляет значение ф-ии зная x y ,
те она подставляет сразу значения в выводимую ф-ию)
и вывод результата.
procedure interpretator(st,var F) (должна сохранить результат не численно а сохранить
расположение переменных, те она должна хранить что она должна приплюсовать x и y)
далее
procedure rez_xy(x,y)
она должна как то обращаться к F которая хранит результат приплюсовывания
и соответственно щас должна сложить x y численно.
вывод результата.
М | Постарайся не делать слишком длинных строк внутри тегов CODE. Читать трудно. Lapp |
2 вариант я уже сделал, но это не удобно очень
несколько биллионов запросов
interpretator(st, var F), то почему там МОЖНО вызывать
rez_xy(x,y)? Чего ты мудришь? Приводи полную программу, чего у тебя там творится, а не морочь мозги ни себе ни другим. Я например не вижу причин, по которым второй вариант, предложенный Lapp-ом будет работать быстрее, чем тот модуль, который сейчас есть у тебя. Попробуй меня переубедить...
задача надо ввести ф-ию и построить ее график, ф-ию нельзя вводить в коде программы тк требуется получить exe-шник в котором не изменить код.
программа для построяние графиков я сделал но ф-ию у меня сейчас можно ввести только в коде.
я кажется не понял про 2ой вариант. я вот так его представляю мб я не прав.
2ой вариант:
создаю файл function.pas кидаю его в папку TPU, код function.pas:
{$N+}
Unit function;
{===}interface
function BBog_xy(x:real;y:real):real;
{===}implementation
function BBog_xy(x:real;y:real):real;
begin
{F1}BBog_xy:=x+y;{F2}
end.
{$N+}
Unit function;
{===}interface
function BBog_xy(x:real;y:real):real;
{===}implementation
function BBog_xy(x:real;y:real):real;
begin
{F1}BBog_xy:=x*y;{F2}
end.
profram graphiki;
uses function,graph;
begin
x:=-100;
y:=-100;
repeat
if abs(function BBog_xy(x;y))<0.001 then putpixel(x,y);
until x>1000;
end;
TPU создается только как промежуточный этап компиляции. В конце концов он включается в exe. Поэтому, для того, чтобы изменения в файле function.pas вступили в силу, необходимо откомпилировать программу заново.
Как вариант, попробуй вызывать компилятор в режиме командной строки (без запуска IDE). Сделать это можно внутри программы для ввода графика функции или создать bat-файл в котором будут прописаны необходимые команды:
Вот, об этом я и говорил! сейчас попробую это сделать
работает если изменить "c:\tp7\turbo.exe -b start.PAS > nul" на "c:\tp7\turbo.exe start.PAS > nul" можно как то еще сделать чтобы исходник запускался сам??
алгоритм в ручную
1) открываю блокнотом C:\tp7\TPU\usesone.PAS ввожу нужную ф-ию, сохраняю.
2) удаляю C:\tp7\TPU\usesone.tpu
3) Запускаю C:\tp7\START.PAS
4) компилирую, нажимая F9
5) запускаю через ctrl+F9
6)наслаждаюсь работой программы
прикрепил папку с паскалем и всеми необходимыми файлами иам еще редми есть "что для чего.txt" там еще раз описал все. ссылка на скачивание архива 991кб http://webfile.ru/2589888
ПОМОГИТЕ оптимизировать все запуском одного bat файла !!!!
А зачем ты из батника все команды вырезал?
C:\tp\bin\tpc.exe -b gr.pas > nul - компилирует программу. Тут не к turbo.exe нужно путь писать, а именно к компилятору (tpc.exe). Модификатор -b нужен для автоматической компиляции модулей.
Если у тебя нет пока программы для правки модуля с твоей функцией и ты предпочитаешь делать это вручную, используй вот этот батник:
Георгий, вот скажи честно, тебе нравится такая организация программы? А вот теперь смотри сюда: берем из аттача TPU-файл, занимающийся вычислением произвольной функции, и компилируем с его помощью программу:
uses parser;Заметь, ты можешь не имея никаких исходников этого модуля (я исходники тебе пока не покажу, они еще слишком сырые) поменять функцию, перекомпилировать и запустить программу, можешь переделать ввод, и ввести значение функции, тогда вообще все будет выполняться в рантайме. Можешь добавить в функцию переменных (до 26, все буквы латинского алфавита от A до Z, только прописные, а не строчные; строчные зарезервированы для функций). Правда пока доступны только арифметические операции (+ - * /), но добавить мат. функции, имея на руках модуль, корректно работающий с арифметикой - дело пары часов максимум. И не надо никаких тебе извращений с корректировкой исходного текста, и тому подобными вещами... Насколько ты видишь из приведенного кода, сначала функция готовится, а потом, при вызове eval, вычисляется, причем вычисляется она очень быстро...
const
s1: string = '2.75*(3+4*X)*5';
s2: string = '2.75*(3+4*X)*5-4*Y';
var ls: tlist;
begin
setFunction(s1, ls);
setVariable('X', 3);
writeln('result = ', eval(ls):8:3);
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
setFunction(s2, ls);
setVariable('X', 3);
setVariable('Y', 7);
writeln('result = ', eval(ls):8:3);
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
end.
Archon, я так понял что
@echo off
не выводит исполняемые команды на экран
c:\tp7\tpc.exe -b start.pas > nul
должен компилировать файл start.pas с новым модулем, + создавать c:\tp7\tpu\start.exe (у меня в этой директории создаются exe) но exe файл не создаются + должен после компиляции создаваться файл c:\tp7\tpu\usesone.tpu но он тоже не создается. вывод: компиляции не происходит?
del c:\tp7\tpu\usesone.tpu
после создания выше он должен удалиться (тк он не создался -> понятно почему вылезает ошибка: "нет файла")
start.exe
должен запускаться скомпилированный exe с новой ф-ей но также понятно почему вылазит ошибка тк его нет нигде
мб что то не так у меня? мб паскаль корявый или команды все же не правильные?
Volvo, я пока на счет твоего варианта не могу никак въехать мозга видимо не хватает у меня, я еще посижу подумаю мб догадаюсь и отпишу как это произойдет. мне сейчас хоть как бы сделать
Добавлено через 10 мин.
volvo,
я вот как я понял:
const
s1: string = '2.75*(3+4*X)*5';
s2: string = '2.75*(3+4*X)*5-4*Y';
очевидно для меня что это ф-ии которые надо построить, но почему их две??
var ls: tlist;
tlist это ты наверное в парсере обозначил формат типа ззаписи я предполагаю
begin
setFunction(s1, ls);
это наверное ввод ф-ии
setVariable('X', 3);
это наврное ввод в ф-ию x
writeln('result = ', eval(ls):8:3);
это вывод ответа
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
это снова в качестве примера наверное показываешь что можно обращаться с какими угодно переменными потом (кстате вот это и нужно мне было! )
setFunction(s2, ls);
setVariable('X', 3);
setVariable('Y', 7);
это наврное ввод-фии с несколькими переменными , и соответственно ввод x y
writeln('result = ', eval(ls):8:3);
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
это походу пример что так можно и тут, только где setVariable('Y', 5); ммм а почему не совпадают числа после x? там 3,5,3,7,5 ?
setFunction(s2, ls);я вычисляю функцию f(X, Y) = 2.75*(3+4*X)*5-4*Y при X = 3, Y = 7, а вот тут:
setVariable('X', 3);
setVariable('Y', 7);
writeln('result = ', eval(ls):8:3);
setVariable('X', 5);эта же функция вычисляется при X = 5, Y = 7 (значение Y не поменялось с прошлого вызова setVariable('Y', 7), оно по прежнему равно 7). setVariable же просто задает значение переменной...
writeln('result = ', eval(ls):8:3);
Фигасе! скачал другой паскаль и стало компилироваться и создаваться еxе!
все работает!!!
Volvo, сделал программу, но опять косяк, не могу понять почему такая глупая ошибка получается
суть в следующем:
через прогу у меня запускаются 1 из 3х паскалевских проги.
1) run.bat долженкомпилировать и запускать прогу START.EXE
@echo off
TPC.exe -B -U.. start.pas > nul
del usesone.tpu
start.exe
@echo off
TPC.exe -B -U.. starttwo.pas > nul
del usesone.tpu
starttwo.exe
@echo off
TPC.exe -B -U.. startpol.pas > nul
del usesone.tpu
startpol.exe
мне хотелось бы чтобы ф-ию можно было вводить в делфи, те придется переделать весь код программы под делфи? (когда я начинал писать программу я еще не знал делфи.)
1200строк переделать в код под делфи с учетом того что с графикой в делфи я не работал еще вообще ни разу. как думаешь у меня получится?
или всетаки проще разобраться почему батник не работает?
слушай вот он компилируется, раз уж начал делать коряво надо бы и закончить коряво, просто переделывать все нормально... "игра не стоит свеч"
тогда как запустить ексешный файл через делфи*?
volvo, можешь подсказать похожие ф-ии в делфи
паскаль делфи
cleardevice; ?
ch:=readkey; ?
if ch=char(пробел, ентер, ) then ?
я то могу попробывать переделать просто это будет столько вопросов, кстате на счет корявого ты не прав, код сделан достаточно четко, чтобы проц как можно меньше грузить при вычислении, скажем у меня есть case of: на 300 строк тк алгорит построения сложный. при построении графика ф-ии программа не прочесывает все область значений а ищет значения в маленькой окрестности где график существует и выстраивает цыпочки графика.
как очистить экран?
не помогает form1.Canvas.FillRect(Rect);
PatBlt(Form1.Canvas.Handle, 0, 0,
Form1.ClientWidth, Form1.ClientHeight, PATCOPY);
а что на счет readkey??
у меня в паскале был цикл:
repeat
ch:=readkey;
if ch=char(13) then .....
if ch=char(8) then .....
if ch=(' ') then .....
until ch=char(27);
ок! кстате прогу я перенес с паскаля на делфи, только вот с рефдкей не выходит )))) а так все вроде красиво сам в шоке я тогда отпишу позже на счет ввода ф-ии, когда до ума доведу перенос.
ну вот, я сделал прогу, теперь самое главное осталось необходимо организовать ввод ф-ии с формы edit. Volvo ты говорил что у тебя есть tpu который поможет мне.
ф-ии:
{$N+}
Unit usesa;
{-------------------------------}
interface
function pow(a:extended; n:extended):real;
function ctg(x:real):real;
function tg(x:real):real;
function arcctg(x:real):real;
function arctg(x:real):real;
function arccos(x:real):real;
function arcsin(x:real):real;
function fln(x:real):real;
{-------------------------------}
implementation
function fln(x:real):real;
begin
if x>0 then fln:=ln(x) else fln:=987654321;
end;
function arcsin(x:real):real;
begin
if ((x>-1)and(x<1))then arcsin:=arctan(x/sqrt(1-x*x));
if x<-1 then arcsin:=987654321;
if x>1 then arcsin:=987654321;
if x=0 then arcsin:=arctan(0);
if abs(x)=1 then arcsin:=pi/2;
end;
function arccos(x:real):real;
begin
if x=0 then arccos:=pi/2 else
if ((x>-1)and(x<1)and(x<0))then arccos:=arctan(sqrt(1-x*x)/x)+pi else
if ((x>-1)and(x<1)and(x>=0))then arccos:=arctan(sqrt(1-x*x)/x) else
if x<-1 then arccos:=987654321 else
if x>1 then arccos:=987654321;
end;
function arctg(x:real):real;
begin
arctg:=arctan(x);
end;
function arcctg(x:real):real;
begin
arcctg:=pi/2-arctan(x);
end;
function tg(x:real):real;
begin
tg:=sin(x)/cos(x);
end;
function ctg(x:real):real;
begin
ctg:=cos(x)/sin(x);
end;
function pow(a:extended; n:extended):real;
begin
{a^n} if ((n>=0)and(a>=0)) then pow:=exp(fln(a)*n);
{a^-n} if ((n<0)and(a>0)) then pow:=1/exp(fln(a)*abs(n));
{-a^n ;n-4et} if ((n>=0)and(a<0)and( frac(n/2)=0 )) then pow:=exp(fln(abs(a))*n);
{-a^n ;n-He 4et} if ((n>=0)and(a<0)and( frac(n/2)<>0 )) then pow:=-exp(fln(abs(a))*n);
{-a^-n ;n-4et} if ((n<0)and(a<=0)and( frac(n/2)=0 )) then pow:=1/exp(fln(abs(a))*abs(n));
{-a^-n ;n-4et} if ((n<0)and(a<=0)and( frac(n/2)<>0 )) then pow:=-1/exp(fln(abs(a))*abs(n));
end;
begin
end .
Volvo, пожалуйста помоги! я вот переделал программу под делфи, щас вот нужно как то ввод ф-ии сделать.
http://webfile.ru/2619710
Volvo, я все-таки сделал программу, и интерпретатор написал, даже успел 2е место на конференции занять
вот цени: http://depositfiles.com/ru/files/g7vzn0v93
252 Free Penny Auction Bids
You can get 252 bids for Zeekler penny auction and all you have to do is to register under the link ukr.zeekler.com/splash/. Just copy the complete link and paste it into address bar; if you don't use the complete link, you'll receive only 25 bids.
Zeekler is one of the best penny auction sites providing the opportunity to win not only brand new stuff, but also cash and other rewards. Using Zeekler you can purchase different goods with a discount from 50% to 95% of the actual price.
252 bids, which is an equivalent of 150$, is a good opportunity to win jewelry, photo cameras, mp3 players, cash and other stuff.
Don't miss an opportunity to play at the Zeekler penny auction site free of charge, since the quantity of registration is limited.