Forum: Ders Arası RSS
Yanlışım Nerede
Sayfa:  1  2  3  4  sonraki 
Avatar
huseyin #1
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Yanlışım Nerede
Arkadaşlar Ali Hoca nın tavsiyesi ile vtd ye yeniden bir el attım ama derlenirken derleme başarılı deneme çalıştırılınca " Segmentation fault " Return Code :139 Hatası veriyor sebebi nedir yardımcı olur musunuz ?

module vt;
import std.path;
import std.datetime;
import std.process;
import std.stream; 
import std.conv;
import std.string;
import std.file;
import std.cstream;
import std.array;
import crypt; 
 
class Database
{
    Subtable [string] database;
    
}//end of class
 
class Subtable
{
    Data [string] subtables;
}//end of class
 
class Data
{
    string[] datas;
}//end of class
 
class InOut
{
    Database dbopen(string dbname)
    {
        
        Database db;
        Data data;
        Subtable subtable;
        scope File myfile = new File(dbname,FileMode.In);
        
        string currenttable;
        string currentkey;
        string[] currentdatas;
        while(myfile.available)
        {
            char[] line_c = myfile.readLine();
            string line_s = to!(string)(line_c);
            if(line_c[0..2]=="|;")
            {
                currenttable=replace(line_s,"|;","");
            }
            else if(line_c[0..2]=="*;")
            {
                currentkey=replace(line_s,"*;","");
            }
            else
            {
                data.datas~=line_s;
                subtable.subtables[currentkey]=data;
                db.database[currenttable]=subtable;
            }
        }
        
        return db;
    }
    
}//end of class 
Huseyin
Avatar
huseyin #2
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
BU da deneme.d


import std.path;
import std.datetime;
import std.process;
import std.stdio;
import std.conv;
import std.string;
import std.file;
import std.array;
import vt;
 
 
 
void main()
{
    Database dbase = new Database;
    InOut io = new InOut;
    dbase = io.dbopen("db.vt");
    
    writeln(dbase.database);
}
Huseyin
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ı
huseyin325325:
    dbase = io.dbopen("db.vt");
    
    writeln(dbase.database);

InOut.dbopen() null döndürdüğü için 'dbase' null oluyor. O yüzden dbase.database diyemeyiz.

Ali
Avatar
huseyin #4
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
null olmasının sebebi nedir bunu nasıl giderebiliriz ?
Huseyin
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ı
dbopen() içinde db isminde bir değişken var. O değişken bir class türünde olduğu için ilk değeri null'dır. dbopen() onu olduğu gibi döndürüyor.

Burada tasarıma karar vermek gerek. main() içindeki dbase değişkeni main içinde mi new ile ilklenmeli yoksa dbopen()'ın döndürdüğü değerle mi?

Ali
Avatar
huseyin #6
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
hmm dbopen ın döndürdüğü değerle
Huseyin
acehreli (Moderatör) #7
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ı
Yani şöyle olabilir:

    Database dbopen(string dbname)
    {
        Database db = new Database;
        // ...
     }
// ...
    InOut io = new InOut;
    Database dbase = io.dbopen("db.vt");

Ali
Avatar
huseyin #8
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet anladım o sorun tamam da şimdi çıktı şu şekilde oldu

["tablo1":vt.Subtable, "tablo2":vt.Subtable]



(program exited with code: 0)
Press return to continue

Huseyin
Avatar
huseyin #9
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Deneme.d yi şu şekilde değiştirirsem  oluyor galiba :)
bunada pratik şeyler ekleyeceği değil mi

import std.path;
import std.datetime;
import std.process;
import std.stdio;
import std.conv;
import std.string;
import std.file;
import std.array;
import vt;
 
 
 
void main()
{
    
    InOut io = new InOut;
    Database dbase = io.dbopen("db.vt");
    Subtable sub = dbase.database["tablo1"];
    Data data = sub.subtables ["anahtar1"];
    writeln(dbase.database);
    writeln(sub.subtables);
    writeln(data.datas);
    
}


Çıktısı:
["tablo1":vt.Subtable, "tablo2":vt.Subtable]
["anahtar1":vt.Data, "anahtar2":vt.Data]
["veri1", "veri2", "aasd", "asas"]


(program exited with code: 0)
Press return to continue




Huseyin
Kadir Can #10
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #8
Böyle yapmak yerine hiyerarşide en altta kalan sınıfta bir toString() işlevi yazarak pratikleştirebilirsin.
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2012-07-10, 01:58.
Avatar
huseyin #11
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben sorunu çözdüm de  vt adlı moduldeki verilere eşit olması garibime gitti vt.subtable değişirse o da mı değişecek şimdi ?
Huseyin
Avatar
huseyin #12
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Böyle yapmak yerine hiyerarşide en altta kalan sınıfta bir toString() işlevi yazarak pratikleştirebilirsin.


Data sınıfında mı
Huseyin
Kadir Can #13
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #11
O sınıfların nesneleri olduğu için değerler değiştiğinde orada da değişecektir.
Değişmezlik istiyorsan immutable ile işaretleyebilirsin, dışarıdan erişimi önlemek için sarma kullanabilirsin.
Burada sanırım en alttaki sınıf(Hepsine erişim sağlayan sınıf) InOut sınıfı, toString()'i orada tanımlayabilirsin.
Avatar
huseyin #14
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
immutable ile işaretlemek değilde InOut da return db ; de dönen db yani Database sınıfının verilerinin tamamının dbase yani kendi kurduğum sınıfa aktarılmasını istiyorum yani InOut bağlantısının bitmesini istiyorum
Huseyin
Kadir Can #15
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu halde mümkün değil gibi görünüyor. Sonuçta sınıfı kurarken kullandığın için bağlantısı olacaktır.
Biraz tasarım muhabbeti her zaman iyidir. :)
Burada bir dbase için birden çok sınıf var.Eğer o sınıflar kendi işlevlerini içermeyecekse, sadece veri türlerini oluşturmak içinse tek bir sınıf altında birleştirebiliriz gibi geliyor. Eğer ileride kendi işlevleri olacaksa ayrı kalmaları daha iyi olur.
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  4  sonraki 
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-19, 04:32:25 (UTC -08:00)