процедура должна вычислять значение ф-ии F:=x+y; НО. к ней будет 100500 обращений и нельзя ее прогонять через interpretator вот таким образом:
Может, я чего-то не понимаю, но если здесь НЕЛЬЗЯ вызывать функцию вот так:
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.
перед запуском основной программы построения графиков я запускаю программу для ввода грфика ф-ии
ее задача открыть файл function.pas и изменить строку "{F1}BBog_xy:=x+y;{F2}" на ту что введет пользователь скажем пользователь ввел x*y код 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.
после чего я запускаю программу построения графиков общий вид кода которой:
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;
впринцыпе все работает НО перед запуском программы построения графиов необходимо нажать F9 тобишь откомпилировать ее и после чего запусть на ctrl+F9 иначе она будет работать со старым не измененным TPU. дак вот как то можно сделать чтобы автоматически при окрытии кода программы он автоматически компилировался и запускался после этого????
или предложите мне другой варинт для решения этой задачи пожалуйста!
TPU создается только как промежуточный этап компиляции. В конце концов он включается в exe. Поэтому, для того, чтобы изменения в файле function.pas вступили в силу, необходимо откомпилировать программу заново. Как вариант, попробуй вызывать компилятор в режиме командной строки (без запуска IDE). Сделать это можно внутри программы для ввода графика функции или создать bat-файл в котором будут прописаны необходимые команды:
Код
@echo off chfunc.exe c:\tp\bin\tpc.exe -b gr.pas > nul del func.tpu gr.exe
Для использования, создай дирректорию, кинь туда исходник программы (gr.pas), исходник модуля с функцией (func.pas), exe-шник программы для ввода функции (chfunc.exe) и этот 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/2589899
ПОМОГИТЕ оптимизировать все запуском одного bat файла !!!!
C:\tp\bin\tpc.exe -b gr.pas > nul - компилирует программу. Тут не к turbo.exe нужно путь писать, а именно к компилятору (tpc.exe). Модификатор -b нужен для автоматической компиляции модулей.
Если у тебя нет пока программы для правки модуля с твоей функцией и ты предпочитаешь делать это вручную, используй вот этот батник:
Код
@echo off c:\tp7\tpc.exe -b start.pas > nul del usesone.tpu start.exe
PS Кстати, Turbo Pascal у тебя какой-то порезанный.
PPS Как тебе уже намекал Volvo, этот способ довольно корявый и, кстати, противоречит заданию. Поэтому лучше разберись с той библиотекой, тем более, что помощь в этом тебе уже предлагали.
Георгий, вот скажи честно, тебе нравится такая организация программы? А вот теперь смотри сюда: берем из аттача TPU-файл, занимающийся вычислением произвольной функции, и компилируем с его помощью программу:
Заметь, ты можешь не имея никаких исходников этого модуля (я исходники тебе пока не покажу, они еще слишком сырые) поменять функцию, перекомпилировать и запустить программу, можешь переделать ввод, и ввести значение функции, тогда вообще все будет выполняться в рантайме. Можешь добавить в функцию переменных (до 26, все буквы латинского алфавита от A до Z, только прописные, а не строчные; строчные зарезервированы для функций). Правда пока доступны только арифметические операции (+ - * /), но добавить мат. функции, имея на руках модуль, корректно работающий с арифметикой - дело пары часов максимум. И не надо никаких тебе извращений с корректировкой исходного текста, и тому подобными вещами... Насколько ты видишь из приведенного кода, сначала функция готовится, а потом, при вызове eval, вычисляется, причем вычисляется она очень быстро...
Итак, что выбираешь? Продолжать свою эпопею с TPC, или сделать нормальную программу?
Кстати, если выберешь путь, предложенный мной - тему надо будет перенести в Задачи, она по-моему уже сейчас вышла за пределы Теории...
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 ?
очевидно для меня что это ф-ии которые надо построить, но почему их две??
А для теста. Сначала обработал одну, потом поменял функцию на другую, обработал другую...
Цитата
setVariable('X', 5); writeln('result = ', eval(ls):8:3); это снова в качестве примера наверное показываешь что можно обращаться с какими угодно переменными потом
Угу... Вот именно для этого я и написал этот модуль. В этом-то вся и суть: ты скрываешь детали реализации. Все, что надо знать для вычисления функции - это собственно сама функция, и значения переменных... Менять переменные можешь любым образом, хоть в цикле, хоть подставляя вручную - программе без разницы, как ты это делаешь...
Цитата
это походу пример что так можно и тут, только где setVariable('Y', 5); ммм а почему не совпадают числа после x?
эта же функция вычисляется при X = 5, Y = 7 (значение Y не поменялось с прошлого вызова setVariable('Y', 7), оно по прежнему равно 7). setVariable же просто задает значение переменной...
Volvo, сделал программу, но опять косяк, не могу понять почему такая глупая ошибка получается суть в следующем: через прогу у меня запускаются 1 из 3х паскалевских проги. 1) run.bat долженкомпилировать и запускать прогу START.EXE
@echo off TPC.exe -B -U.. start.pas > nul del usesone.tpu start.exe
2) runtwo.bat долженкомпилировать и запускать прогу STARTTWO.EXE
@echo off TPC.exe -B -U.. starttwo.pas > nul del usesone.tpu starttwo.exe
3) runpol.bat долженкомпилировать и запускать прогу STARTPOL.EXE
@echo off TPC.exe -B -U.. startpol.pas > nul del usesone.tpu startpol.exe
1 и 2ой запускаются, а 3ий у меня дома работает а на др компах, при запуске, открывается батник, компилирует все нормально но не открывает скомпилированный эксешник. вот ссылка на прогу http://depositfiles.com/files/jxao0uzds да чтобы проверить 3 файл надо поставить галочку "параметрический вид" и нажать "построить график" ПОЖАЛУЙСТА ПОМОГИ!
сделал программу, но опять косяк, не могу понять почему такая глупая ошибка получается
А я тебе говорил, что не надо пользоваться бредовым алгоритмом... Ты опять за свое... Пойми раз и навсегда: чем больше файлов содержит проект - тем больше вероятности, что он не заработает... А ты вместо того, чтобы вкомпилировать все в один файл (с использованием того модуля, пусть и доработанного, что я предложил тебе выше), и ЗАБЫТЬ раз и навсегда о том, что надо делать какие-то BATники, таскать за собой компилятор, устанавливать это все мало того что на диск C: (еще не давая пользователю изменить путь к установке), так еще и в его корень (!!!) А я не работаю под Админским аккаунтом. Результат:
Итог - такая программа дальше мусорки не проходит... Хочешь - помогу добавить в свой модуль ту функциональность, которая нужна тебе, и доработать твою программу, чтобы она делала абсолютно то же самое, что делает сейчас, но не сбоила, и работала одинаково ВЕЗДЕ. Но для этого мне надо 1) знать, какие именно функции ты будешь обрабатывать и 2) мне нужен полный исходник твоей программы... Не хочешь выкладывать в общий доступ - есть контактная информация в профиле... Больше ничем помочь не могу...
мне хотелось бы чтобы ф-ию можно было вводить в делфи, те придется переделать весь код программы под делфи? (когда я начинал писать программу я еще не знал делфи.) 1200строк переделать в код под делфи с учетом того что с графикой в делфи я не работал еще вообще ни разу. как думаешь у меня получится? или всетаки проще разобраться почему батник не работает? слушай вот он компилируется, раз уж начал делать коряво надо бы и закончить коряво, просто переделывать все нормально... "игра не стоит свеч" тогда как запустить ексешный файл через делфи*?
Уточняю: 1200 строк корявого кода перенести в Дельфи... А может, НЕкорявого будет в 2-3 раза меньше, как ты думаешь?
Цитата
как думаешь у меня получится?
Я не телепат... Твой код не видел, как он написан - не знаю, как его можно упростить/сделать более эффективным - тоже не имею понятия...
Цитата
раз уж начал делать коряво надо бы и закончить коряво, просто переделывать все нормально... "игра не стоит свеч"
До свидания... Это не для меня... Делай дальше эту корявую "поделку" сам, у меня больше нет никакого желания заходить в этот топик и помогать тебе на "сдать и забыть", а не "научиться делать правильно". Удачи...
я то могу попробывать переделать просто это будет столько вопросов, кстате на счет корявого ты не прав, код сделан достаточно четко, чтобы проц как можно меньше грузить при вычислении, скажем у меня есть case of: на 300 строк тк алгорит построения сложный. при построении графика ф-ии программа не прочесывает все область значений а ищет значения в маленькой окрестности где график существует и выстраивает цыпочки графика.
А вот это уже твоя проблема... Ты исходники засекретил, ЧТО и КАК у тебя делается - знаешь только ты, советовать ничего не буду, скажешь одно, получится, что надо было совершенно другое... Думай сам...
Добавлено через 3 мин. В общем, так... Чтобы не спрашивать, "а как сделать 2+3, а как с циклами", и т.д., почитай что-нибудь про язык программирования Дельфи. А потом будешь задавать вопросы, что останется непонятным... Нельзя вот так просто Copy+Paste-ом перенести программу с одной платформы (DOS) на другую (Windows)... Где-нибудь да нарвешься на неприятности... Так что сначала разберись, что такое событийное программирование (это про Дельфи), и как оно работает, а потом - продолжим...