Дана программа, генерирующая также определенные программы на Паскале (подробнее fastproger.moy.su)
Однако, вес этой программы ранее составлял около 64 кб в одном файле, и Борланд Паскаль, который я использовал, не тянул компилить файлы весом более 64 кб с чем-то там.
В общем, я решил перейти на модульную основу, однако ни в Турбо Паскале, ни в ФриПаскале наладить подключение модулей не смог.
В Турбо инициализация модуля проходила, но компилятор зависал на подключении процедур, написав, что не знает, откуда эта процедура (unknown identifier)
В ФриПаскале модули вообще не подключаются - пишет, что не может их найти.
Модули лежат в одной папке с компилируемым файлом. Полная версия программы в архиве, тут - начало самой программы и исходник одного из модулей.
//Программа
program fastproger;
uses fpg_id1, fpg_id2, fpg_id3, fpg_id4, fpg_id5, fpg_id6, fpg_id7, fpg_id8, fpg_id9, fpg_id10, fpg_id11, fpg_id12, fpg_id13,
fpg_id14, fpg_id15, fpg_id16, fpg_id17, fpg_id18, fpg_id19, fpg_id20, fpg_id21, fpg_id22, fpg_id23, fpg_id24, fpg_id25,
fpg_id26, fpg_id27, fpg_id28, fpg_id29, fpg_id30, fpg_id31, fpg_id32, fpg_id33, fpg_id34, fpg_id35, fpg_id36, fpg_id37,
fpg_id38, fpg_id39, fpg_id40, fpg_id41, fpg_id42, fpg_id43, fpg_id44, fpg_id45, fpg_id46, fpg_id47, fpg_id48, fpg_id49,
fpg_id50, fpg_id51, fpg_id52, fpg_id53, fpg_id54, fpg_id55;
var a,b,c,d,e,f,g,h,i,j,k,l,m,n,u,v,w,x,y,z,z1:integer; {struktura programmy}
o:string; {funkzia v program id=1}
p:string; {apostrof dlya zapisi v programmy}
q:string; {dlya zapisi znaka v programmy s masivami}
r:real; {dlya zapisi chisla c programmy s masivami}
s:string; {znak raboty s neravenstvami}
file1:text; {file dlya zapisi dannyh}
logfile:text; {log file}
id:string; {id procedury dlya zapisi v logi}
t:string; {imya file, v kotoruy generiruetsya proga}
procedure logwrite; {zapis deystviya v logi}
begin
assign(logfile,'logfile.txt');
append(logfile);
writeln(logfile,'sgenerirovana programma ',id,' v file ',t);
close(logfile);
end;
procedure logwrite2; {zapis oshibki}
begin
assign(logfile,'logfile.txt');
append(logfile);
writeln(logfile,'Dopushena oshibka pri rabote s programmoy!');
close(logfile);
end;
begin
...
end.
//Модуль
unit fpg_id1;
interface
implementation
procedure fpg_id_1;
var file1:text; o,p,id,t:string;
begin
assign(file1,t);
rewrite(file1);
id:='fpg_id_1';
writeln(file1,'program fpg_id_1;');
writeln(file1,' var x,y:real;');
writeln(file1,'begin');
writeln(file1,' writeln(',p,'vvedite x',p,');');
writeln(file1,' readln(x);');
writeln(file1,' y:=',o,';');
writeln(file1,' writeln(',p,'znachenie funkzii ',p,',y:1:2);');
writeln(file1,' readln;');
writeln(file1,'end.');
close(file1);
end;
end.
Посмотрел на приведенный модль.
У него пустые раздел интерфейса и инициализации. Другими словами, модуль совершенно бесполезен.
Если хочешь пользоваться роцедурами из модуля вне его, надо поместить их заголовки в разделе интерфейса.
т.е:
unit fpg_id1;
interface
procedure fpg_id_1;
implementation
procedure fpg_id_1;
var file1:text; o,p,id,t:string;
begin
Какой же я лох)))
Спасибо большое, думаю, все заработает.
И все равно не работает...
Все процедуры подправлены, программа даже компилируется, но корректно использовать ни одну из процедур не может... Новая версия в архиве... (выкладывать весь текст основной программы нецелесообразно, там 24 кб)
Прикрепленные файлы
fastproger.rar ( 225.36 килобайт )
Кол-во скачиваний: 333
Программа не только компилируется, но и запускается (если ее пересобрать. Я не знаю, с какими опциями ты компилировал модули, но с ними ни одна процедура не запустилась. После копирования исходников всех модулей в папку с основной программой и полного ребилда процедуры из модулей начали вызываться). А работает неправильно - потому что (возьмем к примеру первый твой модуль):
unit fpg_id1;
interface procedure fpg_id_1;
implementation
procedure fpg_id_1;
var file1:text; o,p,id,t:string; // <--- Тут описана T - переменная типа String... Локально...
begin
assign(file1,t); // <--- А тут ты с этим уже хочешь работать?
rewrite(file1);
id:='fpg_id_1';
writeln(file1,'program fpg_id_1;');
writeln(file1,' var x,y:real;');
writeln(file1,'begin');
writeln(file1,' writeln(',p,'vvedite x',p,');');
writeln(file1,' readln(x);');
writeln(file1,' y:=',o,';');
writeln(file1,' writeln(',p,'znachenie funkzii ',p,',y:1:2);');
writeln(file1,' readln;');
writeln(file1,'end.');
close(file1);
end;
end.
volvo,
1) Компилировал ФриПаскалем, обычным способом...
2) Никаких предупреждений не выскакивало, мб я слепой((
3) Насчет переменной t - не прав, эта переменная действительно описывается только в основной программе, надо бы из var-a перенести ее в скобки за procedure...
4) Насчет инициализации не понял, т.к. что прошлый вариант я исправил, и в interface название процедуры вставил.
unit my_globals;, подключить его в Uses первым, а описания переменных o, p, id и t из основной программы убрать...
interface
var
o, p, id, t: string;
implementation
end.
Cпасибо за помощь...
Уведомления у меня включены, но варнинги как раз нет)) Не знаю, чего я так сглупил, мб просто мышкой промахнулся.
По переменным разберусь, действительно ошибся... Единственное что, можешь подробнее объяснить, какие должны определяться в программе, а какие - передаваться?
Создавать модуль global, пожалуй, не буду, т.к. имхо слишком геморрно, лучше уж все процедурки подправить - их там всего 60))))
А по переменным... Вот "о" - это функция, которая вводится с клавиатуры в самом интерфейсе программы, не знаю, как ее можно описать в модуле. "р" - апостроф, там все понятно, его надо совать в сам модуль. Самая большая проблема, я так понял, с "t", так как файл с правильным именем не генерируется. Но как можно запихнуть в модуль эту переменную, если она тоже вводится с клавиатуры в основной программе? (это имя файла, в программе есть кусок кода для него:
writeln('vvedite imya faila, v kotoriy budet sgenerirovana programma');)
readln(t);
t:=t+'.txt';