Помощь - Поиск - Пользователи - Календарь
Полная версия: написание своего модуля
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
SeRGuSii
Забыл как описывать свои модули, помню, что вроде надо так

Код

user <назв модуля>;


а дальше то как ? напишите пожалуйста, в faq, статьях и уроках вроде нету если пропустил ткните носом
volvo
unit <имя_модуля>;
interface
...
{ описание процедур, функций и объектов, которые 
   должны быть доступны в вызывающем модуле/программе }

implementation
...
{ реализация процедур, функций и объектов }


{ инициализирующая часть модуля:
  выполняется при подключении модуля к программе }
begin { begin может отсутствовать, если модулю не нужна инициализация }
end.
klem4
И еще не забудь, что имя файла, в котором находится модуль, должно совпадать с именем в программе(то что после слова
unit <тут>;
)
SeRGuSii
примного благодарен smile.gif
SeRGuSii
Что нужно сделать, чтобы заработал модуль GRAPH, а то паскаль выдает ошибку:
 
ERROR 15: file not found (graph.tpu)



Хотя в папке units он присутствует.
klem4
try:
зайди в Option->Directories-> и пропиши пути к папке units в там где unit directories
volvo
:yes: Или брось Graph.TPU в текущую папку (я всегда так делаю...)
SeRGuSii
to klem4, делал не помогло.
volvo спасибо, теперь работает.
----------
Посмотрите задачку что-то упустил в создании модуля, не инициализируется.
Модуль включает подпрограмму обработки массива: ввод массива, вывод массива в графическом режиме, проверка упоряд на возрастание, на убывание, сортировка массива, поиск заданного элемента.
 
unit obrmasiv;
interface
const
     n=5;

type
 TElem = integer;
 mass = array[1..n] of TElem;


implementation
uses crt,Graph;
procedure inputmas (a:mass);
var i:integer;
begin
 for i:=1 to n do begin
                      write('a[',i,']= ');
                      read(a[i]);
                  end;
end;
procedure outputmas (a:mass);
var i:integer;
begin
 for i:=1 to n do begin
                      write(a[i],' ')
                  end;
end;
function yp(a:mass): boolean;
 var i:integer;
     p:boolean; p1:boolean;
 begin
  p:=true;
  p1:=true;
   for i:=1 to n-1 do
   begin
    p:=p and (a[i] > a[i+1]);
    p1:=p1 and (a[i] < a[i+1]);
   end;
  yp:=p or p1;
 end;
end.
procedure sort(a:mass);
var c:integer;
begin
 for i:=2 to n do
  begin
   c:=a[i-1];a[i-1]:=a[i];a[i]:=c;
  end
end;
uses obrmasiv;
const n=5;
var a: array [1..n] of integer;
    i:integer;
begin
 inputmas(a);
 if yp then writeln('yp') else writeln('neyp');
 sort(a);
 outputmas(a);
end.


и какбы по красивее её вывести в графическом режиме
volvo
Смотри, что происходит:
1. Ты определил реализацию функций и процедур в модуле, но не описАл их как внешние, то есть вызывающая программа о них не знает...

2. Процедура sort описана после завершающей точки - это запрещено. Компилятор просто не знает о ее существовании... ( плюс к этому в sort была небольшая ошибка - не описана переменная i )

3. Более опасное:
в модуле у тебя определен тип
Type
  TElem = integer;
  mass = array[1..n] of TElem;
{ и затем : }
procedure inputmas (a:mass);

ты попытался описАть переменную такого же типа в основной программе и передать ее как параметр в процедуру... Нет !!! Нельзя этого делать. По правилу совместимости типов эти 2 типа будут считаться разными, и естественно вылетит ошибка. Нужно использовать ранее определенный в модуле тип...

Вот правильный вариант 2-х файлов (работоспособность не проверял, но компиляцию проходят smile.gif )

obrmasiv.pas
unit obrmasiv;
interface
const
  n=5;

type
  TElem = integer;
  mass = array[1..n] of TElem;

procedure inputmas (a:mass);
procedure outputmas (a:mass);
function yp(a:mass): boolean;
procedure sort(a:mass);

implementation
uses crt,Graph;

procedure inputmas (a:mass);
var i:integer;
begin
  for i:=1 to n do begin
    write('a[',i,']= ');
    read(a[i]);
  end;
end;

procedure outputmas (a:mass);
var i:integer;
begin
  for i:=1 to n do begin
    write(a[i],' ')
  end;
end;

function yp(a:mass): boolean;
var
  i:integer;
  p:boolean; p1:boolean;
begin
  p:=true;
  p1:=true;
  for i:=1 to n-1 do begin
    p:=p and (a[i] > a[i+1]);
    p1:=p1 and (a[i] < a[i+1]);
  end;
  yp:=p or p1;
end;

procedure sort(a:mass);
var
  c:integer;
  i:integer;
begin
  for i:=2 to n do begin
    c:=a[i-1];a[i-1]:=a[i];a[i]:=c;
  end
end;

end.


Файл main.pas
uses obrmasiv;
var
  a: mass;
  i:integer;
begin
  inputmas(a);
  if yp(a) then writeln('yp') else writeln('neyp');
  sort(a);
  outputmas(a);
end.


Кстати, зачем тебе Graph, он же нигде не используется? Или ты хочешь перенести это в графику? Я бы не советовал, смысл какой? Разными цветами можно и в текстовом режиме вывести... rolleyes.gif
SeRGuSii
volvo, не всеравно не стартует, а graph был нужен чтобы красиво вывести массив
volvo
Распакуй архив, открой main.pas и в меню компилятора выбери НЕ Compile (Alt+F9) а Make (F9)... Я программы без проверки не выкладываю... Раз я сказал, что компилируется, значит она компилируется и запускается... (По крайней мере первый шаг в пошаговом режиме делается)...
SeRGuSii
Да ты прав она запускается, это я с путями намудрил. Правда еще проблемы остались массив вводит, но элементы не запоминает, выводит нулевой массив
volvo
Цитата(SeRGuSii @ 1.06.05 11:59)
еще проблемы остались массив вводит, но элементы не запоминает, выводит нулевой массив

Правильно... У тебя в модуле процедура ввода массива как определена? Вот так:
procedure inputmas (a:mass);

а это значит что результаты работы процедуры в вызывающую программу не вернутся... Поменяй на
procedure inputmas (var a:mass);

(только не забудь, и в секции Interface и в Implementation)

То же самое - в сортировке (ты там вообще чего-то намудрил, я поменял то что было на простейший алгоритм "пузырька"):
procedure sort(var a:mass);
var
  T:integer;
  i, j:integer;
begin
  For i := 1 To n Do
    For j := n DownTo i+1 Do
      If a[j - 1] > a[j] Then Begin
        T := a[j - 1]; a[j - 1] := a[j]; a[j] := T
      End
end;

не забудь про Var...
SeRGuSii
ок, еще раз СПАСИБО !
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.