Enumerasi

1. Tipe Enumerasi (Enumerated Type)

Enumerasi pada Pascal merupakan tipe buram dengan enkapsulasi yang bagus, jauh lebih sering dipakai dalam pengembangan sehari-hari dibandingkan enumerasi dari bahasa pemrograman lain.

Sintaks Dasar Pendeklarasian

type
  TAnimalKind = (akDuck, akCat, akDog);

Kebiasaan penulisan: tambahkan awalan dua huruf singkatan nama tipe pada setiap konstanta enumerasi

  • ak = Animal Kind (singkatan dari TAnimalKind)

Huruf T di depan TAnimalKind tidak wajib secara sintaks, hanya standar industri. Sebaiknya tetap gunakan agar langsung terlihat bahwa ini tipe enumerasi.

type
  AnimalKind = (akDuck, akCat, akDog); // Tanpa huruf T, sintaks validCode language: JavaScript (javascript)

Catatan Tambahan:

  1. Nama identik tidak langsung memicu error kompilasi; unit berbeda boleh pakai nama yang sama;
  2. Tetapi demi keterbacaan kode dan pencarian global (grep), sebaiknya hindari bentrok nama secara sengaja.

Enumerasi Berlingkup ({$scopedenums on})

Direktif kompiler {$scopedenums on} akan memisahkan konstanta enumerasi ke dalam tipe induknya, sehingga tidak mencemari ruang nama global

Secara bawaan tidak aktif
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program EnumDemo;

type TAnimalKind = (akDuck, akCat);

var k: TAnimalKind;

begin
  k := akDuck; // Gunakan konstanta langsung tanpa TAnimalKind.
  WriteLn(k); //Menampilkan akDuck
end.Code language: PHP (php)

Sesuai penjelasan sebelumnya, eksekusi kode dimulai dari kata kunci begin.

Menggunakan awalan ak adalah praktik terbaik untuk menghindari bentrok nama, meskipun tanpa awalan tidak akan muncul kesalahan.

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}

program EnumDemo;

type TAnimalKind = (Duck, Cat);

var k: TAnimalKind;

begin
  k := Duck; 
  WriteLn(k);//Duck
end.Code language: PHP (php)

Jika {$scopedenums on} aktif, wajib tulis «NamaTipe.»

  1. Saat mengakses harus tambah penentu tipe: TAnimalKind.akDuck
  2. Awalan ak tidak lagi diperlukan, konstanta bisa disingkat menjadi Duck, Cat, Dog
{$scopedenums on}
type
  TAnimalKind = (Duck, Cat, Dog);
var
  Kind: TAnimalKind;
begin
  Kind := TAnimalKind.Duck; // Penentu tipe wajib ada
end;Code language: PHP (php)

Jika tidak menambahkan penentu tipe

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;

type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
  k := Duck; // Tanpa TAnimalKind.
  WriteLn(k);
end.Code language: PHP (php)

Akan muncul kesalahan kompilasi

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(9,8) Error: Identifier not found "Duck"
mydemo.dpr(11,4) Fatal: There were 1 errors compiling module, stopping
Fatal: Compilation aborted
Error: C:\FPC\3.2.2\bin\i386-Win32\ppc386.exe returned an error exitcodeCode language: CSS (css)

Setelah menambahkan penentu tipe

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
{$scopedenums on}
program EnumDemo;

type TAnimalKind = (Duck, Cat);
var k: TAnimalKind;
begin
  k := TAnimalKind.Duck; // Lengkap dengan penentu tipe
  WriteLn(k);
end.Code language: PHP (php)

Kode dapat dikompilasi dengan normal

Konversi Paksa antara Enumerasi dan Bilangan Bulat

Enumerasi termasuk tipe buram, tidak bisa langsung salin nilai dengan bilangan bulat, wajib lakukan konversi paksa secara manual:

  1. Enumerasi → Bilangan Bulat: Ord(variabelEnumerasi)
  2. Bilangan Bulat → Enumerasi: konversi tipe paksa TAnimalKind(nilaiBulat)
  3. Sebelum mengubah bilangan bulat menjadi enumerasi, validasi rentang angka: rentang valid 0 ~ Ord(High(TipeEnumerasi))
type
  TAnimalKind = (akDuck, akCat, akDog);
var
  Kind: TAnimalKind;
  Num: Integer;
begin
  Kind := akCat;
  Num := Ord(Kind); // Nomor urut akCat adalah 1, Num=1

  Num := 2;
  // Validasi rentang sebelum konversi
  if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
    Kind := TAnimalKind(Num);
end;Code language: JavaScript (javascript)
{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}

program EnumDemo;

type
  TAnimalKind = (akDuck, akCat, akDog);
var
  Kind: TAnimalKind;
  Num: Integer;
begin
  Kind := akCat;
  Num := Ord(Kind); // akCat index is 1,Num=1

  Num := 2;

  if (Num >= 0) and (Num <= Ord(High(TAnimalKind))) then
    Kind := TAnimalKind(Num);

  WriteLn(Num);//2
end.Code language: PHP (php)

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *