Forum: Ders Arası RSS
Karakterler Dizisi İle İlgili Hata
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ı: Karakterler Dizisi İle İlgili Hata
Kadir Can'ın yazdığı bir programda karakter dizileri ile ilgili hatalar var. İlk önce kodları görelim:
module helper;
import std.stdio;
class HtmlHelper
{
    char[] content;
    char[] head;    
    this(){
        this.content="";
        this.head="";
    }
    void htmlTags(){
        content~="<html>\n"~content~"</html\n";
    }
    void headTags(){  
        content~="<head>\n"~head~"</head>\n";
    }
    void createTitle(dchar[] title){
        head~="<title>"~title~"</title>";
    }
    void bodyPiece(){
        content~="<body>\n"~content~"</body>\n";
    }
    void header(int level,string text){
        switch(level){
        case 1: content~="<h1>"~text~"</h1>\n"; break;
        case 2: content~="<h2>"~text~"</h2>\n"; break;
        case 3: content~="<h3>"~text~"</h3>\n"; break;
        case 4: content~="<h4>"~text~"</h4>\n"; break;
        case 5: content~="<h5>"~text~"</h5>\n"; break;
        case 6: content~="<h1>"~text~"</h6>\n"; break;
        default: ;
        }
    }
    void downLine(){
        content~="<br />\n";
    }
    void paragraph(string metin){
        content~="<p>"~metin~"</p>\n";
    }
    void bolder(string metin){
        content~="<b>"~metin~"</b>\n";
    }
    void createTable(){
        content~="<table>";
    }
}
void main()
{
    HtmlHelper help=new HtmlHelper();
    help.downLine();
    help.header(1,"Merhaba");
    help.paragraph("Merhaba");
    help.bolder("Merhaba");
    help.bodyPiece();
    help.createTitle("Merhaba");
    help.head();
    help.htmlTags();
}

Hata kodu:
 
htmlHelper.d(11): Error: cannot implicitly convert expression ("") of type string to char[]
htmlHelper.d(12): Error: cannot implicitly convert expression ("") of type string to char[]
htmlHelper.d(30): Error: cannot append type dchar[] to type char[]
htmlHelper.d(89): Error: function helper.HtmlHelper.createTitle (dchar[] title) is not callable using argument types (string)
htmlHelper.d(89): Error: cannot implicitly convert expression ("Merhaba") of type string to dchar[]
htmlHelper.d(90): Error: function expected before (), not help.head of type char[]

Hatanın yanıtını alt mesajlarda arayacağız.
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ı
Hata koldarının hepsi bize türlerinin birbirine uymadığını söylüyor. Böyle hatalar alan kişiler için bunla ilgili olan şu dersleri bir daha okunmalıdır: http://ddili.org/ders/d/karakterler.html ,
http://ddili.org/ders/d/dilimler.html
ve son olarak http://ddili.org/ders/d/dizgiler.html

Hatalarımızı anlatmadan önce notlar ile başlayalım:

1)  "" genelde string yada bazen wstring ya da bazen dstring belirtir. ""c kesin string. ""w wstring ""d ise dstring olduğunu belirtir.
2) stringler kısaca char dizisininin değişmezleridir. Yani immutable'dır. char[] değişir. Eşdeğeri string değişmez. Ancak aynı biçimde karakter saklar. wchar[] değişir. Ancak wstring değişmez dchar[] içinde aynı...
3) char wchar dchar farklı türlerdir. char 8bit saklar. wchar 16 bit saklar. dchar 32 bit saklar. Doğal olarak bunlar char dizisi yani char[] ve sabit değeri tanımlandıktan sonra değişemeyen char dizisi yani string içinde geçerlidir. Ve tabiki char için olan aynı şey wchar ve dchar içinde geçerlidir.
4)Bu türler birbirine cast kullanılarak dönüştürülebilir. Örneğin dchar[] türündeki bir değişken wstring türüne çevrilmek istiyor. Bunun için şöyle bir kod yazarız:
dchar[] değişken="la la lala la la.Bahçelerde rüzgar..."d.dup
//aynı değeri wstring türündeki değişkenede yazmak istiyoruz.
wstring sabit;
sabit=cast(wstring)(değişken)//cast ile parametredeki değişkenin istediğimiz türde döndürürüz. 
5) ""c string türündeydi. Yani değişmez ve yani sabitti. Ancak biz bunu değişir olarak almak istersek sonuna .dup koyup kopyalarız.
Örnek:
dchar[] değişken="lala"d.dup//normalde "lala" string türünde.
//"lala"d dstring türünde "lala".dup char[] türünde "lala"d.dup dchar[] türünde 

Hata kodlarına dönersek ilk olarak:
htmlHelper.d(11): Error: cannot implicitly convert expression ("") of type string to char[]
diyor.
Kısaca 11.satırdaki ifade string türünden char[] türüne çevrilememiş. kod:
        this.content="";

Burada sınıftaki content değişkenine string bir değer veriyoruz. Ancak programın başında content değişkeni char[] olarak tanımlanmış:
    char[] content;
Sonraki hata.
htmlHelper.d(12): Error: cannot implicitly convert expression ("") of type string to char[]
Dediği aynı şey ancak sadece değişken ismi farklı.

Sonraki hata bu:
htmlHelper.d(30): Error: cannot append type dchar[] to type char[]
Diyorki char[] türüne dchar[] türü ekleyemezsin.

Kodlarda bunlar

    void createTitle(dchar[] title){
  
        head~="<title>"~title~"</title>";// 30.satır
 
    }

title eklemeye çalışıyoruz ancak title dchar[] türünde ancak head[] char türünde. Ekleyebilmek için ikiside aynı türde olmalıdır. Ayrıca derleyici o hatayı verince o kodda tıkanmış ancak başka bir hata daha var. "" arasında belirtilen her şey dizidir ayrıca immutable yani sabit türdedir. Ancak eklemeye çalıştığımız tür char[] bunuda düzeltmek gerekiyor.

htmlHelper.d(89): Error: function helper.HtmlHelper.createTitle (dchar[] title)
 is not callable using argument types (string)

helper.HtmlHelper.createTitle işlevi dchar[] türündeki bir parametreye sahip ancak sen string türüyle kullanmaya çağırmaya çalışıyorsun çağıramazsın diyor.

Diğer hata:
htmlHelper.d(89): Error: cannot implicitly convert expression ("Merhaba") of type string to dchar[]

89.satırda "merhaba" dchar[]'a çevrilmez diyor. "merhaba" bir string türüdür. Biz bunun yerine dchar[] kullanabiliriz. Nasıl mı? Şöyle:
("merhaba"d.dup)

Bu sefer türle ilgili değil.
htmlHelper.d(90): Error: function expected before (), not help.head of type char[]

Hatanın ne dediğini boşverin. help.head diye işlev yok. Herhalde head değişkenine erişilmek istendi. O zaman yanlış kod şu:
help.head();
Eğer o değişkene erişirsek onla ilgili bir şeyde yapmak gerekir. Yani doğrusu şu:
writeln(help.head);
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ı
canalpay:
4)Bu türler birbirine cast kullanılarak dönüştürülebilir. Örneğin dchar[] türündeki bir değişken wstring türüne çevrilmek istiyor. Bunun için şöyle bir kod yazarız:
dchar[] değişken="la la lala la la.Bahçelerde rüzgar..."d.dup
//aynı değeri wstring türündeki değişkenede yazmak istiyoruz.
wstring sabit;
sabit=cast(wstring)(değişken)//cast ile parametredeki değişkenin istediğimiz türde döndürürüz. 

cast ne yazık ki bu durumda istediğimizi yapmaz. O, her bir dchar'ı 2 wchar olarak kullandırır. Yani çoğu durumda her geçerli wchar'dan sonra bir de 0 karakteri olur.

Orada std.conv modülündeki to'yu to!wstring(değişken) diye çağırmak gerek.

Ali
Kadir Can #4
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Merhaba arkadaşlar yine aynı hatayı alıyorum.Şu koda bakabilir misiniz?

Karakter dizileri dersini tekrarlayacağım.

module helper;
import std.stdio;
import std.conv;
class HtmlHelper
{
 
    char[] content;
    char[] head;   
 
    this(){
 
        this.content=[]; 
        this.head=[];
 
    }
 
    void createCode(char[] functions ... ){
 
        foreach(i;functions){
 
            writeln(i);
 
        }
 
    }
  
    string htmlTags(){
  
        return "<html>\n"~to!string(content)~"</html>\n";
 
    }
 
    string headTags(){
        
        return "<head>\n"~to!string(head)~"</head>\n"~to!string(content);
 
    }
 
    string createTitle(const char[] title){
  
        return "<title>"~to!string(title)~"</title>\n";
 
    }
 
    string bodyPiece(){
    
        return "<body>\n"~content~"</body>\n";
 
    }
 
    string header(int level,string text){
 
        switch(level){
        case 1: return "<h1>"~text~"</h1>\n"; break;
        case 2: return "<h2>"~text~"</h2>\n"; break;
        case 3: return "<h3>"~text~"</h3>\n"; break;
        case 4: return "<h4>"~text~"</h4>\n"; break;
        case 5: return "<h5>"~text~"</h5>\n"; break;
        case 6: return "<h6>"~text~"</h6>\n"; break;
        default:;
    
        }
 
    }
 
    string downLine(){
 
        return "<br />\n";
 
    }
 
    string paragraph(string text){
 
        return "<p>"~text~"</p>\n";
 
    }
 
    string bolder(string text){
  
        return "<b>"~text~"</b>\n";
 
    }
 
    string createTable(){
 
        return "<table>";
 
    }
 
    string createLink(string address,string name){
    
        return "<a href=\""~address~"\">"~name~"</a>\n";
 
    }
 
    string createComment(string comment){
 
        return "<!--"~comment~"-->\n";
 
    }
 
    string bigger(string text){
    
        return "<big>"~text~"</big>\n";
 
    }
 
    string emphasized(string text){
 
        return "<em>"~text~"</em>\n";
 
    }
 
    string italic(string text){
 
        return "<i>"~text~"</i>\n";
 
    }
 
    string smaller(string text){
 
        return "<small>"~text~"</small>\n";
 
    }
 
    string stronger(string text){
 
        return "<strong>"~text~"</strong>\n";
 
    }
 
    string subscripted(string text){
 
        return "<sub>"~text~"</sub>\n";
 
    }
 
    string superscripted(string text){
 
        return "<sup>"~text~"</sup>\n";
 
    }
 
    string inserted(string text){
 
        return "<ins>"~text~"</ins>\n";
 
    }
 
    string deleted(string text){
 
        return "<del>"~text~"</del>\n";
 
    }
 
    string definitionTerm(string text){
 
        return "<dfn>"~text~"</dfn>\n";
 
    }
 
    string codeStyle(string text){
 
        return "<code>"~text~"</code>\n";
 
    }
 
    string keyboardText(string text){
 
        return "<kbd>"~text~"</kbd>\n";
 
    }
 
    string sample(string text){
  
        return "<samp>"~text~"</samp>\n";
 
    }
 
    string teleType(string text){
 
        return "<tt>"~text~"</tt>\n";
 
    }
 
    string variable(string text){
 
        return "<var>"~text~"</var>\n";
 
    }
 
    string preformatted(string text){
 
        return "<pre>"~text~"</pre>\n";
 
    }
 
    string abbreviated(string text,string longer){
 
        return "<abbr title="~longer~">"~text~"</abbr>\n";
 
    }
 
    string acronym(string headCharacters,string text){
 
        return "<acronym title="~text~">"~headCharacters~"</acronym>\n";
 
    }
 
    string bidirectional(int direction,string text){
 
        if(direction==0){
 
            return "<bdo dir=\"rtl\">"~text~"</bdo>\n";
 
        }else{
 
            return "<bo dir=\"ltr\">"~text~"</bdo>\n";
 
        }
    }
 
    string longQuote(string text){
 
        return "<blockquote>"~text~"</blockquote>\n";
 
    }
 
    string shortQuote(string text){
 
        return "<q>"~text~"</q>\n";
 
    }
 
    string citation(string text){
 
        return "<cite>"~text~"</cite>\n";
 
    }
 
}
 
unittest
{
    HtmlHelper help=new HtmlHelper();
    help.downLine();
    help.header(1,"Merhaba");
    help.paragraph("Merhaba");
    help.bolder("Merhaba");
    help.bigger("Merhaba");
    help.emphasized("Merhaba");
    help.italic("Merhaba");
    help.smaller("Merhaba");
    help.stronger("Merhaba");
    help.subscripted("Merhaba");
    help.superscripted("Merhaba");
    help.inserted("Merhaba");
    help.deleted("Merhaba");
    help.keyboardText("Merhaba");
    help.sample("Merhaba");
    help.teleType("Merhaba");
    help.variable("Merhaba");
    help.preformatted("Merhaba");
    help.abbreviated("Mrb","Merhaba");
    help.acronym("MD","Merhaba D");
    help.bidirectional(0,"Merhaba");
    help.longQuote("Merhaba");
    help.shortQuote("Merhaba");
    help.citation("Merhaba");
    help.bodyPiece();
    help.createTitle("Merhaba");
    help.headTags();
    help.htmlTags();
    help.createCode();
}
 
void main()
{   
    HtmlHelper help=new HtmlHelper();
    help.createCode(
        help.downLine(),
        help.header(1,"Merhaba"),
        help.paragraph("Merhaba"),
        help.bolder("Merhaba"),
        help.bigger("Merhaba"),
        help.emphasized("Merhaba"),
        help.italic("Merhaba"),
        help.smaller("Merhaba"),
        help.stronger("Merhaba"),
        help.subscripted("Merhaba"),
        help.superscripted("Merhaba"),
        help.inserted("Merhaba"),
        help.deleted("Merhaba"),
        help.keyboardText("Merhaba"),
        help.sample("Merhaba"),
        help.teleType("Merhaba"),
        help.variable("Merhaba"),
        help.preformatted("Merhaba"),
        help.abbreviated("Mrb","Merhaba"),
        help.acronym("MD","Merhaba D"),
        help.bidirectional(0,"Merhaba"),
        help.longQuote("Merhaba"),
        help.shortQuote("Merhaba"),
        help.citation("Merhaba"),
        help.bodyPiece(),
        help.createTitle("Merhaba"),
        help.headTags(),
        help.htmlTags(),
    );
 
}

Ali Bey;
Sizin dediklerinizi yapmaya çalıştım biraz.Kodum hata veriyor.

Bakabilir misiniz?
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ı
Üç hata görüyorum:

1)

    string bodyPiece(){
    
        return "<body>\n"~content~"</body>\n";
 
    }

Error: cannot implicitly convert expression ("<body>\x0a" ~ this.content ~ "</body>\x0a") of type char[] to string

char[] türündeki sonucun string'e otomatik olarak dönüştürülemediğini söylüyor. Bu mantıklı, çünkü bizi çağırana "sana karakterleri değiştirilemeyen bir dizgi veriyorum, buna güvenerek kullanabilirsin" diyoruz.

(Aslında, döndürülen sonucun bir ismi bile olmadığı için daha sonradan herhangi bir şekilde değiştirmemiz olanaksızdır. Bana biraz fazla sert bir karar geliyor ama şu anda bu semantik konuyla uğraşmak istemiyorum. :) )

En kolay çözüm, yerel bir string oluşturup onu döndürmek oluyor:

    string bodyPiece()
    {
        string sonuç = "<body>\n";
        sonuç ~= content ~ "</body>\n";
        return sonuç;
    }

Not: Bu işlev kodlama standardımıza da uydu. ;)


2)

     string header(int level,string text){
 
        switch(level){
        case 1: return "<h1>"~text~"</h1>\n"; break;
        case 2: return "<h2>"~text~"</h2>\n"; break;
        case 3: return "<h3>"~text~"</h3>\n"; break;
        case 4: return "<h4>"~text~"</h4>\n"; break;
        case 5: return "<h5>"~text~"</h5>\n"; break;
        case 6: return "<h6>"~text~"</h6>\n"; break;
        default:;
    
        }
 
    }


Warning: statement is not reachable
Warning: statement is not reachable
Warning: statement is not reachable
Warning: statement is not reachable
Warning: statement is not reachable
Warning: statement is not reachable
Error: function helper.HtmlHelper.header no return exp; or assert(0); at end of function


return dedikten sonra işlevden çıkıldığı için return'lerden sonra yazılan break'lerin anlamı yok. Altı tane uyarı onun için.

Öte yandan, default bölümüne düşüldüğünde bir return bulunmuyor. Hata da onun için.

3)

    void createCode(char[] functions ... ){
 
        foreach(i;functions){
 
            writeln(i);
 
        }
 
    }
 
/* ... */
 
    help.createCode(
        help.downLine(),                // <-- hata burada veriliyor
        help.header(1,"Merhaba"),
        help.paragraph("Merhaba"),
        help.bolder("Merhaba"),
        help.bigger("Merhaba"),
        help.emphasized("Merhaba"),
        help.italic("Merhaba"),
        help.smaller("Merhaba"),
        help.stronger("Merhaba"),
        help.subscripted("Merhaba"),
        help.superscripted("Merhaba"),
        help.inserted("Merhaba"),
        help.deleted("Merhaba"),
        help.keyboardText("Merhaba"),
        help.sample("Merhaba"),
        help.teleType("Merhaba"),
        help.variable("Merhaba"),
        help.preformatted("Merhaba"),
        help.abbreviated("Mrb","Merhaba"),
        help.acronym("MD","Merhaba D"),
        help.bidirectional(0,"Merhaba"),
        help.longQuote("Merhaba"),
        help.shortQuote("Merhaba"),
        help.citation("Merhaba"),
        help.bodyPiece(),
        help.createTitle("Merhaba"),
        help.headTags(),
        help.htmlTags(),
    );

deneme.d(28092): Error: function helper.HtmlHelper.createCode (char[] functions...) is not callable using argument types (string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string,string)
deneme.d(28092): Error: cannot implicitly convert expression (help.downLine()) of type string to char
deneme.d(28093): Error: cannot implicitly convert expression (help.header(1,"Merhaba")) of type string to char

... son hatadan çok sayıda daha ...


createCode, char[] aldığını söylediği halde ona çok sayıda string veriyoruz. Ben, parametre olan dizgilerin 'const char[]' olarak alınmalarının doğru olduğunu düşünüyorum; çünkü işlev, parametrede değişiklik yapmayacağının sözünü vermiş oluyor. Öyle olunca da hem char[] hem string gönderilebiliyor:

    void createCode(const char[][] functions ... )
    {
        foreach(i; functions) {
            writeln(i);
        }
    }

Neden iki çift köşeli parantez kullanıldığını anlıyor musun? Belirsiz sayıda parametre gönderebilmek için listenin sonuna ... yazınca parametreyi dizi olarak almak gerekiyordu ya... Orası tamam... Ama senin her parametren 'const char[]' olduğu için senin onlardan oluşan bir dizi alman gerekiyor.

Ali
Kadir Can #6
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hemen dzeltiyorum.Teşekkür ederim.
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ı
Bu arada Kadir Can buradaki hatan ile ilgisi yok ancak yinede söyleyeyim:

module helper;

Yapmışsın ancak modül adı system.helper.htmlHelper olacak. Ayrıca eğer şuan kod derlenebiliyorsa dediğim değişikliği yap ve pull request olarak gönder. Daha sonra modülü tamamlarsın.
Kadir Can #8
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu anda bazı küçük çalışma hataları var(body ve head ile ilgili.).Onları halledince pull request atacağım.

modül adını düzelteceğim.
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ı
Yanıtlanan mesaj #5
Konu adı: assumeUnique
acehreli:
    string bodyPiece(){
    
        return "<body>\n"~content~"</body>\n";
 
    }

[...]

(Aslında, döndürülen sonucun bir ismi bile olmadığı için daha sonradan herhangi bir şekilde değiştirmemiz olanaksızdır. Bana biraz fazla sert bir karar geliyor ama şu anda bu semantik konuyla uğraşmak istemiyorum. :) )

O konuyu digitalmars.D haber grubunda sordum. Başkaları da bana katılıyor. Ama derleyicinin her durumu doğru olarak çözümleyebilmesinin ve karar verebilmesinin olanaksız olduğu da kabul ediliyor.

Bu iş için std.exception modülünde assumeUnique varmış. (Neden o modülde olduğunu tahmin etmeye bile çalışmayacağım! :p) "Tek referans olduğunu var say" anlamına geliyor. Aslında basit bir tür dönüşümü yapsa da amacımızı tam olarak dile getirdiği için kullanılması öneriliyor:

import std.exception;
 
string bodyPiece() {
    char[] sonuç;
    // ... içi nasıl doldurulacaksa ...
    return assumeUnique(sonuç);
}

Aynısı eşleme tabloları için de geçerli. immutable bir eşleme tablosu döndüren bir işlev de return deyiminde assumeUnique kullanabilir.

assumeUnique .idup çağırmaktan daha iyi çünkü .idup kopyaladığı halde assumeUnique yalnızca bize güveniyor ve basit bir tür dönüşümü uyguluyor. phobos/std/exception.d dosyasındaki diziler ve eşleme tabloları için yüklemeleri şöyle:

immutable(T)[] assumeUnique(T)(ref T[] array) pure nothrow
{
    auto result = cast(immutable(T)[]) array;
    array = null;
    return result;
}
 
/* ... */
 
immutable(T[U]) assumeUnique(T, U)(ref T[U] array) pure nothrow
{
    auto result = cast(immutable(T[U])) array;
    array = null;
    return result;
}

Ali
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:
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-23, 23:11:21 (UTC -08:00)