Jump to page: 1 2
Thread overview
Assert ve Enforce dersi hk.
May 21, 2012
zafer
May 22, 2012
Salih Dinçer
May 22, 2012
Salih Dinçer
May 22, 2012
Salih Dinçer
May 22, 2012
Salih Dinçer
May 22, 2012
Salih Dinçer
May 22, 2012
zafer
May 22, 2012

http://www.ddili.org/ders/d/assert.html

Bu adresdeki dersin sonunda çok güzel bir öğretim problemi hazırlanmış. Doğrusu benim çok hoşuma gitti. Ancak 3. maddede geçen hata bende oluşmadı.

Alıntı:

>
  1. Bu sefer programa 06:09 ve 1:1 zamanlarını girin. Yeni bir hata ile karşılaşacaksınız. O satıra da gidin ve o hatayı da giderin.

Burada hata ile karşılacaksınız diyor ama bendeki çıktı şu şekilde oldu;

Alıntı:

>

zafer@debian:~/projeD/Test$ ./main
Başlangıç zamanı? (SS:DD) 06:09
İşlem süresi? (SS:DD) 1:1
09:06'da başlayan ve 1 saat 1 dakika süren işlem 10:07'de sonlanır.
zafer@debian:~/projeD/Test$

Büyük bir sorun değil tabi, sadece bilgilendirmek için yazdım.

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

May 22, 2012

Peki hocam bu assert'leri 'scope(exit) {..}' gibi bir küme içinde kullanabilir miyiz? Yani mantıklı mıdır? En azından 'assert()' ifadelerini daha nitelikli hale getirebilir miyiz?

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

May 22, 2012

Alıntı (acehreli):

>

Sanırım önceki maddelerdeki hatalar giderilmediği için. Dikkat edersen "06:09" girdiğin halde çıktı "09:06" diyor. Ancak o hata giderilmişse üçüncü adımdaki hata ortaya çıkıyor.

Haklısın Ali, dikkat etmemiş pek, sorun yok o zaman :)

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

May 22, 2012

Alıntı (Salih Dinçer):

>

Peki hocam bu assert'leri 'scope(exit) {..}' gibi bir küme içinde kullanabilir miyiz? Yani mantıklı mıdır? En azından 'assert()' ifadelerini daha nitelikli hale getirebilir miyiz?

Tekrar düşündüm de; 'scope(exit) {..}' kümesi içinde işletilen yordamlar sırasında assert'in yaptığı gibi program sonlanmış olacak. Bu durumda 'if() write()' kullanımına benzer bir sonuç ortaya çıkacak. Ancak sonlanma anında örneğin veri tabanına bağlanılmadıysa bağlantıyı kesmenin anlamsız olacağından (hataya yol acacağından) devam eden satırlarda ilerlemesi yine 'assert()' ile uyarılı bir şekilde engellenebilir.

Tabi bir de scope'un başka kullanımları da var. Biraz daha düşünüyorum da program geliştirilirken 'assert()' çok işimize yarayabilir. Ama Zefer'in açtığı diğer başlıkta tartıştığımız gibi akıllıca ifadeler kullanmalı. Peki yeni bir soru daha:

Biz 'assert()' ifadelerini "is" gibi şeylerle veya üçlü işleçle zengileştirebiliyor muyuz? Sanırım mümkün ama kullanmaya başlamadan evvel her şeyini bilmek istiyor insan. Bu arada şimdi aklıma işlevlerdeki 'in {} out() {} 'kümesi de geldi. Herhalde scope'a göre daha nitelikli şeyler yapılabilir.

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

May 22, 2012

'assert()''in şöyle bir kullanımını şuradan (http://forum.dlang.org/thread/bug-4925-3@http.d.puremagic.com/issues/) çıkararak denedim, ilginç değil mi?

	const int a = 1;
	const int b = (assert(a==1), 0);

	writeln(a, b);

Aslında orada b sabiti yok ama derleyici çöktüğü için ve böyle daha anlamlı olacağından işe yarar mı dedim!

Sanki const'dan dolayı 'static assert()' gibi çalışıyor, sizce?

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

May 22, 2012

Alıntı (acehreli):

>

Alıntı (Salih Dinçer):

>
> > 	const int a = 1;
> > 	const int b = (assert(a==1), 0);
> >
> > 	writeln(a, b);
> > ```

> > [Sanki const'dan dolayı 'static assert()' gibi çalışıyor, sizce?
>
> Ben artık değişkenleri const olarak işaretlemiyorum...
> ...
> 'static assert' derlemeyi durdurur. Eğer denediğin zaman yukarıdaki kod da bunu sağlıyorsa evet, static assert gibi işliyor. Yok eğer assert çalışma zamanında işletiliyorsa normal assert gibi işliyor demektir.
Evet, bu kod parçacığı derleme zamanında iş (hata döndürüyor) görüyor. Ayrıca immutable ile birlikte kullanılabiliyor. Bana farklı gelen ve ilk defa gördüğüm kullanım şekli şuydu:

<sabit tür> ismi = (işlev(), değeri);


Anladığım kadarıyla üçlü işlevin teklisi gibi çalışan isimsiz bir 'if()' ifadesi gibi bir şey bu. Burada ifade yerine işleve gönderiyorsunuz. Ama işlevde stdout komutları varsa yan etki oluşturuyor. O yüzden tek başına 'assert()' veya '**in** {} **out**() {} 'kümesi için belli başlı yordamları işleyecek satırları koymanız gerekiyor.

Tabi (sanırım!) bu, derleme zamanında kurulan sabit değerler için. Yoksa değişkenler için böyle bir sözdizimi iş görmüyor.

Teşekkürler...

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

Hocam, benim gibi amatör ve yarım bilenlerle uğraşıyorsun ya Allah kolaylık versin sana...:)

Alıntı (acehreli):

>

Orada virgül işleci kullanılıyor. D'den kaldırılması önerilir ama C'den beri var olduğu için kaldırılmaz. Virgül işleci ifadeleri soldan sağa doğru işletir ve sonuncusunun değerini üretir. Çalışma zamanında da işler.
Böyle bir şeyi ilk defa görüyorum; demek C99 standardı?

Bence gayet hoş çünkü verdiğin örnekteki gibi üç işlev sonucunda meydana gelecek bir değere eşitleniyor. Örneğin (anlamsız olsa da) sonuçta bir örnek:

import std.stdio;

double daireninAlanı = 1;

double pi()
{
	return 3.14;
}
double üssü(double t, double k)
{
	writeln(daireninAlanı);
	return t*k*k;
}
void main()
{
	daireninAlanı = (pi(), üssü (daireninAlanı, 10.0), 314);
	writeln(daireninAlanı);
}

Ancak beklediğim sonuç çıkmadı. Çünkü daireninAlanı'na en son tek başına duran 314 değeri eşitleniyor. Yani işlevlerden dönen değerler havada asılı kalıyor ki üçlü işlev daha işlevsel görülmekte. Bu durum belki de D'de olan bir durumdur.

Peki hocam hiç üçlü işlevi else'si olmadan yani :'nin sağından bir şey olmadan kullanabildin mi? Bazen ihtiyaç oluyor ama D derleyicisi (belki de tüm derleyiciler?) buna izin vermemektedir.

Sevgiler, saygılar...

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

May 22, 2012

Sanırım önceki maddelerdeki hatalar giderilmediği için. Dikkat edersen "06:09" girdiğin halde çıktı "09:06" diyor. Ancak o hata giderilmişse üçüncü adımdaki hata ortaya çıkıyor.

Veya, önceki hataları gidermeden o hataya takılmak istersen sonucun son hanesi sıfır olan değerler girilebilir. Örneğin "10:10" ve "1:00" girmeyi dene.

Ali

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

May 22, 2012

Alıntı (Salih Dinçer):

>

'in {} out() {} 'kümesi de geldi.

Zaten D'nin unittest, in, out, ve invariant olanakları ortalıkta kendi başlarına duran assert'leri çok azaltıyor.

Bir işlevimi çağırdığımda her zaman için belirli bir koşula uymuş olacağımı sanıyorsam (veya biliyorsam), bunu in bloğunda assert ile garantilerim. Örneğin, elemanSayısınıAzalt() işlevimin in bloğunda assert(elemanAdedi > 0) uygundur. (Dikkat: Bu konuda assert veya enforce() arasındaki seçim zor olabilir.)

Bu işlevimin sonucunun her zaman için belirli bir koşula uyacağını biliyorsam bunu out bloğunda bir assert ile denetlerim. Örneğin, assert(sonuç >= this.hacim).

Bu yapı veya sınıfın bir mutlak değişmezi varsa bunu invariant bloğunda denetlerim. Örneğin iki ayrı dizi vardır. Bunların uzunluklarının birbirlerine eşit olmaları şarttır: assert(birinci.length == ikinci.length).

Alıntı:

>

Herhalde scope'a göre daha nitelikli şeyler yapılabilir.

scope ile benzer olduğunu düşünmemek gerek:

  • assert, her zaman doğru olduğunu denetler

  • scope, mutlaka işletilmesini sağlar

Ali

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

May 22, 2012

Alıntı (Salih Dinçer):

>
> 	const int a = 1;
> 	const int b = (assert(a==1), 0);
>
> 	writeln(a, b);
> ```

> Aslında orada b sabiti yok ama derleyici çöktüğü için ve böyle daha anlamlı olacağından işe yarar mı dedim!

Evet ilginç ama alışık olmadığım için ben o assert'ü kendi satırında görmek isterim.

Alıntı:
> Sanki const'dan dolayı 'static assert()' gibi çalışıyor, sizce?

Ben artık değişkenleri const olarak işaretlemiyorum. Olabiliyorsa enum, olamıyorsa immutable. C++'tan geldiğim dönemlerde otomatik olarak const yazıyordum ama artık şu bölümün sonundaki "Nasıl kullanmalı" başlığındaki ilkeleri uyguluyorum:

 http://ddili.org/ders/d/const_ve_immutable.html

'static assert' derlemeyi durdurur. Eğer denediğin zaman yukarıdaki kod da bunu sağlıyorsa evet, static assert gibi işliyor. Yok eğer assert çalışma zamanında işletiliyorsa normal assert gibi işliyor demektir.

Ali

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