Forum: D Programlama Dili RSS
Uzunlukları farklı iki boyutlu dizi kullanma
Avatar
esatarslan52 (Moderatör) #1
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Uzunlukları farklı iki boyutlu dizi kullanma
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 mesaj esatarslan52 tarafından değiştirildi; zaman: 2009-09-06, 16:28.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Avatar
esatarslan52 (Moderatör) #3
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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ş.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 
Avatar
esatarslan52 (Moderatör) #5
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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]
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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... :)

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... :)

/*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...

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...

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
Avatar
esatarslan52 (Moderatör) #7
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
/*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.

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.

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 :-)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 13:07:14 (UTC -08:00)