Форум программистов, компьютерный форум, киберфорум
Andretti
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

РАБОТА С КОМПИЛЯТОРОМ BPС(TPC) ЧЕРЕЗ ПРИЛОЖЕНИЕ DELPHI

Запись от Andretti размещена 16.04.2012 в 19:57
Показов 7212 Комментарии 0
Метки delphi

РАБОТА С КОМПИЛЯТОРОМ BPС(TPC) ЧЕРЕЗ ПРИЛОЖЕНИЕ DELPHI

Автор : Andretti (e-mail:"Drunex@narod.ru", ICQ:569575751)

Бывает что существует необходимость какой-либо сгененрированные (набранный) код Pascal программы скомпилировать и проверить на работоспособность. Но сделать мы хотим это, в автоматизированном режиме и используя программы которые написали например на Delphi. Здесь я опишу ОБЩУЮ ИДЕЮ как например код набранный в окне приложения написанного на Delphi 7 передать компилятору Borland Pascal (можно Turbo Pascal или д.р.), получить информацию о его компиляции в нашем приложении и протестировать на работоспособность кода используя входные и выходные данные записанные в соответствующих файлах(либо через задание входных данных через параметры запуска программы), ПРИ ЖЕЛАНИИ ВЫ МОЖЕТЕ ЗНАЧИТЕЛЬНО УМЕНЬШИТЬ КОЛИЧЕСТВО ПЕРЕХОДОВ И ДЛИНУ КОДА ИСПОЛЬЗУЯ СТАНДАРТНЫЕ ПРОЦЕДУРЫ.

Для начала не забываем что нам потребуется рабочий bp7.0 и компилятор bpc который необходимо скачать отдельно и запихнуть в папку bin.

Создадим новое приложение в Delphi 7 (File>New>Application). На форму разместим следующие компоненты:
-Memo1 -для ввода кода Pascal-программы
-Memo2 -для отображения ответа компилятора
-Memo3 -для ввода входных данных (файл input.txt)
-Memo4 -для отображения выходных данных которые выдаст программа (файл output.txt)
-Button1 - для запуска компиляции Pascal-программы
-Button2 - для запуска программы и обработки ею входных данных из файла input.txt которые мы ввели в memo3

Далее представлен полный код рабочей программы по примеру работы с компилятором bpc:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Memo2: TMemo;
    Label2: TLabel;
    Memo3: TMemo;
    Label3: TLabel;
    Label4: TLabel;
    Memo4: TMemo;
    {функция запускающая приложение и ожидающая его завершения}
    function ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
    procedure MyRewriteProc(namefile,WDorDW:string);//процедура перевода файлов из Win-кодировки в DOS -кодировку и оборатно
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.MyRewriteProc (namefile,WDorDW:string);//процедура перевода файлов из dos-кодировки в win -кодировку и обратно
const
  BUF_SZ = 4096;
var
  DosWinFile: file;
  dosBuf: array [0..BUF_SZ - 1] of Char;
  winBuf: array [0..BUF_SZ - 1] of Char;
  rCnt: Integer;
  wCnt: Integer;
begin
if WDorDW='DOStoWIN' // ASCII (DOS) -> ANSI (Win)
then begin
  AssignFile(DosWinFile, namefile);
  Reset(DosWinFile, 1);
  BlockRead(DosWinFile, dosBuf, BUF_SZ, rCnt);
  OemToCharBuff(dosBuf, winBuf, rCnt);     // ASCII (DOS) -> ANSI (Win)
  CloseFile(DosWinFile);
  ReWrite(DosWinFile, 1);
  BlockWrite(DosWinFile, winBuf, rCnt, wCnt); // запись в ANSI (Win)-кодировке
  CloseFile(DosWinFile);
end;
if WDorDW='WINtoDOS' //  ANSI (Win) ->  ASCII (DOS)
then begin
  AssignFile(DosWinFile, namefile);
  Reset(DosWinFile, 1);
  BlockRead(DosWinFile, winBuf, BUF_SZ, rCnt);
  CharToOEMBuff(winBuf, dosBuf, rCnt);     //  ANSI (Win) ->  ASCII (DOS)
  CloseFile(DosWinFile);
  ReWrite(DosWinFile, 1);
  BlockWrite(DosWinFile, dosBuf, rCnt, wCnt); // запись в ASCII (DOS)-кодировке
  CloseFile(DosWinFile);
end;
end;
 
function TForm1.ExecAndWait(const FileName, Params: ShortString; const WinState: Word): boolean; export;
{функция запускающая приложение и ожидающая его завершения и записывающая результат работы в текстовый файл otvet.txt}
var 
  StartInfo: TStartupInfo; 
  ProcInfo: TProcessInformation; 
  CmdLine: ShortString; 
begin 
  { Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x } 
  CmdLine := '"' + Filename + '" ' + Params+' >otvet.txt';
  FillChar(StartInfo, SizeOf(StartInfo), #0);
  with StartInfo do 
  begin 
    cb := SizeOf(StartInfo); 
    dwFlags := STARTF_USESHOWWINDOW; 
    wShowWindow := WinState; 
  end; 
  Result := CreateProcess(nil, PChar( String( CmdLine ) ), nil, nil, false, 
                          CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, 
                          PChar(ExtractFilePath(Filename)),StartInfo,ProcInfo); 
  { Ожидаем завершения приложения } 
  if Result then 
  begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
    { Free the Handles }
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Lines.SaveToFile(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\KOD.pas'); //сохраняем наш код в файл c Win-кодировкой
{перевод кодировок из win в dos (из одного файла в другой), т.к. Delphi работает
с Win-кодировкой, а Pascal с dos-кодировкой}
MyRewriteProc(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\KOD.pas','WINtoDOS');
{Теперь создадим процесс в котором запустим компилятор bpc.exe с параметрами указывающими на наш файл и дождемся его завершения}
ExecAndWait(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\BPC.exe','-b KOD.pas', SW_SHOWNORMAL) ;
{перевод кодировок из dos в win (из одного файла в другой), т.к. Delphi работает
с Win-кодировкой, а Pascal с dos-кодировкой}
MyRewriteProc(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\otvet.txt','DOStoWIN');
Memo2.Lines.LoadFromFile(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\otvet.txt');
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
{перевод кодировок из win в dos (из одного файла в другой), т.к. Delphi работает
с Win-кодировкой, а Pascal с dos-кодировкой}
MyRewriteProc(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\input.txt','WINtoDOS');
Memo3.Lines.SaveToFile(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\input.txt');
ExecAndWait(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\KOD.exe','', SW_SHOWNORMAL);
{перевод кодировок из dos в win (из одного файла в другой), т.к. Delphi работает
с Win-кодировкой, а Pascal с dos-кодировкой}
MyRewriteProc(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\output.txt','DOStoWIN');
Memo4.Lines.LoadFromFile(ExtractFileDir(Application.ExeName)+'\bp7.0\BIN\output.txt');
end;
 
end.



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

Компилятор командной строки позволяет вам вызывать все функции компилятора IDE из командной строки DOS (она же командная строка cmd.exe в Windows).
Компилятор командной строки использует следующий синтаксис

TPC [опции] <имя файла> [опции]
BPC [опции] <имя файла> [опции]

Где в качестве [опций] могут быть одна или большее
количество опций, разделенных пробелами.

¦ Поместите + (или пробел) после опции, чтобы включить ее.
¦ Поместите - после опции, чтобы выключить ее.
Опции директив компилятора

/$A Выравнивание данных (Align Data)
/$B Булева оценка (Boolean Evaluation)
/$D Отладочная информация (Debug Information)
/$F Дальний тип вызова (Force FAR Calls)
/$G Генерировать 286 команды (Generate 286 Instruction)
/$I Проверка ввода/вывода (Input/Output Checking)
/$L Информация о локальных символах (Local Symbol Information)
/$N 80x87 коды (FPU сопроцессор) (80x87 Code (Numeric coprocessor))
/$R Проверка диапазона (Range Checking)
/$S Проверка переполнения стека (Stack-Overflow Checking)
/$T Типизированный @ указатель (Typed @ Pointer)
/$V Проверка строковых переменных (String Var Checking)
/$W Запись активации Windows (Windows Stack Frame)
/$X Расширенный синтаксис (Extended Syntax)
Опции режима компилятора

/B Компилировать все (Build All)
/F Найти ошибку (Find Error)
/L Буфер компоновщика (Link Buffer)
/M Создать (Make)
/Q Тихий (нет эквивалента в IDE) (Quiet)
Опция условного выражения

/D Условные выражения (Conditional Defines)
Опции отладки

/G .Map файл
/V Включить отладочную информация в EXE файл
Опции Каталога

/E Каталог для EXE и TPU
/I Каталог включений (include)
/O Каталог объектных файлов
/R Каталог ресурсов
/T Каталог Turbo Pascal
/U Каталог модулей (unit)

Большинство опций командной строки имеет эквивалентные команды меню.

Структура папок для указанного примера должна быть следующая :

Папака с проектом
¦ Project1.cfg
¦ Project1.dof
¦ Project1.dpr
¦ Project1.exe
¦ Project1.res
¦ tree.txt
¦ Unit1.dcu
¦ Unit1.ddp
¦ Unit1.dfm
¦ Unit1.pas
¦ Unit1.~ddp
¦ Unit1.~dfm
¦ Unit1.~pas
¦
L---bp7.0
+---BGI
¦ ATT.BGI
¦ BOLD.CHR
¦ CGA.BGI
¦ EGAVGA.BGI
¦ EURO.CHR
¦ GOTH.CHR
¦ HERC.BGI
¦ IBM8514.BGI
¦ LCOM.CHR
¦ LITT.CHR
¦ PC3270.BGI
¦ SANS.CHR
¦ SCRI.CHR
¦ SIMP.CHR
¦ SVGA256.BGI
¦ TRIP.CHR
¦ TSCR.CHR
¦ VESA16.BGI
¦
+---BIN
¦ BP.DSK
¦ BP.EXE
¦ BP.ICO
¦ BP.TP
¦ BPC.EXE // наш компилятор который мы скачивали отдельно
¦ DPMI16BI.OVL
¦ Input.txt
¦ KOD.EXE
¦ KOD.PAS
¦ otvet.txt
¦ OUTPUT.TXT
¦ PRNFLTR.EXE
¦ RTM.EXE
¦ TPP.TPL
¦ TURBO.TPH
¦ TURBO.TPL
¦ TVISION.TPH
¦ Русская версия Borland Pascal.PIF
¦
L---UNITS
APP.TPP
APP.TPU
COLORSEL.TPP
COLORSEL.TPU
DIALOGS.TPP
DIALOGS.TPU
DRIVERS.TPP
DRIVERS.TPU
EDITORS.TPP
EDITORS.TPU
GRAPH.TPP
GRAPH.TPU
HISTLIST.TPP
HISTLIST.TPU
MEMORY.TPP
MEMORY.TPU
MENUS.TPP
MENUS.TPU
MSGBOX.TPP
MSGBOX.TPU
OBJECTS.TPP
OBJECTS.TPU
OUTLINE.TPP
OUTLINE.TPU
STDDLG.TPP
STDDLG.TPU
STRINGS.TPU
TEXTVIEW.TPP
TEXTVIEW.TPU
VALIDATE.TPP
VALIDATE.TPU
VIEWS.TPP
VIEWS.TPU
WINDOS.TPU

Во вложенном архиве находится рабочая программа, исходники, BP7.0, компилятор bpc.exe и все это размещено по настроенным ссылкам в программе.

Использованые источники для составления статьи :
процедура перевода кодировок пользователя kukuruku310 с форума cyberforum.ru
tp7.info
sysman.ru
pascal.toom.su
поиск google.com ))
Вложения
Тип файла: rar Работа с pascal компилятором.rar (1.32 Мб, 824 просмотров)
Метки delphi
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
Диалоги с ИИ
zorxor 23.05.2026
Насколько я понимаю - Вы - Искусственный Интеллект. Это так? Да, всё верно. Я — искусственный интеллект. Я представляю собой большую языковую модель, созданную для помощи в самых разных задачах. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru