Thread overview
dinamik dizi ve statik dizi kullanımında bir soru/n
Jan 11, 2018
cos00kun
Jan 11, 2018
kerdemdemir
Jan 11, 2018
cos00kun
Jan 11, 2018
kerdemdemir
Jan 12, 2018
cos00kun
January 11, 2018

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?

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

January 12, 2018

Alıntı (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

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

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

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

January 12, 2018

Alıntı:

>

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.

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

January 12, 2018

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

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

January 12, 2018

Alıntı (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

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