Thread overview
Uzunlukları farklı iki boyutlu dizi kullanma
Sep 06, 2009
esatarslan52
Sep 06, 2009
esatarslan52
Sep 06, 2009
esatarslan52
Sep 07, 2009
esatarslan52
September 06, 2009

Uzunlukları iki farklı iki boyutlu dizi oluşturup ekrana yazdırmaya çalışıyorum. Algoritma aşağıdaki şekilde

import std.stdio;

int main()
{
   int[10][5] dizi;

   for (int i=0;i<10;i++)
   {
       for (int j =0;j<5;j++)
           write(dizi[j][i]);

       writeln();
   }

   return 0;
}
dizi[j][i]

yazımında dikkat ederseniz ikinci döngünün değişkeni ilk olarak kullanılıyor. c++ da bu

dizi[i][j]

şeklinde yazılıyor ki mantıklı olanda bu gibi geliyor bana <_< .

#include <iostream>

int main()
{
   int mDizi[10][5];
   for (int i =0;i<10;i++)
   {
       for (int j =0;j<5;j++)
           mDizi[i][j] = 0;
   }

   for (int i =0;i<10;i++)
   {
       for (int j =0;j<5;j++)
           cout<<mDizi[i][j];

       cout<<endl;
   }
}

Niye böyle yapmış olabilirler?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 06, 2009

Alıntı (acehreli):

>

C ve C++'nın garipliğini düzeltmişler işte! :) C++'da:

Bu sadece C++ ait bir durum değil ki. Flash, php ve javascript içinde aynı durum söz konusu. Yanlış hatırlamıyosam C# içinde.

Alıntı (esatarslan52):

>
> import std.stdio;
>
> int main()
> {
>     int[10][5] dizi;
>
>     for (int i=0;i<10;i++)
>     {
>         for (int j =0;j<5;j++)
>             write(dizi[j][i]);
>
>         writeln();
>     }
>
>     return 0;
> }
> ```

>

Zaten tanımlamadan ziyade dizi üzerinde işlem yaptığımda kafam karışıyor.Yukarıda belirttiğim dillerde iki döngü yardımı ile dizi üzerinde işlem yapmak istediğimde ikinci döngü tanımlama gereği ikinci [] köşeli parantez içindeki uzunluğu temsil eder. Ama D de tam tersi olmuş.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
September 06, 2009

Söz dizimine baktığımızda gördüğümüz şeyler çok farklı. Görecelik dedikleri bu olsa gerek :-)

int mDizi[20][10][5];

Ben sözdizimine baktığımda 20 yi orta değil başlangıç noktası olarak görüyorum.

Sizce dizi üzeriden işlem yaptırırken kullanılan yöntem tutarsız değil mi?

/*D ye göre satırın uzunluğu ikinci köşeli parantezler içinde yazılan değer temsil ediyo.
Ama ben misal 2.satırın 3.değerini yazdıracağım zaman
Söz dizimi olarak mDizi[2][3] kullanmalıyım
Bence sözdizimi gereği yine ikinci köşeli parantez satırı temsil etmeli yani
mDizi[3][2] gibi olmalı*/
int [10][5] mDizi;
mDizi[satır][sutun]

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 06, 2009

C ve C++'nın garipliğini düzeltmişler işte! :) C++'da:

int mDizi[10][5];

yazınca, 10 adet int[5] vardır. Bence asıl garip olan o... Bunu görmek için fonksiyon yüklemeden yararlanan bir C++ programı:

#include <iostream>

void foo(int (&) [5])
{
   std::cout << "bes\n";
}

void foo(int (&) [10])
{
   std::cout << "on\n";
}

int main()
{
   int mDizi[10][5] = {};
   foo(*mDizi);
}

O program benim ortamımda 'bes' yazıyor. Yani, mDizi'nin elemanlarının türü int[5].

D'deki yazım ise doğal. mDizi'nin eşdeğeri şöyle yazılır:

int[5][10] dizi;

Dikkat edilirse bu yazım, elemanın int olduğu durumla aynı yazılmaktadır:

int[10] dizi;

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 07, 2009

Alıntı (acehreli):

>

Alıntı:

>

/*D ye göre satırın uzunluğu ikinci köşeli parantezler içinde yazılan değer temsil ediyo.

"Satırın uzunluğu" değil de, "satır adedi" demek istedin sanırım... Çünkü şöyle doğru:

> Tür[satır_uzunluğu][satır_adedi] dizi;
> ```

>

Evet yanlış bir kavram kullanmışım :). sutun_adedi de olabilirdi.

Alıntı:
>
> Bence sözdizimi gereği yine ikinci köşeli parantez satırı temsil etmeli yani
> mDizi[3][2] gibi olmalı*/

Alıntı:
>
> Bence o çalışamaz; çünkü mDizi'ye ilk uygulanacak işleç, onun ilk elemanını vermeli. İlk elemanı da bir satır olduğu için, ne olursa olsun, ilk parantezin içine satır numarası gelmeli.
>

Ben sözdizimi gereği ilk önce satır uzunluğu ikinci olarakta satır adedi geldiği için öyle olmalı demiştim. Mantıklı bir yanı yok tabi  :-D.

Benimki biraz ezbere kaçmak oluyo tanımlarken önce satır uzunluğu var ozaman kullanırken de önce satır uzunluğu olmalı gibi düşünüyorum. Bu pek doğru değil tabi  :-)

Dediğiniz gibi büyük bir sorun değil. Ben dün gece programı yazarken aralık ihlali hatasının nedenini anlamak için çok vakit harcamıştım o anki gerginlikle konuyu açmıştım. Ama konuştukça çokda mantıksız olmadığına kanaat getirdim :-)

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
September 06, 2009
int[10][5] dizi;

yazdığın zaman C'nin eşdeğeri olmuyor. C'de şu var:

int mDizi[10][5];

Anlamı: 10 adet 5 int'li dizi. Yani orada bir terslik var: daha belirgin olan boyut içeriye yazılıyor! Ve bu, dizinin genel tanımına uymuyor:

TurIsmi dizi[uzunluk];

C'nin kendi kuralına göre, normalde eleman türü sola yazılır ve uzunluk sağa yazılır. Ama bunu iki boyuta uygularken tutarsız davranıyorlar: İki boyutlu dizinin elemanlarının türü int[5] olduğu halde, [5] ta en sağa gidiyor!

(Belki anlaşılmamıştır diye tekrarlayacağım: yukarıdaki mDizi, 10 adet int[5] dizisidir; 5 adet int[10] değil...)

Bunu D'de yazarken, aslında C'nin kuralını uyguluyoruz ve çok tutarlı oluyor: tür ismi sola, dizi uzunluğu sağa; hep öyle:

int[5]         dizi0;   // 5 adet int dizisi
int[5][10]     dizi1;   // 10 adet int[5] dizisi
int[5][10][20] dizi2;   // bir üsttekinden 20 adet
vs.                     // hep tutarlı...

Oysa C'de 20'yi gidip en ortaya yazmak gerekirdi:

int mDizi[20][10][5];

Bu konuda anlaştıysak; ve eğer diziyi öncelikle satır satır işleyeceksek, bence D örneğinde diziyi C'dekinden ters sırada ve i,j yerine satır,sütun kullanarak şöyle yazarız:

import std.stdio;

int main()
{
   int[5][10] dizi;

   for (int satır = 0; satır < 10; ++satır)
   {
       for (int sütun = 0; sütun < 5; ++sütun) {
           write(dizi[satır][sütun]);
       }
       writeln();
   }

   return 0;
}

Bence D tutarlı; çünkü hep tür sola, uzunluk sağa...

Ali

Not: Aslında C'deki yazım da hâlâ destekleniyor ama ileride kalkabilir; ve ben tutarsız olduğu için onu kullanmayı düşünmem de:

   int dizi[10][5];  // D'de de geçerli

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

September 06, 2009

Alıntı (esatarslan52):

>
> int mDizi[20][10][5];
> ```

> Ben sözdizimine baktığımda 20 yi orta değil başlangıç noktası olarak görüyorum.

Ama en içteki dizinin türü int[5] olduğu için, bütün 'mDizi[20][10]', int[5]'in arasına girmiş oluyor. Tabii bu önemli değil; bu kadar insan bu kadar yıldır C ve benzeri dilleri böyle kullanıyoruz. Sorun büyük değil... :)

Alıntı:
>
> Sizce dizi üzeriden işlem yaptırırken kullanılan yöntem tutarsız değil mi?
>

Şimdi anladım! :) D dizisini yazarken en sağa yazılan boyut, döngülerde en üste yazılıyor. Demek ki bu da bana garip gelmiyor... :)

Alıntı:
> /*D ye göre satırın uzunluğu ikinci köşeli parantezler içinde yazılan değer temsil ediyo.

"Satırın uzunluğu" değil de, "satır adedi" demek istedin sanırım... Çünkü şöyle doğru:


Tür[satır_uzunluğu][satır_adedi] dizi;



Yukarıdaki örneğimden:


int[5][10] dizi;

for (int satır = 0; satır < 10; ++satır)
{



Yani satır adedi ikinci parantezin içinde...

Alıntı:
>
> Ama ben misal 2.satırın 3.değerini yazdıracağım zaman
> Söz dizimi olarak mDizi[2][3] kullanmalıyım

Ve zaten öyle... D'de de öyle...

Alıntı:
>
> Bence sözdizimi gereği yine ikinci köşeli parantez satırı temsil etmeli yani
> mDizi[3][2] gibi olmalı*/

Bence o çalışamaz; çünkü mDizi'ye ilk uygulanacak işleç, onun ilk elemanını vermeli. İlk elemanı da bir satır olduğu için, ne olursa olsun, ilk parantezin içine satır numarası gelmeli.

Senin dediğin gibi olması için, dilin [] işlecinin yanında [][], [][][], vs. işleçlerini de ayrı ayrı bilmesi ve dizinin büyüklüğüne uygun olanını seçmesi gerekirdi. Oysa yalnızca bir tane [] işleci var, ve her zaman için dizi elemanına erişim sağlıyor. O yüzden hep dizi[dış_indeks][iç_indeks][daha_iç_indeks] olarak yazılmak zorunda. Hem C'de, hem D'de...

Bunun dizi tanımına uymadığını görüyorum, ama ben tanımdaki tutarlığı yüzünden D'nin bu *düzeltmesini* ;) hâlâ mutlulukla karşılıyorum.

Çünkü iki boyutlu dizilere erişirken ben zaten indeksleri hiç tanımdaki anlamıyla aynı sırada yazmaya bakmıyorum. Ben, hep erişirken dıştakinden içtekine doğru düşünüyorum. D'de bunda bir değişiklik yok.

Evet, görecelik gerçekten bu olsa gerek. :)

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]