Archive

Archive for March, 2010

Lebih Jauh Dengan Pointer [ 2 ]

March 24th, 2010 2 comments

Oke. Pembahasan kita terakhir adalah dereferensi pointer untuk mengambil nilai yang ditunjuknya.

Pertanyaan, bila kita bebas melakukan casting terhadap variabel bertipe pointer untuk mengambil nilainya, dapatkah kita membuat saja tipe variabel baru yang sesuai dengan kebutuhan kita? Agar tidak usah ada casting lagi tiap kita melakukan dereferensi terhadap pointer?

Jawabannya, tentu saja.

Kita dapat membuat tipe variabel baru bertipe pointer dengan ukuran yang bebas. Contoh, kita akan membuat sebuah tipe data, berjenis pointer, dan data yang ditunjuknya seukuran Dword.

Nah, kita telah memiliki tipe data baru. Sebuah tipe data berjenis pointer, data yang ditunjuk seukuran Dword, bernama PDword. Kita memberi nama dengan prefiks P agar kita mudah mengingat bahwa tipe data tersebut berjenis pointer. Tanda ^ di depan tipe data dasar (Dword) adalah penunjuk bahwa kita sedang mendeklarasikan sejenis pointer sebagai tipe data baru.

Sebuah contoh akan menjelaskan lebih jauh:

Lihat. Nilai DwordBiasa1 adalah 16762. Kita deklarasikan tipe data baru dengan nama PDword, sebagai tipe berjenis pointer, ukuran data yang ditunjuknya sebesar ukuran data Dword. Kita juga punya sebuah variabel PointerDword dengan tipe PDword tadi. variabel PointerDword ini kita tugaskan untuk menjukkan alamat variabel DwordBiasa1 di memori. Kemudian kita dereferensikan lagi ke variabel DwordBiasa2. Ternyata, tanpa perlu casting tipe data, kita sudah dapat mengambil nilai 16762 tadi.
image

Bagaimana dengan dua baris terakhir? Ingat, pointer, termasuk PDword tadi, hanya menunjukkan alamat sebuah data/variabel di memori. Bukan menunjukkan nilainya. Jika kita melakukan dereferensi dengan x:=p^, maka nilai pada memori yang ditunjuk oleh p di memori akan dimasukkan ke variabel x. Sebaliknya, bilai kita melakukan penugasan p^:=x, maka nilai di memori yang ditunjuk oleh p akan diisi dengan nilai x.

Pada kode di atas, DwordBiasa1 awalnya bernilai 16762. Kemudian kita mencatat alamat data DwordBiasa1 ke variabel PointerDword. Baris terakhir mengubah nilai di alamat tersebut (yang ditunjuk oleh PointerDword) menjadi 4. Ini berakibat variabel DwordBiasa1, yang berada di alamat tersebut, menjadi bernilai 4, bukan lagi 16762. Percaya?
image

Oke. Lanjut. :)

Kemudian perhatikan deklarasi tipe-tipe data yang tersedia di Delphi. Kebanyakan mereka dideklarasikan menggunakan cara kita:

Dengan pembahasan ini, saya berharap kita sudah punya sebuah pengetahuan baru, bahwasannya pointer adalah sesuatu yang sangat bagus dalam memfasilitasi kita dalam menulis program. Meskipun terlihat begitu rumit dan bertele-tele, kita harus bersyukur bahwa pointer ada di dunia yang kita tinggali, dunia programming :)

Manfaat pointer tentu saja belum terasa sampai di sini. Kita masih akan melanjutkan dengan tipe-tipe data dasar lainnya, sebelum melanjutkan pembahasan sampai ke pemanfaatan pointer dan contoh-contoh implementasinya dalam kode.

Salam, Joko Rivai.

Lebih Jauh Dengan Pointer

March 21st, 2010 33 comments

Pointer adalah sebuah tipe data yang berfungsi menunjukkan alamat di memori. Semua objek dalam Delphi yang diturunkan dari TObject adalah pointer. TForm, TStrings, TList, TDBGrid, semuanya pointer.

Oke. Saya mulai dengan sebuah contoh.

Categories: Data Types, Object Pascal Tags:

Tipe Pointer

March 21st, 2010 No comments

Di Delphi, hampir semua tipe data memiliki padanan bertipe pointer. Tipe-tipe pointer ini berguna pada penggunaan memori dalam skala besar secara dinamis. Misalnya pada pengaksesan file, linked-list.

Bila sebuah variabel bertipe integer dideklarasikan, maka compiler akan mengalokasikan memori sebesar 4 byte (32 bit) untuk variabel tersebut, terlepas dari apakah variabel tersebut digunakan atau tidak. Dengan pointer, memori hanya akan dialokasikan jika variabel bertipe pointer akan digunakan. Dengan demikian, kita dapat mengatur penggunaan memori secara fleksibel dan hemat. Bila belum perlu, memori tidak digunakan, sehingga dapat dialokasikan oleh variabel lain yang mungkin akan lebih dulu menggunakan memori.

Di bawah ini beberapa tipe pointer yang disediakan Delphi. Namun Anda dapat dengan bebas mendeklarasikan tipe pointer lainnya sesuai kebutuhan. Satu catatan mengenai penggunaan pointer, bila Anda mengalokasikan memori pada sebuah pointer, Anda bertanggungjawab untuk melepaskannya kembali. Bila tidak, memori tersebut tetap dicatat sebagai “sedang digunakan”, sehingga variabel bertipe pointer lainnya tidak mengalokasikan memori pada alamat yang ditunjuk oleh variabel bertipe pointer sebelumnya.

Sebenarnya pointer adalah berukuran 4 byte (32 bit), bertipe Dword. Semua tipe pointer lainnya adalah pointer. Hanyasannya, tipe pointer lainnya dideklarasikan secara khusus untuk memberitahu compiler ukuran satuan data pada alamat yang ditunjuk oleh pointer tersebut.

Berikut adalah tipe-tipe pointer yang telah disediakan Delphi. Selanjutnya, kita akan lihat tipe-tipe pointer yang user-defined dan contoh penggunaanya.

PAnsiChar
PAnsiChar adalah pointer yang menunjukkan alamat data bertipe AnsiChar. Harap diingat, meskipun AnsiChar berukuran 1 byte (8 bit), tetapi PAnsiChar berukuran 4 byte (32 bite), karena pada dasarnya, semua pointer berukuran 4 byte.

Hasil kode di atas:
image 

PAnsiString
Menunjukkan alamat AnsiString. AnsiString sendiri adalah sejenis pointer, sehingga PAnsiString jarang dugunakan. Anda mungkin ingin membaca tentang AnsiString untuk melihatnya lebih jauh.

PChar
Mirip dengan PAnsiChar. Meskipun pada versi Delphi terbaru, Char telah diperlakukan sebagai PWideChar (2 byte), bukan lagi AnsiChar (1 byte), tetap saja PChar berukuran 4 byte. Karena bagaimanapun, PChar adalah pointer. Penggunakan PChar biasanya dalam operasi string yang dibatasi dengan zero character, seperti yang digunakan di Windows dan biasanya digunakan dalam C/C++.

Pada kode-kode Windows API yang menggunakan string sebagai parameter/kembalian fungsi, maka tipe data inilah yang sering dipakai. Tinggal menetukan apakah PAnsiChar apabila fungsi tersebut menggunakan standar ANSI ataukah PWideChar jika Unicode.

PCurrency
Pointer ke tipe data Currency.

PDateTime
Pointer ke tipe DateTime.

PExtended
Pointer ke tipe Extended.

Pointer to an Int64 value.

Pointer
Defines a general use Pointer to any memory based data.

PShortString
Pointer ke tipe data ShortString.

PString
Pointer ke tipe String

PVariant
Pointer ke tipe

PWideChar
Mirip dengan PChar dan PAnsiChar.

PWideString
Pointer ke tipe WideString.

Lebih jauh dengan pointer, kita diskusikan di sini.

Categories: Delphi Tags:

Tipe Char dan String

March 20th, 2010 No comments
AnsiChar Karakter berkuran 1 byte (8 bit)

type AnsiChar = #0..#255;

AnsiString Deretan karakter AnsiChar. Panjang string bertipe AnsiString tidak terbatas, hanya dibatasi oleh besarnya memori (RAM).
AnsiString adalah sejenis pointer yang akan dialokasikan secara otomatis bila diperlukan (bila ada nilainya) dan otomatis dibuang dari memori jika tidak bernilai.
Char Char adalah tipe karakter seperti AnsiChar, namun sejak Delphi 2009 (Delphi 12), Char adalah WideChar, di mana ukurannya adalah 16bit (2 byte), menampung karakter ANSI maupun Unicode (multi-byte).
ShortString ShortString merupakan deretan karakter berukuran hingga 255 karakter. Tipe String di bawah ini akan diperlakukan sebagai ShortString jika directive $LongStrings diset ke OFF
String String merupakan deretan karakter. Bila directive $LongStrings diset ke OFF, String akan diperlakukan sebagai ShortString, sebaliknya jika directive ini diset ke ON, String akan diperlakukan sebagai AnsiString.
Meskipun $LongStrings diset ke ON, sebuah string akan tetap diperlakukan sebagai ShortString jika kita menentukan FixedSize pada sebuah string.

var
shortstr: String[5];
{
mendefiniskan sebuah variabel bertipe ShortString dengan panjang string maksimal 5 karakter.
}
longstr: String[260];
{
error! ShortString hanya dapat menampung maksimal 255 karakter!
}

WideChar Karakter dengan ukuran 16 bit, untuk menampung karakter Unicode. Pada Delphi 2009 (mungkin versi selanjutnya juga), Char diperlakukan sebagai WideChar.
WideString String yang terbentuk dari deretan karakter bertipe WideChar. Tiap elemennya berukuran 16 bit.
Bila Anda mempunyai kode:
Categories: Data Types, Object Pascal Tags:

Tipe Bilangan Pecahan

March 20th, 2010 2 comments

Currency
Bilangan pecahan dengan 4 digit di belakang koma. Biasanya digunakan dalam aplikasi-aplikasi finansial dan akuntansi. Bila sebuah angka dengan nilai desimal lebih panjang dari 4 digit, maka otomatis akan dibulatkan ke atas atau ke bawah sesuai nilai desimal tersebut. Pembulatan dilakukan sampai hanya 4 digit yang tertinggal di belakang koma. Presisi nilai desimal ini sebesar 53 bit, namun sangat tergantung pada presisi desimal yang didukung prosesor.

Double
Double merupakan tipe pecahan dengan 15 digit presisi dengan rentang 2.23 x 10-308 sampai 1.79 x 10308
Tipe double menyeimbangkan presisi/kapasitas dan storage/performansi. Tipe ini merupakan tipe general purpose, paling presisi, juga paling cepat.

Extended
Pecahan dengan rentang 3.37 x 10-4932 sampai 1.18 x 104932. Paling presisi, sekaligus paling lambat dan paling banyak menggunakan memori. Presisi sampai 19 desimal di belakang koma.

Real
Merupakan versi obsolete. Digantikan oleh Double.

Real48
Merupakan versi obsolete. Digantikan oleh Extended.

Single
Pecahan paling kecil dengan presisi paling rendah. Namun merupakan yang paling baik performansinya.



Related Posts Plugin for WordPress, Blogger...

Categories: Data Types, Object Pascal Tags: