October 10, 2012

(Daha önce yazdıklarımın tekrarı olabilir; unutmuşum, kusura bakmayın. :))

Bu sınırlı bir stack, öyle mi? Uzunluğunu baştan belirliyoruz ve daha fazla büyütemiyoruz. Kabul ama hatalı indekslerin sessizce gözardı edilmelerinin yararını ben hâlâ göremiyorum. 16 gibi bir boyut belirlemişsem 20 yok demektir. 20'ye yazmak hata atmalı çünkü hatamı bilmek önemli.

set ve get'in @property olmaları kafa karıştırıyor. @property işlevlerini parantezsiz kullanmayı bekleriz ama ikisi de len alıyorlar (aslında len değil de, indeks (veya konum) olsa daha doğru).

Şu kodda ne olmasını bekliyoruz?

   struct S
   {}

   auto s = Stack!S(10);
   s.set = 3;

Sondaki atamanın hiçbir etkisi yok çünkü s.set(3) çağrılıyor; o referans döndürüyor; ve döndürülen referans ile hiçbir şey yapılmıyor.

Ayrıca set her çağrıldığında _Index'in arttırılması da doğru gelmiyor. Aynı elemana arka arkaya set(3) yapsam eleman mı ekleniyor?

Bu türler belki de tamamen tasarımlarına uygun davranıyorlardır ama isimleri "stack" olunca ister istemez alıştığımız stack veri yapısı gibi davranmasını bekliyorum.

Kodla ilgili kişisel bir sorunum var: main içindeki işlemlerin bazıları with içinde oluşturulan isimsiz nesne üzerinde uygulanıyor. with, o nesneyi koddan çıkartılmasına neden olduğu için kodun okunmasını güçleşiyor.

Bir örnek: with'in içinde geçen testArray'in de başında hiçbir belirteç yok. Kodu okurken "aslında belki de nesne.testArray'dir" diye düşünülebilir. with, kodun bütünüyle tanınmasını gerektiriyor:

   with (birİfade()) {
       foo();    // birİfade üzerinde mi işliyor?
       bar();    // peki bu?
   }

O soruları yanıtlayabilmek için hem birİfade'nin döndürdüğü türü bütünüyle tanımam gerek. Aşağıdaki kodun with'ten daha üstün olduğunu iddia ediyorum:

   auto değer = birİfade();
   değer.foo();
   bar();

İşte şimdi foo()'nun birİfade()'nin döndürdüğü değer üzerinde işlediğini biliyorum. Hiçbir şey gizli değil.

Ali

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

October 10, 2012

Aslında hata atılacak davranışta bulunacağız demek istiyorum. Hata döndüğünde programın işleyişi başka bir yere kaydığı için veri işlemeye ara vermemeli...

Dizi dışındaki adreslere çözüm için ise 0 veya boş bilgi alanından başka bir çarem ne yazık ki yok. Çünkü olmayan bir adrese veri yazılmasını (bire bir eşitlemeyi) ve okunmasını (0 döndürmesini) istiyorum. T.init de olabilir ve hatta dizinin 0. hücresi karavana atış atılan bölüm olabilir...:)

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

October 10, 2012

Alıntı (Salih Dinçer):

>

kullandığımız döngü içinde sınırlarını ve davranışlarını bildiğimiz için taşma durumlarını dışarıda tahmin edebiliyoruz.

O zaman hata atmasında da bir sakınca olamaz çünkü zaten hata atılacak davranışta bulunmayacağız diyorsun. ;)

Alıntı:

>

Ama kararlı çalışmaları gerekli yoksa yanlış kullanımda bu sefer gerçekten garip sonuçlar doğurabilir...:)

Asıl garip olan, 'return empty_stack_cell'de ve 'return 0'da olduğu gibi icat edilmiş değerler döndürmektir. İçinde hiç 0 bulunmayan bu türe get() diyorum ve 0 alıyorum. Garip.

(Bu arada, 0 yerine T.init olması gerekiyor. Bir de 'new int' yerine 'new T'.)

Ali

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

October 11, 2012

Alıntı (Salih Dinçer):

>

hata atılacak davranışta bulunacağız demek istiyorum

Yani programcı yanlışlık yapmış olacak. Bunun hiçbir göstergesi olmayacak. Örneğin, programcı geçersiz olan 10 numaralı yerden veri okuyacak, değeri 0 olarak elde edecek, ve bu yanlışlığı bilmeyecek.

Alıntı:

>

Hata döndüğünde programın işleyişi başka bir yere kaydığı için veri işlemeye ara vermemeli...

O verinin yanlış olduğunda anlaşıyoruz, değil mi? O programın çalıştığı radyasyon tedavi aletinin altında yattığını düşün.

Veri yanlışsa program istenenin dışında davranmaktadır. O alt işlemin hemen durdurulması gerekir. Programın üst düzeyleri bu hatayı yakalayabilirler; programın bileceği iş. İstemezlerse program hemen sonlandırılır ve hatalı davranması hemen önlenmiş olur.

Alıntı:

>

Dizi dışındaki adreslere çözüm için ise 0 veya boş bilgi alanından başka bir çarem ne yazık ki yok. Çünkü olmayan bir adrese veri yazılmasını (bire bir eşitlemeyi) ve okunmasını (0 döndürmesini) istiyorum.

Herhalde oyun gibi önemsiz bir programda bir kullanım amacı vardır. Örneğin, oyundaki bir pencere dışında kalan yerlere de yazılır ama onlar gözardı edilir. (?) Ama o zaman bile pencere büyüse, karakter pencereye yaklaşsa, binanın dışına çıksa, görünmeyen dünyanın bomboş olurdu.

Neyse, senin ihtiyaç duyduğun belli. :)

Alıntı:

>

T.init de olabilir ve hatta dizinin 0. hücresi karavana atış atılan bölüm olabilir...:)

T.init olması gerekiyor yoksa kod yalnızca int ile uyumlu türlerle çalışabiliyor.

Ali

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

1 2
Next ›   Last »