Forum: Ders Arası RSS
Assert ve Enforce dersi hk.
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Assert ve Enforce dersi hk.
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ı.

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

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.
https://github.com/zafer06 - depo
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ı
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
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #4
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
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 :)
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
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.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
Salih Dinçer #6
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
assert()'in şöyle bir kullanımını şuradan çı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?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-05-22, 11:47.
acehreli (Moderatör) #7
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ı
Yanıtlanan mesaj #5
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).

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
acehreli (Moderatör) #8
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ı
Yanıtlanan mesaj #6
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.

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
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
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ı
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.

İfadelerin etrafına parantez koyulmadığı zaman söz dizimi yanlış anlaşılabiliyor. Örneğin aşağıda parantezler olmasa i'nin tanımlanmasından sonra bir de bar() isminde bir işlev bildiriliyor gibi oluyor.

void foo()
{}
 
double bar()
{
    return 1.5;
}
 
int zar()
{
    return 42;
}
 
void main()
{
    int i = (foo(), bar(), zar());
    assert(i == 42);
}

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam, benim gibi amatör ve yarım bilenlerle uğraşıyorsun ya Allah kolaylık versin sana...:)

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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-05-22, 16:44.
acehreli (Moderatör) #12
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ı
Salih Dinçer:
demek C99 standardı?

gcc'nin -std=c89 seçeneği kabul ediyor.

Ancak beklediğim sonuç çıkmadı. Çünkü daireninAlanı'na en son tek başına duran 314 değeri eşitleniyor.

Virgül işleci öyledir: sağındaki ifadenin değerini üretir. Dolayısıyla en sondaki değer oluyor.

Peki hocam hiç üçlü işlevi else'si olmadan yani :'nin sağından bir şey olmadan kullanabildin mi?

gcc'nin üçlü işleçle ilgili bir ek olanağı vardı. Belki odur. (?)

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:
Forum: Ders Arası RSS
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-23, 23:37:07 (UTC -08:00)