![]() |
|
Marco Cantù's |
Bab 8
|
Catatan Penulis: Bab ini akan membahas penanganan memory, mendiskusikan berbagai area memory, dan memperkenalkan array dinamis. Untuk sementara, hanya bagian terakhir ini saja yang tersedia.
Secara tradisional, bahasa Pascal selalu mempunyai array dengan ukuran yang tetap. Ketika Anda mendeklarasikan suatu data type menggunakan konstruksi array, Anda harus menentukan jumlah elemen dari array tersebut. Seperti yang diketahui oleh para pemrogram ahli, ada beberapa teknik yang dapat Anda gunakan untuk mengimplementasikan array dinamis, biasanya menggunakan pointer dan secara manual mengalokasikan dan membebaskan memory yang diperlukan.
Delphi 4 memperkenalkan suatu implementasi array dinamis yang sangat sederhana, meniru model type long string yang dinamis seperti yang baru saja saya bahas. Seperti long string, array dinamis secara dinamis dialokasikan dan dihitung referensinya, tapi mereka tidak menawarkan teknik copy-sambil-tulis. Ini bukanlah permasalahan besar, karena Anda dapat membebaskan alokasi array dengan mengubah variabel tersebut menjadi nil.
Anda sekarang cukup mendeklarasikan suatu array tanpa menyebutkan jumlah elemen dan lalu mengalokasikannya dengan suatu ukuran tertentu menggunakan procedure SetLength. Procedure yang sama juga dapat digunakan untuk merubah ukuran array tanpa kehilangan isinya. Ada juga procedure untuk string lain, seperti function Copy, yang dapat Anda gunakan untuk array.
Berikut ini adalah cuplikan code singkat, menggarisbawahi kenyataan bahwa Anda harus mendeklarasikan dan mengalokasikan memory untuk array sebelum Anda dapat mulai menggunakannya:
procedure TForm1.Button1Click(Sender: TObject); var Array1: array of Integer; begin Array1 [1] := 100; // error SetLength (Array1, 100); Array1 [99] := 100; // OK ... end;
Karena Anda hanya mengindikasikan jumlah elemen array, maka index akan dimulai dari 0. Array generik dalam Pascal menggunakan batas bawah bukan nol dan untuk index non-integer, dua fitur yang tidak didukung oleh array dinamis. Untuk mengetahui status array dinamis, Anda dapat menggunakan function Length, High, dan Low, seperti pada array yang lain. Namun demikian, untuk array dinamis, Low akan selalu mengembalikan nilai 0, dan High akan mengembalikan nilai Length dikurangi satu. Hal ini berlaku untuk array kosong dimana High akan mengembalikan nilai -1 (dimana, ketika Anda berpikir tentang ini, merupakan suatu nilai yang aneh, karena ini lebih kecil dari nilai yang dikembalikan oleh Low).
Gambar 8.1: Contoh form dari DynArr
Setelah perkenalan pendek ini, saya dapat menunjukkan Anda sebuah contoh sederhana, dinamai DynArr dan ditunjukkan pada Gambar 8.1. Contoh ini benar-benar sederhana karena tidak ada yang rumit mengenai array dinamis. Saya juga akan menggunakannya untuk menunjukkan beberapa kesalahan yang mungkin dilakukan oleh pemrogram. Program ini mendeklarasikan dua array global dan menginisialisasi array pertama pada handler OnCreate:
var Array1, Array2: array of Integer; procedure TForm1.FormCreate(Sender: TObject); begin // allocate SetLength (Array1, 100); end;
Ini akan mengubah semua nilai menjadi nol. Code inisialisasi semacam ini memungkinkan kita untuk mulai membaca dan menulis nilai dari array tanpa kekhawatiran akan memory error. (Tentu saja dengan asumsi bahwa Anda tidak mencoba untuk mengakses item diluar batas atas array). Untuk inisialisasi yang lebih baik, program mempunyai suatu button yang menulis tiap cell dari array:
procedure TForm1.btnFillClick(Sender: TObject); var I: Integer; begin for I := Low (Array1) to High (Array1) do Array1 [I] := I; end;
Button Grow memungkinkan Anda untuk mengubah ukuran array tanpa kehilangan isinya. Anda dapat memeriksanya dengan menggunakan button Get value setelah menekan button Grow:
procedure TForm1.btnGrowClick(Sender: TObject); begin // grow keeping existing values SetLength (Array1, 200); end; procedure TForm1.btnGetClick(Sender: TObject); begin // extract Caption := IntToStr (Array1 [99]); end;
Code yang sedikir rumit terdapat pada event OnClick dari button Alias. Program menyalin suatu array ke array yang lain dengan operator :=, yang secara efektif membuat suatu alias (suatu variabel baru yang menunjuk pada array yang sama di memory). Namun demikian, pada titik ini, jika Anda merubah suatu array, maka array yang lain akan terpengaruh juga, karena mereka menunjuk pada area memory yang sama:
procedure TForm1.btnAliasClick(Sender: TObject); begin // alias Array2 := Array1; // change one (both change) Array2 [99] := 1000; // show the other Caption := IntToStr (Array1 [99]);
Method btnAliasClick mengerjakan dua operasi lagi. Yang pertama adalah suatu pemeriksaan kesamaan pada kedua array. Hal ini tidak memeriksa elemen aktual namun area memory yang ditunjuk oleh array, memeriksa apakah kedua variabel ini merupakan dua alias untuk array yang sama dalam memory:
procedure TForm1.btnAliasClick(Sender: TObject); begin ... if Array1 = Array2 then Beep; // truncate first array Array1 := Copy (Array2, 0, 10); end;
Yang kedua adalah pemanggilan function Copy, dimana tidak hanya memindahkan data dari suatu array ke array yang lain, tapi juga menggantikan array yang pertama dengan array yang baru dibuat oleh function tersebut. Hasilnya adalah variabel Array1 sekarang menunjuk ke array dengan 11 elemen, sehingga dengan menekan tombol Get value atau Set value akan menghasilkan memory error dan menimbulkan suatu exception (kecuali jika Anda mematikan opsi range-checking, yang menyebabkan error tetap timbul namun exception tidaklah ditampilkan). Code dari button Fill akan terus bekerja dengan baik bahkan setelah perubahan ini, karena item array yang akan diubah ditentukan menggunakan batas saat ini.
Bab ini secara sementara hanya membahas array dinamis, tentu saja merupakan suatu elemen penting dalam memory management, tapi hanya sebagian dari gambar keseluruhan. Lebih banyak bahan yang akan ditambahkan.
Stuktur memory yang dijabarkan pada bab ini merupakan pemrograman Windows pada umumnya, suatu topik yang saya perkenalkan pada bab selanjutnya (walaupun tanpa membahas VCL secara keseluruhan).
© Copyright Marco Cantù, Wintech Italia Srl 1995-2000
© Copyright of the Indonesian Translation by Hianoto Santoso, 2002