September 08, 2009
string toupperT(string giriş) {
   string I="I";
   string İ="İ";
   string i="i";
   string ı="ı";
   giriş=replace(giriş , ı , I);
   giriş=replace(giriş , i , İ);
   string sonGiriş = toupper(giriş);
   return sonGiriş;
}
unittest
{

   assert(toupperT("iıİI") == "İIİI");
   assert(toupperT("ğşç") == "ĞŞÇ");
   assert(toupperT("öü") == "ÖÜ");
}

Burada her şey normal ama assertte toupperT("ii") yerine toupperT('ii') yazınca hata veriyor ? Neden acaba ? " ile ' farkı nedir ki ? Yüksek seviyeli dillerde şimdiye kadar hiç farkını göremedim. Tek ' kullandığında metinin içinde ' işaretini yalın olarak kullanamayacağın için " kullanılırdı. Ya da tam zıttı. Ama d bunlara farklı görevler yüklemiş.

Evet bir klasik devam ediyor :-D Kodda hata yaptığımı sandığım için çok fazla kafa yormuştum. Çözümü zor buldum. ( Çok şanslıyım. Hiç alakası olmadığını düşündüğüm halde çözüm bu çıktı.) Bende merak ettim.

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

September 08, 2009

Bir string oluşturup ona tanımlayacağımıza direk i yazmak evet daha hızlı çalıştıracaktır. Zaten ben de normalde böyle kullanırdım. Sadece burada böyle kullandım.

Alıntı (acehreli):

>

Çok çok önemli olmasa da, bu fonksiyonu daha hızlı yapabilirsin. Bu fonksiyon verilen dizgi üzerinde üç kere ilerliyor: çünkü replace() ve toupper() dizgiyi baştan sona yürümek zorundadırlar. Belki dizgiyi tek bir yürümeyle de halledebilirsin.

Bunu nasıl yapacağımı çok iyi anlamadım.

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

September 08, 2009

İki derse de ekledim; ama daha siteye koymadım. Dosyalar bölümünü koyarken gelecekler.

Can, bir kaç not:

'İ' karakterinin ne olduğu zaten görünüyor ve tek bir yerde kullanılıyor. '7' gibi ne oldukları anlaşılmayan sabitler yerine 'hafta_gün_adet' gibi isimli değişkenler kullanmak çok yararlıdır, ama burada zaten İ karakterinin kendisinden bahsettiğimiz için bence 'İ' uygundur.

Çok çok önemli olmasa da, bu fonksiyonu daha hızlı yapabilirsin. Bu fonksiyon verilen dizgi üzerinde üç kere ilerliyor: çünkü replace() ve toupper() dizgiyi baştan sona yürümek zorundadırlar. Belki dizgiyi tek bir yürümeyle de halledebilirsin.

Kopy^H^H^H^Hİpucu ;) için dmd klasörünün altındaki src/phobos/std/string.d dosyasına bakabilirsin. Oradaki kodda da 'a' ve 'A' gibi sabitler kullandıklarını göreceksin.

Daha önemlisi, iki farklı toupper yazarak hız farklarını deneyebilirsin.

Ali

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

September 08, 2009

Doğrudan 'İ' yazmayı hız için söylememiştim. Hatta derleyici ikisini aynı derecede hızlı derleyecek kadar akıllıdır. Kesin! :)

toupper() gibi bir fonksiyon, verilen diziyi başından sonuna doğru yürür ve karakter karakter sonucu bir sonuç dizgisine yerleştirir. Yani tek bir for döngüsü yeter. (Dikkat edersen, iki tanesi replace()'ler içinde ve bir tanesi de senin çağırdığın toupper() içinde olmak üzere, senin fonksiyonun dizgiyi üç kere yürüyor.)

dmd ile gelen src/phobos/std/string.d dosyasındaki toupper'ı nasıl yaptıklarını incelemek aydınlatıcı olacak.

Ali

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

September 09, 2009

Alıntı (acehreli):

>

Doğrudan 'İ' yazmayı hız için söylememiştim. Hatta derleyici ikisini aynı derecede hızlı derleyecek kadar akıllıdır. Kesin! :)

Eğer ikisinin aynı olduğunu anlıyorsa bunun için değişken ile değerini durmadan kontrol etmesi gerekmiyor mu ? Bu da derleyicide yavaşlamaya neden olur. Bunun için bunu yapcaklarını sanmıyorum. Ama char ı ='ı' nın programı yavaşlatcağını sanmıyorum.

Bu arada D dilini nasıl hiç bakmadığınız halde bu kadar iyi biliyorsunuz diye merak etmiştim. Bir de baktım C'de de aynı toupper tolower diye fonksiyonlar var. Neredeyse bir çok şey aynı. Doğrusu C'ye bağlı olan bir dilin fonksiyonlarınında aynı isimli olması normal bir şey.

Ama C ile ilgili bir şey bilmemek beni çok zorluyor. Acaba D'yi bıraksam ya C'ye başlayıp devam edip sonra D'yemi geçsem yada direk C# python yada php'yemi geçsem diye merak ediyorum.

invariant char[16] hexdigits = "0123456789ABCDEF";      /// 0..9A..F
invariant char[10] digits    = "0123456789";            /// 0..9
invariant char[8]  octdigits = "01234567";          /// 0..7
invariant char[26] lowercase = "abcdefghijklmnopqrstuvwxyz";    /// a..z
invariant char[26] uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";    /// A..Z
invariant char[52] letters   = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
   "abcdefghijklmnopqrstuvwxyz";    /// A..Za..z
invariant char[6] whitespace = " \t\v\r\n\f";           /// ASCII whitespace

enum dchar LS = '\u2028';   /// UTF line separator
enum dchar PS = '\u2029';   /// UTF paragraph separator

Bu beni çok şaşırttı. Dilin ana kütüphanesinde bu kadar basit değişkenler tanımlanması, ben bunları sistemden filan öğrenip ekrana yazdırılıyor sanmıştım. Normal değişken tanımlanmış. Bu arada invariant kaldırılmayacak mıydı ? Yerine immutable gelecekti.

Bu arada hız farkını anlayabilmem için çalıştırılma süresini gösteren kod parçacıkları var mı?

Bu arada aklıma nasıl yapacağım geldi(İlk başta aklımdaki toupper'ın kaynak kodlarını düzenlemekti. Şimdi for döngüsü ile teker teker ı i leri if ile kontrol edip büyüğünü yazdırmak geldi. Daha doğrusu resmen siz beynimin içine bu fikri soktunuz :-)) ama benim düzensiz kod yazışımdan kaynaklanacak yavaşlama replace'den doğan yavaşlamadan daha az olur mu ?

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

September 09, 2009

Bu arada neyin daha hızlı olduğunu nreden bileceğiz. Mesala pythonda ben ikisin aynı anda çalştırmayı deneyek ölçmüştüm. Python da birden atıyorum on bine kadar sayan while kod parçacığı for'da aynı işi yapana göre çok daha hızlıydı.

Sorular:

1.enum ne işe yarıyor ?

  1. version ne işe yarıyor ? (Tahminim versiyonun içine işletim sistemi adını yazıyorsun o da sana program o işletim sistemnde çalıştıysa true çalışmadıysa false dönürüyor.)

3.debug ne işe yarıyor.

  1. size_t ne demek oluyor.( Tahminim bir şeyin büyüklüğünü tutarken yardımcı oluyor. Ama o zaman neden real türünü kullanmıyoruz ?)

4.cast ne işe yarıyor ?

5.copy = new char[s.length + 1]; bu ne işe yarıyor. (Yoksa copy değişkenini tanımlıyken bir daha tanımlamak için başına new mi yazmak gerekiyor? )

  1. in, out, body bunlar ne işe yarıyor ?

7.cast ne işe yarıyor?

8.throw ne işe yarıyor?

9.deprecated ne işe yarıyor ?

  1. pragma ne işe yarıyor?

  2. foreach (size_t i, dchar c; s) bunun ne demek olduğunu çözemedim. Yani bu neye yarıyor. (kısaca foreach döngüsünü soruyorum.)

  3. scope ne işe yarıyor ?

Evet şimdilik bu kadar :-D Fazla mı abarttım ?

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

September 09, 2009

Alıntı (canalpay):

>

3.debug ne işe yarıyor.

Hata yakalamak demek. Programları oluştururken iki yöntemle release ve debug modunda oluşturuyoruz. Debug modunda, oluşan hata ile ilgili daha fazla bilgi programa geçiyor. Release modunda ise önemli olan hız. Debug modunda yeterince test edilen program, release modunda üretiliyor ve kullanılmaya hazır hale geliyor.

Alıntı (canalpay):

>
  1. size_t ne demek oluyor.( Tahminim bir şeyin büyüklüğünü tutarken yardımcı oluyor. Ama o zaman neden real türünü kullanmıyoruz ?)

İşaretsiz tamsayı veri tipi için kullanılan bir takma isim. Örneğin dizi indislerini tuttuğunu varsayılım. Bunlar 0'dan başlayıp pozitif olduğu ve tamsayı olduğu için size_t kullanabilirsin.

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

September 09, 2009

Alıntı (canalpay):

>

4.cast ne işe yarıyor ?

Galiba türler arası dönüşümlerde kullanılıyor. Örn:

int sayı = 7;
double sayı2 = cast(double)sayı;
writeln(sayı, " ", sayı2);

Alıntı (canalpay):

>

8.throw ne işe yarıyor?

O da hata fırlatıyordu herhalde?

Alıntı (canalpay):

>

foreach (size_t i, dchar c; s) bunun ne demek olduğunu çözemedim. Yani bu neye yarıyor. (kısaca foreach döngüsünü soruyorum.)

Buradaki foreach'in amacını anlayamadım ama foreach bir dizideki elemanları tek tek dolanan bir döngüdür. Ona da örnek vereyim (tabi yanlış değilse yanlışsa da acehreli belirtir nasıl olsa güvenlik var yani :)):

int[] dizi = [1,2,3,4,5,6,7,8];
foreach(int sayı; dizi) {
   writeln(sayı);
}

Ayrıca foreach sana toupperT konusunda da yardımcı olabilir. Yani karakter düzeyine inersen.

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

September 09, 2009

foreach'a başka bir örnek:

   string mesaj = "Selam Ben Emre";
   int sayı;
   foreach(char e; mesaj) {
       if(e == 'e' || e == 'E') {
           sayı++;
       }
   }
   writeln("\"", mesaj, "\" Cümlesi içinde ", sayı, " tane 'e' veya 'E' harfi var");

Yani bir string'in içinde kaç tane istediğin bir harfin geçtiğini bulabilirsin.

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

September 09, 2009

Alıntı:

>
  1. in, out, body bunlar ne işe yarıyor ?

in ve out üzerinde daha önce tartışmıştık. BUradan (http://ddili.org/forum/post/200) ulaşabilirsin.

Alıntı:

>

1.enum ne işe yarıyor ?

Enum (Enumerators) kendi küme tiplerimizi oluşturmamıza yarıyor. Numaraları isimlendirerek kullanımı kolaylaştırır.
enum kümeİsmi
{
değişken1,
değişken2,
değişken3,
}
Aksi belirtilmediği sürece ilk değişken sıfıra karşılık gelir ve artarak devam eder. Ama istersek kendi numaralarımızı kendimizde verebiliriz.

enum kümeİsmi
{
değişken1=10,
değişken2=5,
değişken3=8,
}

Ufak bir örnek:

import std.stdio;

enum Renk
{
   SİYAH,
   BEYAZ,
   MAVİ,
   KIRMIZI,
}

void ekranRenk(Renk pRenk)
{
   switch(pRenk)
   {
       case Renk.SİYAH: writeln("Ekranı Siyah yap");break;
       case Renk.BEYAZ: writeln("Ekranı Beyaz yap");break;
       case Renk.MAVİ: writeln("Ekranı MAVİ yap");break;
       case Renk.KIRMIZI: writeln("Ekranı KIRMIZI yap");break;
   }
}

int main()
{
   ekranRenk(Renk.MAVİ);

   return 0;
}

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