Tipe Data dalam Delphi Pascal

Operasi Bitwise

Operasi Bitwise (Bitwise Operation) adalah meng‐ operasikan 2 (dua) operand dengan tipe integer yang dipandang sebagai kumpulan bit. Perhatikan contoh berikut (A, B, dan C adalah Byte).

A := 5; B := 12; C := A and B;

Berapa nilai C ? Nilai C dapat ditentukan dengan menggunakan bitwise operation, yaitu dengan memandang A dan B sebagai kumpulan Bit. Karena A dan B bertipe Byte, maka panjangnya adalah 8 Bit.

A 5 0000 0101 B 12 0000 10

---------------------------------------------------------- and

C 0000 0100 = 4

Setiap bit yang bersesuaian dioperasikan dengan operasi logic and, yaitu bila kedua bit bernilai satu maka nilai bit hasilnya adalah 1. Selain itu, bernilai nol. Jadi, nilai C adalah 4.

Secara lengkap, operator bitwise sebagai berikut.

Operator Keterangan

Contoh

not

bitwise negasi

A := 5;

untuk setiap bit 0 menjadi 1 dan setiap bit 1

B := not A;

menjadi 0.

A 5 0000 0101 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ not

B 1111 1010 = 250 and

bitwise and

A := 5;

Bila dua bit bernilai 1, maka bit hasilnya bernilai 1.

B := 12;

Jika salah satu bit bernilai 0 maka hasilnya bernilai

B 12 0000 10 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ and

C 0000 0100 = 4 or

bitwise or

A := 5;

Bila salah satu bit bernilai 1, maka bit hasilnya

B := 12;

bernilai 1. Jika keduanya 0, maka bit hasilnya

B 12 0000 10 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ or

C 0000 1101 = 13 xor

bitwise xor

A := 5;

Bila salah satu bit bernilai 1 dan bit lainnya bernilai

B := 12;

0, maka bit hasilnya adalah 1. Bila keduanya 0 atau

C := A xor B;

keduanya 1, maka bit hasilnya adalah 0.

A 5 0000 0101

B 12 0000 10 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ xor

C 0000 1001 = 9 Page 34 C 0000 1001 = 9 Page 34

bitwise shift left

A := 5;

Menggeser semua bit ke kiri dari operand pertama

B := 12;

sebanyak operand kedua.

C := A shi B;

A 5 0000 0101 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ shi 2

C 0001 0100 = 20 shr

bitwise shift right

A := 5;

Menggeser semua bit ke kanan dari operand

B := 12;

pertama sebanyak operand kedua.

C := A shr B;

A 5 0000 0101 ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ ‐ shr 2

C 0000 0001 = 1

Real

Tipe fundamental bilangan real dalam Delphi Pascal sebagai berikut.

Tipe Data

Ukuran (byte)

Range

Significant Digits

real48

11‐ 12 single

6 2.9 x 106^‐ 39 s.d. 1.7 x 10^38

7‐ 8 double

4 1.5 x 10^‐ 45 s.d. 3.4 x 10^38

15‐ 16 extended

8 5.0 x 10^‐ 324 s.d. 1.7 x 10^308

10 3.4 x 10^‐ 4932 s.d. 1.1 x 19‐ 20 10^4932

comp

8 ‐ 9,223,372,036,854,775,808 s.d. 19‐ 20 9,223,372,036,854,775,807

currency

s.d. 19‐ 20

Tipe generic Real pada Delphi 7 didefinisikan sebagai Double. Tipe extended menawarkan presisi lebih tinggi tetapi agak kurang portable. Tipe Comp (Computational) adalah native Intel CPU dan direpresentasikan sebagai Integer 64 bit. Tipe Currency adalah fixed‐ floating point data type yang digunakan untuk meminimalkan error

pembulatan. Tipe ini direpresentasikan sebagai Integer 64 bit yang berskala dan hanya mempunyai 4 (empat) digit di belakang koma.

Char dan Wide Char

Tipe fundamental dari character adalah AnsiChar dan WideChar. AnsiChar berukuran 1 (satu) byte sedangkan WideChar berukuran lebih dari 1 (satu) byte. Tipe generic karakter adalah Char dan sama dengan AnsiChar. Char adalah tipe ordinal, sehingga dapat mempunyai sifat‐ sifat tipe ordinal, misalnya dapat di‐ increment, decrement, dan dapat menjadi pilihan dalam case. Untuk melihat nilai byte dari karakter, bisa menggunakan Ord(x), di mana x adalah char.

Page 35

Enumerated

Tipe data Enumerated adalah tipe data yang isinya terbatas pada nilai‐ nilai yang telah didefinisikan. Untuk mendefinisikan tipe dan jenis ini digunakan kurung buka sebagai awal, kurung tutup sebagai akhir, serta setiap nilai yang mungkin dibatasi dengan tanda koma.

Contohnya sebagai berikut.

type

TKartu = (Club, Diamond. Heart, Spade); TJenisKelamin = (Pria, Wanita);

Set

Tipe data set adalah kumpulan elemen data yang masing‐ masing mempunyai tipe yang sama. Set merupakan implementasi dari himpunan data. Untuk mendefinisikannya dapat dilihat pada contoh berikut ini.

type

TSetHuruf = set of Char;

var

Vokal : TSetHuruf; Konsonan : TSetHuruf; Angka : TSetHuruf; Kosong : TSetHuruf;

Untuk mengisi suatu set, dapat dilakukan secara langsung dengan menyebutkan tipe yang mungkin dan dibatasi oleh kurung kotak ([…]). Setiap elemen set dibatasi oleh koma. Setiap variabel yang didefinisikan sebagai set selalu dapat diisi dengan nilai kosong yang didefinisikan sebagai [ ]. Perhatikan contoh berikut ini.

Vokal := [ ‘A’, ‘E’, ‘I’, ‘O’, ‘U’ ] ; Konsonan := [ ‘B’, ‘C’, ‘D’, ‘F’, ‘G’, ‘H, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’ ] ; Angka := [ ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ ] ; Kosong := [ ] ;

Operasi Set

Operasi dalam Set (himpunan) sebagai berikut.

Operator

Fungsi

Tipe Operand

Tipe Hasil

Tipe set yang kompatibel. Set ‐

Gabungan.

Tipe set yang kompatibel. Set *

Selisih.

Tipe set yang kompatibel. Set In

Irisan.

Anggota dari.

Operand

kiri

adalah Boolean

diperiksa. Operand kanan adalah set yang akan diperiksa.

Page 36

Perhatikan juga contoh berikut.

type

TSetHuruf = set of Char;

var

Vokal : TSetHuruf; Konsonan : TSetHuruf; Angka : TSetHuruf; Kosong : TSetHuruf; Alfabet : TSetHuruf; HasilBoolean : Boolean; AlfabetBukanAngka : TSetHuruf;

begin

Vokal := [‘A’, ‘E’, ‘I’, ‘O’, ‘U’]; Konsonan := [ ‘B’, ‘C’, ‘D’, ‘F’, ‘G’, ‘H’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’]; Angka := [‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’]; Kosong := [ ]; Alfabet := Vokal + Konsonan + Angka Kosong := Vokal + Konsonan; HasilBoolean := ‘A’ in Vokal; AlfabetBukanAngka := Alfabet – Angka;

end;

3.1.10. Tipe Data String

Delphi Pascal mendukung beberapa macam string, yaitu Short String, Ansi String atau Long String, Wide String, dan Null‐ terminated String. Indeks string dimulai dari 1 (satu).

Short String

Short string adalah string dengan panjang maksimum 255 (dua ratus lima puluh lima) karakter. Pendefinisian dari Short String dapat dilakukan dengan 2 (dua) cara, yaitu dengan Short string dan dengan string [x], di mana x adalah panjang maksimum dari string. Pendefinisian dengan Short string adalah string dengan panjang maksimum 255 karakter dan memory yang dialokasikan sejumlah 256 byte. Untuk pendefinisian dengan string [x] diterjemahkan sebagai panjang maksimum dari string adalah x sedangkan memory yang dialokasikan adalah x+1. Indeks ke 0 dari string akan menyimpan panjang string. Short string hanya digunakan untuk backward compatibility. Perhatikan contoh bawah ini.

var

: ShortString; ( panjang maks 255 karakter, 256 byte)

S1

: string[10 ]; ( panjang maks 10 karakter, 11 byte)

Len : Integer;

begin

S := ‘Hello’;

Len := Ord(S[ 0]); ( ‘L’ n ow contains the length of S, or 5 ) end;

Ansi String

Ansi String atau Long String adalah string yang dialokasikan secara dinamik sesuai dengan kebutuhan. Panjang Ansi String hanya dibatasi oleh memory yang tersedia. Variabel bertipe string sendiri sebenarnya adalah sebuah pointer yang berisi alamat di heap memory. Mekanisme alokasi dan dealokasinya dikelola oleh Delphi Pascal.

Page 37

Wide String

Wide String mirip dengan Ansi String hanya setiap karakternya disimpan sebagai Wide Char (16 bit karakter Unicode). Perilaku Wide String sangat mirip dengan Ansi String. Perbedaannya hanya pada ukuran setiap karakternya.

Null‐ terminated String

Null‐ terminated string adalah kumpulan karakter bukan null (#0) yang diakhiri oleh karakter null. Karakter null pertama dalam string ini akan dianggap sebagai akhir dari string. Null‐ terminated string banyak dipakai untuk meng‐ akses Windows API. Implementasi pemrograman dengan menggunakan Null‐ terminated String adalah dengan menggunakan variabel bertipe PChar (Pointer of Char), atau menggunakan array of char. Selain itu, Anda juga bisa menggunakan typecast terhadap variabel tipe string, atau menggunakan function StrPCopy.

3.1.11. Pencabangan dan Pengulangan

Pencabangan adalah mengontrol program sehingga perintah yang dijalankan mengikuti alur tertentu berdasarkan suatu kondisi tertentu. Yang termasuk dalam pencabangan adalah perintah if – then – else, dan perintah case.

Elemen program lain yang juga sangat penting adalah pengulangan atau loop. Loop adalah pengulangan perintah sesuai dengan kondisi tertentu. Dalam object Pascal terdapat 3 (tiga) macam loop, yaitu : for, while, dan repeat, yang masing‐ masing mempunyai ciri tersendiri.

If, Then, Else

Salah satu kata kunci yang mempunyai peran sangat besar dalam pemrograman adalah kelompok kata kunci If, Then, Else. Kata kunci ini digunakan untuk melakukan suatu proses tertentu bila kondisi tertentu dipenuhi, dan menjalankan proses lain jika kondisi tidak terpenuhi.

Bentuk dasarnya adalah

if <ekspresi Boolean> then <statement> [ else <statement>];

Ekspresi adalah sekumpulan perintah dalam object Pascal yang memberikan nilai tertentu. Ekspresi Boolean dalam if di atas adalah ekspresi yang hasilnya adalah tipe data Boolean (True atau False).

Statement adalah sekumpulan perintah dalam object Pascal yang me‐ representasikan aksi tertentu dan akan dijalankan. Sekumpulan statement yang diawali oleh begin dan diakhiri oleh end disebut statement block, dan selalu dapat dianggap sebagai statement tunggal.

Kata kunci else <statement>, bersifat optional, artinya boleh tidak dikutsertakan. Sebelum kata kunci else tidak ada titik koma. Kita buat sebuah contoh berikut ini.

if a>0 then x := 100 else x := 200;

Pada contoh di atas, variabel a akan diperiksa untuk menentukan nilai yang akan diisikan pada variabel x. Jika variabel a nilainya 0, maka x akan diisi dengan 100, jika tidak, maka x akan diisi dengan 200.

Page 38

Case

Kalau if‐ then‐ else adalah pencabangan yang mempunyai dua alternatif, maka Case adalah pencabangan yang mempunyai lebih dari dua alternatif. Bentuknya sebagai berikut ini.

case <expression> of <casevalue> := <statement>;

… <casevalue> := <statement>;

Expression adalah suatu ekspresi yang menghasilkan nilai ordinal, sedangkan casevalue adalah nilai konstan yang akan dibandingkan dengan nilai ekspresi ordinal tersebut.

Contoh adalah : case Ch of

‘A’..’Z’, ‘a’..’z’ : Label1.Caption := ‘Letter’; ‘0’..’9’ : Label1.Caption := ‘Digit’; ‘+’, ‘-‘, ‘*’, ‘/’ : Label1.Caption := ‘Operator’;

else

Label1.Caption := ‘Special Character’;

end;

Berikut ini adalah contoh lain yang akan menggunakan case. Variabel Nilai adalah nilai ujian yang akan diperiksa untuk menghasilkan nilai index. var Nilai : Byte;

begin

case Nilai of 0..34 : Label1.Caption := ‘Nilai E’; 35..54 : Label1.Caption := ‘Nilai D’; 55..74 : Label1.Caption := ‘Nilai C’; 75..84 : Label1.Caption := ‘Nilai B’;

else

Label1.Caption := ‘Nilai A’;

end; end.

For

Loop jenis ini dilakukan untuk pengulangan dengan banyaknya pengulangan yang sudah diketahui. Format dari loop jenis ini sebagai berikut.

for <nilai_awal> to <nilai_akhir> do <statement> …

end;

Page 39

Untuk for yang nilai akhir lebih kecil dari nilai awal, gunakan bentuk berikut ini. for <nilai_awal> downto <nilai_akhir> do

<statement> …

end;

Nilai_awal dan Nilai_akhir adalah ekspresi dengan tipe Integer. Contoh penggunaan for sebagai berikut.

var

I : Integer; X : Integer;

I := 0 to 9 do begin Writeln(‘Iteration value : ‘ + IntToStr(X); Inc (X, 10);

end; end.

While

Loop jenis ini digunakan untuk melakukan pengulangan selama suatu kondisi tertentu terpenuhi. Bentuknya sebagai berikut.

while <kondisi> do begin <statement> …

end;

Contohnya sebagai berikut.

var

I : Integer;

I > -1 do begin Writeln(‘Iterasi ke ‘ + IntToStr(I)); Dec(I);

end;

Memo1.Lines.Add(‘Selesai’);

end; Repeat

Loop jenis ini digunakan untuk melakukan pengulangan sampai suatu kondisi terpenuhi. Perbedaan mendasar antara while dengan repeat adalah pada while pengecekan dilakukan pertama kali sedangkan pada repeat pengecekan dilakukan terakhir. Bentuk repeat sebagai berikut.

Page 40 Page 40

<statement> …

until <kondisi> Contohnya sebagai berikut.

var

I : Integer;

begin

I := 5; Memo1.Clear;

repeat

Memo1.Lines.Add(‘Iterasi ke ‘ + IntToStr(I)); Dec(I);

until

I = -1; Memo1.Lines.Add(‘Selesai’);

end;

3.1.12. Array

Array adalah kumpulan data yang bertipe sama dengan banyaknya elemen tetap. Secara internal, seluruh elemen array tersimpan dalam memori yang contiguous, di mana setiap elemen akan langsung diikuti oleh elemen berikutnya. Untuk meng‐ akses array, dipergunakan indeks yang berada dalam kurung kotak([]), misalnya A[0], A[100], dst.

Keuntungan terbesar ketika kita menggunakan array adalah akses elemenya yang sangat cepat. Secara internal, alamat elemen ke n dari array dapat dihitung dengan n dan ukuran dari array tersebut, oleh karena itu O(A[n]) = 1. Kerugiannya adalah bila kita ingin menyisipkan data ke dalam array atau ingin menghapus elemen array, maka kita harus menggeser semua elemennya. Delphi menyediakan beberapa tipe array, yaitu static array, dynamic array serta open array.

Array Statis (Static Array)

Array statis adalah array yang banyaknya elemen tetap selama program berjalan karena ditentukan pada saat deklarasi. Indeks dari array statis bisa berupa Integer, Char, atau tipe ordinal lainnya. Memori yang dialokasikan untuk array statis adalah banyaknya elemen dikalikan ukuran elemen. Mendefinisikan array statis berukuran besar sebagai variabel lokal procedure/function tidak dianjurkan karena menyebabkan borosnya penggunaan stack.

Pendefinisian Array Statis

Bentuk umum dari array statis adalah :

<NamaArray> = array[Tipe Indeks] of <Tipe Dasar>;

Tipe Indeks adalah tipe yang digunakan untuk melakukan indeksing array. Tipe indeks yang paling sering digunakan adalah [min..maks], min adalah indeks minimum, maks adalah indeks maksimum. Tipe indeks lainnya adalah [Byte], [ShortInt], [Char] atau Tipe ordinal lainnya. Tipe dasar adalah tipe elemen array, bisa tipe elementer seperti Integer, Byte, Double, String, atau Record juga bisa tipe lain seperti TObject (dan turunannya).

Page 41

Perhatikan contoh di bawah ini.

type

ArrayChar = array [Char] of Integer; // Array #0 s.d. #255 dari Integer ArrayByte = array [Byte] of Char; // Array 0 s.d. 255 dari Char ArrayInt = array [ShortInt] of string; // Array -128 s.d. 127 dari string

Sebagai contoh lain, untuk mendefinisikan array yang terdiri atas 5 (lima) elemen integer, kita dapat melakukannya dengan cara sebagai berikut :

var

MyArray : array[0..4] of integer

Untuk mengaksesnya, gunakan cara sebagai berikut ini.

var

MyArray : array [0..4] of integer

begin

MyArray[ 0] := -20; MyArray[ 1] := -10; MyArray[ 2] := 0; MyArray[ 3] := 10; MyArray[ 4] := 20;

x := MyArray[ 2] + MyArray[ 3] ;

end; Array Dinamis (Dynamic Array)

Array dinamis adalah array yang banyaknya elemen dapat diubah pada saat runtime. Indeks dari array dinamis selalu diawali dengan 0, dan banyaknya elemen dapat ditentukan dengan menggunakan SetLength.

Mendefinisikan Array Dinamis

Pendefinisian array dinamis mirip dengan array statis tetapi tidak menyebutkan tipe indeks‐ nya. Sintaks pendefinisian array dinamis sebagai berikut ini.

type

<NamaTipe> = array of <Tipe Dasar>;

var

<Nama Variabel> : array of <Tipe Dasar>;

Page 42

Tipe dasar adalah tipe elemen array, bisa tipe elementer seperti Integer, Byte, Double, String, atau Record juga bisa tipe lain seperti TObject (dan turunannya).

type

TMyIntegerArray = array of Integer; TMyFloatArray = array of Double;

var

A : array of string; B : array of boolean; C : array of TComponent;

Pada awalnya variabel array dinamis berisi nil, di mana banyaknya elemen dari array dinamis adalah 0 (tidak mempunyai elemen), sehingga kita perlu memanggil procedure SetLength untuk menentukan berapa ukuran array dinamis yang diinginkan.

var

X : array of Integer; vSize : Integer;

begin

vSize := 100; SetLength(X, vSize); for i := 0 to vSize-1 do begin

X[ i] := I;

end; end;

Array Terbuka (Open Array)

Array Terbuka adalah parameter dalam procedure atau function yang dapat dilewati oleh array statis ataupun array dinamis. Array statis yang dilewatkan pun tidak tergantung dengan tipe indeknya. Batas indeks minimum array terbuka adalah 0, meskipun variabel array yang dilewatkan batas minimumnya bukan 0. Batas maksimumnya tergantung ukuran array yang dilewatkan.

Perhatikan contoh kode berikut ini. function Array2Str(vNamaArray : string; vArray : array of integer) : string;

var i : Integer; vLow : Integer;

begin

result := ‘ ‘; for i := Low(vArray) to High(vArray) do begin

result := result+Format(‘%s[ %d] : %d’, [ vNamaArray, i, vArray[ i]]); result := result+#13#10;

end; end;

Pada contoh di atas, parameter vArray adalah array terbuka sehingga bisa dilewati oleh array statis dengan berbagai tipe indeks.

3.1.13. Record

Record adalah kumpulan data yang setiap elemennya dapat memiliki tipe yang berbeda. Elemen data ini disebut dengan Field. Untuk menggunakan data jenis record ini, pertama kita harus mendeklarasikan

Page 43 Page 43

type

TMyRecord = record Nama : string; Alamat : string; Kota : string; KodePos : string[ 5];

end; var

MyRecordVar : TMyRecord;

begin

MyRecordVar.Nama := ‘Diego Maradona’; MyRecordVar.Alamat := ‘Jalan Gunung Merapi No.99’; MyRecordVar.Kota := ‘Buenos Aires’; MyRecordVar.KodePos := ‘56777’;

end; Kata Kunci With

Bila kita berbicara tentang record, maka mau tidak mau kita harus berbicara sebuah kata kunci, yaitu with. Meskipun demikian penggunaan kata kunci ini tidak terbatas untuk penggunaan record saja. Kata kunci ini digunakan untuk mempermudah pemrograman dengan menggunakan record. Untuk mempermudah pembahasan, kita tulis ulang contoh yang telah dibahas di atas, sebagai berikut.

MyRecordVar.Nama := ‘Diego Maradona’; MyRecordVar.Alamat := ‘Jalan Gunung Merapi No.99’; MyRecordVar.Kota := ‘Buenos Aires’; MyRecordVar.KodePos := ‘56777’;

Dengan menggunakan kata kunci with, kita dapat menyederhanakan perintah di atas sebagai berikut ini. with MyRecordVar do begin

Nama := ‘Diego Maradona’; Alamat := ‘Jalan Gunung Merapi No.99’; Kota := ‘Buenos Aires’; KotaPos := ‘56777’;

end;

3.1.14. Pointer

Dalam sistem komputer, semua bagian di memory dapat diasosiasikan dengan suatu nilai numerik yang disebut address atau alamat di memory. Dengan demikian, setiap bagian di memory dapat di‐ akses dengan menggunakan alamat. Pointer adalah tipe data dalam bahasa pemrograman yang berisi alamat di memory tersebut. Ini berarti pointer adalah sebuah tipe data yang isinya menunjuk ke data lain di memory.

Dalam bahasa pemrograman Delphi, khususnya pada tingkat yang lebih lanjut, peran pointer sangatlah penting, meskipun di sisi lain dapat menimbulkan malapetaka. Pointer mempunyai kekuatan besar dalam

Page 44 Page 44

Dasar‐ dasar penggunaan Pointer

Seperti telah dijelaskan sebelumnya, pointer adalah tipe data yang dapat menunjuk ke lokasi tertentu di memori. Untuk mendefinisikan sebuah variabel pointer, kita bisa menggunakan <tipe data> atau bisa menggunakan Pointer. Perhatikan contoh berikut ini.

var p1 : ^Integer; // pointer to integer p2 : ^Real;

// pointer to real number p3 : Pointer // untyped pointer

Variabel p1 adalah variabel dengan tipe pointer to integer, artinya nilai yang ditunjuk oleh p1 adalah nilai bertipe integer. Variabel p2 adalah pointer to real, artinya nilai yang ditunjuk oleh variabel ini adalah bilangan real. Sementara variabel px adalah untyped pointer, artinya tipe yang ditunjuk oleh variabel pointer ini tidak ditentukan. Variabel bertipe untyped pointer akan kompatibel dengan variabel pointer bertipe apa pun. Menggunakan untyped pointer pada umumnya lebih fleksibel tetapi kurang aman.

3.1.15. Function dan Procedure

Function dan Procedure adalah suatu blok program yang dapat dipanggil oleh bagian lain dalam program. Setelah dipanggil, function akan mengembalikan nilai, sedangkan procedure tidak. Karena menghasilkan nilai, function bisa menjadi bagian dari suatu ekspresi, dan bisa juga nilainya di‐ assign‐ kan ke suatu variabel tertentu. Procedure tidak menghasilkan nilai, sehingga tidak dapat menjadi bagian dari suatu ekspresi. Demikian juga, procedure tidak dapat di‐ assign‐ kan ke variabel. Berikut ini contoh pemanggilan function dan procedure.

X := (MyFunction(Y)+A)*B; MyFunction(P);

MyProcedure(X); Function bisa dipanggil seperti procedure (tanpa perlu dipergunakan nilainya), seperti contoh di atas.

Pendeklarasian Function

Deklarasi untuk function sebagai berikut ini. function <NamaFunction>(<Parameter>) : <Tipe Hasil>;

<directives>; <localDeclarations>;

begin

<Pernyataan – pernyataan>

end;

Nama Function mengacu pada ketentuan identifier. Parameter berbentuk daftar nama parameter dan tipenya akan dibahas secara khusus. Tipe hasil adalah semua tipe data yang mungkin. Directives mencakup calling conventions, forward declaration, serta overloading.

Local declaration adalah deklarasi constant, tipe data, variabel local, ataupun function dan procedure. Page 45

Contoh pendeklarasian dari function sebagai berikut ini. function MyFx : Integer;

Result adalah variabel yang sudah terdefinisi secara internal untuk menyimpan hasil keluaran function. Tipe variabel result sama dengan deklarasi tipe hasil function.

Kita juga dapat menggunakan nama function untuk mengembalikan hasil, seperti terlihat pada contoh di bawah ini.

function MyFx : Integer;

begin

MyFx := 17;

end; Pendeklarasian Procedure

Seperti telah disebutkan di atas, perbedaan antara function dan procedure sangatlah tipis. Deklarasinya pun sangat mirip seperti terlihat di bawah ini.

function <NamaProcedure>(<Parameter>); <directives>; <localDeclarations>;

begin

<Pernyataan – pernyataan>

end;

Nama Procedure mengacu pada ketentuan identifier. Parameter berbentuk daftar nama parameter dan tipenya akan dibahas secara khusus. Directives mencakup calling conventions, forward declaration, serta overloading .

Local declaration adalah deklarasi constant, tipe data, variabel local, ataupun function dan procedure. Contoh dari procedure sebagai berikut ini. procedure NumString(N : Integer; var S : string);

var

V : Integer;

begin

V := Abs(N); S := ‘ ‘;

repeat

S := Chr(V mod 10 + Ord(‘0’)) + S; V := V div 10;

until

V = 0; if N < 0 then S := ‘-‘ + S;

end;

Page 46

Parameter dalam Function/Procedure

Sebagian besar function dan procedure mempunyai daftar parameter di bagian kepalanya. Seperti contoh berikut ini.

function Power(X : Real; Y : Integer) : Real ; Yang merupakan daftar parameter adalah (X : Real; Y : Integer).

Daftar parameter adalah sekumpulan deklarasi parameter yang dipisahkan dengan tanda titik koma (;) dan berada dalam kurung. Setiap parameter adalah deklarasi nama parameter yang dipisahkan dengan koma, diikuti dengan titik dua dan diakhiri dengan tipe data, mirip seperti ketika kita mendefinisikan variabel. Beberapa parameter bisa diikuti tanda = untuk menentukannya sebagai default parameter. Deklarasi setiap parameter bisa diawali dengan var, const, atau out. Bila parameter dideklarasikan tanpa var , const, atau out, maka passing parameter‐ rnya dilakukan dengan cara By Value. Artinya function mempunyai variabel parameter tersendiri dan nilai yang dikirimkan ke function/procedure akan di‐ copy ke variabel parameter tersebut. Bila didefinisikan sebagai var atau out, maka passing parameter akan dilakukan By Reference. Artinya function tidak mempunyai variabel parameter tetapi hanya alamat dari nilai yang diisikan. Jadi, aksi terhadap parameter sebenarnya langsung kepada variabel yang dilewatkan pada parameter tersebut. Bila menggunakan const, variabel akan di‐ passing mirip dengan By Value, tetapi compiler akan melakukan optimasi tertentu bila parameter yang dilewatkan adalah string atau record.

Bila kita mendeklarasikan parameter dengan tipe const maka kita tidak dapat mengubah nilai parameter tersebut. Akan tetapi, bila yang dilewatkan adalah reference ke objek, kita masih bisa mengubah property‐ nya. Demikian juga bila yang dilewatkan adalah pointer, kita masih dapat mengubah data pada alamat yang ditunjuk oleh pointer tersebut.

Deklarasi parameter dengan var dan out digunakan untuk mendefinisikan variabel yang dapat menerima hasil proses dalam function atau procedure, artinya dalam function atau procedure variabel dengan tipe ini biasanya akan di‐ assign suatu nilai tertentu yang merupakan hasil proses. Bedanya adalah bila parameter didefinisikan by value atau didefinisikan sebagai const, maka variabel dengan nilai kompatibel dapat dilewatkan. Tetapi bila parameter didefinisikan dengan var atau out, maka variabel yang dilewatkan harus identik. Perhatikan contoh berikut ini.

function MyFunction (x : Integer; var y : Integer; out z : Integer) : Integer;

begin

Y := x+y; Z := x*x;

end;

procedure TForm1.ButtonClick ( Sender : TObject); var x, y, z : Cardinal;

begin // pemanggilan function MyFunction

MyFunction (x, y, z);

end;

Page 47

Pada saat MyFunction dipanggil, x bisa dilewatkan karena cardinal dan integer adalah kompatibel. Tetapi y dan z tidak bisa dilewatkan karena penggunaan deklarasi var dan out mensyaratkan variabel yang dilewatkan harus identik.

Default Parameter

Default parameter adalah parameter function atau procedure yang mempunyai default sehingga pemanggilnya bisa mengabaikan parameter tersebut. Persyaratan dari parameter seperti ini adalah :

 Parameter bertipe by value atau const (var atau out tidak bisa) dan tidak boleh untyped.  Parameter ini harus berada di bagian paling belakang dalam daftar parameter.  Nilai yang diisikan sebagai default menggunakan ekspresi mengikuti ketentuan ekspresi untuk

konstanta (constant expression). Misalnya kita mempunyai sebuah procedure yang dideklarasikan sebagai berikut ini.

procedure FillArray (A: array of Integer; Value: Integer = 0);

Maka kita dapat memanggilnya tanpa mengikutsertakan parameter yang mempunyai default.

FillArray(MyArray);

Atau kita bisa juga melewatkan parameter default tersebut untuk meng‐ override nilai default‐ nya.

FillArray (MyArray, 1);

Deklarasi Forward

Bila kita ingin sebuah function dalam suatu unit dapat diakses oleh unit lain, maka kita harus mendeklarasikan function tersebut (bagian kepala function) di bagian interface.

unit Unit2;

interface

uses SysUtils; function MyFunction(x: Integer; var y: Integer;

out z: Integer): Integer;

implementation

function MyFunction(x: Integer; var y: Integer; out z: Integer); Integer;

begin

y := x+y; z := x*z;

end; end.

Bila kita sudah mendefinisikan sebuah function pada bagian interface, maka di bagian manapun dalam implementation kita dapat memanggil function tersebut. Berbeda jika function tidak didefinisikan di bagian interface, maka function pemanggil harus berada di bawah deklarasi function yang dipanggil.

Page 48

Kadang kala kita tidak ingin function yang kita definisikan bisa diakses oleh unit lain, misalnya jika function tersebut bersifat internal. Tetapi di sisi lain kita ingin function tersebut dipanggil meskipun pemanggilnya kita tulis di atas function yang dipanggil. Pada kasus ini kita dapat mendeklarasikan function tersebut dengan forward declaration. Kita tinggal meng‐ copy kepala function tersebut di atas dan menambahkan kata kunci forward, seperti contoh di bawah ini.

implementation

function MyFunction(x: Integer; var y: Integer; out z: Integer); Integer; forward

Calling Conventions

Calling convention akan menentukan bagaimana parameter‐ parameter suatu procedure/function akan dilewatkan, meliputi urutan parameter, penggunaan register dalam processor, serta pengaturan penggunaan stack. Untuk menentukan calling convention mana yang akan digunakan, kita dapat menambahkan register pascal, cdecl, stdcall, atau safecall. Bila tidak ada pendefinisian calling convention secara eksplisit, maka Delphi akan menggunakan register. Biasanya kita hanya perlu mendefinisikan calling convention secara eksplisit bila kita berinteraksi dengan dll (dynamic linked library). Calling convention yang paling efisien adalah register karena meminimalkan penggunaan stack. Akan tetapi bila kita bekerja dengan dll di Windows, biasanya kita akan menggunakan stdcall ataupun dengan safecall. Sedangkan cdecl biasanya digunakan oleh library yang dibuat dengan bahasa C.

Overloading Function/Procedure

Kita dapat mendefinisikan 2 (dua) buah function atau procedure dengan nama yang sama dalam satu unit asal menggunakan directive overload dan parameter kedua fungsi harus berbeda (tipenya atau banyaknya parameter, atau keduanya). Function atau procedure yang seperti ini biasanya disebut dengan istilah overloading procedure. Perhatikan contoh berikut ini.

function Divide(X, Y: Real) : Real; overload;

begin

Result := X/Y;

end;

function Divide(X, Y: Integer) : Integer; overload;

begin

Result := X div Y;

end; Variabel bertipe Prosedural

Kita dapat mendefinisikan suatu variabel yang bertipe procedure atau function sehingga variabel tersebut bisa diisi nilainya dengan function atau procedure yang kompatibel. Variabel bertipe procedure atau function ini biasa disebut dengan istilah procedural types atau bertipe prosedural. Berikut ini contoh dari pendefinisian variabel sebagai tipe prosedural.

type

TIntegerFunction = function : Integer; TProcedure = procedure; TStrProc = procedure(const S: string); TMathFunc = function (X : Double) : Double;

var

F : TIntegerFunction; Proc : TProcedure;

Page 49

SP : TStrProc; M : TMathFunc;

Contoh berikut ini adalah tipe prosedural yang digunakan dalam parameter sebuah procedure. Procedure FuncProc( P : TIntegerFunction);

begin

end;

Misalkan kita mempunyai function atau procedure yang kompatibel dengan tipe‐ tipe prosedural yang sudah kita definisikan.

function F1 : Integer;

function F2 (x : double) : double;

begin

result := x;

end;

procedure F1;

begin // end;

procedure F2 (const S : string);

begin // end;

Suatu function atau procedure dikatakan kompatibel dengan suatu tipe prosedural bila daftar parameter dan tipenya sama dengan yang didefinisikan pada tipe prosedural tersebut, sedangkan nama setiap parameter tidak harus sama. Untuk function ditambah bahwa hasilnya juga harus bertipe sama.

Selanjutnya kita dapat meng‐ assign‐ kan procedure/function tersebut ke dalam variabel bertipe prosedural, seperti contoh berikut ini.

F : = F1; M := F2; Proc := P1; SP := P2;

Kemudian kita bisa memanggil function (yang sudah di‐ assign‐ kan) melalui variabel tersebut. procedure TForm1.ButtonClick(Sender : TObject);

begin

X := F; Y := M (1); Proc; SP (‘Testing’);

end;

Page 50

Variabel bertipe prosedural sebenarnya adalah variabel pointer. Nilai default dari variabel ini adalah nil. Bila variabel ini berisi nil, maka memanggil function melalui variabel yang bernilai nil akan berakibat dibangkitkannya exception. Cara termudah apakah variabel bernilai nil atau tidak, kita dapat menggunakan function Assigned. Meskipun variabel bertipe prosedural adalah variabel pointer, tetapi ada perbedaan yang sangat penting antara variabel ini dengan pointer. Misalkan F adalah variabel prosedural dan Pt adalah variabel bertipe pointer. Memanggil F secara langsung berarti memanggil function/procedure yang ditunjuk oleh F. Sedangkan bila kita langsung memanggil Pt, maka berarti kita mengambil alamat yang ditunjuk oleh Pt tersebut. Untuk mengetahui alamat function yang ditunjuk oleh

F, maka kita harus menggunakan @F sedangkan untuk mengetahui alamat variabel dari F sendiri maka kita harus menggunaka @@F.