Forum: Ders Arası RSS
assert kontrol ifadesi hazırlama
assert
Sayfa:  1  2  sonraki 
zafer #1
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: assert kontrol ifadesi hazırlama
import std.stdio;
import std.functional;
 
void main()
{
    writefln("uint.max : %s", uint.max);
 
    writefln("Toplam : %s", Topla(1, 2_147_483_647));
}
 
int Topla(int sayi1, int sayi2)
{
    // 1 - assert(sayi1 + sayi2 < int.max, "Sayıların toplamı int sınırını aşıyor.");
 
    // 2 - assert(sayi1 + sayi2 > 0, "Sayıların toplamı int sınırını aşıyor.");
 
    assert(sayi1 + sayi2 >= 1, "Sayıların toplamı int sınırını aşıyor.");
 
    return sayi1 + sayi2;
}

Yukarıdaki kodda amacım assert kullanımını örneklemek için Topla() metodu içinde int sınırını aşan bir toplam elde etmek ve bunu assert kullanarak yakalamaktı. Ancak işler umduğum gibi gitmedi.

1. olarak işaretledğim satırda toplam değeri sınırı aşınca eksi değer aldığı için kontrol deyimi TRUE sonucunu üretti ve assert işleme izin verdi.

2. assert deyiminde ise daha farklı bir durum var. Sonuç eksi bir değer olmasına rağmen assert sesini çıkarmadı.

Son assert deyimi çalıştı ancak o da Topla(0, 0); gibi bir çağrı için hata üretiyor. Oysa bu çağrı ne kadar  anlamsız olsada kurallara uygun ve işletilebilir bir çağrı.

Dolayısıyla öncelikle sorunum bunlar diğer taraftan assert kullanımı ile ilgili etkileyici örneklerle karşılaştıysanız yada aklınıza böyle örnekler geliyorsa paylaşırsanız çok sevinirim. Sunum için bir şeyler hazırlamaya çalışıyorum.
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ı
Yanılmıyorsam taşma olmadığı zaman toplam her iki sayıya da eşit veya daha büyüktür:

    assert((sonuç >= sayi1) && (sonuç >= sayi2),
           "Sayıların toplamı int sınırını aşıyor.");

Ali
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler Ali. Bu assert kontrol ifadeleride başlı başına bir iş gibi görünüyor. Çünkü ifade yanlış kurulursa bu sefer geçmesi gereken işlemide engelleyebiliyor.

Bu arada "2. assert deyiminde ise daha farklı bir durum var. Sonuç eksi bir değer olmasına rağmen assert sesini çıkarmadı." hakıında benim göremeyip senin gördüğün bir durum  var mı?
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
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ı
Benim yanıt pek genel değilmiş. Araştırınca şu konuda bazı bağlantılar buldum:

  http://stackoverflow.com/questions/199333/best-way-to-dete…

Oradaki pdf'in içinde gcc'nin kaynak kodlarında geçtiği söylenen şöyle bir çözüm var:

Wtype __addvsi3 (Wtype a, Wtype b) {
  const Wtype w = a + b;
 
  if (b >= 0 ? w < a : w > a)
    abort ();
 
  return w;
}

Şu sayfada da bütün aritmetik işlemler için çözümler var ("compliant" denenler taşmaları sezen kodlar):

  https://www.securecoding.cert.org/confluence/dis…?showCo…

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben de dün konuşmaya hazırlanmak için şöyle notlar hazırlamıştım ama meğer bilmediğim hala çok şey varmış:

D DİZİLERİ.rtf
Deneme ve Bir Hazırlık


Merhaba,

Bir çok dilin olmazsa olmazı diziler (arrays), kendi içlerinde çok çeşitli olduğu kadar her ortamda (ve script'lerde) farklı şekilde tanımlanırlar. Çoğu zaman ortamlar arasında geçiş yapıldığında bir yerlere (reference notes) bakma gereği duyarım, ancak D'de buna ihtiyaç duymam! Bunun sebeplerine ve ayrıntılarına geçmeden önce, hepsinde (çoğunlukla) ortak noktanın köşeli parantezler [..] olduğunu belirtmeden geçemeyeceğim...:)

D'de üç şekilde dizi tanımlayabiliriz; bunlar:

1-İşaretçi Dizisi
2-Değişken Dizisi
3-Eşleme Dizisi


Ancak ayrıntılara (dynamic, matrix) geçmeden evvel C'den günümüze (D'ye) nasıl dizi oluşturduğumuzu hızlı bir şekilde geçelim. Çok ayrıntısına girmeden bütün bir şekilde (tümden varım) açıklayacağım.

C'de şöyle yapardık:

    <veri türü> ismi[boyutu] = {'v', 'e', 'r', 'i', 'l', 'e', 'r' };

D'de ise hem yukarıdakine benzer:

    <veri türü> ismi[boyutu] = ["ve", "ri", "ler"];

Hem de en (D)oğal anlamıyla şöyle yaparız:

    <veri türü>[boyutu] ismi = ["ve", "ri", "ler"];

(D)oğal ifadesini bilinçli yazdım! Bir dizi demek 'veri türü'nün çoğulu demektir ki biz bunu köşeli parantezler [..] ile yaparız. Yani gidip bunu 'veri ismi'nin sağına değil de soluna (türün yanına) yazmak daha doğal.

Zaten biz dizilerin elemanlarına erişeceğimiz zaman diğer şekilde kullanmaktayız. Aynı şekilde güzel parantez {..} kullanmak da anlamsız. Öyle ya, diziler ile her işimizi köşeliler ile halledeceğiz ki dört köşe olalım...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
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:
D'de üç şekilde dizi tanımlayabiliriz; bunlar:

1-İşaretçi Dizisi
2-Değişken Dizisi
3-Eşleme Dizisi

1 ile 2 farklı mı? Ben aşağıdaki gibi anlamayı daha kolay buluyorum:

  • Sabit uzunluklu dizi
  • Dilim

Bence bu ayrım önemli çünkü:

  • birisi değer türü, diğeri referans türü
  • birisinin uzunluğu değişemiyor, diğerininki değişebiliyor
  • birisinde yalnızca elemanlar var (C ve C++ dizileri gibi), diğeri ise elemanlardan kopuk olarak bir uzunluk ve işaretçiden oluşuyor

Eşleme dizisi ise ancak veri depolama olduğu için diğerleriyle aynı sıraya koyulmalı çünkü aslında array değil, hash table.

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında Digital Mars'ın belgelerinden faydalandım. Array'i anlatırken üçe bölmüşler ve aralarda concating gibi  mevzuları işlemişler ki bir nevi dilime girilmiş.

Dilim mevzusunu dinamik dizi ile karışmasını engellemek için farklı bir şekilde ele almayı düşünüyorum. Ama en son notlarımı toparlayınca e-posta ile gönderip üzerinden geçmeni rica edeceğim.
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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ı
Anladım. Sanırım şuradaki sıralamadan bahsediyorsun:

  http://dlang.org/arrays.html

Senin "İşaretçi dizisi" yazdığını görünce içinde işaretçiler bulunan dizi anlamıştım. Sen ise galiba tek işaretçinin dizi gibi kullanılmasını söylüyorsun.

Ayrıca haklısın (ve haklılar): Diziler ve eşleme tabloları da "indeks ile erişim" anlamında aynılar.

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ı
Bilmem katılır mısın; dilimleri işaretçi dizisi içinde işlemeyi düşünüyorum?

Çünkü onlar dinamik dizilerden biraz farklılar. Yani bir bellek bölgesini işaret ediyorlar. Dinamik diziler ise GC'nin kontrolünde 2. madde içinde işlenebilir.
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ı
Anlıyorum. Çünkü dilimler de zaten elemanları gösteren bir işaretçi barındırıyorlar. (Sen "işaretçi" diyorsun diye öyle yazıyorum yoksa ben "gösterge"ye sadığım. :p)

Ama bir işaretçinin dizi gibi kullanılması yalnızca C kütüphaneleri ile etkileşirken gerekiyor. Normal D programlarında yeri olmadığı için bir D olanağıymış gibi anlatmaya gerek olduğunu sanmıyorum.... Diyeceğim ama genel bir D tanıtımı konusunu atladık. Acaba D'yi merak edip gelenler olacak mı? Konuşmalardan birisinin yerine "D nedir" diye bir konuşma mı eklesek? En başa o gelir. (?)

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ı
Pardon, işaretçi mi demişim! Kim demiş, neden demiş, niçin, nasıl... :-D

Alışkanlık işte...:)

Evet, gösterge ve tüm nimetleri D'nin özel bir olanağı değil. Ancak bağlantı kurmak için diğer dillerde olmayan (öyle değil mi?) dilimleri ifade edebileceğim, daha doğrusu devam edebileceğim önemli bir başlık. Gerçi diziyi anlatmadan dilime geçilmez ama bir yolunu bulurum. Kaldı ki dizileri bilmeyen yoktur herhalde...

İşte 'D Nedir'i anlatmak Ali hocamın işi olsa gerek. Bunun da en yakıştığı yer açılış konuşması...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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:
bağlantı kurmak için diğer dillerde olmayan (öyle değil mi?) dilimleri ifade edebileceğim, daha doğrusu devam edebileceğim önemli bir başlık

Çok haklısın. Güzel bir akış olur. Python'da dil olanağı olarak, C#'ta da kütüphane olanağı olarak dilim olduğunu biliyorum. Ama D'den farklarını bilmiyorum.

İşte 'D Nedir'i anlatmak Ali hocamın işi olsa gerek. Bunun da en yakıştığı yer açılış konuşması...

O da doğru. O zaman örneğin Unicode'a o kadar zaman ayıracağımıza baştaki tanıtım konuşmasının arasında hızlıca geçilir.

Ali
zafer #13
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #10
acehreli:
Konuşmalardan birisinin yerine "D nedir" diye bir konuşma mı eklesek? En başa o gelir. (?)

Bence de kesinlikle çok iyi bir fikir. Böyle bir sunum böyle bir açılışla başlamalı zaten.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #14
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
acehreli on 2012-05-19, 00:39:
Yanılmıyorsam taşma olmadığı zaman toplam her iki sayıya da eşit veya daha büyüktür:

    assert((sonuç >= sayi1) && (sonuç >= sayi2),
           "Sayıların toplamı int sınırını aşıyor.");
Bunu denedim ve sayılardan herhangi biri eksili olduğunda hata veriyor. Şu nasıl Zafer?

int Topla(int sayi1, int sayi2)
{
    long sonuç = cast(long)sayi1 +  cast(long)sayi2;
    assert ((sonuç >= int.min) && (sonuç <= int.max), "Sayıların toplamı int sınırını aşıyor.");
    
    //assert((sonuç >= sayi1) && (sonuç >= sayi2), "Sayıların toplamı int sınırını aşıyor.");
    //assert(sonuç < int.max, "Sayıların toplamı int sınırını aşıyor.")
    //assert(sonuç > 0, "Sayıların toplamı int sınırını aşıyor.");
    //assert(sonuç >= 1, "Sayıların toplamı int sınırını aşıyor.");
    
    return cast(int)sonuç;
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #15
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Bunu denedim ve sayılardan herhangi biri eksili olduğunda hata veriyor. Şu nasıl Zafer?

Salih, aslında amacım taşmayı yakalamaktan ziyade assert sunumu için çarpıcı bir örnek hazırlamaktı. Ancak bu konuda istediğim gibi içerik bulamadım.

Taşma ilgili konuda ise Ali'nin verdiği adres (https://www.securecoding.cert.org/confluence/dis…?showCo…) gayet güzel, içinde tüm durumlar için kontrol ifadeleri yazılmış, ancak dediğim gibi benim istediğim çarpıcı bir örnek bulamadım.

Benim istediğim örnek, assert kullanmadığımızda programda ölümcül bir hata oluşsun ama assert kullanımı bu hatayı engellesin gibi bir örnek. Örneğin şöyle bir şey

1985-1987 — Therac-25 Tıp Kazası: Bir radyasyon terapi cihazı hatalı çalıştı ve çeşitli tıbbi tesislerde ölümcül düzeyde radyasyon verdi. Daha önceki bir tasarım geliştirilerek yaratılmuş bulunan Therac-25 iki farklı tür radyasyon verilen “ileri” bir terapi sistemi idi. Ya düşük güçlü elektron ışını (beta parçacıklar) veya X-ışınları veriyordu. Therac-25′in X-ışınları yüksek güçlü elektronların elektron silahı ile hasta arasına yerleştirilmiş bir metal hedefe çarptırılmaları ile yaratılıyordu. İkinci bir “ilerleme” de eski Therac-20 nin elektromekanik güvenlik bağlantılarının yazılım kontrolüyle yapılmasıydı. Bu karara yazılımın daha güvenli olduğu düşüncesiyle varılmıştı. Mühendislerin bilmediği şey hem 20 hem 25′in hiçbir resmi eğitimi olmayan bir programcı tarafından yazılmış olduklarıydı. Bir görünmez hata nedeniyle, hızlı yazan bir klavye kullanıcısı kaza yaparak Therac-25′in elektron ışınını yüksek enerjili modda, fakat metal hedef yerinde olmadan, hastaya gönderecek şekilde çalışmasına yol açabilirdi. Böyle oldu ve en az 5 hasta öldü başkaları ciddi şekilde yaralandı.

Tabi burada tüm olayın programcının üzerine yıkılmasıda başka bir ironi, sanki orada o programcının bir üstü veya bir test ekibi yok muydu? Eğer yoksa zaten iş baştan bir felaket, yok eğer böyle bir ekip veya amir varsa, bu seferde programcı hata yaptı böyle oldu demek bana pek doğru gelmiyor.

Ancak bu yazıyı arasıra okuyor ve TEST, TEST, TEST diyorum :)
https://github.com/zafer06 - depo
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:
Sayfa:  1  2  sonraki 
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-21, 15:18:38 (UTC -08:00)