{"id":155,"date":"2019-09-30T22:16:27","date_gmt":"2019-09-30T19:16:27","guid":{"rendered":"http:\/\/www.potansif.com\/?p=155"},"modified":"2019-09-30T22:16:27","modified_gmt":"2019-09-30T19:16:27","slug":"array-nedir-nasil-kullanilir","status":"publish","type":"post","link":"http:\/\/www.potansif.com\/?p=155","title":{"rendered":"Array Nedir, Nas\u0131l Kullan\u0131l\u0131r"},"content":{"rendered":"<p>Bu yaz\u0131da daha \u00e7ok, Pascal&#8217;daki Array kavram\u0131n\u0131n ne oldu\u011funu, nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131, klasik kullan\u0131m \u00f6rneklerini ve i\u015fimizi basitle\u015ftirecek baz\u0131 ufak tefek&nbsp;fonksiyon \u00f6nerilerini inceleyece\u011fiz. Fakat Array&#8217;larla ilgili pointer ve heap gibi mekanizmalara ve kompleks veri tipleriyle (class, generics vb&#8230;) nas\u0131l kullan\u0131ld\u0131\u011f\u0131na dair konulara de\u011finmeyece\u011fiz. Bunlar daha ileri konular ve as\u0131l konu ba\u015fl\u0131 ba\u015f\u0131na geni\u015f bir i\u00e7eri\u011fe sahip oldu\u011fu i\u00e7in anlat\u0131m\u0131&nbsp;da\u011f\u0131tma potansiyeline sahipler, o nedenle belki ba\u015fka bir makalede bunlara de\u011finiriz. \u00d6rneklerimizi basit veri t\u00fcrleri ile s\u0131n\u0131rland\u0131raca\u011f\u0131z ve performans ile ilgili konulara girmeyee\u011fiz, sadece nedir, nas\u0131l kullan\u0131l\u0131r sorular\u0131n\u0131n etraf\u0131nda dola\u015faca\u011f\u0131z. Bununla birlikte Arraylar\u0131 kullan\u0131rken sadece basit (veya basitle\u015ftirilmi\u015f) veri tipleriyle (byte, integer, char, TDateTime, Double, currency, string gibi) s\u0131n\u0131rl\u0131 olmad\u0131\u011f\u0131n\u0131z\u0131 bilmeniz yararl\u0131 olur.<br \/>\n<!--more--><br \/>\nGirizgaha matematik ile ba\u015flayal\u0131m; Net bir tan\u0131m\u0131 olmamas\u0131na ra\u011fmen Matematikteki k\u00fcme kavram\u0131 tarif edilirken &#8220;Belirli \u00f6zelli\u011fe sahip olan nesneler toplulu\u011fu&#8221; ifadesi kullan\u0131l\u0131r. Array&#8217;lar\u0131 da bu \u00e7er\u00e7eveden ele al\u0131rsak bellekte olu\u015fturdu\u011fumuz k\u00fcmeler olarak d\u00fc\u015f\u00fcnebiliriz. Buna g\u00f6re; Ayn\u0131 veri tipine sahip (ayn\u0131 t\u00fcrde olmak zorunda da de\u011fil) de\u011ferler k\u00fcmesini topluca y\u00f6netebildi\u011fimiz, bir kolleksiyon olarak ele alabildi\u011fimiz yap\u0131lara dizi, yani &#8220;Array&#8221; diyoruz. De\u011fi\u015fken olarak tan\u0131mlayabildi\u011fimiz her\u015feyi birer dizi olarak da tan\u0131mlayabiliriz. \u00c7\u00fcnk\u00fc Dizilerin kendisi de asl\u0131nda ve ayn\u0131 zamanda birer veri tipidir. K\u00fcmeyi olu\u015fturan nesnelere k\u00fcmenin &#8220;elemanlar\u0131&#8221; denir. Ayn\u0131 \u015fekilde Array&#8217;lar da elemanlardan olu\u015fur ve her bir eleman\u0131n bir indis de\u011feri vard\u0131r. Bu indis de\u011ferini kullanarak Array&#8217;\u0131n elemanlar\u0131 (Item&#8217;leri) aras\u0131nda gezinebiliriz.<\/p>\n<p>Pascal&#8217;da \u00fc\u00e7 tip Array tan\u0131m\u0131 vard\u0131r. Bunlar dura\u011fan, sabit, yani &#8220;Statik Array&#8221; tipi, bunun tam tersi olan, \u00e7al\u0131\u015fma zaman\u0131nda boyunu anl\u0131k olarak de\u011fi\u015ftirebilece\u011fimiz &#8220;Dinamic Array&#8221; tipi ve son olarak fonksiyon ve prosed\u00fcrlere parametre olarak iletebildi\u011fimiz A\u00e7\u0131k Dizi \/ Open Array&#8217;lar vard\u0131r. Boyut a\u00e7\u0131s\u0131ndan ise tek boyutlu Array&#8217;lar ve \u00e7ok boyutlu arraylar olarak ikiye ay\u0131rmak san\u0131r\u0131m daha do\u011fru bir yakla\u015f\u0131m olabilir.<\/p>\n<p>K\u0131saca Array&#8217;lar\u0131 tan\u0131d\u0131\u011f\u0131m\u0131za g\u00f6re art\u0131k sade ve basit misallerle yaz\u0131m\u0131z\u0131 \u00f6rneklendirmeye ba\u015flayabiliriz.<\/p>\n<h1>STATIK ARRAY \/ SAB\u0130T D\u0130Z\u0130LER<\/h1>\n<p>Yukar\u0131da k\u0131saca de\u011findi\u011fimiz gibi bu t\u00fcr diziler \u00e7al\u0131\u015fma an\u0131ndayken eleman say\u0131s\u0131 de\u011fi\u015ftirilemeyen dizilerdir. Eleman say\u0131s\u0131 a\u00e7\u0131s\u0131ndan nas\u0131l tan\u0131mlanm\u0131\u015flarsa o s\u0131n\u0131rlar i\u00e7erisinde kullan\u0131l\u0131rlar. Eleman say\u0131s\u0131 sabittir ve \u00e7al\u0131\u015fma an\u0131nda eleman say\u0131s\u0131 de\u011fi\u015ftirilemez, bunun temel bir sebebi vard\u0131r, o da bu t\u00fcr dizilere ayr\u0131lan bellek b\u00f6lgesinin sabit olmas\u0131ndan kaynaklan\u0131r.<\/p>\n<p>Bunun d\u0131\u015f\u0131nda ba\u015flang\u0131\u00e7 indis de\u011feri statik dizilerde rahatl\u0131kla belirlenebilir. Biz \u00f6rneklerimizde &#8220;[0..9]&#8221; \u015feklinde bir kullan\u0131m sergiledik fakat bir statik dizi i\u00e7in bu b\u00f6yle olmak zorunda de\u011fil, mesela &#8220;[5..10000]&#8221; veya &#8220;[-41..94]&#8221; gibi de tan\u0131mlanabilir. Buradaki ana belirleyici unsur, sizin indis de\u011ferini baz ald\u0131\u011f\u0131n\u0131z durumlar\u0131 y\u00f6netmeye ihtiyac\u0131n\u0131z\u0131n olup olmad\u0131\u011f\u0131d\u0131r&#8230;<\/p>\n<p>A\u015fa\u011f\u0131daki \u00f6rnekte basit bir statik dizi tan\u0131m\u0131 yap\u0131lmaktad\u0131r;<\/p>\n<pre><code>var\n&nbsp; BiDizi&nbsp; : Array [0..9]&nbsp; of integer;<\/code><\/pre>\n<p>Yukar\u0131da &#8220;BiDizi&#8221; ad\u0131nda, toplamda (yani s\u0131f\u0131r da dahil olmak \u00fczere) &#8220;10&#8221; adet eleman\u0131 olan ve veri tipi INTEGER olan bir dizi tan\u0131mlam\u0131\u015f olduk. Bu tan\u0131ma g\u00f6re bu dizideki elemanlara nas\u0131l eri\u015fece\u011fimizin de bir \u00f6rne\u011fini vermek, konunun anla\u015f\u0131lmas\u0131 a\u00e7\u0131s\u0131ndan yard\u0131mc\u0131 olabilir;<\/p>\n<pre><code>var\n&nbsp; BiDizi : Array [0..9] of integer;\n&nbsp; I: Integer;\nbegin\n&nbsp; BiDizi[0] := 1;\n&nbsp; BiDizi[1] := 2;\n&nbsp; BiDizi[2] := 3;\n&nbsp; BiDizi[3] := 4;\n&nbsp; BiDizi[4] := 5;\n&nbsp; BiDizi[5] := 6;\n&nbsp; BiDizi[6] := 7;\n&nbsp; BiDizi[7] := 8;\n&nbsp; BiDizi[8] := 9;\n&nbsp; BiDizi[9] := 10;\n\n&nbsp; \/\/ Ba\u015fka bir \u00f6rnek;\n&nbsp; for I := 0 to 9 do BiDizi[I] := I + 1;\n\n&nbsp; \/\/ Di\u011fer bir \u00f6rnek;\n&nbsp; for I in BiDizi do begin\n&nbsp; &nbsp; &nbsp; BiDizi[I] := I * 2;\n&nbsp; &nbsp; &nbsp; Memo1.Lines.Add(BiDizi[I].ToString);\n&nbsp; end;\n\n&nbsp; \/\/ Daha ba\u015fka bir \u00f6rnek\n&nbsp; for I := Low(BiDizi) to High(BiDizi) do begin\n&nbsp; &nbsp; &nbsp; BiDizi[I] := I div 2;\n&nbsp; &nbsp; &nbsp; Memo1.Lines.Add(BiDizi[I].ToString);\n&nbsp; end;\nend;<\/code><\/pre>\n<p>Dikkat ettiyseniz dizimizin ilk eleman\u0131 &#8220;0&#8221; ile ifade ediliyor. E\u011fer tan\u0131m\u0131 \u015fu \u015fekilde yapsayd\u0131k;<\/p>\n<pre><code>var\n&nbsp; BiDizi : Array [5..9]&nbsp; &nbsp;of integer; \/\/ veya &gt; of string; of char; of Currency; of TDateTime; \/\/ vs...<\/code><\/pre>\n<p>Bu diziyi BiDizi[0] \u015fekilde kulland\u0131\u011f\u0131m\u0131zda derleyici bize &#8220;s\u0131f\u0131r&#8221; indisli bir dizi eleman\u0131 olmad\u0131\u011f\u0131 i\u00e7in &#8220;E1012 Constant expression violates subrange bounds&#8221; \u015feklinde bir hata mesaj\u0131 verecekti&#8230;<\/p>\n<p>Konuya geri d\u00f6necek olursak, diziler sadece bir de\u011fi\u015fken olarak tan\u0131mlanmak zorunda de\u011fildir. Statik Dizileri bir sabit veya bir tip olarak da tan\u0131mlamak m\u00fcmk\u00fcnd\u00fcr;<\/p>\n<p>Bir de\u011fi\u015fken olarak tan\u0131mlayaca\u011f\u0131m\u0131z zaman;<\/p>\n<pre><code>var\n&nbsp; BiDizi : Array [0..9] of Integer;<\/code><\/pre>\n<p>Bir tip olarak tan\u0131mlayaca\u011f\u0131m\u0131z zaman;<\/p>\n<pre><code>type\n&nbsp; TDizi = Array [0..9] of integer;\n&nbsp; \/\/ devam\u0131d\u0131r;\nvar\n&nbsp; BiDizi: TDizi;<\/code><\/pre>\n<p>Ve dizimizin boyutunun sabit oldu\u011fu gibi, i\u00e7eri\u011finin de sabit olmas\u0131n\u0131 istiyorsak bunu bir sabit olarak da tan\u0131mlayabiliriz, \u015f\u00f6yle;<\/p>\n<pre><code>const\n&nbsp; BiDizi : Array [0..9] of Integer = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);\n&nbsp; \/\/ veya ba\u015fka bir veri tipiyle daha anla\u015f\u0131l\u0131r ba\u015fka bir \u00f6rnek\n&nbsp; Aylar : Array [1..12] of String = ('Ocak', '\u015eubat', 'Mart', 'Nisan', 'May\u0131s', 'Haziran', 'Temmuz', 'A\u011fustos', 'Eyl\u00fcl', 'Ekim', 'Kas\u0131m', 'Aral\u0131k');<\/code><\/pre>\n<p>Tabi b\u00f6yle bir tan\u0131mlama yapt\u0131\u011f\u0131m\u0131zda dizimiz \u00e7al\u0131\u015fma an\u0131ndayken de\u011fi\u015ftirilemez (readonly) bir nitelik kazanacakt\u0131r.&nbsp;<\/p>\n<p>ufak bir kullan\u0131m \u00f6rne\u011fiyle bu k\u0131sm\u0131 bitirip Dinamik arraylara ge\u00e7ebiliriz;<\/p>\n<pre><code>const\n&nbsp; Aylar : Array [1..12] of String = ('Ocak', '\u015eubat', 'Mart', 'Nisan', 'May\u0131s', 'Haziran', 'Temmuz', 'A\u011fustos', 'Eyl\u00fcl', 'Ekim', 'Kas\u0131m', 'Aral\u0131k');\nbegin\n&nbsp; for I := Low(Aylar) to High(Aylar) do&nbsp; Memo1.Lines.Add( Aylar[I] );\nend;<\/code><\/pre>\n<h1>DYNAMIC ARRAY &#8211; D\u0130NAM\u0130K D\u0130Z\u0130LER<\/h1>\n<p>Ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere bu Array tipi \u00e7al\u0131\u015fma zaman\u0131nda eleman say\u0131s\u0131 de\u011fi\u015ftirilebilen, dolay\u0131s\u0131yla bellekte geni\u015fleyip daralabilen dizilerdir. Dinamik diziler tan\u0131mland\u0131\u011f\u0131 s\u0131rada kullanaca\u011f\u0131 veri tipini belirtir fakat herhangi bir eleman say\u0131s\u0131 bilgisine bildirmeyiz. Dinamik bir diziye bir de\u011fer atad\u0131\u011f\u0131m\u0131zda (yani onu bir de\u011fi\u015fkenmi\u015f gibi kulland\u0131\u011f\u0131m\u0131zda) veya onu SetLength yordam\u0131na maruz b\u0131rakt\u0131\u011f\u0131m\u0131zda, dinamik dizimiz i\u00e7in bellek yeniden ayarlan\u0131r. Dinamik diziyi bir de\u011fi\u015fken olarak kullanmay\u0131p, do\u011frudan elemanlar\u0131n\u0131 i\u015flemek istedi\u011fimizde hen\u00fcz bellekte kendine ait bir b\u00f6lge olmad\u0131\u011f\u0131 i\u00e7in diziyi &#8220;ilklendirmeliyiz&#8221;. Yani &#8220;SetLength(BiDizi, 15)&#8221; komutu kullan\u0131larak diziye bellekte ka\u00e7 (\u00f6rnekte 15) elemanl\u0131k bellek ayr\u0131lmas\u0131 gerekti\u011fini belirtiriz. Bu durumda belle\u011fin, bir k\u0131sm\u0131, bu dizi i\u00e7in tahsis edilir. Bellekteki bu aktivitenin nas\u0131l i\u015fledi\u011fi, mekanizman\u0131n nas\u0131l oldu\u011fu gibi konular bu yaz\u0131n\u0131n kapsam\u0131n\u0131 da\u011f\u0131tmamak ad\u0131na de\u011finilmeyecek. Bu tarz, bellek mekanizmas\u0131na dair mevzular muhtemelen yorumlar k\u0131sm\u0131nda di\u011fer arkada\u015flar\u0131m taraf\u0131ndan de\u011finilecektir diye tahmin ediyorum.<\/p>\n<p>Dinamik dizilerde indis belirtilemez, dolay\u0131s\u0131yla bu tip dizilerde indis her zaman &#8220;0&#8221; ile ba\u015flar ve negatif bir de\u011fer alamaz. Bu nedenle her zaman toplam eleman say\u0131s\u0131, eksi bir, olacak \u015fekilde dizi elemanlar\u0131 aras\u0131nda dola\u015fmam\u0131z gerekir. A\u015fa\u011f\u0131daki bir ka\u00e7 \u00f6rnek san\u0131r\u0131m bunu a\u00e7\u0131klamaya yard\u0131mc\u0131 olacakt\u0131r;<\/p>\n<pre><code>var\n&nbsp; BiDizi, DiziDegiskeni : Array of Integer;\n&nbsp; I: Integer;\nbegin\n&nbsp; SetLength(BiDizi, 5); \/\/ BiDizi adl\u0131 dizinin eleman say\u0131s\u0131n\u0131 burada belirtti\u011fimize dikkat edin.\n&nbsp; memo1.Clear;\n&nbsp; for I := Low(BiDizi) to High(BiDizi) do begin\n&nbsp; &nbsp; &nbsp; BiDizi[I] := I;\n&nbsp; &nbsp; &nbsp; Memo1.Lines.Add( BiDizi[I].ToString );\n&nbsp; end;\n\n&nbsp; DiziDegiskeni := BiDizi; \/\/ DiziDegiskeni'ni SETLENGTH ile ayarlamad\u0131\u011f\u0131m\u0131za, \"DiziDegiskeni\"'ni bir \"de\u011fi\u015fken\" olarak kulland\u0131\u011f\u0131m\u0131za dikkat edin...\n&nbsp; for I := Low(DiziDegiskeni) to High(DiziDegiskeni) do begin\n&nbsp; &nbsp; &nbsp; BiDizi[I] := I;\n&nbsp; &nbsp; &nbsp; Memo1.Lines.Add( DiziDegiskeni[I].ToString );\n&nbsp; end;\nend;<\/code><\/pre>\n<p>Setlength kullan\u0131m\u0131na alternatif olarak do\u011frudan k\u00fcme ifadesi de kullan\u0131labilir;<\/p>\n<pre><code>var\n&nbsp; BiDizi: Array of Integer;\nbegin\n&nbsp; BiDizi := [1,2,3,4,5,6,7,8]; \/\/ do\u011frudan 8 elemanl\u0131 bir dinamik dizi olu\u015fturmu\u015f olduk.\nend;<\/code><\/pre>\n<h1>OPEN ARRAY &#8211; A\u00c7IK D\u0130Z\u0130LER<\/h1>\n<p>Yukar\u0131daki \u00f6rnek kodda dizilerimizi bir de\u011fi\u015fken olarak tan\u0131mlad\u0131k ve ayn\u0131 veri tipinde olmalar\u0131na ra\u011fmen aslen pek de ger\u00e7ek\u00e7i bir \u00f6rnek olmad\u0131\u011f\u0131n\u0131 g\u00f6rd\u00fck. G\u00f6rd\u00fck \u00e7\u00fcnk\u00fc de\u011fi\u015fkenlerimizi ve tiplerimizi fiiliyatta tek bir noktada tan\u0131mlamayabiliyoruz. Bu sorunu a\u015fmak i\u00e7in kulland\u0131\u011f\u0131m\u0131z diziye \u00f6zel veri tipleri tan\u0131mlayabiliriz. Hemen \u00f6rnek verelim;<\/p>\n<pre><code>type\n&nbsp; TDiziTipim = array of integer;\n&nbsp; TAylar = array [1..12] of string;\n\n\/\/...\n\nvar\n&nbsp; BiDizi&nbsp; &nbsp; &nbsp; &nbsp; : TDiziTipim;\n&nbsp; DiziDegiskeni : TDiziTipim;\n&nbsp; Aylar&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: TAylar;<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bir \u00f6nceki \u00f6rnekte BiDizi ve DiziDegiskeni adl\u0131 de\u011fi\u015fkenlerimizi tan\u0131mlarken araya virg\u00fcl katmam\u0131z gerekmi\u015f idi, \u015fimdiki \u00f6rnekte ise b\u00f6yle bir k\u0131s\u0131tlamaya maruz kalmam\u0131\u015f olduk. Biz, bu t\u00fcr bir tan\u0131mlamaya OPEN ARRAY \/ A\u00c7IK D\u0130Z\u0130 diyoruz.&nbsp;<\/p>\n<p>A\u00e7\u0131k dizileri, derleme zaman\u0131nda elemanlar\u0131 hen\u00fcz belirlenmemi\u015f olan diziler olarak da d\u00fc\u015f\u00fcnebiliriz. A\u00e7\u0131k dizileri dinamik dizilerden ay\u0131ran temel unsur a\u00e7\u0131k dizilerin bir veri tipi olarak tan\u0131mlanmas\u0131ndan kaynaklan\u0131yor. \u015e\u00f6yleki; Diziler parametre olarak da kullan\u0131labilirler. Dizi parametresinin belli bir indis aral\u0131\u011f\u0131 veya s\u0131n\u0131r\u0131 yoksa (veya istenen \u015fey asl\u0131nda dinamik bir dizi ise) bunu do\u011frudan de\u011fil, dolayl\u0131 olarak parametize ederiz. Bu tip dizilere A\u00c7IK D\u0130Z\u0130 \/ OPEN ARRAY denir ve &#8220;var&#8221; k\u0131sm\u0131nda de\u011fil, &#8220;type&#8221; k\u0131sm\u0131nda bir tip olarak tan\u0131mlan\u0131r. Delphi, a\u00e7\u0131k dizilerin bellekte ne kadar yer kaplayaca\u011f\u0131n\u0131 &#8220;\u00f6rt\u00fcl\u00fc olarak&#8221; kendisi arka tarafta y\u00f6netir. Yani setlength ile bir A\u00c7IK ARRAY&#8217;\u0131n ka\u00e7 elemana sahip olaca\u011f\u0131n\u0131 siz s\u00f6ylemezsiniz, bunu Delphi arka tarafta kendisi otomatik olarak yapar.<\/p>\n<p>A\u00e7\u0131k dizilerin kullan\u0131m\u0131 ile ilgili alternatif olarak Create olu\u015fturucusu da kullan\u0131labilir; Mesela;<\/p>\n<pre><code>type\n&nbsp; TDizi = array of Integer;\nvar\n&nbsp; BiDizi: TDizi;\nbegin\n&nbsp; BiDizi := TDizi.Create(3,5,7,9,11 {...});\nend;<\/code><\/pre>\n<p>veya \u00e7ok daha k\u0131sa bir y\u00f6ntem, do\u011frudan k\u00fcme de\u011ferlerini girmek \u015feklinde de olabilir;<\/p>\n<pre><code>...\nbegin\n&nbsp; BiDizi := [1,2,3,4,5,6,7,89,9];\nend;<\/code><\/pre>\n<p>A\u00e7\u0131k dizileri birbiriyle toplamak da m\u00fcmk\u00fcnd\u00fcr; Bunun i\u00e7in \u00f6rnekteki gibi &#8220;+&#8221; operat\u00f6r\u00fc veya &#8220;concat&#8221; fonksiyonu alternatif olarak kullan\u0131labilir;<\/p>\n<pre><code>type\n&nbsp; TDizi = array of Integer;\nvar\n&nbsp; BiDizi, DigerDizi: TDizi;\n&nbsp; I: Integer;\nbegin\n&nbsp; BiDizi := [1,3,5,7,9];\n&nbsp; DigerDizi := Bidizi + [2,4,6,8];\n&nbsp; for I := Low(DigerDizi) to High(DigerDizi) do Memo1.Lines.Add(DigerDizi[I].ToString);\n\n&nbsp; Memo1.Text := Memo1.Text + #13#10;\n&nbsp; DigerDizi := Concat(DigerDizi, [55,56], [100,200]);\n&nbsp; for I := Low(DigerDizi) to High(DigerDizi) do Memo1.Text := Memo1.Text + ', ' + DigerDizi[I].ToString;\nend;<\/code><\/pre>\n<p>Fakat \u00e7\u0131karma &#8220;-&#8221; operat\u00f6r\u00fcn\u00fc kullanamazs\u0131n\u0131z. Bunun yerine Delete metodu kullan\u0131labilir;<\/p>\n<pre><code>&nbsp; ...\n&nbsp; Delete(DigerDizi, 0, 2);\n&nbsp; for I := Low(DigerDizi) to High(DigerDizi) do Memo1.Lines.Add(DigerDizi[I].ToString);\nend;<\/code><\/pre>\n<h1>MULTI-DIMENSIONAL ARRAY&#8217;LAR &#8211; \u00c7OK BOYUTLU D\u0130Z\u0130LER<\/h1>\n<p>Basit anlamda sade, statik bir dizinin, dinamik bir dizinin ve a\u00e7\u0131k bir dizinin hangi y\u00f6ntemlerle tan\u0131mlanabilece\u011fini g\u00f6rd\u00fc\u011f\u00fcm\u00fcze g\u00f6re \u00e7ok boyutlu dizilerin nas\u0131l tan\u0131mlanabilece\u011fini de inceleyebiliriz. Gerek Statik, gerek dinamik, gerekse de a\u00e7\u0131k dizi olsun, bir diziyi \u00e7ok boyutlu yapan \u015fey, bir eleman i\u00e7in birden \u00e7ok indisin tan\u0131mlanabilmesidir.<\/p>\n<p>\u00d6rneklemeyi Statik Arraylar i\u00e7in konu\u015facak olursak onlar\u0131 tan\u0131mlarken &#8220;[0..9]&#8221; gibi bir indis s\u0131n\u0131rlamas\u0131 belirliyorduk. Bunu iki boyutlu yapmak i\u00e7in bir indis s\u0131n\u0131r\u0131 daha belirtmemiz gerekir, yani &#8220;[0..9&nbsp; ,&nbsp; 1..2]&#8221; gibi&#8230; Virg\u00fclden sonraki &#8220;1..2&#8221; ibaresi, bizim ikinci boyutumuzu temsil eden indis s\u0131n\u0131r\u0131n\u0131 g\u00f6stermektedir. Bu \u015fekilde, araya virg\u00fcller katarak daha \u00e7ok indis (yani daha \u00e7ok boyut) ekleyebiliriz. Bunu a\u015fa\u011f\u0131daki \u00f6rnekle daha iyi anlatabilece\u011fimi san\u0131yorum;<\/p>\n<pre><code>var&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;\n&nbsp; ikiboyutluStatikBirDizi: Array [0..9 , 1..2]&nbsp; &nbsp; &nbsp; &nbsp; of integer;\n&nbsp; UcBoyutluStatikBirDizi : Array [0..9 , 1..2 , 0..5] of integer;\n&nbsp; \/\/&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;[&nbsp; A&nbsp; ,&nbsp; B&nbsp; &nbsp;,&nbsp; C&nbsp; ]<\/code><\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere a\u00e7\u0131klama sat\u0131r\u0131nda &#8220;A&#8221; ile temsil edilen k\u0131s\u0131m 1. boyutu, &#8220;B&#8221; 2. boyutu, &#8220;C&#8221; ise 3. boyutu temsil etmektedir. Bu yap\u0131lar\u0131 bellekte basit bir veri tablosu olarak da d\u00fc\u015f\u00fcnebilirsiniz. Bu tip dizileri kullanmak i\u00e7in a\u015fa\u011f\u0131daki \u00f6rne\u011fi inceleyebiliriz;<\/p>\n<pre><code>var\n&nbsp; Dizi_2D : Array [0..9 , 0..9] of integer;\n&nbsp; A, B : Integer;\nbegin\n&nbsp; WriteLn('\u00c7arp\u0131m Tablosu');\n&nbsp; for a := 0 to 9 do begin\n&nbsp; &nbsp; &nbsp; for b := 0 to 9 do begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Dizi_2D[a, b] := a * b;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WriteLn( a.ToString + ' x ' + B.ToString + ' = ' + Dizi_2D[a, b].ToString )\n&nbsp; &nbsp; &nbsp; end;\n&nbsp; end;\nend;<\/code><\/pre>\n<p>Benzer bir yap\u0131y\u0131 dinamik olarak da tan\u0131mlayabiliriz. Dinamik bir \u00e7ok boyutlu dizi tan\u0131m\u0131 statik bir, \u00e7ok boyutlu diziden tan\u0131m\u0131 itibariyle daha esnek olabilmektedir. Bunu bir \u00f6rnekle g\u00f6stermek san\u0131r\u0131m daha kolay olacak;<\/p>\n<pre><code>var\n&nbsp; ikiBoyutluDinamikBirDizi : Array of&nbsp; &nbsp; &nbsp; &nbsp;Array of&nbsp; &nbsp; &nbsp; &nbsp;Integer;&nbsp; \/\/ \u00c7ok Boyutlu dizi \/ Array\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ \"1. boyut\"&nbsp; &nbsp; &nbsp;\"2. boyut\"&nbsp; &nbsp; &nbsp; veri tipi\n&nbsp; A, B : Integer;\nbegin\n&nbsp; SetLength(ikiBoyutluDinamikBirDizi, 3);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ iki boyutlu Array\u0131m\u0131z\u0131n ilk boyutunu 3 elemanl\u0131 olacak \u015fekilde ayarlad\u0131k.\n\n&nbsp; \/\/ Esneklikten kast\u0131m a\u015fa\u011f\u0131daki 3 sat\u0131rl\u0131k kodda a\u00e7\u0131k\u00e7a g\u00f6r\u00fclebilir.\n&nbsp; SetLength(ikiBoyutluDinamikBirDizi[0], 4);&nbsp; &nbsp; &nbsp; \/\/ iki boyutlu dizimizin ilk eleman\u0131nda yer alan alt diziyi 4 elemanl\u0131 olacak \u015fekilde ayarlad\u0131k.\n&nbsp; SetLength(ikiBoyutluDinamikBirDizi[1], 3);&nbsp; &nbsp; &nbsp; \/\/ iki boyutlu dizimizin ikinci eleman\u0131nda yer alan alt diziyi 3 elemanl\u0131 olacak \u015fekilde ayarlad\u0131k.\n&nbsp; SetLength(ikiBoyutluDinamikBirDizi[2], 2);&nbsp; &nbsp; &nbsp; \/\/ iki boyutlu dizimizin son eleman\u0131nda yer alan alt diziyi 2 elemanl\u0131 olacak \u015fekilde ayarlad\u0131k.\n\n&nbsp; \/\/ \u0130ki boyutlu dizimizin t\u00fcm elemanlar\u0131n\u0131n de\u011ferlerini ayarlayal\u0131m ve i\u00e7eri\u011fini yazd\u0131ral\u0131m...\n&nbsp; for A := 0 to High(ikiBoyutluDinamikBirDizi) do\n&nbsp; &nbsp; &nbsp; for B := 0 to High(ikiBoyutluDinamikBirDizi[A]) do begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ikiBoyutluDinamikBirDizi[A, B] := A + B;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WriteLn( 'ikiBoyutluDinamikBirDizi[' + A.ToString + ',' + B.ToString + '] = ' + ikiBoyutluDinamikBirDizi[A, B].toString );\n&nbsp; &nbsp; &nbsp; end;\nend;<\/code><\/pre>\n<p>Fakat dinamik dizilerde bu kadar esnek davranmam\u0131za gerek olmad\u0131\u011f\u0131nda \u00e7oklu dizimizin eleman say\u0131s\u0131n\u0131 \u015f\u00f6yle de tan\u0131mlayabilirdik;<\/p>\n<pre><code>var\n&nbsp; ikiBoyutluDinamikBirDizi : Array of&nbsp; &nbsp; &nbsp; &nbsp;Array of&nbsp; &nbsp; &nbsp; &nbsp;Integer;&nbsp; \/\/ \u00c7ok Boyutlu dizi \/ Array\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\/\/ \"1. boyut\"&nbsp; &nbsp; &nbsp;\"2. boyut\"&nbsp; &nbsp; &nbsp; veri tipi\n&nbsp; A, B : Integer;\nbegin\n&nbsp; SetLength(ikiBoyutluDinamikBirDizi, 3, 5);&nbsp; &nbsp; \/\/ iki boyutlu Array\u0131m\u0131z\u0131n ilk boyutunu 3 elemanl\u0131, alt array'lar\u0131n her birini ise 5'er elemanl\u0131 olacak \u015fekilde de ayarlayabiliriz. Dizideki h\u00fccrelere ise bir \u00f6nceki \u00f6rnekte yer alan for d\u00f6ng\u00fcleri ile de eri\u015filebilir.<\/code><\/pre>\n<h1>ARRAY ve NESNE KULLANIMI<\/h1>\n<p>Her ne kadar yaz\u0131n\u0131n ba\u015f\u0131nda kompleks veri tiplerine de\u011finmeyece\u011fimizi s\u00f6ylemi\u015f olsak da mevzuya bir kenar\u0131ndan dokunmazsak konu eksik kal\u0131r \u00e7ekincesini ta\u015f\u0131yorum, o nedenle yine basite indirgemek ad\u0131na RECORD tipindeki bir yap\u0131n\u0131n bir array i\u00e7inde nas\u0131l kullan\u0131labilece\u011fine dair ufak bir \u00f6rnek vermek san\u0131r\u0131m yeterli olur. A\u015fa\u011f\u0131daki \u00f6rne\u011fi bir CLASS i\u00e7in de kullanmak m\u00fcmk\u00fcnd\u00fcr, sonu\u00e7ta (neredeyse) her\u015fey bir pointer oldu\u011funa g\u00f6re bunu bu \u015fekilde kullanmaya da bir engel yok san\u0131r\u0131m&#8230;<\/p>\n<pre><code>type\n&nbsp; TUrun = packed record\n&nbsp; &nbsp; UrunAdi : String;\n&nbsp; &nbsp; Fiyat&nbsp; &nbsp;: Currency;\n&nbsp; end;\nconst\n&nbsp; Urunler: Array[0..2] of TUrun =\n&nbsp; (&nbsp; ( UrunAdi : 'Kitap'&nbsp; ;&nbsp; Fiyat : 50.00 )\n&nbsp; ,&nbsp; ( UrunAdi : 'Defter' ;&nbsp; Fiyat : 10.00 )\n&nbsp; ,&nbsp; ( UrunAdi : 'Kalem'&nbsp; ;&nbsp; Fiyat :&nbsp; 2.50 )\n&nbsp; );\n\nimplementation\n\n{$R *.dfm}\n\nuses\n&nbsp; System.SysUtils;\n\nprocedure TForm1.Button1Click(Sender: TObject);\nvar\n&nbsp; Mallar: Array[0..2] of TUrun;\n&nbsp; I: Integer;\nbegin\n&nbsp; Mallar[0].UrunAdi := 'Kitap';\n&nbsp; Mallar[0].Fiyat&nbsp; &nbsp;:= 50.00;\n\n&nbsp; Mallar[1].UrunAdi := 'Defter';\n&nbsp; Mallar[1].Fiyat&nbsp; &nbsp;:= 10.00;\n\n&nbsp; Mallar[2].UrunAdi := 'Kalem';\n&nbsp; Mallar[2].Fiyat&nbsp; &nbsp;:= 2.50;\n\n&nbsp; \/\/Urunler[0].UrunAdi := 'BU B\u0130R CONST OLDU\u011eU \u0130\u00c7\u0130N HATA VER\u0130R';\n\n&nbsp; for I := Low(Mallar) to High(Mallar)\n&nbsp; &nbsp;do Memo1.Lines.Add('Mallar &gt; ' + Mallar[I].UrunAdi + ' (' +&nbsp; floatToStr (Mallar[I].Fiyat) + ' TL)');\n\n&nbsp; for I := Low(Urunler) to High(Urunler)\n&nbsp; &nbsp;do Memo1.Lines.Add('Urunler &gt; ' + Urunler[I].UrunAdi + ' (' +&nbsp; floatToStr (Urunler[I].Fiyat) + ' TL)');\n\nend;<\/code><\/pre>\n<h1>UFAK B\u0130R \u00d6RNEK<\/h1>\n<p>Her ne kadar yaz\u0131n\u0131n k\u0131sa olmas\u0131n\u0131 istesem de buraya kadar okuma sabr\u0131n\u0131 g\u00f6sterdi\u011finiz i\u00e7in te\u015fekk\u00fcrler. Yaz\u0131n\u0131n bundan sonras\u0131 i\u00e7in arraylarla ilgili baz\u0131 \u00f6rnekler \u00fczerinde duraca\u011f\u0131z. Array konusu \u00e7ok kapsaml\u0131 ve geni\u015f bir konu, yazd\u0131k\u00e7a yenileri ortaya \u00e7\u0131k\u0131yor ve Delphi Array&#8217;larla ilgili zaman\u0131n verdi\u011fi birikim nedeniyle \u00e7ok geni\u015f bir yetenek kolleksiyonuna sahip. A\u015fa\u011f\u0131daki \u00f6rnek fonksiyonlar bir dizide belirtilen bir eleman\u0131n varsa hangi indiste oldu\u011funu s\u00f6yl\u00fcyorlar. Bunlar\u0131n overload&#8217;lar\u0131 \u00e7e\u015fitlendirilebilir veya generics bir tip tan\u0131m\u0131 \u00fczerinden daha geli\u015fmi\u015f \u00f6rnekler haline de getirilebilir, \u00f6rnek olmas\u0131 a\u00e7\u0131s\u0131ndan incelemenize sunuyorum.<\/p>\n<p>(EKLEME) A\u015fa\u011f\u0131daki \u00f6rnek ayn\u0131 zamanda A\u00c7IK D\u0130Z\u0130&#8217;lerin (OPEN ARRAY) parametre olarak nas\u0131l kullan\u0131labildi\u011fini ve bo\u015f parametre veya varsay\u0131lan parametreleri nas\u0131l verebilece\u011fimizi de ayr\u0131ca g\u00f6stermesi a\u00e7\u0131s\u0131ndan tamamlay\u0131c\u0131 niteliktedir.<\/p>\n<pre><code>type\n&nbsp; TArrayStr = array of string;\n&nbsp; TArrayInt = array of Integer;\n&nbsp; TArrayVar = array of Variant;\n  ...\n&nbsp; function Exists(aAranan: String;&nbsp; aDizi: TArrayStr = []): Integer; overload;\n&nbsp; function Exists(aAranan: Integer; aDizi: TArrayInt = []): Integer; overload;\n&nbsp; function Exists(aAranan: Variant; aDizi: TArrayVar&nbsp;= []): Integer; overload;\n\nImplementation\n\nfunction Exists(aAranan: String; aDizi: TArrayStr = []): Integer;\nvar\n&nbsp; I: Integer;\nbegin\n&nbsp; Result := -1;\n&nbsp; for I := Low(aDizi) to High(aDizi) do\n&nbsp; &nbsp; &nbsp; if (aDizi[I] = aAranan) then begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Result := I;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Break;\n&nbsp; &nbsp; &nbsp; end;\nend;\n\nfunction Exists(aAranan: Integer; aDizi: TArrayInt = []): Integer;\nvar\n&nbsp; I: Integer;\nbegin\n&nbsp; Result := -1;\n&nbsp; for I := Low(aDizi) to High(aDizi) do\n&nbsp; &nbsp; &nbsp; if (aDizi[I] = aAranan) then begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Result := I;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Break;\n&nbsp; &nbsp; &nbsp; end;\nend;\n\nfunction Exists(aAranan: Variant; aDizi: TArrayVar = []): Integer; overload;\nvar\n&nbsp; I: Integer;\nbegin\n&nbsp; Result := -1;\n&nbsp; for I := Low(aDizi) to High(aDizi) do\n&nbsp; &nbsp; &nbsp; if ( VarType(aDizi[I]) = VarType(aAranan)) then begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (aDizi[I] = aAranan) then begin\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Result := I;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Break;\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;\n&nbsp; &nbsp; &nbsp; end;\nend;<\/code><\/pre>\n<p>Kullan\u0131m\u0131 da \u015f\u00f6yle olabilir;<\/p>\n<pre><code>&nbsp; if Exists( 55.72, ['test', 12, 55, 72, true, 55.72, 'metin']) &gt; -1 then ShowMessage('Eleman dizide mevcut');\n&nbsp;&nbsp;\n&nbsp; \/\/ veya\n\n&nbsp; ShowMessage (&nbsp;&nbsp;Exists(null, ['', null, varEmpty, 0]).ToString&nbsp;&nbsp;);&nbsp; &nbsp;\/\/ 1. indiste null de\u011ferini&nbsp;bulacakt\u0131r...\n\n&nbsp; \/\/ veya eleman\u0131m\u0131z var fakat dizinin i\u00e7i bo\u015f olsun;\n\n&nbsp; ShowMessage(&nbsp;Exists(33, []).ToString&nbsp;);&nbsp; &nbsp;\/\/ bulunamayaca\u011f\u0131 i\u00e7in -1 \u00fcretecektir.<\/code><\/pre>\n<p>Array konusu \u00e7ok geni\u015f ve bu yaz\u0131 burada bitmez ama bir yerde dur demek laz\u0131m.&nbsp;Faydal\u0131 olmas\u0131 dile\u011fiyle&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131da daha \u00e7ok, Pascal&#8217;daki Array kavram\u0131n\u0131n ne oldu\u011funu, nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131, klasik kullan\u0131m \u00f6rneklerini ve i\u015fimizi basitle\u015ftirecek baz\u0131 ufak tefek\u00a0fonksiyon \u00f6nerilerini inceleyece\u011fiz. Fakat Array&#8217;larla ilgili pointer ve heap gibi mekanizmalara ve kompleks veri tipleriyle (class, generics vb&#8230;) nas\u0131l kullan\u0131ld\u0131\u011f\u0131na dair konulara de\u011finmeyece\u011fiz. Bunlar daha ileri konular ve as\u0131l konu ba\u015fl\u0131 ba\u015f\u0131na geni\u015f bir i\u00e7eri\u011fe sahip oldu\u011fu i\u00e7in anlat\u0131m\u0131\u00a0da\u011f\u0131tma potansiyeline sahipler, o nedenle belki ba\u015fka bir makalede bunlara de\u011finiriz. \u00d6rneklerimizi basit veri t\u00fcrleri ile s\u0131n\u0131rland\u0131raca\u011f\u0131z ve performans ile ilgili konulara girmeyee\u011fiz, sadece nedir, nas\u0131l kullan\u0131l\u0131r sorular\u0131n\u0131n etraf\u0131nda dola\u015faca\u011f\u0131z. Bununla birlikte Arraylar\u0131 kullan\u0131rken sadece basit (veya basitle\u015ftirilmi\u015f) veri tipleriyle (byte, integer, char, TDateTime, Double, currency, string gibi) s\u0131n\u0131rl\u0131 olmad\u0131\u011f\u0131n\u0131z\u0131 bilmeniz yararl\u0131 olur.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[17,4,11],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-blog","tag-array","tag-delphi","tag-programlama"],"_links":{"self":[{"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.potansif.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=155"}],"version-history":[{"count":1,"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/posts\/155\/revisions"}],"predecessor-version":[{"id":156,"href":"http:\/\/www.potansif.com\/index.php?rest_route=\/wp\/v2\/posts\/155\/revisions\/156"}],"wp:attachment":[{"href":"http:\/\/www.potansif.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.potansif.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.potansif.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}