jurnal pascal 2 tipe data

Upload: rina-dewi-setyowati

Post on 18-Oct-2015

28 views

Category:

Documents


5 download

TRANSCRIPT

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 177

    ALOKASI DAN DEALOKASI MEMORI DALAM PENGGUNAAN TIPE DATA POINTER PADA PASCAL

    Ni Wayan Wisswani

    Jurusan Teknik Elektro, Politeknik Negeri Bali

    Bukit Jimbaran, P.O.Box 1064 Tuban Badung- Bali Phone +62-361-701981, Fax : +62-361-701128, E-Mail : [email protected]

    Abstrak : Salah satu kelemahan data bertipe array dalam Pascal adalah variabel tersebut harus dideklarasikan terlebih dahulu dengan menyebutkan ukurannya. Ukuran variabel tersebut tidak dapat dirubah selama program dijalankan, sehingga saat menangani jumlah data yang besar dengan jumlah data yang belum diketahui array tidak dapat digunakan. Untuk mengatasi kelemahan array dapat dilakukan dengan tipe data pointer. Dengan tipe data pointer akan dilakukan pengalokasian dan dealokasi ruang memori. Hanya saja saat program menggunakan pointer dengan beberapa operasi dan memori belum dibebaskan maka akan terjadi perbedaan hasil run antara eksekusi pertama dengan eksekusi kedua program yang sama. Hal ini terjadi karena ruang memori masih digunakan untuk menyimpan nilai ataupun alamat dan tetap disimpan sampai eksekusi kedua dan seterusnya. Kata kunci : array, pointer, alokasi memori, dealokasi memori Abstract : One of the weaknesses of the array data type in Pascal was this variable must was declared before by naming his measurement. The measurement of this variable could not be changed while the program was undertaken, so as when handling the number of datas that was big with the number of datas that was not yet known array could not be used. To overcome the weakness array could be carried out with the type of the data pointer. With the type of the data pointer will be carried out by the allocating and dealocating of memory space. During the program used pointer with several operations and the memory was not yet released will make a diferent result then the difference of results will happen run between the first execution and the execution to two same programs. This condition happened because of memory space still used to kept the value or the address and continued to be kept until the second execution. Keywords : array, pointer, allocating memory, deallocating memory

    I. PENDAHULUAN

    1.1 Latar belakang Komunikasi manusia dan komputer dilakukan dengan menggunakan bahasa komunikasi yang disebut dengan bahasa pemrograman. Komputer akan mengerti komunikasi yang dijalin karena di dalam bahasa pemrograman terdapat interpreter dan compiler. Interpreter merupakan sebuah program yang mengeksekusi instruksi yang ditulis dalam bahasa pemrograman. Interpreter menterjemahkan instruksi ke dalam bahasa tingkat tinggi ke dalam bentuk antara yang kemudian dieksekusi (dijalankan) oleh program, sebaliknya compiler menterjemahkan instruksi dalam bahasa pemrograman ke dalam bahasa mesin. [1] Baik interpreter maupun compiler biasanya tersedia pada bahasa pemrograman tingkat tinggi, yaitu bahasa pemrograman yang menggunakan bahasa sehari-hari manusia. Pascal adalah salah satu bahasa pemrograman tingkat tinggi . Pascal adalah sebuah bahasa pemrograman terstruktur yang sederhana dan ekspresif karena memiliki struktur yang sederhana dan sangat

    mendekati bahasa manusia (bahasa Inggris) sehingga mudah dipelajari dan dipahami. Dalam Pascal terdapat tipe data array yang merupakan tipe terstruktur yang memungkinkan program dapat menampung beberapa data sejumlah komponen yang dideklarasikan dan bertipe data sama[2]. Suatu array mempunyai jumlah komponen yang banyaknya tetap. Banyaknya komponen dalam suatu array ditunjukkan oleh suatu indeks. Sebagai contoh dideklarasikan variabel sebagai berikut

    x = array[ 1 100] of real;

    Deklarasi di atas secara logika menyatakan bahwa variabel x akan dapat menampung data maksimal 100 nilai bertipe real dan disimpan didalam memori dengan cara sebagai berikut ini

    |1|2|3|4|5|6|7|8|..|100|

    adapun permasalahan yang akan dihadapi dengan implementasi array adalah :

    a. Bila pada kenyataannya data yang disimpan tidak sebanyak ruang yang disiapkan maka akan ada tempat yang

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 178

    tidak terpakai ( umumnya yang diisi tidak penuh ), atau biasa disebut waste space.

    b. Apabila sudah dialokasikan 100 tempat tetapi yang diperlukan 175 maka tempat kurang atau tempat tidak mencukupi sehingga kelebihan data tidak dapat disimpan

    Berdasarkan permasalahan tersebut di atas maka dibuatlah struktur data yang alokasinya dinamis dengan alokasi memori yang disesuaikan dengan kebutuhan pada saat program dijalankan yang diciptakan didalam body program dan disebut dengan pointer. Menurut (Santosa, 2004) [3] Pointer adalah suatu tipe data yang dapat digunakan untuk mengalokasikan dan mendealokasikan (mengambil / mengurangi) pengingat secara dinamis, yaitu sesuai dengan kebutuhan pada saat suatu program dieksekusi. Pointer akan dapat menampung lebih dari satu jenis tipe data yang dibentuk dalam tipe data bentukan record. Pointer berisi alamat dari suatu variabel yang lain yang akan menunjuk ke data berikutnya yang akan dialokasikan [4] Dalam implementasinya penggunaan beberapa operasi dasar pada pointer yang digunakan untuk mengalokasikan atau mendealokasikan alamat ruang memori dapat menimbulkan kesalahan dalam penggunaan ruang memori komputer. Hal ini akan menyebabkan hasil program saat dijalankan akan tampak berbeda dengan hasil yang diharapkan dari algoritma program. Berdasarkan pemaparan di atas penulis merasa perlu dilakukan kajian untuk mengetahui bagaimana proses pengalamatan tipe data pointer dan pemanfaatan alokasi memori saat program yang menggunakan tipe data pointer pada Pascal diimplementasikan.

    1.2 Rumusan masalah Berdasarkan uraian di atas masalah yang ingin diangkat dalam penelitian ini adalah :

    1. Bagaimana proses pengalamatan tipe data pointer dalam pascal ?

    2. Bagaimana alokasi dan dealokasi memori saat program yang menggunakan tipe data pointer diimplementasika?.

    1.3 Tujuan penelitian Pada penelitian ini mempunyai tujuan untuk mengetahui proses yang terjadi pada alokasi dan dealokasi ruang memori saat implementasi tipe data pointer dengan melakukan operasi copy pointer, copy nilai dan dispose secara bersama maupun terpisah.

    II. METODE PENELITIAN

    2.1 Studi pustaka dan literatur Tahap ini adalah tahapan untuk melakukan

    pencarian teori berkaitan dengan tipe data pointer dan teknik implementasinya dengan menambah wawasan dari buku-buku dan sumber-sumber lain yang dapat menunjang pemecahan masalah 2.2 Metode pengembangan sistem 2.2.1 Pembuatan program Membuat program dengan pointer sederhana dalam bahasa pemrograman Pascal 2.2.2 Pengujian program Melakukan pengujian terhadap implemetasi program yang dibuat. 2.2.3 Analisis ruang memori komputer

    Melakukan analisis pemanfaatan alokasi dan dealokasi memori komputer dengan pemakaian tipe data pointer pada program yang sedang diuji

    III. HASIL DAN PEMBAHASAN

    Pointer [2] adalah tipe data yang digunakan untuk menyimpan alamat memori sebuah variable, bukan menyimpan nilai datanya. Pointer diciptakan untuk mengatasi kelemahan tipe data array yang bersifat statis. Bentuk umum deklarasi pointer adalah sebagai berikut

    Type Pengenal = ^simpul ; Simpul = tipe data ;

    Pengenal adalah nama variable yang menyatakan tipe data pointer, Simpul adalah nama simpul pointer dimana tanda ^ di depan simpul harus ditulis apa adanya karena itu menunjukkan bahwa pengenal bertipe pointer, dan tipe data adalah tipe data dari simpul yang dapat berupa tipe data sembarang, misalnya char, integer, atau real. Pointer digambarkan seperti berikut ini :

    Gambar 1. Visualisasi pointer dan memori komputer

    Pascal membuat pointer dengan prosedur standar new. Bila p adalah variabel pointer ke tipe node maka prosedur new(p) akan menghasilkan suatu variabel dinamis bertipe node dan memberikan alamatnya ke pointer p. Untuk menghapus, merusak atau mengembalikan memori yang dipakai oleh variabel dinamis dapat digunakan prosedur dasar dispose, misalnya dispose(p) berarti mengembalikan memori yang ditempati oleh variabel dinamis yang ditunjuk oleh pointer p ke

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 179

    sistem. Selain membuat dan menghapus pointer terdapat 2 operasi lain pada tipe data pointer, yaitu :

    1. Copy pointer, sehingga sebuah simpul akan ditunjuk oleh lebih dari sebuah pointer

    2. Copy isi dari simpul, sehingga dua atau lebih simpul yang ditunjuk oleh pointer yang berbeda mempunyai isi yang sama.

    Akan diimplementasikan beberapa program pointer sederhana dalam pascal yang akan digunakan untuk menggambarkan perbedaan hasil alikasi memori untuk operasi copy pointer dan copy nilai

    a. Program pertama

    program point1; uses wincrt; type simpul = ^dataku; dataku = record namaku : string ; alamatku : string; end; var dataku1,dataku2 :simpul; begin writeln ('program pointer dasar'); New (dataku1); New (dataku2); writeln(''); dataku1^.Namaku:='wisswani'; dataku1^.Alamatku :='Yogyakarta'; writeln('data pada pointer data1'); writeln(dataku1^.namaku); writeln(dataku1^.alamatku); writeln(''); writeln('data pada pointer data2'); writeln(dataku2^.namaku); writeln(dataku2^.alamatku); dataku2^ := dataku1^; writeln(''); writeln('setelah proses copi nilai ke pointer'); writeln('data pada pointer data2'); writeln(dataku2^.namaku); writeln(dataku2^.alamatku); dataku2 := dataku1; writeln(''); writeln('setelah proses tunjuk pointer'); writeln('data pada pointer data2'); writeln(dataku2^.namaku); writeln(dataku2^.alamatku); dispose(dataku2); end. Hasil dari program ini saat dijalankan adalah

    Gambar 2. Hasil run 1 program pertama

    Saat program yang sama ini dijalankan kedua kalinya maka hasil akan menjadi seperti berikut ini

    Gambar 3. Hasil run 2 program pertama

    Perbedaan yang terjadi dari hasil run pertama dan kedua disebabkan oleh keadaan saat dirun pertama kali ruang alamat memori yang terisi berbeda dengan saat program di jalankan untuk kedua kalinya. Sebagai penggambaran alokasi memori yang terjadi adalah sebagai berikut ini pada saat run yang pertama saat program pertama kali dijalankan alokasi memori yang terbentuk seperti berikut ini :

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 180

    Hal ini menyebabkan saat run pertama kali data pada poiner data 2 tampak kosong dan terisi dengan simbol-simbol. Selanjutnya setelah perintah dataku2^ := dataku1^; akan terjadi proses pengcopyan nilai yang ditunjuk oleh pointer dataku1 ke pointer dataku2 sehingga alokasi memori menjadi seperti berikut ini :

    Setelah perintah dataku2 := dataku1; dilakukan copy arah pointer menyebabkan pointer dataku2 menuju pointer dataku1 sehingga alokasi ruang memori menjadi seperti berikut ini:

    Hal ini menyebabkan ruang memori yang terpakai untuk menyimpan nilai dataku 2 menjadi telepas dari penunjuk dan selanjutnya dengan perintah dispose ruang kosong ini dan akan didealokasi kembali. Proses dealokasi inilah yang menyebabkan saatdirun kedua kali posisi awal data pointer data2 menjadi error. Hal ini disebabkan karena dengan proses dispose konsekuensinya adalah terlepasnya pointer dan data tidak dapat dimasup lagi sehingga seolah-olah terjadi error.

    b. Program kedua

    program alamatpointer; uses wincrt; var p,q,r,s : ^string; nilai : string; begin clrscr; nilai:='ini string nilai!!!'; p:=@nilai; new(p); new(q); new(r); new(s); q^:='ini isi pointer q!!!'; r:=q; s^:=q^; writeln('alamat pointer p = ',seg(p^):4,':',ofs(p^):4,'; isi pointer p = ',p^); writeln('alamat pointer q = ',seg(q^):4,':',ofs(q^):4,'; isi pointer q = ',q^); writeln('alamat pointer r = ',seg(r^):4,':',ofs(r^):4,'; isi pointer r = ',r^); writeln('alamat pointer s = ',seg(s^):4,':',ofs(s^):4,'; isi pointer s = ',s^);

    readln; end.

    Saat program ini di-run maka hasil yang diperoleh adalah sebagai berikut ini :

    Gambar 4. Hasil run program 2

    Terlihat pada hasil run isi pointer p dalam keadaan kosong. Ini terjadi karena proses alokasi memori dalam komputer yang bila digambarkan alokasi ruang memori yang terpakai saat program ini dijalankan adalah sebagai berikut :

    Gambar 5. Alokasi memori program 2 Pada program ini dibuat 4 variabel pointer yang bertipe string, yaitu p, q, r, s. Dan sebuah variabel dengan nama nilai yang bertipe juga string (bukan pointer). Pertama-tama variabel nilai diisi dengan nilai ini string nilai!!!. Kemudian variabel p (pointer) menunjuk alamat dari variabel nilai dengan operator @, sehingga variabel p juga berisi ini string nilai!!!. Kemudian dipesan tempat pada heap dengan prosedur New untuk variabel q. Kemudian variabel q diisi ini isi pointer q!!!. Setelah itu variabel r menunjuk alamat dari variabel q, sehingga alamat maupun isinya sama. Kemudian variabel s diisi dengan nilai dari variabel q, tapi dalam hal ini hanya nilainya saja, sedangkan alamatnya tidak. Bila diperhatikan tampak hasil isi pointer P kosong, namun apabila dilakukan perubahan dengan memindahkan perintah new(p) sehingga listing menjadi seperti berikut ini

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 181

    program alamatpointer; uses wincrt; var p,q,r,s : ^string; nilai : string; begin clrscr; nilai:='ini string nilai!!!'; new(p); p:=@nilai; new(q); new(r); new(s); q^:='ini isi pointer q!!!'; r:=q; s^:=q^; writeln('alamat pointer p = ',seg(p^):4,':',ofs(p^):4,'; isi pointer p = ',p^); writeln('alamat pointer q = ',seg(q^):4,':',ofs(q^):4,'; isi pointer q = ',q^); writeln('alamat pointer r = ',seg(r^):4,':',ofs(r^):4,'; isi pointer r = ',r^); writeln('alamat pointer s = ',seg(s^):4,':',ofs(s^):4,'; isi pointer s = ',s^); readln; end. Program diatas akan menyebabkan hasil run program akan menjadi seperti berikut ini :

    Gambar 6. Hasil run kedua program 2

    Hasil yang tampak berbeda, pada hasil program kedua yang sudah dimodifikasi ini terlihat isi pointer p tidak lagi kosong tetapi telah terisi nilai ini string nilai. Hal ini terjadi karena alokasi ruang memori juga mengalami perubahan menjadi seperti gambar berikut

    Gambar 7. Alokasi memori program kedua

    d.Program ketiga

    program pointcopipointerfinal; uses wincrt; type simpul = ^a; a = record nama : string ; alamat : string; end; var a1,a2:simpul; begin new(a1); new(a2); writeln('ini proses copy pointer'); a1^.nama :='wayan wisswani'; a1^.alamat := 'kuta'; writeln ('data dipointer 1 sebelum proses copi yang diinput adalah'); writeln('namanya ', a1^.nama,' alamatnya ' , a1^.alamat); writeln ('data dipointer 2 sebelum proses copi yang diinput adalah'); writeln('namanya ', a2^.nama,' alamatnya ' , a2^.alamat); a1:=a2; writeln(''); writeln ('data dipointer 1 setelah proses copi dan nilai x2 belum diisi data adalah'); writeln('namanya ', a1^.nama,' alamatnya ' , a1^.alamat); writeln(''); writeln ('data dipointer 2 setelah proses copi dan nilai 2 belum diisi data adalah'); writeln('namanya ', a2^.nama,' alamatnya ' , a2^.alamat); writeln(''); a2^.nama :='bayu angkasa'; a2^.alamat := 'jimbaran'; writeln ('data dipointer 2 yang diinput baru adalah'); writeln ('namanya ', a2^.nama,' alamatnya ' , a2^.alamat); a1:=a2; writeln ('data dipointer 1 setelah proses copi ke 2 kalinya dan nilai 2 diisi data adalah'); writeln('namanya ', a1^.nama,' alamatnya ' , a1^.alamat); writeln(''); writeln ('data dipointer 2 setelah proses copi adalah'); writeln('namanya ', a2^.nama,' alamatnya ' , a2^.alamat); dispose(a1); end. Berikut ini adalah hasil yang tampil saat program di jalankan

  • JURNAL LOGIC. VOL. 11. NO.3. NOPEMBER 2011 182

    Gambar 9. Hasil run program 3

    Pada awal program dijalankan perintah new akan mengalokasi memori dengan pointer a1 dan a2 seperti berikut ini

    Kemudian perintah a1^.nama akan melakukan proses pengisian nilai sehingga alamat yang ditunjuk pointer a1akan membuat alamat yang ditunjuk akan terisi nilai seperti berikut ini :

    Saat dilakukan copy pointer alokasi memori menjadi :

    Hal inilah yang menyebabkan hasil run program menjadi kosong, kemudian nilai akan diisi ke pointer kedua sehingga nilai akan tergambar seperti berikut

    Sehingga hasil akhir baik isi nilai pointer a1 dan a2 bernilai bayu angkasa dan jimbaran. Apabila listing program di atas dirubah dengan memindahkan perintah dispose ke posisi setelah perintah new(a1); dan new(a2) maka akan diperoleh hasil seperti yang tampak sebagai berikut

    Gambar 10. Hasil run modifikasi program 3

    Hal ini terjadi karena pointer a1 pada run sebelumnya sudah dilakukan dispose sehingga pointer a1 akan didealokasi hanya saja pada run ke dua pointer a1 diisi dengan nilai wayan kuta sementara pointer a2 karena run sebelumnya masih berisi nilai bayu angkasa dan jimbaran sehingga pointer sebagai penunjuk mengalami error karena ruang memori yang dialokasi mengarah pada pointer yang sama.

    iv. SIMPULAN Berdasarkan beberapa kajian di atas

    maka dapat diambil beberapa kesimpulan : 1. Pada tipe pointer ruang memori pada alamat

    yang diacu dapat dialokasikan saat diminta dan dikembalikan ke sistem bila tidak diperlukan lagi.

    2. Perintah copy pointer akan mengkopi alamat, sedangkan copy nilai untuk mengkopi nilai dari sebuah alamat.

    3. Saat perintah dispose diberikan memori dengan pointer tertentu dibebaskan tetapi masih berisi alamat ke sel memori lain dengan resiko data tidak dapat dimasup lagi

    4. Proses run yang menghasilkan hasil berbeda dengan algoritma desebabkan karena pada saat tertentu alokasi memori masih sedang terpakai oleh pointer DAFTAR PUSTAKA

    [1] Abdul Kadir. 2001. Pemrograman Pascal Jilid 1. Yogyakarta: ANDI OFFSET.

    [2] Abdul Kadir. 2001. Pemrograman Pascal Jilid 2. Yogyakarta: ANDI OFFSET.

    [3] Insap Santosa. 2004. Struktur Data Menggunakan Turbo Pascal 6.0. Yogyakarta: ANDI OFFSET.

    [4] Teddy Marcus Zakaria, Agus Prijono. 2006. Konsep dan Implementasi Struktur Data. Bandung: INFORMATIKA.