[pascal] 기초

pascal 자료형,함수,프로시저,유닛

자료형

함수,프로시저

함수는 반환값이 있는것이고, 프로시저는 반환값이 없는 것이다.

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를 사용할 수 있다.

unit 작성

유닛은 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 이 적힌 부분만 컴파일하면 알아서 유닛을 찾아준다. 이 부분은 편하다.