Forum: D Programlama Dili RSS
D ile ilgili sorular
Sayfa:  1  2  3  sonraki 
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D ile ilgili sorular
Biliyorsunuz D'yi yeni öğrendiğim için ve hiç düşük seviyeli dillerle çalışmadığım için çok soru soruyorum. Ve bu genelde belli bir başlık altında gitmediğinden çözümü unuttuğumda takip etmekte zorlanıyorum. Bu yüzden böyle bir başlık açmayı uygun gördüm.

İlk sorum. Digitalmars sitesinde böyle bir şey var.
char[] a = "abc";
auto b = to!(immutable(dchar)[])(a);
assert(b == "abc"w);

Buradaki auto b'nin hangi tür olacağını kendi mi seçiyor. Tam olarak ne işe yarıyor merak ettim. Eğer bu işe yarıyorsa bunu kullanmanın avantajı dezavantajı nelerdir. Birde eğer bu işe yaramıyorsa ne işe yarıyor.
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ı
Evet, auto tamamen gereksiz olarak yazılan tür isimlerini engelliyor. auto, C++'nın yeni standardında da gelecek.

Örneğin eğer foo isminde bir fonksiyon OzelBirTur isminde bir tür döndürüyorsa, ve bu tür bir nesneyi ilklerken kullanılıyorsa, C'de ve C++'da tür ismi gereksiz olarak sol tarafa da yazılır. Hele sağ tarafta new kullanılıyorsa, new'e de türün ismi verilmek zorunda olduğundan, bu iyice gereksiz ve şaçma olur. Hele bir de o tür bir şablonsa: (bu örnekler C++)

    OzelBirTur<double> nesne = foo<double>();
    OzelBirTur<BenimGuzelTurum> * p = new OzelBirTur<BenimGuzelTurum>(/* ... */);

oysa kısaca:

    auto nesne = foo<double>();
    auto * p = new OzelBirTur<BenimGuzelTurum>(/* ... */);

Ali
canalpay (Moderatör) #3
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
auto anlaşılan sağda yazılmış olan türü soldayeniden yazmamıza engel oluyor. Otomatik kendi yazıyor.

Bende
char[] alfabe= "abc";
yerine
auto alfabe="abc";
şeklinde yazabileceğimizi düşünmüştüm.
hatta
int sayma_sayılar = 1,2,3,4,5,6,7,8,9 ;
yerine
auto sayma_sayılar= 1,2,3,4,5,6,7,8,9 ;

Şeklinde kullanabiliriz diye düşünmüştüm.
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ı
alfabe çalışır ve türü immutable char[] olur (takma ismi de string). sayma_sayılar'da tabii köşeli parantezler eksik; koyulursa o da olur.

Ali
canalpay (Moderatör) #5
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
alfabe çalışır ve türü immutable char[] olur (takma ismi de string). sayma_sayılar'da tabii köşeli parantezler eksik; koyulursa o da olur.

Bu genel türden daha iyi bir şey. Yani php gibi yüksek seviyeli bir dil oluyor. Neredeyse tür tanımlamamıza bile gerek yok. O zaman türü sadece kesin olarak o tür olması için tanımlarız. Belki biraz da hızda yavaşlama olur. Ama onuda zaten hissedemeyiz.

Ayrıca genel türde sorduğum "girişte hem int hemde dchar türünden değer bekliyorsak ne yapmamız gerekiyor" sorusunu bu şekilde de çözebiliriz.

Tabii neden hep auto kullanılmadığının bir sebebi olmalı. Harelde tür güvenliği için. Yoksa başka bir sebep mi var ?

birde
auto alfabe="abc";
Bunun hangi türden olduğunu nasıl öğrenebiliriz.
auto alfabe="abc";
writeln(alfabe.stringof);
şeklinde tür adını öğrenemiyoruz sanırım. Denediğimde değişken adını verdi. Derslerde türün ismini döndürür diyor ama türün değil değişkenin ismini döndürüyor. Bu ufacık kodda yanlışımı bulamadım :-D
Bu mesaj canalpay tarafından değiştirildi; zaman: 2009-09-07, 09:03.
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ı
php'de değişken türü programın çalışması sırasında belirlenir; bu gibi diller "dynamically typed"tır. C ailesinden diller ise türü derleme zamanında bilmekte ısrar ederler: "statically typed." php'de uymayan tür geldiğinde program göçebilir, D'de ise kod derlenemez.

Şu çalıştı:

writeln(typeof(alfabe).stringof);

Ali
canalpay (Moderatör) #7
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
writeln(typeof(alfabe).stringof);

O zaman derste bu türün adını verilir denmemesi gerekmez mi ? stringof burada anladığım kadarıyla başka bir işe yarıyor.
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ı
stringof'u şimdiye kadar hep tür niteliği olarak gösterdiğim için, o kullanımlarda "türün ismi" o kadar da yanlış olmamış.

Asıl, "bir şeyin insanlar için okunaklı olan yazımı" demem gerekirmiş.

Teşekkürler; daha açıklayıcı yapıyorum.

Ali
acehreli (Moderatör) #9
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ı
Veya tam anlamıyla "string'e dönüşmüş hâli"...

Ali
canalpay (Moderatör) #10
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.
Avatar
esatarslan52 (Moderatör) #11
Üye Haz 2009 tarihinden beri · 142 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
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ş.

Tek tırnaklar(' ') karakterler için kullanılır. Çift tırnaklar(" ") ise dizgiler için kullanılır. toupperT("ii") iki tane 'i' karakterinden meydana geldiği için artık bir dizgidir o yüzden tek tırnak kullanamaya izin vermez. toupperT('i') şeklnde olmalı.

D.ershane'nin Karakterler veya Dizgiler konularının birine bu fark eklenebilir.
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ı
İ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
canalpay (Moderatör) #13
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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.
acehreli (Moderatör) #14
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ı
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
canalpay (Moderatör) #15
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 mesaj canalpay tarafından değiştirildi; zaman: 2009-09-09, 02:39.
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  3  sonraki 
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-19, 19:54:57 (UTC -08:00)