[{"data":1,"prerenderedAt":323},["ShallowReactive",2],{"tag-labels":3,"site-header":4,"article-pascal-dynamic-array-id":72},{},{"featuredPost":5,"navigations":29},{"id":6,"title":7,"title_id":8,"slug":9,"excerpt":10,"excerpt_id":11,"has_translation":12,"published_at":13,"reading_time":14,"hidden_from_listing":15,"tags":16,"thumbnail_image":21,"og_image":22,"series":23,"authors":28},110,"When You Pick a Framework Just to Look Different","Ketika Pilih Framework Cuma Biar Kelihatan Beda","ketika-pilih-framework-cuma-biar-kelihatan-beda","The last time you chose a new framework or library, was it because your problem needed that tool, or because it sounded cool and few people around you were using it? That question is uncomfortable. Technology decisions are often made for reasons that never appear in any technical document.","Terakhir kali kamu milih framework atau library baru, itu karena masalahmu butuh alat itu, atau karena alatnya kedengaran keren dan belum banyak yang pakai? Pertanyaan ini nggak enak dijawab. Soalnya keputusan teknologi sering diambil dengan alasan yang nggak pernah ditulis di dokumen teknis mana pun.",true,"2026-10-06T15:25:21.000Z",5,false,[17,18,19,20],"karier","framework","opini","pengalaman",null,"\u002Fog\u002Fketika-pilih-framework-cuma-biar-kelihatan-beda.png",{"id":24,"title":25,"title_id":26,"slug":27},9,"Articles","Artikel","all",[],[30,46,67],{"collection":31,"item":32},"series",{"__typename":31,"title":25,"title_id":26,"slug":27,"children_series":33},[34,38,42],{"title":35,"title_id":36,"slug":37},"Artificial Intelligence","Kecerdasan Artifisial","kecerdasan-artifisial",{"title":39,"title_id":40,"slug":41},"Programming Fundamentals","Konsep Dasar Pemrograman","konsep-dasar-pemrograman",{"title":43,"title_id":44,"slug":45},"Algorithms and Data Structures","Algoritma dan Struktur Data","algoritma-struktur-data",{"collection":31,"item":47},{"__typename":31,"title":48,"title_id":48,"slug":49,"children_series":50},"Tutorial","tutorial",[51,55,59,63],{"title":52,"title_id":53,"slug":54},"Learning Python","Belajar Python","belajar-python",{"title":56,"title_id":57,"slug":58},"Learning Go","Belajar Golang","belajar-golang",{"title":60,"title_id":61,"slug":62},"Learning Java","Belajar Java","belajar-java",{"title":64,"title_id":65,"slug":66},"Learning Pascal","Belajar Pascal","belajar-pascal",{"collection":31,"item":68},{"__typename":31,"title":69,"title_id":69,"slug":70,"children_series":71},"Lab","lab",[],{"article":73,"renderedBody":197,"renderedTakeaway":198,"latestArticles":199,"toc":304},{"id":74,"title":75,"title_id":75,"slug":76,"excerpt":77,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":84,"series":85,"authors":188,"seoTitle":21,"seoDescription":21,"body_locale":191,"available_locales":192,"body":194,"takeway":195,"prerequisite":196},147,"Array Dinamis Pascal: Nilai Keenam yang Tidak Pernah Ikut Terhitung","pascal-dynamic-array","Enam nilai masuk, lima yang terhitung, dan rata-ratanya tercetak 78.0 karena array tetap berhenti membaca di MAX. `SetLength` memberi array panjang yang diminta datanya, dan ia juga mengubah arti penugasan.","2026-11-11T01:00:00.000Z",8,[81,82,83],"pascal","array","tipe-data","\u002Fog\u002Fpascal-dynamic-array.png",{"id":86,"title":87,"title_id":88,"slug":89,"description":90,"description_id":91,"articles":92,"children_series":167,"parent_series":168},25,"Composite Types","Tipe Data Bentukan","pascal-tipe-data-bentukan","Types you build yourself: record, array, and the pointer that keeps confusing everyone at first.","Tipe data racikan sendiri: record, array, sampai pointer yang sering bikin pusing di awal.",[93,114,129,144,160],{"id":94,"title":95,"title_id":96,"slug":97,"excerpt":98,"excerpt_id":99,"has_translation":12,"published_at":100,"reading_time":101,"hidden_from_listing":15,"tags":102,"thumbnail_image":21,"og_image":105,"series":106,"authors":107},73,"User-Defined Data Types in Pascal","Tentang Tipe Data Bentukan pada Pascal","tentang-tipe-data-bentukan-pada-pascal","User-defined data types in Pascal come in 2 kinds, Enumerated and Subrange, and you declare both of them yourself.","Tipe data bentukan atau User defined data types terbagi menjadi 2, yaitu Enumerated dan Subrange","2020-11-22T13:49:03.000Z",3,[81,83,103,104],"struktur-data","konsep","\u002Fog\u002Ftentang-tipe-data-bentukan-pada-pascal.png",{"id":86,"title":87,"title_id":88,"slug":89},[108],{"authors_id":109},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},1,"Daffa Izzuddin","izzudd","Writer",{"id":115,"title":116,"title_id":117,"slug":118,"excerpt":119,"excerpt_id":120,"has_translation":12,"published_at":121,"reading_time":101,"hidden_from_listing":15,"tags":122,"thumbnail_image":21,"og_image":124,"series":125,"authors":126},74,"Using the RECORD Data Type in Pascal","Menggunakan Tipe Data RECORD pada Pascal","menggunakan-tipe-data-record-pada-pascal","RECORD is a structured data type in Pascal, built from a collection of standard and user-defined data types.","RECORD merupakan tipe data terstruktur pada bahasa Pascal yang terdiri dari kumpulan tipe data standar dan bentukan.","2020-11-27T13:54:30.000Z",[81,123,83,103],"record","\u002Fog\u002Fmenggunakan-tipe-data-record-pada-pascal.png",{"id":86,"title":87,"title_id":88,"slug":89},[127],{"authors_id":128},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":130,"title":131,"title_id":132,"slug":133,"excerpt":134,"excerpt_id":135,"has_translation":12,"published_at":136,"reading_time":137,"hidden_from_listing":15,"tags":138,"thumbnail_image":21,"og_image":139,"series":140,"authors":141},75,"Using the Array Data Type in Pascal","Menggunakan Tipe Data Array pada Pascal","menggunakan-tipe-data-array-pada-pascal","An ARRAY is a structure that holds a set of data with the same type, and you reach each item in it through its index.","ARRAY merupakan struktur data yang berisi sekumpulan data dengan tipe data yang sama. Data dalam ARRAY ini dapat diakses dengan menggunakan index.","2020-12-02T14:01:22.000Z",4,[81,82,83,103],"\u002Fog\u002Fmenggunakan-tipe-data-array-pada-pascal.png",{"id":86,"title":87,"title_id":88,"slug":89},[142],{"authors_id":143},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":145,"title":146,"title_id":147,"slug":148,"excerpt":149,"excerpt_id":150,"has_translation":12,"published_at":151,"reading_time":152,"hidden_from_listing":15,"tags":153,"thumbnail_image":21,"og_image":155,"series":156,"authors":157},76,"Using Pointers in Pascal","Menggunakan Pointer pada Bahasa Pascal","menggunakan-pointer-pada-bahasa-pascal","A variable of pointer type can only hold the address of another variable, and changing it changes that other variable.","Sebuah variable yang bertipe pointer nantinya hanya dapat berisi sebuah alamat dari variable lain.","2020-12-02T14:17:47.000Z",2,[81,154,83,104],"pointer","\u002Fog\u002Fmenggunakan-pointer-pada-bahasa-pascal.png",{"id":86,"title":87,"title_id":88,"slug":89},[158],{"authors_id":159},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":74,"title":161,"title_id":75,"slug":76,"excerpt":162,"excerpt_id":77,"has_translation":12,"published_at":78,"reading_time":79,"hidden_from_listing":15,"tags":80,"thumbnail_image":21,"og_image":84,"series":163,"authors":164},"Pascal Dynamic Arrays: the Sixth Score That Never Got Counted","Six scores go in, five get counted, and the mean prints 78.0 because a fixed array stopped reading at MAX. `SetLength` gives the array the length the data asks for, and it also changes what assignment means.",{"id":86,"title":87,"title_id":88,"slug":89},[165],{"authors_id":166},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},[],{"id":169,"title":64,"title_id":65,"slug":66,"parent_series":170,"children_series":171},14,{"id":110,"title":48,"title_id":48,"slug":49},[172,177,182,183],{"id":173,"title":174,"title_id":175,"slug":176,"cover_image":21},23,"Getting Started with Pascal","Berkenalan dengan Bahasa Pascal","pascal-intro",{"id":178,"title":179,"title_id":180,"slug":181,"cover_image":21},24,"Control Structures","Struktur Kontrol","pascal-struktur-kontrol",{"id":86,"title":87,"title_id":88,"slug":89,"cover_image":21},{"id":184,"title":185,"title_id":186,"slug":187,"cover_image":21},26,"Procedural Programming","Pemrograman Prosedural","pascal-pemrograman-prosedural",[189],{"authors_id":190},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},"id",[193,191],"en","\nKamu memberi program enam nilai dan program itu melaporkan lima. Berkas `scores.txt` berisi 72, 85, 91, 64, 78, dan 67, satu per baris. Program mencetak hitungan 5 dan rata-rata 78.0, tanpa crash dan tanpa peringatan. Rata-rata sebenarnya 76.2, yaitu 457 dibagi 6.\n\n```pascal\nprogram average;\n\n{ Versi 1: array tetap berisi lima, dan nilai keenam yang tidak pernah masuk. }\n\nconst\n  MAX = 5;\n\nvar\n  scores: array[1..MAX] of integer;\n  n, i, sum: integer;\n\nbegin\n  n := 0;\n  sum := 0;\n  for i := 1 to MAX do\n    if not eof then\n    begin\n      readln(scores[i]);\n      n := n + 1;\n      sum := sum + scores[i];\n    end;\n  writeln('count: ', n);\n  writeln('mean: ', sum \u002F n:0:1);\nend.\n```\n\n```plain\n$ fpc average.pas && .\u002Faverage \u003C scores.txt\ncount: 5\nmean: 78.0\n```\n\nKonstanta `MAX` menghentikan loop `for` setelah lima pembacaan, dan baris keenam tetap tidak terbaca di dalam berkas. Ukuran array statis ditetapkan saat kamu menulis programnya, dan loop mematuhi ukuran itu tanpa protes. Tidak ada apa pun di berkas maupun di compiler yang menandai baris yang hilang, jadi satu-satunya cara menangkapnya adalah membandingkan keluaran dengan jawaban yang kamu harapkan.\n\n## Beri array panjang saat program berjalan\n\nArray dinamis dideklarasikan sebagai `array of integer`, tanpa batas. Variabelnya mulai kosong: `Length`-nya 0 dan nilainya sama dengan `nil`, nilai pointer yang tidak menunjuk ke apa pun. `SetLength` memberinya ukuran.\n\n```pascal\nprogram explore;\n\nvar\n  a, b: array of integer;\n  i: integer;\n\nbegin\n  writeln('before SetLength: Length = ', Length(a), ', a = nil is ', a = nil);\n  SetLength(a, 3);\n  writeln('after SetLength(a, 3): Length = ', Length(a), ', Low = ', Low(a), ', High = ', High(a));\n  write('elements:');\n  for i := Low(a) to High(a) do\n    write(' ', a[i]);\n  writeln;\n  writeln('sizeof(a) = ', sizeof(a));\n  a[0] := 10;\n  a[1] := 20;\n  a[2] := 30;\n  SetLength(a, 5);\n  writeln('grown to 5: Length = ', Length(a), ', kept ', a[0], ' ', a[1], ' ', a[2], ', new ', a[3], ' ', a[4]);\n  b := a;\n  b[0] := 99;\n  writeln('b[0] = 99, a[0] = ', a[0], ', same storage = ', @b[0] = @a[0]);\n  SetLength(a, 0);\n  writeln('after SetLength(a, 0): Length = ', Length(a), ', a = nil is ', a = nil);\n  writeln('b is still ', Length(b), ' elements, b[0] = ', b[0]);\nend.\n```\n\n```plain\n$ fpc explore.pas && .\u002Fexplore\nbefore SetLength: Length = 0, a = nil is TRUE\nafter SetLength(a, 3): Length = 3, Low = 0, High = 2\nelements: 0 0 0\nsizeof(a) = 8\ngrown to 5: Length = 5, kept 10 20 30, new 0 0\nb[0] = 99, a[0] = 99, same storage = TRUE\nafter SetLength(a, 0): Length = 0, a = nil is TRUE\nb is still 5 elements, b[0] = 99\n```\n\nIndeksnya berjalan dari 0 sampai 2, sedangkan `array[1..5]` berjalan dari 1 sampai 5. Elemen baru bernilai nol, bukan sisa sampah. Membesarkan array dari 3 ke 5 mempertahankan `10 20 30` dan mengisi dua slot baru dengan nol.\n\n`sizeof(a)` bernilai 8 berapa pun panjangnya, karena variabelnya menyimpan pointer ke data, bukan datanya. `array[1..5] of integer` statis menempati 10 byte di sini: lima integer masing-masing dua byte, ukuran bawaan Free Pascal. Versi dinamis menggantikan 10 byte itu dengan pointer 8 byte ditambah blok heap, yaitu memori yang diminta program saat ia berjalan.\n\n## Dua nama, satu array\n\nPenugasan `b := a` menyalin pointer, bukan elemennya. Setelah `b[0] := 99`, `a[0]` juga terbaca 99, dan `@b[0] = @a[0]` bernilai TRUE: kedua nama mencapai penyimpanan yang sama. `SetLength(a, 0)` mengosongkan `a`, tetapi `b` masih memegang kelima elemennya. Pascal menghitung referensi ke blok itu dan membebaskannya ketika referensi terakhir pergi.\n\n`Copy` memberimu penyimpanan yang independen. `Copy(a, 1, 3)` pada array yang berisi `3 4 5 6 7 8` mengembalikan `4 5 6`, karena indeks awalnya berbasis 0 seperti array itu sendiri. `Copy(a, 4, 3)` hanya mengembalikan `7 8`, karena tersisa dua elemen saja. Mengubah elemen pertama salinan menjadi 999 membiarkan aslinya di 3, dan `@original[0] = @copy[0]` bernilai FALSE.\n\n## Pengecualiannya: tidak ada yang menjaga ujung\n\n```pascal\nprogram probe4;\n\n{ Di luar batas dengan indeks yang tidak bisa dilihat compiler. }\n\nvar\n  dyn: array of integer;\n  i: integer;\n\nbegin\n  SetLength(dyn, 3);\n  i := Length(dyn);\n  writeln('writing at index ', i, ' of length ', Length(dyn));\n  dyn[i] := 42;\n  writeln('survived, dyn[i] = ', dyn[i]);\nend.\n```\n\n```plain\n$ fpc probe4.pas && .\u002Fprobe4\nwriting at index 3 of length 3\nsurvived, dyn[i] = 42\n```\n\nIndeks 3 pada array yang panjangnya 3 menulis ke memori yang bukan milik array itu, dan program keluar dengan status 0. Pemeriksaan rentang mati secara bawaan. Bangun dengan `-Cr` dan penulisan yang sama menghentikan program:\n\n```plain\n$ fpc -Cr probe4.pas && .\u002Fprobe4\nwriting at index 3 of length 3\nRuntime error 201 at $00000000004011D9\n  $00000000004011D9\n  $000000000042308C\n```\n\nStatus keluarnya 201. Indeks konstanta tertangkap lebih awal: dengan `-Cr`, menulis indeks 4 ke `array[1..3]` yang tetap menghentikan kompilasi dengan `Error: range check error while evaluating constants (4 must be between 1 and 3)`.\n\n## Buat pemeriksanya gagal lebih dulu\n\nSimpan ini sebagai `check_average.pas`. Program ini membaca keluaran sebuah program dari stdin dan membandingkannya dengan dua baris yang diharapkan. Untuk setiap baris ia mencetak PASS atau FAIL, dan baris yang tidak pernah datang dihitung sebagai kegagalan dengan catatan \"no such line\".\n\n```pascal\nprogram check_average;\n\n{ Membaca keluaran program dari stdin dan membandingkannya dengan baris yang diharapkan. }\n\nvar\n  expected: array[1..2] of string;\n  line: string;\n  i, passed, failed, total: integer;\n\nprocedure Report(ok: boolean; n: integer; want, got: string);\nbegin\n  if ok then\n  begin\n    writeln('PASS  line ', n, ': ', want);\n    passed := passed + 1;\n  end\n  else\n  begin\n    if got = '' then\n      writeln('FAIL  line ', n, ': expected \"', want, '\", no such line')\n    else\n      writeln('FAIL  line ', n, ': expected \"', want, '\", got \"', got, '\"');\n    failed := failed + 1;\n  end;\nend;\n\nbegin\n  expected[1] := 'count: 6';\n  expected[2] := 'mean: 76.2';\n\n  passed := 0;\n  failed := 0;\n  total := 2;\n  i := 0;\n\n  while (not eof) and (i \u003C total) do\n  begin\n    readln(line);\n    i := i + 1;\n    Report(line = expected[i], i, expected[i], line);\n  end;\n\n  while i \u003C total do\n  begin\n    i := i + 1;\n    Report(false, i, expected[i], '');\n  end;\n\n  writeln;\n  writeln(passed, ' of ', total, ' checks passed');\n  if failed > 0 then\n    ExitCode := 1;\nend.\n```\n\nKompilasi pemeriksa itu dan versi 1 `average.pas` dengan `fpc`, lalu salurkan yang satu ke yang lain.\n\n```plain\n$ .\u002Faverage \u003C scores.txt | .\u002Fcheck_average\nFAIL  line 1: expected \"count: 6\", got \"count: 5\"\nFAIL  line 2: expected \"mean: 76.2\", got \"mean: 78.0\"\n\n0 of 2 checks passed\n```\n\nPemeriksa keluar dengan status 1 di sini, jadi sebuah skrip bisa memakainya sebagai gerbang.\n\n## Beralih ke array dinamis\n\nGanti `average.pas` dengan versi 2. Array tetapnya menjadi `array of integer`, dan `SetLength(scores, n + 1)` dijalankan sebelum setiap pembacaan.\n\n```pascal\nprogram average;\n\n{ Versi 2: array tumbuh mengikuti apa pun yang datang. }\n\nvar\n  scores: array of integer;\n  n, sum: integer;\n\nbegin\n  n := 0;\n  sum := 0;\n  while not eof do\n  begin\n    SetLength(scores, n + 1);\n    readln(scores[n]);\n    sum := sum + scores[n];\n    n := n + 1;\n  end;\n  writeln('count: ', Length(scores));\n  writeln('mean: ', sum \u002F n:0:1);\nend.\n```\n\nKompilasi dan jalankan pipa yang sama.\n\n```plain\n$ .\u002Faverage \u003C scores.txt | .\u002Fcheck_average\nPASS  line 1: count: 6\nPASS  line 2: mean: 76.2\n\n2 of 2 checks passed\n```\n\nPemeriksa sekarang keluar dengan status 0. Versi 2 melaporkan `Length(scores)` sebagai hitungannya, jadi angkanya datang dari array itu sendiri. Loop tidak punya `MAX` yang menghentikannya, dan array berakhir sepanjang berkasnya.\n\n## Memilih di antara keduanya\n\nTanyakan siapa yang menentukan jumlahnya. Kalau kamu yang memutuskannya saat menulis program, pakai `array[1..N]` dengan sebuah konstanta. Kalau datanya yang menentukan, pakai `array of` dan indeks dari 0. Bangun dengan `-Cr` selama kamu menguji, karena array dinamis tidak menghentikan penulisan melewati ujungnya secara bawaan.\n","- `array[1..MAX]` yang tetap berhenti membaca di `MAX` tanpa peringatan, dan begitulah enam nilai menghasilkan rata-rata dari lima nilai.\n- Array dinamis mulai dengan `Length` 0 dan sama dengan `nil`; `SetLength` memberinya panjang, dan elemen baru datang sebagai nol, bukan sebagai sampah.\n- Indeksnya berjalan dari 0 sampai `High`, sedangkan `array[1..5]` statis berjalan dari 1 sampai 5.\n- `b := a` menyalin pointer, jadi menulis lewat `b` mengubah `a`; `Copy(a, start, count)` yang membuat penyimpanan independen.\n- `SetLength(a, 0)` melepas apa yang ditunjuk `a`, tetapi variabel kedua yang memegang blok yang sama menjaga datanya tetap hidup sampai referensi terakhir pergi.\n- Tidak ada yang menghentikan penulisan melewati ujung secara bawaan: bangun dengan `-Cr` untuk mengubahnya menjadi `Runtime error 201` alih-alih korupsi diam-diam.",{"id":130,"title":131,"slug":133},"\u003Cp>Kamu memberi program enam nilai dan program itu melaporkan lima. Berkas \u003Ccode>scores.txt\u003C\u002Fcode> berisi 72, 85, 91, 64, 78, dan 67, satu per baris. Program mencetak hitungan 5 dan rata-rata 78.0, tanpa crash dan tanpa peringatan. Rata-rata sebenarnya 76.2, yaitu 457 dibagi 6.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PASCAL\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"program%20average%3B%0A%0A%7B%20Versi%201%3A%20array%20tetap%20berisi%20lima%2C%20dan%20nilai%20keenam%20yang%20tidak%20pernah%20masuk.%20%7D%0A%0Aconst%0A%20%20MAX%20%3D%205%3B%0A%0Avar%0A%20%20scores%3A%20array%5B1..MAX%5D%20of%20integer%3B%0A%20%20n%2C%20i%2C%20sum%3A%20integer%3B%0A%0Abegin%0A%20%20n%20%3A%3D%200%3B%0A%20%20sum%20%3A%3D%200%3B%0A%20%20for%20i%20%3A%3D%201%20to%20MAX%20do%0A%20%20%20%20if%20not%20eof%20then%0A%20%20%20%20begin%0A%20%20%20%20%20%20readln(scores%5Bi%5D)%3B%0A%20%20%20%20%20%20n%20%3A%3D%20n%20%2B%201%3B%0A%20%20%20%20%20%20sum%20%3A%3D%20sum%20%2B%20scores%5Bi%5D%3B%0A%20%20%20%20end%3B%0A%20%20writeln('count%3A%20'%2C%20n)%3B%0A%20%20writeln('mean%3A%20'%2C%20sum%20%2F%20n%3A0%3A1)%3B%0Aend.\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>program average;\n\n{ Versi 1: array tetap berisi lima, dan nilai keenam yang tidak pernah masuk. }\n\nconst\n  MAX = 5;\n\nvar\n  scores: array[1..MAX] of integer;\n  n, i, sum: integer;\n\nbegin\n  n := 0;\n  sum := 0;\n  for i := 1 to MAX do\n    if not eof then\n    begin\n      readln(scores[i]);\n      n := n + 1;\n      sum := sum + scores[i];\n    end;\n  writeln('count: ', n);\n  writeln('mean: ', sum \u002F n:0:1);\nend.\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20fpc%20average.pas%20%26%26%20.%2Faverage%20%3C%20scores.txt%0Acount%3A%205%0Amean%3A%2078.0\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ fpc average.pas &amp;&amp; .\u002Faverage &lt; scores.txt\u003C\u002Fspan>\ncount: 5\nmean: 78.0\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Konstanta \u003Ccode>MAX\u003C\u002Fcode> menghentikan loop \u003Ccode>for\u003C\u002Fcode> setelah lima pembacaan, dan baris keenam tetap tidak terbaca di dalam berkas. Ukuran array statis ditetapkan saat kamu menulis programnya, dan loop mematuhi ukuran itu tanpa protes. Tidak ada apa pun di berkas maupun di compiler yang menandai baris yang hilang, jadi satu-satunya cara menangkapnya adalah membandingkan keluaran dengan jawaban yang kamu harapkan.\u003C\u002Fp>\n\u003Ch2 id=\"beri-array-panjang-saat-program-berjalan\">Beri array panjang saat program berjalan\u003C\u002Fh2>\n\u003Cp>Array dinamis dideklarasikan sebagai \u003Ccode>array of integer\u003C\u002Fcode>, tanpa batas. Variabelnya mulai kosong: \u003Ccode>Length\u003C\u002Fcode>-nya 0 dan nilainya sama dengan \u003Ccode>nil\u003C\u002Fcode>, nilai pointer yang tidak menunjuk ke apa pun. \u003Ccode>SetLength\u003C\u002Fcode> memberinya ukuran.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PASCAL\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"program%20explore%3B%0A%0Avar%0A%20%20a%2C%20b%3A%20array%20of%20integer%3B%0A%20%20i%3A%20integer%3B%0A%0Abegin%0A%20%20writeln('before%20SetLength%3A%20Length%20%3D%20'%2C%20Length(a)%2C%20'%2C%20a%20%3D%20nil%20is%20'%2C%20a%20%3D%20nil)%3B%0A%20%20SetLength(a%2C%203)%3B%0A%20%20writeln('after%20SetLength(a%2C%203)%3A%20Length%20%3D%20'%2C%20Length(a)%2C%20'%2C%20Low%20%3D%20'%2C%20Low(a)%2C%20'%2C%20High%20%3D%20'%2C%20High(a))%3B%0A%20%20write('elements%3A')%3B%0A%20%20for%20i%20%3A%3D%20Low(a)%20to%20High(a)%20do%0A%20%20%20%20write('%20'%2C%20a%5Bi%5D)%3B%0A%20%20writeln%3B%0A%20%20writeln('sizeof(a)%20%3D%20'%2C%20sizeof(a))%3B%0A%20%20a%5B0%5D%20%3A%3D%2010%3B%0A%20%20a%5B1%5D%20%3A%3D%2020%3B%0A%20%20a%5B2%5D%20%3A%3D%2030%3B%0A%20%20SetLength(a%2C%205)%3B%0A%20%20writeln('grown%20to%205%3A%20Length%20%3D%20'%2C%20Length(a)%2C%20'%2C%20kept%20'%2C%20a%5B0%5D%2C%20'%20'%2C%20a%5B1%5D%2C%20'%20'%2C%20a%5B2%5D%2C%20'%2C%20new%20'%2C%20a%5B3%5D%2C%20'%20'%2C%20a%5B4%5D)%3B%0A%20%20b%20%3A%3D%20a%3B%0A%20%20b%5B0%5D%20%3A%3D%2099%3B%0A%20%20writeln('b%5B0%5D%20%3D%2099%2C%20a%5B0%5D%20%3D%20'%2C%20a%5B0%5D%2C%20'%2C%20same%20storage%20%3D%20'%2C%20%40b%5B0%5D%20%3D%20%40a%5B0%5D)%3B%0A%20%20SetLength(a%2C%200)%3B%0A%20%20writeln('after%20SetLength(a%2C%200)%3A%20Length%20%3D%20'%2C%20Length(a)%2C%20'%2C%20a%20%3D%20nil%20is%20'%2C%20a%20%3D%20nil)%3B%0A%20%20writeln('b%20is%20still%20'%2C%20Length(b)%2C%20'%20elements%2C%20b%5B0%5D%20%3D%20'%2C%20b%5B0%5D)%3B%0Aend.\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>program explore;\n\nvar\n  a, b: array of integer;\n  i: integer;\n\nbegin\n  writeln('before SetLength: Length = ', Length(a), ', a = nil is ', a = nil);\n  SetLength(a, 3);\n  writeln('after SetLength(a, 3): Length = ', Length(a), ', Low = ', Low(a), ', High = ', High(a));\n  write('elements:');\n  for i := Low(a) to High(a) do\n    write(' ', a[i]);\n  writeln;\n  writeln('sizeof(a) = ', sizeof(a));\n  a[0] := 10;\n  a[1] := 20;\n  a[2] := 30;\n  SetLength(a, 5);\n  writeln('grown to 5: Length = ', Length(a), ', kept ', a[0], ' ', a[1], ' ', a[2], ', new ', a[3], ' ', a[4]);\n  b := a;\n  b[0] := 99;\n  writeln('b[0] = 99, a[0] = ', a[0], ', same storage = ', @b[0] = @a[0]);\n  SetLength(a, 0);\n  writeln('after SetLength(a, 0): Length = ', Length(a), ', a = nil is ', a = nil);\n  writeln('b is still ', Length(b), ' elements, b[0] = ', b[0]);\nend.\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20fpc%20explore.pas%20%26%26%20.%2Fexplore%0Abefore%20SetLength%3A%20Length%20%3D%200%2C%20a%20%3D%20nil%20is%20TRUE%0Aafter%20SetLength(a%2C%203)%3A%20Length%20%3D%203%2C%20Low%20%3D%200%2C%20High%20%3D%202%0Aelements%3A%200%200%200%0Asizeof(a)%20%3D%208%0Agrown%20to%205%3A%20Length%20%3D%205%2C%20kept%2010%2020%2030%2C%20new%200%200%0Ab%5B0%5D%20%3D%2099%2C%20a%5B0%5D%20%3D%2099%2C%20same%20storage%20%3D%20TRUE%0Aafter%20SetLength(a%2C%200)%3A%20Length%20%3D%200%2C%20a%20%3D%20nil%20is%20TRUE%0Ab%20is%20still%205%20elements%2C%20b%5B0%5D%20%3D%2099\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ fpc explore.pas &amp;&amp; .\u002Fexplore\u003C\u002Fspan>\nbefore SetLength: Length = 0, a = nil is TRUE\nafter SetLength(a, 3): Length = 3, Low = 0, High = 2\nelements: 0 0 0\nsizeof(a) = 8\ngrown to 5: Length = 5, kept 10 20 30, new 0 0\nb[0] = 99, a[0] = 99, same storage = TRUE\nafter SetLength(a, 0): Length = 0, a = nil is TRUE\nb is still 5 elements, b[0] = 99\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Indeksnya berjalan dari 0 sampai 2, sedangkan \u003Ccode>array[1..5]\u003C\u002Fcode> berjalan dari 1 sampai 5. Elemen baru bernilai nol, bukan sisa sampah. Membesarkan array dari 3 ke 5 mempertahankan \u003Ccode>10 20 30\u003C\u002Fcode> dan mengisi dua slot baru dengan nol.\u003C\u002Fp>\n\u003Cp>\u003Ccode>sizeof(a)\u003C\u002Fcode> bernilai 8 berapa pun panjangnya, karena variabelnya menyimpan pointer ke data, bukan datanya. \u003Ccode>array[1..5] of integer\u003C\u002Fcode> statis menempati 10 byte di sini: lima integer masing-masing dua byte, ukuran bawaan Free Pascal. Versi dinamis menggantikan 10 byte itu dengan pointer 8 byte ditambah blok heap, yaitu memori yang diminta program saat ia berjalan.\u003C\u002Fp>\n\u003Ch2 id=\"dua-nama-satu-array\">Dua nama, satu array\u003C\u002Fh2>\n\u003Cp>Penugasan \u003Ccode>b := a\u003C\u002Fcode> menyalin pointer, bukan elemennya. Setelah \u003Ccode>b[0] := 99\u003C\u002Fcode>, \u003Ccode>a[0]\u003C\u002Fcode> juga terbaca 99, dan \u003Ccode>@b[0] = @a[0]\u003C\u002Fcode> bernilai TRUE: kedua nama mencapai penyimpanan yang sama. \u003Ccode>SetLength(a, 0)\u003C\u002Fcode> mengosongkan \u003Ccode>a\u003C\u002Fcode>, tetapi \u003Ccode>b\u003C\u002Fcode> masih memegang kelima elemennya. Pascal menghitung referensi ke blok itu dan membebaskannya ketika referensi terakhir pergi.\u003C\u002Fp>\n\u003Cp>\u003Ccode>Copy\u003C\u002Fcode> memberimu penyimpanan yang independen. \u003Ccode>Copy(a, 1, 3)\u003C\u002Fcode> pada array yang berisi \u003Ccode>3 4 5 6 7 8\u003C\u002Fcode> mengembalikan \u003Ccode>4 5 6\u003C\u002Fcode>, karena indeks awalnya berbasis 0 seperti array itu sendiri. \u003Ccode>Copy(a, 4, 3)\u003C\u002Fcode> hanya mengembalikan \u003Ccode>7 8\u003C\u002Fcode>, karena tersisa dua elemen saja. Mengubah elemen pertama salinan menjadi 999 membiarkan aslinya di 3, dan \u003Ccode>@original[0] = @copy[0]\u003C\u002Fcode> bernilai FALSE.\u003C\u002Fp>\n\u003Ch2 id=\"pengecualiannya-tidak-ada-yang-menjaga-ujung\">Pengecualiannya: tidak ada yang menjaga ujung\u003C\u002Fh2>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PASCAL\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"program%20probe4%3B%0A%0A%7B%20Di%20luar%20batas%20dengan%20indeks%20yang%20tidak%20bisa%20dilihat%20compiler.%20%7D%0A%0Avar%0A%20%20dyn%3A%20array%20of%20integer%3B%0A%20%20i%3A%20integer%3B%0A%0Abegin%0A%20%20SetLength(dyn%2C%203)%3B%0A%20%20i%20%3A%3D%20Length(dyn)%3B%0A%20%20writeln('writing%20at%20index%20'%2C%20i%2C%20'%20of%20length%20'%2C%20Length(dyn))%3B%0A%20%20dyn%5Bi%5D%20%3A%3D%2042%3B%0A%20%20writeln('survived%2C%20dyn%5Bi%5D%20%3D%20'%2C%20dyn%5Bi%5D)%3B%0Aend.\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>program probe4;\n\n{ Di luar batas dengan indeks yang tidak bisa dilihat compiler. }\n\nvar\n  dyn: array of integer;\n  i: integer;\n\nbegin\n  SetLength(dyn, 3);\n  i := Length(dyn);\n  writeln('writing at index ', i, ' of length ', Length(dyn));\n  dyn[i] := 42;\n  writeln('survived, dyn[i] = ', dyn[i]);\nend.\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20fpc%20probe4.pas%20%26%26%20.%2Fprobe4%0Awriting%20at%20index%203%20of%20length%203%0Asurvived%2C%20dyn%5Bi%5D%20%3D%2042\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ fpc probe4.pas &amp;&amp; .\u002Fprobe4\u003C\u002Fspan>\nwriting at index 3 of length 3\nsurvived, dyn[i] = 42\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Indeks 3 pada array yang panjangnya 3 menulis ke memori yang bukan milik array itu, dan program keluar dengan status 0. Pemeriksaan rentang mati secara bawaan. Bangun dengan \u003Ccode>-Cr\u003C\u002Fcode> dan penulisan yang sama menghentikan program:\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20fpc%20-Cr%20probe4.pas%20%26%26%20.%2Fprobe4%0Awriting%20at%20index%203%20of%20length%203%0ARuntime%20error%20201%20at%20%2400000000004011D9%0A%20%20%2400000000004011D9%0A%20%20%24000000000042308C\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ fpc -Cr probe4.pas &amp;&amp; .\u002Fprobe4\u003C\u002Fspan>\nwriting at index 3 of length 3\nRuntime error 201 at $00000000004011D9\n  $00000000004011D9\n  $000000000042308C\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Status keluarnya 201. Indeks konstanta tertangkap lebih awal: dengan \u003Ccode>-Cr\u003C\u002Fcode>, menulis indeks 4 ke \u003Ccode>array[1..3]\u003C\u002Fcode> yang tetap menghentikan kompilasi dengan \u003Ccode>Error: range check error while evaluating constants (4 must be between 1 and 3)\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2 id=\"buat-pemeriksanya-gagal-lebih-dulu\">Buat pemeriksanya gagal lebih dulu\u003C\u002Fh2>\n\u003Cp>Simpan ini sebagai \u003Ccode>check_average.pas\u003C\u002Fcode>. Program ini membaca keluaran sebuah program dari stdin dan membandingkannya dengan dua baris yang diharapkan. Untuk setiap baris ia mencetak PASS atau FAIL, dan baris yang tidak pernah datang dihitung sebagai kegagalan dengan catatan &quot;no such line&quot;.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PASCAL\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"program%20check_average%3B%0A%0A%7B%20Membaca%20keluaran%20program%20dari%20stdin%20dan%20membandingkannya%20dengan%20baris%20yang%20diharapkan.%20%7D%0A%0Avar%0A%20%20expected%3A%20array%5B1..2%5D%20of%20string%3B%0A%20%20line%3A%20string%3B%0A%20%20i%2C%20passed%2C%20failed%2C%20total%3A%20integer%3B%0A%0Aprocedure%20Report(ok%3A%20boolean%3B%20n%3A%20integer%3B%20want%2C%20got%3A%20string)%3B%0Abegin%0A%20%20if%20ok%20then%0A%20%20begin%0A%20%20%20%20writeln('PASS%20%20line%20'%2C%20n%2C%20'%3A%20'%2C%20want)%3B%0A%20%20%20%20passed%20%3A%3D%20passed%20%2B%201%3B%0A%20%20end%0A%20%20else%0A%20%20begin%0A%20%20%20%20if%20got%20%3D%20''%20then%0A%20%20%20%20%20%20writeln('FAIL%20%20line%20'%2C%20n%2C%20'%3A%20expected%20%22'%2C%20want%2C%20'%22%2C%20no%20such%20line')%0A%20%20%20%20else%0A%20%20%20%20%20%20writeln('FAIL%20%20line%20'%2C%20n%2C%20'%3A%20expected%20%22'%2C%20want%2C%20'%22%2C%20got%20%22'%2C%20got%2C%20'%22')%3B%0A%20%20%20%20failed%20%3A%3D%20failed%20%2B%201%3B%0A%20%20end%3B%0Aend%3B%0A%0Abegin%0A%20%20expected%5B1%5D%20%3A%3D%20'count%3A%206'%3B%0A%20%20expected%5B2%5D%20%3A%3D%20'mean%3A%2076.2'%3B%0A%0A%20%20passed%20%3A%3D%200%3B%0A%20%20failed%20%3A%3D%200%3B%0A%20%20total%20%3A%3D%202%3B%0A%20%20i%20%3A%3D%200%3B%0A%0A%20%20while%20(not%20eof)%20and%20(i%20%3C%20total)%20do%0A%20%20begin%0A%20%20%20%20readln(line)%3B%0A%20%20%20%20i%20%3A%3D%20i%20%2B%201%3B%0A%20%20%20%20Report(line%20%3D%20expected%5Bi%5D%2C%20i%2C%20expected%5Bi%5D%2C%20line)%3B%0A%20%20end%3B%0A%0A%20%20while%20i%20%3C%20total%20do%0A%20%20begin%0A%20%20%20%20i%20%3A%3D%20i%20%2B%201%3B%0A%20%20%20%20Report(false%2C%20i%2C%20expected%5Bi%5D%2C%20'')%3B%0A%20%20end%3B%0A%0A%20%20writeln%3B%0A%20%20writeln(passed%2C%20'%20of%20'%2C%20total%2C%20'%20checks%20passed')%3B%0A%20%20if%20failed%20%3E%200%20then%0A%20%20%20%20ExitCode%20%3A%3D%201%3B%0Aend.\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>program check_average;\n\n{ Membaca keluaran program dari stdin dan membandingkannya dengan baris yang diharapkan. }\n\nvar\n  expected: array[1..2] of string;\n  line: string;\n  i, passed, failed, total: integer;\n\nprocedure Report(ok: boolean; n: integer; want, got: string);\nbegin\n  if ok then\n  begin\n    writeln('PASS  line ', n, ': ', want);\n    passed := passed + 1;\n  end\n  else\n  begin\n    if got = '' then\n      writeln('FAIL  line ', n, ': expected \"', want, '\", no such line')\n    else\n      writeln('FAIL  line ', n, ': expected \"', want, '\", got \"', got, '\"');\n    failed := failed + 1;\n  end;\nend;\n\nbegin\n  expected[1] := 'count: 6';\n  expected[2] := 'mean: 76.2';\n\n  passed := 0;\n  failed := 0;\n  total := 2;\n  i := 0;\n\n  while (not eof) and (i &lt; total) do\n  begin\n    readln(line);\n    i := i + 1;\n    Report(line = expected[i], i, expected[i], line);\n  end;\n\n  while i &lt; total do\n  begin\n    i := i + 1;\n    Report(false, i, expected[i], '');\n  end;\n\n  writeln;\n  writeln(passed, ' of ', total, ' checks passed');\n  if failed &gt; 0 then\n    ExitCode := 1;\nend.\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kompilasi pemeriksa itu dan versi 1 \u003Ccode>average.pas\u003C\u002Fcode> dengan \u003Ccode>fpc\u003C\u002Fcode>, lalu salurkan yang satu ke yang lain.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20.%2Faverage%20%3C%20scores.txt%20%7C%20.%2Fcheck_average%0AFAIL%20%20line%201%3A%20expected%20%22count%3A%206%22%2C%20got%20%22count%3A%205%22%0AFAIL%20%20line%202%3A%20expected%20%22mean%3A%2076.2%22%2C%20got%20%22mean%3A%2078.0%22%0A%0A0%20of%202%20checks%20passed\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ .\u002Faverage &lt; scores.txt | .\u002Fcheck_average\u003C\u002Fspan>\nFAIL  line 1: expected \"count: 6\", got \"count: 5\"\nFAIL  line 2: expected \"mean: 76.2\", got \"mean: 78.0\"\n\n0 of 2 checks passed\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Pemeriksa keluar dengan status 1 di sini, jadi sebuah skrip bisa memakainya sebagai gerbang.\u003C\u002Fp>\n\u003Ch2 id=\"beralih-ke-array-dinamis\">Beralih ke array dinamis\u003C\u002Fh2>\n\u003Cp>Ganti \u003Ccode>average.pas\u003C\u002Fcode> dengan versi 2. Array tetapnya menjadi \u003Ccode>array of integer\u003C\u002Fcode>, dan \u003Ccode>SetLength(scores, n + 1)\u003C\u002Fcode> dijalankan sebelum setiap pembacaan.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden bg-[#24292e] text-[#e1e4e8] transition-all\">\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ff5f56] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#ffbd2e] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"w-3 h-3 rounded-full bg-[#27c93f] border border-black\u002F40 inline-block\">\u003C\u002Fspan>\n      \u003Cspan class=\"ml-2 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">PASCAL\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"program%20average%3B%0A%0A%7B%20Versi%202%3A%20array%20tumbuh%20mengikuti%20apa%20pun%20yang%20datang.%20%7D%0A%0Avar%0A%20%20scores%3A%20array%20of%20integer%3B%0A%20%20n%2C%20sum%3A%20integer%3B%0A%0Abegin%0A%20%20n%20%3A%3D%200%3B%0A%20%20sum%20%3A%3D%200%3B%0A%20%20while%20not%20eof%20do%0A%20%20begin%0A%20%20%20%20SetLength(scores%2C%20n%20%2B%201)%3B%0A%20%20%20%20readln(scores%5Bn%5D)%3B%0A%20%20%20%20sum%20%3A%3D%20sum%20%2B%20scores%5Bn%5D%3B%0A%20%20%20%20n%20%3A%3D%20n%20%2B%201%3B%0A%20%20end%3B%0A%20%20writeln('count%3A%20'%2C%20Length(scores))%3B%0A%20%20writeln('mean%3A%20'%2C%20sum%20%2F%20n%3A0%3A1)%3B%0Aend.\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed bg-[#24292e]\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>program average;\n\n{ Versi 2: array tumbuh mengikuti apa pun yang datang. }\n\nvar\n  scores: array of integer;\n  n, sum: integer;\n\nbegin\n  n := 0;\n  sum := 0;\n  while not eof do\n  begin\n    SetLength(scores, n + 1);\n    readln(scores[n]);\n    sum := sum + scores[n];\n    n := n + 1;\n  end;\n  writeln('count: ', Length(scores));\n  writeln('mean: ', sum \u002F n:0:1);\nend.\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Kompilasi dan jalankan pipa yang sama.\u003C\u002Fp>\n\n\u003Cdiv class=\"code-block-wrapper code-output my-6 not-prose rounded-xl border-2 border-black dark:border-gray-600 shadow-neo overflow-hidden text-[#e1e4e8] transition-all\" data-output-block>\n  \u003Cdiv class=\"code-block-header flex items-center justify-between px-4 py-2.5 bg-[#1f2428] border-b-2 border-black dark:border-gray-600 font-mono text-xs font-bold text-gray-300 select-none\">\n    \u003Cdiv class=\"flex items-center gap-2\">\n      \u003Cspan class=\"code-output-mark\" aria-hidden=\"true\">&gt;_\u003C\u002Fspan>\n      \u003Cspan class=\"ml-1 font-mono font-bold text-xs uppercase tracking-wider text-gray-300\">Keluaran\u003C\u002Fspan>\n    \u003C\u002Fdiv>\n    \u003Cbutton type=\"button\" class=\"copy-code-btn flex items-center gap-1.5 px-3 py-1 text-xs font-bold bg-[#2f363d] text-gray-200 border-2 border-black dark:border-gray-500 rounded-lg shadow-neo-sm hover:translate-x-0.5 hover:translate-y-0.5 hover:shadow-none hover:bg-gray-700 transition-all cursor-pointer\" data-code=\"%24%20.%2Faverage%20%3C%20scores.txt%20%7C%20.%2Fcheck_average%0APASS%20%20line%201%3A%20count%3A%206%0APASS%20%20line%202%3A%20mean%3A%2076.2%0A%0A2%20of%202%20checks%20passed\" title=\"Salin\">\n      \u003Csvg class=\"w-3.5 h-3.5 copy-icon-svg\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n        \u003Cpath stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\">\u003C\u002Fpath>\n      \u003C\u002Fsvg>\n      \u003Cspan class=\"copy-text\">Salin\u003C\u002Fspan>\n    \u003C\u002Fbutton>\n  \u003C\u002Fdiv>\n  \u003Cdiv class=\"code-block-content p-4 overflow-x-auto text-sm font-mono leading-relaxed\">\n    \u003Cpre class=\"shiki github-dark\" style=\"background-color:#24292e;color:#e1e4e8\">\u003Ccode>\u003Cspan class=\"code-output-cmd\">$ .\u002Faverage &lt; scores.txt | .\u002Fcheck_average\u003C\u002Fspan>\nPASS  line 1: count: 6\nPASS  line 2: mean: 76.2\n\n2 of 2 checks passed\u003C\u002Fcode>\u003C\u002Fpre>\n  \u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cp>Pemeriksa sekarang keluar dengan status 0. Versi 2 melaporkan \u003Ccode>Length(scores)\u003C\u002Fcode> sebagai hitungannya, jadi angkanya datang dari array itu sendiri. Loop tidak punya \u003Ccode>MAX\u003C\u002Fcode> yang menghentikannya, dan array berakhir sepanjang berkasnya.\u003C\u002Fp>\n\u003Ch2 id=\"memilih-di-antara-keduanya\">Memilih di antara keduanya\u003C\u002Fh2>\n\u003Cp>Tanyakan siapa yang menentukan jumlahnya. Kalau kamu yang memutuskannya saat menulis program, pakai \u003Ccode>array[1..N]\u003C\u002Fcode> dengan sebuah konstanta. Kalau datanya yang menentukan, pakai \u003Ccode>array of\u003C\u002Fcode> dan indeks dari 0. Bangun dengan \u003Ccode>-Cr\u003C\u002Fcode> selama kamu menguji, karena array dinamis tidak menghentikan penulisan melewati ujungnya secara bawaan.\u003C\u002Fp>\n","\u003Cul>\n\u003Cli>\u003Ccode>array[1..MAX]\u003C\u002Fcode> yang tetap berhenti membaca di \u003Ccode>MAX\u003C\u002Fcode> tanpa peringatan, dan begitulah enam nilai menghasilkan rata-rata dari lima nilai.\u003C\u002Fli>\n\u003Cli>Array dinamis mulai dengan \u003Ccode>Length\u003C\u002Fcode> 0 dan sama dengan \u003Ccode>nil\u003C\u002Fcode>; \u003Ccode>SetLength\u003C\u002Fcode> memberinya panjang, dan elemen baru datang sebagai nol, bukan sebagai sampah.\u003C\u002Fli>\n\u003Cli>Indeksnya berjalan dari 0 sampai \u003Ccode>High\u003C\u002Fcode>, sedangkan \u003Ccode>array[1..5]\u003C\u002Fcode> statis berjalan dari 1 sampai 5.\u003C\u002Fli>\n\u003Cli>\u003Ccode>b := a\u003C\u002Fcode> menyalin pointer, jadi menulis lewat \u003Ccode>b\u003C\u002Fcode> mengubah \u003Ccode>a\u003C\u002Fcode>; \u003Ccode>Copy(a, start, count)\u003C\u002Fcode> yang membuat penyimpanan independen.\u003C\u002Fli>\n\u003Cli>\u003Ccode>SetLength(a, 0)\u003C\u002Fcode> melepas apa yang ditunjuk \u003Ccode>a\u003C\u002Fcode>, tetapi variabel kedua yang memegang blok yang sama menjaga datanya tetap hidup sampai referensi terakhir pergi.\u003C\u002Fli>\n\u003Cli>Tidak ada yang menghentikan penulisan melewati ujung secara bawaan: bangun dengan \u003Ccode>-Cr\u003C\u002Fcode> untuk mengubahnya menjadi \u003Ccode>Runtime error 201\u003C\u002Fcode> alih-alih korupsi diam-diam.\u003C\u002Fli>\n\u003C\u002Ful>\n",[200,219,240,258,273,290],{"id":201,"title":202,"title_id":203,"slug":204,"excerpt":205,"excerpt_id":206,"has_translation":12,"published_at":207,"reading_time":137,"hidden_from_listing":15,"tags":208,"thumbnail_image":21,"og_image":210,"series":211,"authors":216},48,"What a Linked List Actually Is","Tentang Struktur Data LinkedList","tentang-struktur-data-linked-list","A linked list is a linear chain of nodes, each holding data and a pointer to the next node. Here is what that chain looks like, what it costs next to an array, and the same minimal implementation in Java, Python, and JavaScript.","Linked list adalah rantai linear berisi node, dan setiap node menyimpan data plus pointer ke node berikutnya. Ini bentuk rantainya, ongkosnya dibanding array, dan implementasi paling sederhana dalam Java, Python, serta JavaScript.","2026-11-21T01:00:00.000Z",[103,209,154,104],"linked-list","\u002Fog\u002Ftentang-struktur-data-linked-list.png",{"id":212,"title":213,"title_id":214,"slug":215},28,"Linear Data Structures","Struktur Data Linear","asd-struktur-linear",[217],{"authors_id":218},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":220,"title":221,"title_id":222,"slug":223,"excerpt":224,"excerpt_id":225,"has_translation":12,"published_at":226,"reading_time":227,"hidden_from_listing":15,"tags":228,"thumbnail_image":21,"og_image":231,"series":232,"authors":237},47,"Why Understanding Algorithms and Data Structures Actually Matters","Pentingnya Memahami Algoritma dan Struktur Data","pentingnya-memahami-algoritma-dan-struktur-data","An algorithm is an ordered list of steps, and that order decides how expensive a problem is. The examples are on the back of an instant noodle packet, in a factorial, and behind ctrl+z.","Sebagai konsep fundamental, algoritma menentukan seberapa mahal sebuah masalah diselesaikan. Contohnya ada di bungkus mie instan, di bilangan faktorial, dan di tombol undo.","2026-11-19T01:00:00.000Z",7,[229,103,104,230],"algoritma","dasar","\u002Fog\u002Fpentingnya-memahami-algoritma-dan-struktur-data.png",{"id":233,"title":234,"title_id":235,"slug":236},27,"About Algorithms and Data Structures","Tentang Algoritma dan Struktur Data","asd-intro",[238],{"authors_id":239},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":241,"title":242,"title_id":243,"slug":244,"excerpt":245,"excerpt_id":246,"has_translation":12,"published_at":247,"reading_time":248,"hidden_from_listing":15,"tags":249,"thumbnail_image":21,"og_image":252,"series":253,"authors":255},150,"Java Loops: the Last Price That Never Reached the Sum","Loop Java: Harga Terakhir yang Tidak Pernah Masuk ke Total","java-loops","Four prices add up to 47000, and the cart program prints 36500. The bound is `prices.length - 1`, so the last item is never read while the average is still divided by four.","Empat harga berjumlah 47000, tapi program keranjang mencetak 36500. Batasnya `prices.length - 1`, jadi item terakhir tidak pernah dibaca sementara rata-ratanya tetap dibagi empat.","2026-11-13T01:00:00.000Z",6,[250,251],"java","loop","\u002Fog\u002Fjava-loops.png",{"id":254,"title":60,"title_id":61,"slug":62},13,[256],{"authors_id":257},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":259,"title":260,"title_id":261,"slug":262,"excerpt":263,"excerpt_id":264,"has_translation":12,"published_at":265,"reading_time":248,"hidden_from_listing":15,"tags":266,"thumbnail_image":21,"og_image":268,"series":269,"authors":270},149,"Java switch: the 78 That Came Out as a C","Java switch: 78 yang Keluar sebagai C","java-switch","A grading program marks a paper 78 and prints `grade: C`. `case 7` assigns `B` and then runs into `case 6` because the `break` is missing, and the compiler says nothing about it.","Sebuah program penilaian memberi nilai 78 pada satu lembar ujian lalu mencetak `grade: C`. `case 7` memberi `B` lalu jatuh ke `case 6` karena `break`-nya hilang, dan kompilator tidak mengatakan apa pun soal itu.","2026-11-12T01:00:00.000Z",[250,267],"percabangan","\u002Fog\u002Fjava-switch.png",{"id":254,"title":60,"title_id":61,"slug":62},[271],{"authors_id":272},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":274,"title":275,"title_id":276,"slug":277,"excerpt":278,"excerpt_id":279,"has_translation":12,"published_at":265,"reading_time":14,"hidden_from_listing":15,"tags":280,"thumbnail_image":21,"og_image":285,"series":286,"authors":287},108,"At 11 a.m. the AI Quota Runs Out, and the Work Stops There","Jam 11 siang kuota AI-nya habis, dan kerjaan berhenti di situ","jam-11-kuota-ai-habis-kerjaan-berhenti","The panel says the usage limit is reached and the work stops, not because it is finished. Three guesses explain it, and all three are wrong: the limit is shaped like a cliff, and the day is built on top of one tool.","Panel di layar bilang batas pemakaian tercapai, dan kerja berhenti di situ. Bukan karena selesai. Ada tiga tebakan kenapa ini terjadi, dan ketiganya salah: batasnya berbentuk tebing, dan harinya dibangun di atas satu alat.",[281,282,283,284],"ai","tooling","rate-limit","produktivitas","\u002Fog\u002Fjam-11-kuota-ai-habis-kerjaan-berhenti.png",{"id":24,"title":25,"title_id":26,"slug":27},[288],{"authors_id":289},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},{"id":291,"title":292,"title_id":21,"slug":293,"excerpt":294,"excerpt_id":21,"has_translation":15,"published_at":78,"reading_time":248,"hidden_from_listing":15,"tags":295,"thumbnail_image":21,"og_image":298,"series":299,"authors":301},148,"Go Variables: the Mean That Printed 0.0","go-program-structure-and-variables","Six scores arrive, all six are added up, and Go prints a mean of 0.0. A second `total := 0` inside the `if` block is the whole bug, and the compiler that refuses unused variables has nothing to say about it.",[296,230,297],"go","variabel","\u002Fog\u002Fgo-program-structure-and-variables.png",{"id":300,"title":56,"title_id":57,"slug":58},11,[302],{"authors_id":303},{"id":110,"name":111,"slug":112,"role":113,"profile_picture":21},[305,308,311,314,317,320],{"text":306,"depth":152,"id":307},"Beri array panjang saat program berjalan","beri-array-panjang-saat-program-berjalan",{"text":309,"depth":152,"id":310},"Dua nama, satu array","dua-nama-satu-array",{"text":312,"depth":152,"id":313},"Pengecualiannya: tidak ada yang menjaga ujung","pengecualiannya-tidak-ada-yang-menjaga-ujung",{"text":315,"depth":152,"id":316},"Buat pemeriksanya gagal lebih dulu","buat-pemeriksanya-gagal-lebih-dulu",{"text":318,"depth":152,"id":319},"Beralih ke array dinamis","beralih-ke-array-dinamis",{"text":321,"depth":152,"id":322},"Memilih di antara keduanya","memilih-di-antara-keduanya",1794557078049]