Forum: Projeler dkv RSS
Deniz Uygulamasını Yazdım Ama dkvG Hata Veriyor
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ı: Deniz Uygulamasını Yazdım Ama dkvG Hata Veriyor
Deniz(dkvG'deki parametreleri daha kolay tanımlatan uygulama) adında bir uygulama yazdım.
Kodlarını şu anda buradan ulaşabilirsiniz : http://www.ozgurlukicin.com/yapistir/395/

Eğer DkvG'nin kodlarına bakmak isterseniz svn'deki ile aynı(Hatta belki değiştirmişimdir diye kopyala-yapıştır yaptım.).

Şöle bir hata veriyor :dkvG.d(185):
Error: undefined identifier package std.cstream
dkvG.d(185): Error: no property 'dout' for type 'void'
Error: no property 'writefln' for type 'int'
dmd: mtype.c:3882: StructDeclaration* TypeAArray::getImpl(): Assertion `impl' failed.
İptal edildi

Dmd 2.039 kullanıyorum.(şimdi 2.040'ı denedim ve yine hatalı

Sanırım derleyici ile ilgili bir sorun. Çünkü başka zamanlarda da böyle şeyler oluyor.

Söylememe gerek var mı bilmiyorum ama dkvG normalde çalışıyor...
Bu mesaj canalpay tarafından değiştirildi; zaman: 2010-01-31, 09:17.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Öncelikle, haklısın tabii ki. Hiç olmazsa daha anlaşılır mesajlar olmalıydı... :)

- deniz.d olarak dkvG klasörüne kaydettim

- Derleme satırı olarak şunu kullandım:

dmd deniz.d dkvG.d

Şu değişikliklerle derleyebildim:

1) Sınıf tanımının içinde auto taban = new dkvG; gibi bir ifade kullanamayız. Aslında kullanabildiğimiz durumlar da var ama orayı normal kod alanı gibi kullanmak doğru değil. En azından auto'nun orada çalışmasını beklemem.

class Deniz
{
    dkvG taban;

2) O değişkeni ilklemek için kurucu işlevi kullandım:

    this()
    {
        taban=new dkvG;
    }

3) dkvG.d dout'u kullandığı halde onun modülünü eklemiyordu:

import std.cstream;

4) Her ne kadar çalışır diye düşünsem de, uzunca std.cstream.dout.writefln olarak yazdığın satırı kısalttım:

        dout.writefln([vTAdı][tAdı][veriAdı].length);

5) deneme.d'yi kullanmak yerine, kendim deniz.d'nin sonuna bir main ekledim. Tabii ki normalde orada olmaması gerekir:

void main()
{}

Derlendi... :)

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ı
Teşekkürler, çalıştı.

Şimdi bunla ilgili sorularım var :-)

1.Sanırım auto çalışmaz dediniz. Sorun değil ama ne için çalışmaz merak ettim :-)

2. Neden import std.cstream; demek zorunda kalıyoruz. Neden std.cstream.dout.writefln() diyemiyoruz ? Bazen diyebiliyoruz bazen diyemiyoruz, neye göre diyebildiğimizi anlamadım.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
1.Sanırım auto çalışmaz dediniz. Sorun değil ama ne için çalışmaz merak ettim :-)

Ben C++'dan geldiğim için, öncelikle o mantıkla düşünüyorum: sınıf tanımlarında, o sınıfı oluşturan üyeler bildirilir. Ek olarak, bu sınıfın üye işlevleri olur.

Yanı sınıfın tanımı, kod değildir.

<not>
C türevi olan hiç de yaygın olmayan (deneysel?) bir dilin tanıtımına katılmıştım. Şu listede "C3 - The C Class Concurrent Programming Language" başlığına tıklayınca slaytları geliyor:

  http://accu.org/index.php/accu_branches/accu_usa/past

İlginç bir şekilde, orada yapıların içine kod yerleştirilebiliyordu; ve aynen senin yaptığın gibi, o kodlar yapı nesnelerinin kurulmalarını sağlıyordu. Yani sınıf bloğu içindeki kodlar kurucu kodlar oluyordu.
</not>

Sınıfın türünden olan nesneleri oluşturmak ise kurucu işlevin görevidir. Aynı mantığın D için de sürdüğünü düşünüyorum.

Asıl neden şu olabilir: Kabul edilse, daha önce yazdığın new dkvG hangi an çalıştırılır? Sınıfın tanımı derleme zamanında bir kere okunur ve derlenir. Ama o new dkvG ifadesinin çalışması için çalışma zamanından bir ana gerek var.

İşte o an, bir nesne oluşma anıdır.

Evet, sanırım sen sınıfın tanımlandığı bloğu kurucu kodları olarak düşündün. Ama o zaman da kurucuya parametre verme olanağımız bulunmazdı.

Sonuçta: sınıf, üyelerini tanımlar ve kurucu işlev(ler) de nesnelerini kurarlar.

2. Neden import std.cstream; demek zorunda kalıyoruz.

dout nesnesi onun içinde tanımlandığı için.

Neden std.cstream.dout.writefln() diyemiyoruz ? Bazen diyebiliyoruz bazen diyemiyoruz, neye göre diyebildiğimizi anlamadım.

Bunu ben de anlamadım. En azından başına nokta koyarak çalışmalıydı: .std.cstream.dout.writefln. Böylece evrensel isim alanındakinden bahsettiğimiz anlaşılırdı. Ama bu fikirleri C++'dan taşıyorum. D'nin modül ve paket kavramları tam denk değil.

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ı
Teşekkürler anladım ve accu'ya bakıyorum.

Evet benim gibi sizde std.cstream.dout.writefln(); yazısının neden çalışmadığını anlamamışsınız. Tanımlamamda hata olduğunuda sanmıyorum.(Çünkü böyle tanımlamayı phobos kütüphanesinin kodlarına bakarak öğrendim :-) )

Şuan bu konu ile ilgili bir ilgisi olmayan bir konuya geçeceğim. Şuan derlediğim bütün D programları çalıştırırken parçalama hatası veriyor. Nedenini anlayabilmiş değilim.
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
İyi haber: Uzun uzun std.cstream.dout.writefln yazınca da çalışıyor. Herhalde derlemeye çalışırken arada kendimi yanıltmışım.

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ı
İyi haber: Uzun uzun std.cstream.dout.writefln yazınca da çalışıyor. Herhalde derlemeye çalışırken arada kendimi yanıltmışım.

Hayır kendinizi yanıltmadınız bu her zaman olan bir sorun, d forumuna sormak gerekiyor.

Bende de bazen sorun olurken bazen olmuyor. Örneğin sizin dediğiniz gibi import etmeden denedim sorun yine oldu. Zaten dmd hata mesajı olarakta veriyor.

Ama benim şuan ki sorunum çok daha büyük ve önemli.

Kodlar derleniyor ama şöyle bir hata veriyor:
Parçalama arızası

Bu sadece bu projele özgü değil. Daha önce çalışan romen rakamı ile ilgili olan uygulamada da bu hata var.

Ama dmd'nin içinde bulunan hello dosyasında böyle bir sorun yok. Çok şaşırmış bir durumdayım.
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
İyi haber: Uzun uzun std.cstream.dout.writefln yazınca da çalışıyor. Herhalde derlemeye çalışırken arada kendimi yanıltmışım.

Hayır kendinizi yanıltmadınız bu her zaman olan bir sorun, d forumuna sormak gerekiyor.

import cstream; satırını kaldırınca bu konunun ilk mesajında gösterdiğin hataları alıyorum. Ekleyince sorun yok.

Bende de bazen sorun olurken bazen olmuyor. Örneğin sizin dediğiniz gibi import etmeden denedim sorun yine oldu.

O normal; çünkü o isimleri kullanabilmek için, onları bildiren modülü eklememiz gerekir.

Kodlar derleniyor ama şöyle bir hata veriyor:
Parçalama arızası

Bunu kıstırmamız gerek. Hangi kodla ilgili olduğunu belirleyebiliyor musun? Bazen olup bazen olmamak, genellikle kendi kodumuzdaki hatalardan oluşur. Yani çalışıyor gibi görünse bile, tesadüfen öyle olabilir.

Ama dmd'nin hatası olması da çok mümkün. Forumda sormak için biraz daha kanıta ihtiyaç var. Örneğin dkv'nin deneme programı çalışırken mi oluyor?

Bu sadece bu projele özgü değil. Daha önce çalışan romen rakamı ile ilgili olan uygulamada da bu hata var.

Yeni dmd'yi kurduğun zaman yeni derleyicinin kütüphane dosyasını da /usr/lib'e kopyaladığını varsayıyorum...

Romen rakamı programında ne yapınca oluyor?

Ali
canalpay (Moderatör) #9
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ı
Ama dmd'nin hatası olması da çok mümkün. Forumda sormak için biraz daha kanıta ihtiyaç var. Örneğin dkv'nin deneme programı çalışırken mi oluyor?


Foruma import olayını soralım dedim. Çünkü import std.cstream; dout.writefln() deyince olmasına karşın std.cstream.dout.writefln() deyince hata veriyor. Ama phobos kütüphanesinde böyle bir kullanım var. Neye göre hatalı neye göre değil öğrenebilmek için. Ama şimdiki meselemiz bu değil.


Parçalama Hatası:


samples dizininin d dizindeki hello.d uygulamasını çalıştırıyor. Ama wc wc2 uygulamalarını çalıştırmıyor.

wc için yaptıklarım: 
canalpay@canalpay-pardus d $ dmd wc.d
canalpay@canalpay-pardus d $ ./wc
Parçalama arızası

wc2 için yaptıklarım:
canalpay@canalpay-pardus d $ dmd wc2.d
canalpay@canalpay-pardus d $ ./wc2
Parçalama arızası


hello.d dosyasını çalıştırıyor.


Kendi yazdığım deneme.d adlı dosya :
import std.stdio;
void main(){
 
    writeln("Merhaba dünya");
 
}

Çalıştırmaya çalıştığımda oluşan hata:
canalpay@canalpay-pardus d $ dmd deneme.d
canalpay@canalpay-pardus d $ ./deneme
Parçalama arızası


Umarım yeterince açıklayıcı olmuşumdur. Ve sanıyorum ki sorun derleyicide değil: İşletim sistemimde: Yoksa aynı hata sizde de olurdu ve zaten dmd 2.040'ı kurduktan sonra Deniz uygulamasını çalıştırabilmiştim. Ama şuan böyle bir sorun oldu.
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bir önceki sürümün phobos kütüphanesiyle bağlayınca ben de aynı hatayı alıyorum:

$ dmd deneme.d ~/dmd2.039/linux/lib/libphobos2.a
$ ./deneme
Segmentation fault

Kullandığım dmd 2.040 olduğu halde, özellikle 2.039'un kütüphanesiyle bağladığımda parçalama hatası aldım.

2.040'ın kütüphanesini /usr/lib'e kopyaladın mı?

Ali
canalpay (Moderatör) #11
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ı
Evet dediğiniz doğruymuş. Ben konsol ile halletmeye çalışıyordum. Daha önceki sürümden libphobos kaldığı için bana soru soruyordu. Bende rw yazıp enter'a bastım. Ama üzerine tekrar yazmamış. Şimdi gui aracılıyla kopyaladım ve çalıştı.Teşekkürler,

Sizi yorduğum için üzgünüm.
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4538 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Rica ederim... Başından beri söylediğim gibi, birlikte öğreniyoruz... :)

Bu parçalama hatasının nedeni, bazı sınıfların ve yapıların üyelerinin değişmiş olması.

Örneğin yeni programı derlerken şöyle bir yapı kullanılıyor olsun:

struct BirPhobosYapısı
{
    int birÜye;
    double başkaÜye;
    char buSürümdeEklenenÜye;
}

Bizim yeni programın modülü, doğal olarak o yapı içindeki yeni üyeye de erişiyordur. (Bu sürümde eklendiğine göre bir işe yarıyor olmalı.)

Eski kütüphane dosyası bu yapının eski bir tanımını içerir:

struct BirPhobosYapısı
{
    int birÜye;
    double başkaÜye;
}

ve bizim yeni programın buSürümdeEklenenÜye'ye yaptığını sandığı erişim, eski kütüphanede bu yapı nesnesinin dışına erişmiş olur. Artık ondan sonra ne olacağı bilinemez. Çünkü örneğin buSürümdeEklenenÜye bir gösterge olsa, onun gösterdiğini sandığımız belleğe erişmeye çalışılır ve parçalama hatası alınır.

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: Projeler dkv 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-12-16, 16:28:56 (UTC -08:00)