함수는 반환값이 있는것이고, 프로시저는 반환값이 없는 것이다.
procedure
{인수는 ; 로 구분하며 동일 자료형의 인수는 콤마로 사용이 가능하다}
procedure print_point(x,y:integer;s:string);
begin
writeln(s,x,y);
end;
function
{반환자료형은 마지막에 쓴다.}
function Add(a,b:integer):integer;
begin
{반환은 함수의 이름에 값을 넣으면 된다.
넣는다고 바로 return 되는것은 아니다.
바로 return 할려면 Exit; 를 삽입해야한다.}
Add:=a+b;
end;
이 포스팅은 FPC(free pascal compiler)를 기준으로 작성된다.
델파이의 경우 컴파일러 지시자 {$X+} 를 쓰면 반환값으로 함수의 이름대신 result를 사용할 수 있다.
유닛은 C언어의 헤더파일 개념이라고 보면된다. 사용법은 아래 소스를 참조하면 된다.
main.pas
{프로그램의 이름을 지정한다. 필수는 아님}
program test;
{C의 include 개념이다. 사용할 Unit을 작성한다.}
uses List;
var p:pnode;
begin
push_back(container,2);
push_back(container,5);
push_back(container,1);
push_back(container,3);
push_back(container,4);
p:=container.head;
while p<>nil do
begin
writeln(p^.data);
p:=p^.next;
end;
end.
List.pas
파일명과 첫줄에 적는 유닛은 일치해야한다.
{unit을 지정한다.}
unit List;
{interface 부분은 공개되는 부분이다.
program에서 참조할 수 있으며,
함수선언을 이곳에다 한다.}
interface
{type과 전역변수 container를 이곳에다 선언했다}
type
pnode=^node;
node=record
next,prev:pnode;
data:Integer;
end;
LinkedList=record
head,tail:pnode;
len:Integer;
end;
var
container:LinkedList;
procedure push_back(var this:LinkedList;elem:Integer);
{implementation은 숨겨진 내용이다. 함수의 정의는 이곳에다 한다.}
implementation
procedure push_back(var this:LinkedList;elem:Integer);
var
n:pnode;
begin
getmem(n,sizeof(node));
n^.next:=nil;
n^.prev:=nil;
n^.data:=elem;
if this.head=nil then
begin
this.head:=n;
this.tail:=n;
end
else
begin
this.tail^.next:=n;
n^.prev:=this.tail;
this.tail:=this.tail^.next;
end;
inc(this.len);
end;
procedure dealloc;
var ptr:pnode;
begin
while container.head<>nil do
begin
ptr:=container.head;
container.head:=container.head^.next;
dispose(ptr);
end;
end;
{initialization은 초기화부분이다. 프로그램이 실행될때 동작한다.}
initialization
container.head:=nil;
container.tail:=nil;
container.len:=0;
{finalization은 소멸자부분이다. 종료되기 직전 수행된다.}
finalization
{링크드리스트의 소멸자 함수 호출}
dealloc;
end.
컴파일은 program 이 적힌 부분만 컴파일하면 알아서 유닛을 찾아준다. 이 부분은 편하다.