Thread overview
Gnome Sort Algoritmasi hatasi
Jul 14, 2013
agora
Jul 15, 2013
Salih Dinçer
Jul 15, 2013
Salih Dinçer
Jul 16, 2013
agora
Jul 16, 2013
agora
Jul 16, 2013
agora
July 14, 2013

Selam

Kendimi gelistirmek icin denemeler yapiyorum

Su (http://en.wikipedia.org/wiki/Gnome_sort) baglantida gnome sort algoritmasindan bahsedilmis. D icin denemesini yaptim ve 2 hata aldim

HATA:

gnome_sort.d(28): Error: a struct is not a valid initializer for a int[10u]
gnome_sort.d(29): Error: function gnome_sort.gnomesiralamasi (int* a, int boyut) is not callable using argument types (int[10u], int)

Kod ise bu. C++ konusundaki aliskanligimdan dolayi gozden kacirdigim noktalar var acaba hangi hatalari yaptim?

import std.stdio;

void gnomesiralamasi(int *a, int boyut)
{
	int i = 1;
	while(i < boyut) {
		if(a[i] >= a[i-1])
			i++;
		else{
			int geciciSa = a[i];
			a[i] = a[i-1];
			a[i-1] = geciciSa;
			writeln("%d <-> %d\n",i,i-1);
			if( i > 1)
				i--;
			else
				i++;
	}
	for(int j = 0; j < boyut; j++)
		writeln("%d ", a[j]);

	writeln("\n");
	}
}

int main()
{
	int a[10] = {2,6,8,1,3,7,4,9,0,5};
	gnomesiralamasi (a,10);
	return 0;
}

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

July 14, 2013

Birincisi küme parantezleri kullanıldığı için. D'de dizi tanımlarken köşeli parantezler kullanılır:

   int a[10] = [2,6,8,1,3,7,4,9,0,5];

C'de de gerekmediği gibi dizinin boyutunu yazmaya da gerek yok:

   int a[] = [2,6,8,1,3,7,4,9,0,5];

Ek olarak, D C'deki tanımlama söz dizimini C programcıları yabancılık çekmesin diye destekliyor. Elini alıştırmanı ve köşeli parantezleri türe bitişik olarak yazmanı öneririm:

   int[] a = [2,6,8,1,3,7,4,9,0,5];

İkinci hata ise D'nin dizilerine C'deki kadar ilkelmişler gibi davranıldığı için oluyor. ;) 'int*' aslında tek int göstergesidir; onun dizi gibi kullanılması anlaşmalara bağlıdır. Örneğin burada gnomesiralamasi şöyle demiş oluyor: Bana tek int göstergesi ver, ben oradan başlayıp 'boyut' kere ilerleyeceğim ve o kadar int'i dizi gibi kullanacağım. Görüldüğü gibi, bu bir anlaşma; derleyicinin denetlemesi olanaksız.

Walter Bright C'nin dizilerinin bu zayıflığını "C's Biggest Mistake" adlı makalesinde anlatır ve D'nin böyle güvensizliğe nasıl izin vermediğini gösterir. D'de diziler ve dilimler doğrudan desteklenirler. Örneğin, kendi büyüklüklerini bilirler. O yüzden burada gnomesiralamasi'na doğrudan bir dilim göndermek yeterli olur:

void gnomesiralamasi(int[] a)
{
   // burada dizi boyutu olarak a.length kullanılır
}
// ...
   gnomesiralamasi (a);

Ali

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

July 15, 2013

Hocama ek olarak; belirtmeliyim ki D'ye geçince, (her ne kadar static dizi kavramı olsa da) biz dizileri dynamic arkadaşlar olarak görürsek işimiz kolaylaşır...:)

Eğer işaretçi aritmetiği kullanıyorsak, bu sevimli arkadaşların sağı solu belli olmayacağı için denetimi D'nin verdiği araçlar ile gerçekleştirmekte fayda görüyorum. Aslında yeni başlayan arkadaşların, "bu dilim ne ki?" gibi soruları kendine soracağından adım gibi eminim. Hatta cevabı bir şekilde bulmasına rağmen ancak bir kaç deneme ile kavramak mümkün olabilir...

Öyleyse biraz kodlardan konuşalım:

   size_t boyutu = 10;
   size_t[] test = new size_t[boyutu];
            test[9] = test.length; // aslında son elemana 10 yazacak!
   assert(boyutu == test.length);

   test.writeln; // [0, 0, 0, 0, 0, 0, 0, 0, 0, 10]
   writeln(test.capacity()); // 15

   size_t[] ekle = [ 11, 12, 13, 14, 15, 16 ];
   test ~= ekle;

   writeln(test.capacity()); // 31

Öncelikle size_t kafanızı karıştırmasın. Bu bizim işlemci ve/veya derleme türüne (32 bit/64 bit) göre belirlenen ve an itibariyle en büyük ulong olabilen bir takma (alias) isimdir. Eğer işletim sisteminiz 32 bit ise bu uint olacaktır. Bunu ''typeid''(test).writeln;'' ile öğrenebilirsiniz. Ama sizin tasarladığınız bir tür örneğin ''struct foo { 'size_t' a; 'bool' b }'' de olabilirdi.

Şimdi, biz ilk olarak bir devingen (dynamic) bir dizi oluşurduk ve buna new işleçi ile 10 eleman yükledik. Hepsi de varsayılan değer olarak 0 aldı. Sanki durağan (static) bir diziymiş gibiler ama değil. Çünkü capacity() ile baktığınızda bunun 15 elemana kadar herhangi bir bellekten yer talep etme davranışı sergilemeden büyüyebileceğini (expand) öğrendik. Yani aslında D, işletim sisteminden 10 tane değil 15 tane eleman talep etti...

Sonraki denemede ise biz, 6 elemanlık bir diziyi sonuna ekliyoruz. Tabi bu aşamadan neler olduğunu bilemeyiz. Çünkü bulunduğu bellek bölgesi ikiye katlanmaya müsait olmayabilir (ki yüksek ihtimalle boş bir yerdir!) ve tüm veriyi taşıyarak 31 elemanlık bir yeri ayırır. Ama dikkat bizim dizinin boyutu şimdi 16 oldu. Peki biz bu verinin son eklediğimiz kısımıyla ilgileniyorsak ve bunu bellekte eleman sayısı kadar yer işgal etmeden kullanmak istiyorsak ne yaparız?

Tabi ki dilim kullanırız:

   auto dilim = test[boyutu..$];
        dilim.writeln; // [11, 12, 13, 14, 15, 16]

   assert(ekle.length == dilim.length);
   assert(&test[$-1] == &dilim[$-1]); // her iki hücrenin adresi aynı

Her ne kadar bu da bir dizi gibi görünse de aslında 2 adet işaretçi (pointer)'den oluşan bir özel değişken. Biz bununla ilgili işlem yapmak istediğimizde aslında aynı bellek bölgelerine erişiyoruz. Bunun kanıtı 2. assert() ifadesidir.

Kolay gelsin...

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

July 15, 2013

Son bir şey daha denemenizi ve hatayı görmenizi isterim:

   assert(&test[$-1] == &ekle[$-1]); // hata verir!

Tabi derleme yaparken 'dmd test -release' paremetresi verirseniz assert()'ler derlemeye dahil edilmez ve yazılım normal bir şekilde çalışmasına devam eder, sonlanmaz.

Son olarak dizilerde $'ın dizi.length'in döndürdüğü değer ile aynı olduğunu belirtmek isterim. O yüzden $-1 yaparak son elemana erişmiş oluyoruz. Özellikle dilimlerde kullanılan bu kısayol çok işinize yarayacak.

Başarılar...

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

July 15, 2013

Alıntı (Salih Dinçer):

>

Her ne kadar bu da bir dizi gibi görünse de aslında 2 adet işaretçi (pointer)'den oluşan bir özel değişken.

Andrei'nin kitabında da öyle anlatılıyor ama tam doğru olmak istersek aslında dmd'de dilimler şu yapının eşdeğeri olarak gerçekleştiriliyorlar:

struct Dizi(T)
{
   size_t length;
   T *ptr;
}

Ali

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

July 16, 2013

Ali Hocam ve Salih Hocam

cok aydinlatici oldunuz cok cok tesekkur ederim. bahsettiginiz ust seviyeye gelemedim daha :) ama o seviyeye gelince de bunlari biliyor olacagim :)

makaleyi okuduktan sonra islemler yaptirdim

Ornegin dizileri yazdirmak gibi :)

string[] öğretmen_fikri = ["haylaz ama zeki olabilir", "çalışkan tam aradığım tipte bir öğrenci", "tembel öğrenciyi hiç sevmem",
	"bu benim sınıfıma nasıl gelmiş", "idare eder. aşırı zeki değil ama çalışmayı biliyor"];
writeln(öğretmen_fikri[2]);

gibi bu tip yazımların sorun oluşturma durumları olur mu acaba?

Hatta bununla ilgili bir de farklı bi deneme yaptım

string[] öğrenci_tipi = ["haylaz", "çalışkan", "tembel", "beyinsiz", "inek"];
string öğrenci_karakteri;
else if(devamsızlık_sayısı >= devamsızlık_sınırı)
	{
	    öğrenci_karakteri = öğrenci_tipi[3];
	    //writeln(öğrenci_karakteri);
	}

/*FARKLI KONTROLLER*/

if(öğrenci_karakteri == "beyinsiz")
	{
	    writeln("\nÖğrenci hakkındaki görüşlerim bunlardır: ",öğretmen_fikri[3]);
	}

gibisinden. yorum satırından sonraki kısımda dizi içindeki karşılaştırmayı yapmayı denedim başarılı oldu ve ekrana da yazdırdım. Merak ettiğim bu tip kullanımların herhangi bi zararı olmaz yanı vs. var mıdır?

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

July 16, 2013

Alıntı (acehreli):

>

2, 3 gibi sabit değerlerden kaçınılır ama kullanımlar doğru görünüyor.

Ali

Bunlar alıntılanma süreci.

mesela

while ve for döngülerinin birlikte kullanımında oradaki [2] değeri [i,j,k] gibi olabilir. dizilerdeki elemanların çekilip çekilmediği konusunda merakım vardı aslında.

Son olarak hocam derlediğim programların boyutları 2,5 mb oluyor bunun sebebi nedir? Yazılan programlardaki satır sayısı olduğunu sanmam. Zira java ile 3.000 satır üzeri kod yazdım görsel kütüphanede yine de 113 kb oldu boyut bazinda.

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

July 16, 2013

Alıntı (acehreli):

>

Alıntı (agora):

>

derlediğim programların boyutları 2,5 mb oluyor bunun sebebi nedir?

(Bu konu daha önce de tartışılmıştı; aratabilirsin.)

O boyuta etkisi olan iki ana etken var:

  • D çalışma ortamı (D runtime) C ve C++'tan çok daha beceriklidir. Örneğin çöp toplayıcının ve dilimlerin işleyişlerinin idare edilmesi gerekiyor. Dolayısıyla ne yapılırsa yapılsın en küçük program bile büyük görünebilir.

  • Asıl neden, bu aşamada bütün standart kütüphanenin programa bağlanıyor olması (link). Yakında bu "sorun" ortadan kalkacak.

Buna rağmen bu konuyu önemsememeni öneririm. Neyse ki D öğrenmemize engel olmuyor. :)

Ali

Engel değil hocam. C++'taki karışıklık hissine D ile kapılmadığımı söyleyebilirim. Sadece kütüphane kullanımları konusunda vasat durumdayım. Ama onları da kendim modüller oluşturup deneye deneye öğreniyorum :) Sadece merak ben biraz fazla meraklıyım :( Gerçi programın boyutunun önemi yok gibi. Ama C++ için standalone çalışıyor, o yüzden böyle yüksek boyutlu çıktılar veriyor dendiğini hatırladım.

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

July 16, 2013

2, 3 gibi sabit değerlerden kaçınılır ama kullanımlar doğru görünüyor.

Ali

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

July 16, 2013

Alıntı (agora):

>

derlediğim programların boyutları 2,5 mb oluyor bunun sebebi nedir?

(Bu konu daha önce de tartışılmıştı; aratabilirsin.)

O boyuta etkisi olan iki ana etken var:

  • D çalışma ortamı (D runtime) C ve C++'tan çok daha beceriklidir. Örneğin çöp toplayıcının ve dilimlerin işleyişlerinin idare edilmesi gerekiyor. Dolayısıyla ne yapılırsa yapılsın en küçük program bile büyük görünebilir.

  • Asıl neden, bu aşamada bütün standart kütüphanenin programa bağlanıyor olması (link). Yakında bu "sorun" ortadan kalkacak.

Buna rağmen bu konuyu önemsememeni öneririm. Neyse ki D öğrenmemize engel olmuyor. :)

Ali

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