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

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

Форум «Всё о Паскале» _ Free Pascal, Pascal ABC и другие _ Работа с модулями в FPC

Автор: forscripts 18.12.2007 0:16

Дана программа, генерирующая также определенные программы на Паскале (подробнее 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.



Как все-таки подключить эти модули?..

Заранее спасибо за помощь.


Прикрепленные файлы
Прикрепленный файл  fastproger.rar ( 77.47 килобайт ) Кол-во скачиваний: 337

Автор: volvo 18.12.2007 0:29

Цитата
Модули лежат в одной папке с компилируемым файлом.
Не вижу... В одной папке с компилируемым файлом лежат файлы TPU, они не являются модулями для FPC... Этот компилятор работает с файлами PPU... Перекомпилируй все модули с помощью FPC, забрось PPU файлы в одну папку с исходником (или пропиши путь в Options -> Directories -> Units), и исправляй ошибки в программе. Но модули подключатся...

Автор: andriano 18.12.2007 1:01

Посмотрел на приведенный модль.
У него пустые раздел интерфейса и инициализации. Другими словами, модуль совершенно бесполезен.
Если хочешь пользоваться роцедурами из модуля вне его, надо поместить их заголовки в разделе интерфейса.
т.е:

unit fpg_id1;
interface
procedure fpg_id_1;
implementation
procedure fpg_id_1;
var file1:text; o,p,id,t:string;
begin


Автор: forscripts 18.12.2007 3:07

Какой же я лох)))

Спасибо большое, думаю, все заработает.

Автор: forscripts 18.12.2007 4:07

И все равно не работает...
Все процедуры подправлены, программа даже компилируется, но корректно использовать ни одну из процедур не может... Новая версия в архиве... (выкладывать весь текст основной программы нецелесообразно, там 24 кб)


Прикрепленные файлы
Прикрепленный файл  fastproger.rar ( 225.36 килобайт ) Кол-во скачиваний: 333

Автор: volvo 18.12.2007 4:37

Программа не только компилируется, но и запускается (если ее пересобрать. Я не знаю, с какими опциями ты компилировал модули, но с ними ни одна процедура не запустилась. После копирования исходников всех модулей в папку с основной программой и полного ребилда процедуры из модулей начали вызываться). А работает неправильно - потому что (возьмем к примеру первый твой модуль):

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.

А кто будет инициализировать (имя файла я для чего вводил в начале - непонятно)? Тебя ж предупредили:
Цитата(Error Log)
fpg_id1.pas(7,17) Warning: Local variable "t" does not seem to be initialized
fpg_id1.pas(13,4) Warning: Local variable "p" does not seem to be initialized
fpg_id1.pas(15,4) Warning: Local variable "o" does not seem to be initialized
На Warning-и не обращаешь внимания? Напрасно...

Автор: forscripts 19.12.2007 0:06

volvo,
1) Компилировал ФриПаскалем, обычным способом...
2) Никаких предупреждений не выскакивало, мб я слепой((
3) Насчет переменной t - не прав, эта переменная действительно описывается только в основной программе, надо бы из var-a перенести ее в скобки за procedure...
4) Насчет инициализации не понял, т.к. что прошлый вариант я исправил, и в interface название процедуры вставил.

Автор: volvo 19.12.2007 0:39

Цитата
2) Никаких предупреждений не выскакивало, мб я слепой((
Может, включить забыл? Зайди Options -> Compiler -> Verbose и отметь Warnings, Notes, Hints как минимум. Тогда будешь получать все, что отмечено. После компиляции жмешь на F12 и смотришь список предупреждений/хинтов/замечаний.

Цитата
4) Насчет инициализации не понял, т.к. что прошлый вариант я исправил, и в interface название процедуры вставил.
Я не про эту инициализацию... У тебя есть строка, и перед использованием (скажем так, перед использованием в качестве RValue, справа от знака присваивания) она должна быть инициализирована. Иначе будешь получать глюки в программе. А у тебя ни один из тех четырех String-ов не был инициализирован. Исправляй... Кстати, три из них должны передаваться из основной программы.

Самый простой путь сделать это, не перелопачивая все 55 модулей - это добавить еще один, маленький, юнит:

unit my_globals;

interface
var
o, p, id, t: string;

implementation
end.

, подключить его в Uses первым, а описания переменных o, p, id и t из основной программы убрать...

Автор: forscripts 19.12.2007 3:53

Cпасибо за помощь...
Уведомления у меня включены, но варнинги как раз нет)) Не знаю, чего я так сглупил, мб просто мышкой промахнулся.
По переменным разберусь, действительно ошибся... Единственное что, можешь подробнее объяснить, какие должны определяться в программе, а какие - передаваться?

Создавать модуль global, пожалуй, не буду, т.к. имхо слишком геморрно, лучше уж все процедурки подправить - их там всего 60))))

А по переменным... Вот "о" - это функция, которая вводится с клавиатуры в самом интерфейсе программы, не знаю, как ее можно описать в модуле. "р" - апостроф, там все понятно, его надо совать в сам модуль. Самая большая проблема, я так понял, с "t", так как файл с правильным именем не генерируется. Но как можно запихнуть в модуль эту переменную, если она тоже вводится с клавиатуры в основной программе? (это имя файла, в программе есть кусок кода для него:

writeln('vvedite imya faila, v kotoriy budet sgenerirovana programma');
readln(t);
t:=t+'.txt';
)
Что касается "id", то там, в общем, все понятно, определить ее можно и в программе, и в модуле...