Forum: Projeler dkv RSS
Deniz Uygulamasını Yazdım Ama dkvG Hata Veriyor
canalpay (Moderator) #1
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Subject: 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...
This post was edited on 2010-01-31, 09:17 by canalpay.
acehreli (Moderator) #2
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Ö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 (Moderator) #3
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #4
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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 (Moderator) #5
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #6
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
İyi haber: Uzun uzun std.cstream.dout.writefln yazınca da çalışıyor. Herhalde derlemeye çalışırken arada kendimi yanıltmışım.

Ali
canalpay (Moderator) #7
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
İ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 (Moderator) #8
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
Quote by 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 (Moderator) #9
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #10
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #11
User title: Can Alpay Çiftçi
Member since Jul 2009 · 1032 posts · Location: İzmir
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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 (Moderator) #12
User title: Ali Çehreli
Member since Jun 2009 · 1981 posts
Group memberships: Genel Moderatörler, Üyeler
Show profile · Link to this post
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
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please note the verification code from the picture into the text field next to it.
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Special characters:
Forum: Projeler dkv RSS
Not logged in. · Lost password · Register
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Current time: 2012-02-05, 10:59:43 (UTC -08:00)