Forum: D Programlama Dili RSS
Hazır dizgi değerlerinin türü
acehreli (Moderatör) #1
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ı
Konu adı: Hazır dizgi değerlerinin türü
trileri'yi dmd 2.038'den beri derleyemiyorum. Bunun bir derleyici hatası yüzünden olduğunu düşünmüştüm ama 2.043'te de aynı olunca sordum:

  http://www.digitalmars.com/webnews/newsgroups.…?art_grou…

Sorun, "merhaba" şeklinde yazılan dizgi hazır değerlerinin türünde.

Benim bu güne kadar sandığım şuydu:

"merhaba"c  ->  string
"merhaba"w  -> wstring
"merhaba"d  -> dstring
"merhaba"   ->  string (yanlış biliyormuşum)

Sonuna c yazılmayan hazır değerlerin de string olduklarını sanıyordum. Yukarıdaki konuda öğrendiğime göre, türleri özellikle belirtilmeyen dizgi sabitleri, kullanımlarına göre belirleniyormuş.

Bunun bir kısmını biliyordum. Örneğin

dstring dizgi = "merhaba";

yazıldığında elimizde dstring türünden bir dizgi olduğu için onun "merhaba" ile ilklendiğini anlıyordum. Zaten başka bir şey de beklenemez...

Bilmediğim bir şey, hazır değer, C türünden bir dizgi ile ilklendiğinde, sonuna '\0' karakteri bile yerleştiriliyormuş:

const char * dizgi = "merhaba";    // C türü dizgi; sonunda '\0' var 

Yani "merhaba", 4 farklı tür yerine geçebiliyormuş. Buraya kadar tamam.

Bir sorun, işlev yüklemede ortaya çıkıyor:

void foo(const(char)[])
{}
 
void foo(const(wchar)[])
{}
 
void foo(const(dchar)[])
{}
 
void main()
{
    foo("merhaba");      // <-- hangi foo?
}

"merhaba"nın türü benim yanlış bildiğim gibi string olmadığı için, derleyici hangi işlevi çağıracağını bilemiyor:

deneme.d(10137): Error: function deneme.foo called with argument types:
    ((string))
matches both:
    deneme.foo(const(char)[] _param_0)
and:
    deneme.foo(const(dchar)[] _param_0)

main'deki çağrının hem char dizisi alana, hem de dchar dizisi alana uyduğunu söylüyor. (Nedense o iki türü seçiyor ve susuyor. Bunlardan birisini silince wchar'lı işleve uyduğunu da söylemeye başlıyor.)

Ara not olarak, "merhaba"nın türü tek başına sorgulandığında string seçiliyor:

writeln(typeof("merhaba").stringof);    // "string" diyor 

Bu yüzden, trileri'deki Dizgi'nin opEquals işlevini istediğim gibi yükleyemiyorum; çünkü dizgi=="merhaba" yazıldığında hangi opEquals'un çağrılacağı bilinemiyor.

Ne yapmak gerek? Böyle bir kütüphane D'nin dizgilerinden hangisini desteklemeli? string daha yaygın olduğu için yalnızca string'le mi çalışmalı? Yoksa kendisi perde arkasında bir dchar dizisi kullandığı için yalnızca dstring'le mi çalışmalı?

Yukarıdaki konuda sordum. Öğreneceğim... :)

Ali
canalpay (Moderatör) #2
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ı
Ne yapmak gerek? Böyle bir kütüphane D'nin dizgilerinden hangisini desteklemeli? string daha yaygın olduğu için yalnızca string'le mi çalışmalı? Yoksa kendisi perde arkasında bir dchar dizisi kullandığı için yalnızca dstring'le mi çalışmalı?

dkvG'de const dchar[] kullanıyor daha sonrada string türüne çevriliyor. Ama şablon ile hem const dstring,const wstring,const string ile kullanamaz mıyız ? Bu şablon ile kullanım başka bir modül şelinde de olabilir.


Bu arada trileride daha önce stringleri dstring olarak değiştirmişiz. dstring bizim için uygundur. Eğer Türkçe karakter kullanacaksak ve o karakterlere özel değişiklikler yapacaksak zaten türü dstring ya da dchar[] seçmeyi alışkanlık yapmalıyız.
acehreli (Moderatör) #3
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ı
dchar[] kullanmak mantıklı bir seçim. Ama yine de kullanıcının elinde char[] olduğunda dönüşüm yapmak zorunda kalması beni hep düşündürüyor.

Evet, şablon olunca "merhaba" gibi bir hazır değer string olarak seçiliyor. O kadarı güzel... Benim asıl sorunum, trileri.'nin Dizgi'sinin opEquals işlecini yazarken oluşmuştu. Doğal olarak, böyle bir türün her tür dizgiyle kolayca çalışmasını istedim.

Ben de opEquals'u baştan şablon olarak yazmıştım. Ama öyle yapınca türün kendi opEquals(Object) işleciyle karışıyordu. O yüzden şablon yerine, Dizi için birden fazla opEquals tanımladım. Yani opEquals'u bu türler için yükledim.

Her dizgi türü için yüklediğim için de "merhaba"nın hangisine gönderileceği bilinemedi.

Şablon çözümüne tekrar bakacağım ve neden onu bıraktığımı hatırlamaya çalışacağım.

Ne olursa olsun, "merhaba" gibi bir hazır değerin kesin bir türü olmadığını aklımızda tutalım. Başka kütüphanelerle de sonuna "merhaba"c diye yazmak gerekebilir.

Ali
canalpay (Moderatör) #4
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ı
Şöyle bir şey yapabilir miyiz :

trileri şuan kendi içinden hep dchar türü kullansın. Ama parametre olarak dchar'a çevrilebilecek değerler alsın ve trileri kendi içinde dchar'a çevirsin.

Yada direk sadece dchar kullanılsın. Nasıl phobos direk string kullanıyorsa bizde öyle yapalım. Sonuçta phobos kütüphanesi için biz zorla string'e çeviriyoruz. trileri içinde dchar'a çeviririz, çok büyük bir sorun olmaz.
acehreli (Moderatör) #5
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ı
canalpay:
trileri şuan kendi içinden hep dchar türü kullansın. Ama parametre olarak dchar'a çevrilebilecek değerler alsın ve trileri kendi içinde dchar'a çevirsin.

Evet, fikir o; ve zaten öyle çalışıyor. Sorun, hazır dizgi ile çağırınca oluşuyor.

Aslında tr.Dizgi açısından bir sorun yok. Sorun, kullanıcının sonuna c yazmasının gerekmesi: "merhaba"c.

Büyük bir sorun değil aslında. Sonuçta D, C++ olmadığı için hazır değerlerin dört farklı hedefi olabiliyor.

Yada direk sadece dchar kullanılsın. Nasıl phobos direk string kullanıyorsa bizde öyle yapalım. Sonuçta phobos kütüphanesi için biz zorla string'e çeviriyoruz. trileri içinde dchar'a çeviririz, çok büyük bir sorun olmaz.

Ona da katılıyorum. Örneğin çok standart olduğu için toString desteklenmeli; ve zaten var. Amaç, olabildiğince kullanışlı yapmak...

Bu konu üzerinde düşündükçe, aslında bir sorun olmadığını görüyorum. Bunlar, benim "merhaba"nın string olduğunu sanmamdan kaynaklanıyor. Eğer değilse, kullanıcının açıkça bildirmesinde bir sakınca olmamalı. Zaten sorun yalnızca hazır değerlerde var. Türü belirtilmiş olan değişkenlerde sorun yok.

Sorun yok; dağılın!  :-p

Ali
canalpay (Moderatör) #6
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ı
Sorun yok; dağılın!  :-p


Esas sorun şimdi başlıyor :-) Dershanede ek yapmak gerekiyor. Ayrıca "merhaba"c şeklinde yazmayıda alışkanlık etmemiz gerekiyor.

Şimdi dağılabiliriz :-p
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:
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:05 (UTC -08:00)