Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ компиляция Exe-шника

Автор: Георгий 8.01.2009 15:02

добрый день!
возможно ли такое:
1) имеется исходник кода, необходимо чтобы при его открытии он сам компилировался (не нажимая F9) (ВАЖНО чтобы он проверял TPU файлы привазаные к нему!!!!).
2) если сохранить этот файл в exe то при его запуске он компилировался и запускался (ВАЖНО чтобы он проверял TPU файлы привазаные к нему!!!!).


blink.gif

Автор: volvo 8.01.2009 15:24

И зачем это тебе, можно уточнить? Саму задачу озвучь, возможно она решается более стандартными средствами.

Потому как для решения того, что ты написал, надо как минимум знать, ЧЕМ будет открываться исходник... Вот я, например, открываю SciTE-ом, хоть занажимайся F9 - ничего не будет компилироваться. Хотя нажатие на другую клавишу (или выбор пункта меню) прекрасно компилирует/билдит программу...

Автор: Георгий 8.01.2009 16:12

в общем я написал программу для построения графиков. ввод ф-ии осуществляется непосредственно в исходнике, я хочу скрыть код программы, для этого я создал модуль 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 с веденой в него ф-ей, сама запускается и строит график

Автор: volvo 8.01.2009 16:33

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

"Скрывать" - в кавычках. Потому, что это не сокрытие. Кому надо - все равно сломает, а себе ты наживешь проблемы.

Автор: Георгий 8.01.2009 16:57

я нашел интерпретатор http://pascal.sources.ru/parsing/swexpr.htm он находится в модуле, как подключить этот модуль то?
вот имеется строка и как ее прогнать через этот модуль то??

Автор: volvo 8.01.2009 17:22

Цитата
мб есть OBJECTS.TPU?
Есть. По крайней мере, должен быть, в папке TP\UNITS. Если у тебя появляется такая ошибка, значит, версия компилятора, на которой создан этот самый Objects.TPU, не совпадает с той версией, которая используется тобой для компиляции проекта (как пример - файл OBJECTS.TPU из пакета TP7 и использование TP6 для компиляции программы выдаст тебе именно такую ошибку).

Проверил программу по ссылке. За исключением того, что Integer надо заменить на LongInt, у компилятора (TP 7.0) больше нет никаких претензий. Скачай себе нормальный дистрибутив Паскаля, установи, и у тебя ошибка тоже пропадет...

Цитата
вот имеется строка и как ее прогнать через этот модуль то??
Там есть пример использования - программа INT.PAS

Автор: Георгий 8.01.2009 17:32

модуль стал нормально компилироваться

млин не пруха mad.gif
пример не работает

вылазит ошибка Type mismatch на GetVariable:=GetX;

Автор: volvo 8.01.2009 17:42

Ты сообщения мои вообще читаешь? Я же написал:

Цитата
За исключением того, что Integer надо заменить на LongInt
, ну так замени:

{$F+}
Function GetX(Code:LongInt):Real; { <--- Изменить }
begin
GetX:=X;
end;
{$F-}

Автор: Георгий 8.01.2009 18:17

млин я не могу понять пример, я понимаю только где происходит ввод ф-ии а где выводится значение ф-ии не могу понять.
вот скажем прога:



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 '); {надо ввести к примеруsad.gifF=x+y) }
Write('f(X,Y)=');
Readln(F);
if F='' then halt;
Code:=CompileExpression(F);
until not CompileError;



Fxy:=InterpreteExpression(Code);

end.



так шоли?
чтобы ввести x и y надо:

AddVariable('X',1);
GetVariable:=GetX;

AddVariable('Y',2);
GetVariable:=GetY;

при таком раскладе он читает только y ((( тобишь считает x за y

что нужно исправить чтобы он читал и x и y ??

Автор: Георгий 8.01.2009 19:04

Please help!

Автор: volvo 8.01.2009 21:01

Попробуй вот так:

{$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;
...

Автор: Георгий 8.01.2009 21:08

АААААААААААААААААААААААААААААААААААААААА
ААААААААААА give_rose.gif give_rose.gif give_rose.gif give_rose.gif give_rose.gif give_rose.gif give_rose.gif
СПАСИБА!! yes2.gif good.gif
очень классно!!! все работает!!! не представляешь как помог!

Добавлено через 1 мин.
давай кошелек webmoney положу 50wmr smile.gif

Автор: Георгий 9.01.2009 1:08

млин опять ничего не работает mega_chok.gif

короче у меня есть ф-ия "BBog_xy" в которую вводится значения x y и по сути она должна вставлять их в введеную ф-ию и выводить ответ
вот тут то и возникла проблема. к ней идет 100500 запросов а прогонять 100500 раз модуль не возможно.

как вот сделать чтобы скажем процедурка "TEST" для ввода ф-ии сохраняла результат из переменных x y (к примеру было введено "x+y" и она должна хранить этот результат !не в формате стринг!, без знания значений x y.
а ф-ия "BBog_xy" зная значения x y както обращалась к гдето хранившемся результате из процедурки "TEST" подставляла значения x y и выводила ответ.

ваще такое возможно?

Автор: volvo 9.01.2009 1:57

Цитата
процедурка "TEST" для ввода ф-ии сохраняла результат из переменных x y (к примеру было введено "x+y" и она должна хранить этот результат !не в формате стринг!, без знания значений x y.
а ф-ия "BBog_xy" зная значения x y както обращалась к гдето хранившемся результате из процедурки "TEST" подставляла значения x y и выводила ответ.
Ты для себя-то реши, в каком формате и что ты хочешь хранить, а то получается "пойди туда, не знаю куда, принеси то, не знаю что..." (С)

Задачу формализуй: что за функция, где и что известно, к чему доступ должен быть, к чему - нет, КАК ВЫЗЫВАЕТСЯ вычисление значения функции с тем или иным параметром... И чем не устраивает то решение, которое озвучено выше?

Навскидку могу дополнительно предложить введенную функцию опять же парсить, загонять в дерево: узлы - операции, или операнды, над которыми эти операции должны выполняться, (или перегонять в ОПЗ - обратную польскую запись, и хранить в виде списка, но тут будет засада с тем, что ты замучаешься реализовывать И вычисления простых арифметических операций, и вычисления функций от одного/двух/трех аргументов) но там, где будут потом подставляться значения аргументов - хранить указатель на какой-то элемент массива аргументов... А потом, при вычислении функции, передавать параметром в функцию вычисления сам массив аргументов. Предупреждаю сразу: в итоге все равно сведется к тому, что и было уже найдено тобой, только ты реализуешь этот велосипед сам. А потом поймешь, что НЕЛЬЗЯ вычислять что-то, что-то вводя, но ничего об этом не зная, в каких-то точках... Я понятно объяснил?

Есть несколько готовых классов-парсеров (ООП, естественно), но пока не будет уточнения о том, какие могут быть функции, и что на каком этапе тебе известно, а что надо скрыть, и что когда вычисляется - ссылок не будет.

Автор: Георгий 9.01.2009 19:55

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


Автор: Lapp 10.01.2009 7:45

Цитата(Георгий @ 9.01.2009 15:55) *
дак както вот так можно сделать?
Все можно, вопрос нужно ли..

Как я понял, тебя волнует скорость выполнения. Ускорить можно, например..

1. Скомпилировав исходную строку в некий "код", выполнение которого будет проходить быстрее. Желательно его, кстати, делать в польской нотации, которую практически не нужно разбирать (на этом сэкономить время). Это примерно то, что ты сам предлагаешь (запомнить - значит скомпилировать этот код).

2. Можно генерировать код на Паскале (или другом языке такого же уровня) и записывать в файл. Затем этот файл компилировать (разумеется, из программы) и запускать (тоже в программе). Способ довольно реальный, но требует тащить за собой компилятор.

3. Генерить машинный код (иначе говоря, ехе-шник) и запускать. Тоже выполнимая задача. Свистеть будет пулей!

"Главное в нашем деле - вовремя остановиться" (С)

Автор: Георгий 10.01.2009 14:14

2 вариант я уже сделал, но это не удобно очень

Автор: Lapp 10.01.2009 14:21

Цитата(Георгий @ 10.01.2009 10:14) *
2 вариант я уже сделал, но это не удобно очень
Чем именно? Я вижу только одно "неудобство": время компиляции само по себе очень немалое, так что выигрыш будет ощущаться только на ОООЧЕНЬ больших расчетах.

Автор: Георгий 10.01.2009 16:01

несколько биллионов запросов

Автор: Lapp 10.01.2009 16:06

Цитата(Георгий @ 10.01.2009 12:01) *
несколько биллионов запросов
Тогда в чем слстоит упомянутое неудобство?

Автор: volvo 10.01.2009 16:51

Цитата(Георгий @ 9.01.2009 14:55) *
процедура должна вычислять значение ф-ии F:=x+y; НО. к ней будет 100500 обращений и нельзя ее прогонять через interpretator вот таким образом:
Может, я чего-то не понимаю, но если здесь НЕЛЬЗЯ вызывать функцию вот так:
interpretator(st, var F)
, то почему там МОЖНО вызывать
rez_xy(x,y)
? Чего ты мудришь? Приводи полную программу, чего у тебя там творится, а не морочь мозги ни себе ни другим. Я например не вижу причин, по которым второй вариант, предложенный Lapp-ом будет работать быстрее, чем тот модуль, который сейчас есть у тебя. Попробуй меня переубедить...

Автор: Георгий 27.01.2009 21:59

задача надо ввести ф-ию и построить ее график, ф-ию нельзя вводить в коде программы тк требуется получить 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.
дак вот как то можно сделать чтобы автоматически при окрытии кода программы он автоматически компилировался и запускался после этого????


или предложите мне другой варинт для решения этой задачи пожалуйста! give_rose.gif

Автор: Archon 27.01.2009 23:13

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-ник. Только укажи в нем свой путь к компилятору.

Автор: Георгий 27.01.2009 23:59

Вот, об этом я и говорил! сейчас попробую это сделать

Автор: Георгий 28.01.2009 0:48

работает если изменить "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 файла !!!!

Автор: Archon 28.01.2009 4:49

А зачем ты из батника все команды вырезал?

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, этот способ довольно корявый и, кстати, противоречит заданию. Поэтому лучше разберись с той библиотекой, тем более, что помощь в этом тебе уже предлагали.

Автор: volvo 28.01.2009 5:56

Георгий, вот скажи честно, тебе нравится такая организация программы? А вот теперь смотри сюда: берем из аттача TPU-файл, занимающийся вычислением произвольной функции, и компилируем с его помощью программу:

uses  parser;

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.
Заметь, ты можешь не имея никаких исходников этого модуля (я исходники тебе пока не покажу, они еще слишком сырые) поменять функцию, перекомпилировать и запустить программу, можешь переделать ввод, и ввести значение функции, тогда вообще все будет выполняться в рантайме. Можешь добавить в функцию переменных (до 26, все буквы латинского алфавита от A до Z, только прописные, а не строчные; строчные зарезервированы для функций). Правда пока доступны только арифметические операции (+ - * /), но добавить мат. функции, имея на руках модуль, корректно работающий с арифметикой - дело пары часов максимум. И не надо никаких тебе извращений с корректировкой исходного текста, и тому подобными вещами... Насколько ты видишь из приведенного кода, сначала функция готовится, а потом, при вызове eval, вычисляется, причем вычисляется она очень быстро...

Итак, что выбираешь? Продолжать свою эпопею с TPC, или сделать нормальную программу?

Кстати, если выберешь путь, предложенный мной - тему надо будет перенести в Задачи, она по-моему уже сейчас вышла за пределы Теории...


Прикрепленные файлы
Прикрепленный файл  PARSER.zip ( 2.16 килобайт ) Кол-во скачиваний: 278

Автор: Георгий 28.01.2009 13:21

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, я пока на счет твоего варианта не могу никак въехать unsure.gif мозга видимо не хватает у меня, я еще посижу подумаю мб догадаюсь и отпишу как это произойдет. мне сейчас хоть как бы сделать

Добавлено через 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 это ты наверное в парсере обозначил формат типа ззаписи smile.gif я предполагаю

begin
setFunction(s1, ls);

это наверное ввод ф-ии

setVariable('X', 3);
это наврное ввод в ф-ию x

writeln('result = ', eval(ls):8:3);
это вывод ответа

setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
это снова в качестве примера наверное показываешь что можно обращаться с какими угодно переменными потом (кстате вот это и нужно мне было! good.gif )

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 ?

Автор: volvo 28.01.2009 14:32

Цитата
очевидно для меня что это ф-ии которые надо построить, но почему их две??
А для теста. Сначала обработал одну, потом поменял функцию на другую, обработал другую...
Цитата
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
это снова в качестве примера наверное показываешь что можно обращаться с какими угодно переменными потом
Угу... Вот именно для этого я и написал этот модуль. В этом-то вся и суть: ты скрываешь детали реализации. Все, что надо знать для вычисления функции - это собственно сама функция, и значения переменных... Менять переменные можешь любым образом, хоть в цикле, хоть подставляя вручную - программе без разницы, как ты это делаешь...

Цитата
это походу пример что так можно и тут, только где setVariable('Y', 5); ммм а почему не совпадают числа после x?
А почему они должны совпадать? Вот тут:
setFunction(s2, ls);
setVariable('X', 3);
setVariable('Y', 7);
writeln('result = ', eval(ls):8:3);
я вычисляю функцию f(X, Y) = 2.75*(3+4*X)*5-4*Y при X = 3, Y = 7, а вот тут:
setVariable('X', 5);
writeln('result = ', eval(ls):8:3);
эта же функция вычисляется при X = 5, Y = 7 (значение Y не поменялось с прошлого вызова setVariable('Y', 7), оно по прежнему равно 7). setVariable же просто задает значение переменной...

Тему все-таки переношу в Задачи.

Автор: Георгий 28.01.2009 17:21

blink.gif blink.gif blink.gif
Фигасе! скачал другой паскаль и стало компилироваться и создаваться еxе!
все работает!!! good.gif good.gif good.gif good.gif good.gif

Автор: Георгий 8.02.2009 13:29

Volvo, сделал программу, но опять косяк, не могу понять почему такая глупая ошибка получается blink.gif
суть в следующем:
через прогу у меня запускаются 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 файл надо поставить галочку "параметрический вид" и нажать "построить график"
ПОЖАЛУЙСТА ПОМОГИ!

Автор: volvo 8.02.2009 13:55

Цитата
сделал программу, но опять косяк, не могу понять почему такая глупая ошибка получается
А я тебе говорил, что не надо пользоваться бредовым алгоритмом... Ты опять за свое... Пойми раз и навсегда: чем больше файлов содержит проект - тем больше вероятности, что он не заработает... А ты вместо того, чтобы вкомпилировать все в один файл (с использованием того модуля, пусть и доработанного, что я предложил тебе выше), и ЗАБЫТЬ раз и навсегда о том, что надо делать какие-то BATники, таскать за собой компилятор, устанавливать это все мало того что на диск C: (еще не давая пользователю изменить путь к установке), так еще и в его корень (!!!) А я не работаю под Админским аккаунтом. Результат:
Прикрепленное изображение

Итог - такая программа дальше мусорки не проходит... Хочешь - помогу добавить в свой модуль ту функциональность, которая нужна тебе, и доработать твою программу, чтобы она делала абсолютно то же самое, что делает сейчас, но не сбоила, и работала одинаково ВЕЗДЕ. Но для этого мне надо 1) знать, какие именно функции ты будешь обрабатывать и 2) мне нужен полный исходник твоей программы... Не хочешь выкладывать в общий доступ - есть контактная информация в профиле... Больше ничем помочь не могу...

Автор: Георгий 8.02.2009 16:29

мне хотелось бы чтобы ф-ию можно было вводить в делфи, те придется переделать весь код программы под делфи? (когда я начинал писать программу я еще не знал делфи.)
blink.gif 1200строк переделать в код под делфи blink.gif с учетом того что с графикой в делфи я не работал еще вообще ни разу. как думаешь у меня получится?
или всетаки проще разобраться почему батник не работает?
слушай вот он компилируется, раз уж начал делать коряво надо бы и закончить коряво, просто переделывать все нормально... "игра не стоит свеч"
тогда как запустить ексешный файл через делфи*?


Автор: volvo 8.02.2009 16:47

Цитата
1200строк переделать в код под делфи
Уточняю: 1200 строк корявого кода перенести в Дельфи... А может, НЕкорявого будет в 2-3 раза меньше, как ты думаешь?

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

Цитата
раз уж начал делать коряво надо бы и закончить коряво, просто переделывать все нормально... "игра не стоит свеч"
До свидания... Это не для меня... Делай дальше эту корявую "поделку" сам, у меня больше нет никакого желания заходить в этот топик и помогать тебе на "сдать и забыть", а не "научиться делать правильно". Удачи...

Автор: Георгий 8.02.2009 16:49

volvo, можешь подсказать похожие ф-ии в делфи
паскаль делфи
cleardevice; ?

ch:=readkey; ?
if ch=char(пробел, ентер, ) then ?


я то могу попробывать переделать просто это будет столько вопросов, кстате на счет корявого ты не прав, код сделан достаточно четко, чтобы проц как можно меньше грузить при вычислении, скажем у меня есть case of: на 300 строк тк алгорит построения сложный. при построении графика ф-ии программа не прочесывает все область значений а ищет значения в маленькой окрестности где график существует и выстраивает цыпочки графика.

Автор: amega 8.02.2009 17:09

Цитата
можешь подсказать похожие ф-ии в делфи


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

Автор: Георгий 8.02.2009 17:54

как очистить экран?

не помогает form1.Canvas.FillRect(Rect);

Автор: volvo 8.02.2009 18:09

Цитата
как очистить экран?
Не экран, а канву.. Это тебе не Паскаль, где у тебя была графика полноэкранная, здесь все в окне, на его канве.

Вот так, если я не ошибаюсь:
  PatBlt(Form1.Canvas.Handle, 0, 0,
Form1.ClientWidth, Form1.ClientHeight, PATCOPY);

Автор: Георгий 8.02.2009 18:15

а что на счет readkey??
у меня в паскале был цикл:

repeat
ch:=readkey;
if ch=char(13) then .....
if ch=char(8) then .....
if ch=(' ') then .....
until ch=char(27);

как мне его рганизовать в делфи?

Добавлено через 7 мин.
))) через hotkey наверное делфается??? smile.gif

Добавлено через 45 сек.
только как на стрелочки сделать*??

Автор: volvo 8.02.2009 18:25

Цитата
как мне его рганизовать в делфи?
А вот это уже твоя проблема... Ты исходники засекретил, ЧТО и КАК у тебя делается - знаешь только ты, советовать ничего не буду, скажешь одно, получится, что надо было совершенно другое... Думай сам...

Добавлено через 3 мин.
В общем, так... Чтобы не спрашивать, "а как сделать 2+3, а как с циклами", и т.д., почитай что-нибудь про язык программирования Дельфи. А потом будешь задавать вопросы, что останется непонятным... Нельзя вот так просто Copy+Paste-ом перенести программу с одной платформы (DOS) на другую (Windows)... Где-нибудь да нарвешься на неприятности... Так что сначала разберись, что такое событийное программирование (это про Дельфи), и как оно работает, а потом - продолжим...

Автор: Георгий 8.02.2009 18:40

ок! кстате прогу я перенес с паскаля на делфи, только вот с рефдкей не выходит )))) а так все вроде красиво lol.gif сам в шоке я тогда отпишу позже на счет ввода ф-ии, когда до ума доведу перенос.

Автор: Георгий 8.02.2009 19:39

ну вот, я сделал прогу, теперь самое главное осталось необходимо организовать ввод ф-ии с формы 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 .


987654321 у меня присваивается когда точки не существует, тобишь при построении она не будет учитываться.
суть построения графиков в следующем:
есть ф-ия BBog_xy(x:real; y:real):real;
к ней будет идти запрос с имеющимися x y и она должна выдавать ответ

Автор: Георгий 9.02.2009 10:21

Volvo, пожалуйста помоги! я вот переделал программу под делфи, щас вот нужно как то ввод ф-ии сделать.
http://webfile.ru/2619710

Автор: Георгий 21.04.2009 21:09

Volvo, я все-таки сделал программу, и интерпретатор написал, даже успел 2е место на конференции занять smile.gif
вот цени: http://depositfiles.com/ru/files/g7vzn0v93

Автор: Ritardikzzz 18.12.2011 14:59

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.