Forum: D Programlama Dili RSS
dinamik dizi ve statik dizi kullanımında bir soru/n
cos00kun #1
Üye Kas 2014 tarihinden beri · 201 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: dinamik dizi ve statik dizi kullanımında bir soru/n
merhabalar
import std.stdio;
void main(string[] parametreler)
{
    int ilkDeğişken=5;
    int[5]dizi=[0,1,2,3,4];
 
    int ikinciDeğişken=ilkDeğişken;
    int[5] diziyedek=dizi;
    
    ilkDeğişken=500;
    dizi[1]=555;
    writeln(ikinciDeğişken);
    writeln(diziyedek);
    readln();
sonuç beklenildiği gibi;
5
[0,1,2,3,4,5]


ancak kodu yedekdizi yi dinamik dizi olarak tanımladığımızda yani;
int[5] diziyedek=dizi; satırını
int[] diziyedek=dizi;  olarak değiştirdiğimizde bu sefer sonuç;
5
[0,555,2,3,4,5]

olmaktadır.. dinamikte olsa dizi dizisini kopyaladığımda yedekdizi dizisinin 5 elemanlı olacağıda düşünüldüğünde neden yedekdizi yeni bir dizi gibi davranmayıpta sanki bir referans gibi muamele yapmaktadır bize?
E=mc^2
Bu mesaj cos00kun tarafından değiştirildi; zaman: 2018-01-11, 23:53.
kerdemdemir #2
Üye Eyl 2013 tarihinden beri · 150 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
cos00kun:
merhabalar
import std.stdio;
void main(string[] parametreler)
{
    int ilkDeğişken=5;
    int[5]dizi=[0,1,2,3,4];
 
    int ikinciDeğişken=ilkDeğişken;
    int[5] diziyedek=dizi;
    
    ilkDeğişken=500;
    dizi[1]=555;
    writeln(ikinciDeğişken);
    writeln(diziyedek);
    readln();
sonuç beklenildiği gibi;
5
[0,1,2,3,4,5]


ancak kodu yedekdizi yi dinamik dizi olarak tanımladığımızda yani;
int[5] diziyedek=dizi; satırını
int[] diziyedek=dizi;  olarak değiştirdiğimizde bu sefer sonuç;
5
[0,555,2,3,4,5]

olmaktadır.. dinamikte olsa dizi dizisini kopyaladığımda yedekdizi dizisinin 5 elemanlı olacağıda düşünüldüğünde neden yedekdizi yeni bir dizi gibi davranmayıpta sanki bir referans gibi muamele yapmaktadır bize?

Merhaba Coskun,

D dilinde dinamik diziler siniflar gibi referans ile atama yapiyorlar. Statik diziler ise yapilar gibi kopyalaniyorlar.
int[] diziyedek=dizi; dedigin zaman diziyedek , dizinin referans 'i oluyor yani dizide yapicagin herhangi bir degisiklik diziyedek'ide etkiliyor.

int[5] diziyedek=dizi; dediginde ise dizi tamamen kopyalaniyor ve diziyedek bagimsiz bir kopya oluyor. Bu noktadan sonra hicbir degisiklikten etkilenmiyor.

Ayni kopyalanma etkisini dinamik dizilerde olsun istiyorsan int[] diziyedek=dizi.dup; dediginde dizi ustundeki degisikliklerin diziyedek'e etki etmedigini gorebilirsin.

Erdemdem
cos00kun #3
Üye Kas 2014 tarihinden beri · 201 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
evet sanırım tam cevap dediğin gibi dinamik dizilerin referans gibi, statik dizilerinde normal şekilde kopyalanması.
Acaba buna neden gerek duyulmuş merak ettim doğrusu sonuçta dinamik dizilerinde statik diziler gibi davranması ve gerekli niteliklerle farklı davranış göstermesi sanki bir dili daha basit kılardı ama mutlaka birşey düşünülmüşki bu şekilde referans gibi davrandırılmış.. 

Belkide .dup gibi bir nitelik zaten kopya oluşturabileceği için referans gibi bir kullanım ile çok daha fazla özellik kazandırılmışda olabilir elbette .. sorular bitmez  :-)
E=mc^2
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 150 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Acaba buna neden gerek duyulmuş merak ettim doğrusu sonuçta dinamik dizilerinde statik diziler gibi davranması ve gerekli niteliklerle farklı davranış göstermesi sanki bir dili daha basit kılardı ama mutlaka birşey düşünülmüşki bu şekilde referans gibi davrandırılmış.. 

Bu davranis benim simdiye kadarlik is tecrubelerimle cok ortusuyor. Ornegin bir C/C++ fonksiyonunda

void Yazdir()
{
   char buffer[32];
   // std::array < char, 32 > bufferCpp;  // Daha cpp versiyon
   //// Dosyadan oku vs..
}

Ne zaman statik uzunluklu bir array olustursam hep yiginda(stackde) olustururum. Bu sadece stack isaretcisinin yerini degistirecek bir sey oldugunda maliyeti 0'a yakindir. Bu durumlarda diziye atama yapmak istedigimde genelde kopyalama yapmak isterim. Ne de olsa maliyet cok dusuk.

Fakat dinamik dizilerde calisma zamaninda bellekten yer ayirmamiz gerekebilir ki bu cok masrafli bir seydir. Bu durumlarda yeni bir dizi yaratmak yerine genelde referans ile isimi yapmaya calisirim. Tabi yapamadigim bazi durumlarda kopyalama yapmam gerekebilir(D deki .dup durumu). Ama kopyalama ozellikle dinamik dizilerde kacinmasi gereken bir durumdur.

Benim tecrubelerim ile sagolsun D nin bu davranisi cok ortusuyor.
cos00kun #5
Üye Kas 2014 tarihinden beri · 201 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Valla bu işlerin direk içinde olan herkes sizin dediğiniz gibi D yi çok kullanışlı buluyor orası kesin ancak benim şu anki seviyem ve mesleğimin bu olmaması sebebiyle çok daha ileriye dönük bir görüş söyleyemiyorum.. Sizlerin tecrübe ve deneyimleride benim için Amerikayı baştan keşfetmeden yola devam etmemi sağlıyor sağolun varolun hepiniz  :blush:

Benim D de en ilgimi çeken şeylerden biride Aralık ve dilim kavramı oldu.. C++ öğrenmeye çalışırken açıkçası pointer kullanımını sıkıcı bulurken Referans kullanımını çok daha temiz ve stabil bulmuştum. D de ise şu ana kadar öğrendiklerime baktığımda resmen Referanslarla dans eden bir D Dili gördüm karşımda (En azından referans kullanımına yatkın ve referans gibi hareket eden kullanımlar diyelim). Açıkçası bu çok hoş oldu benim için. Bakalım ilerisi ne gösterecek umarım sıkıcı pointerlara çok işim düşmez  :-)
E=mc^2
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4581 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
 
cos00kun:
umarım sıkıcı pointerlara çok işim düşmez  :-)

Göstergeler (pointer) hep işin içinde ama üst düzey programlama dilleri bu kavramları referans, dilim (dinamik dizi), sınıf, vs. gibi üst düzey kavramlarla programcıdan uzak tutarlar. (C++'tan örnek olarak, oradaki referanslar da aslında kullanımları kolaylaştırılmış göstergedir.

D'de göstergelere neredeyse hiç rastlanmıyor ama kullanılması şart olan bir yer D'ye yeni gelenleri şaşırtıyor: D'de değişken ve üye değişken referansı yok. O yüzden, veri yapıları tasarlarken üye değişkenleri gösterge olarak tanımlamak gerekiyor:
struct BağlıListe {
    BağlıListe *baş;    // 'ref' anahtar sözcüğü burada kullanılamıyor
}
ref işlev parametresi, foreach değişkeni, ve başka yerlerde kullanılıyor:
    foreach (i, ref eleman; dilim) {
        if (i % 2) {
            // Tek numaralı olanları değiştir
            eleman = 42;
        }
    }
Ali
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: 2018-01-16, 13:25:51 (UTC -08:00)