December 04, 2009

Yok sorunum dosya yazıp okurken Türkçe karakterleri yazıp okutturamamam. Daha doğrusu daha okuma işine gelemedim çünkü yazarken sorun oluşturuyor. Bomlu yazayım dediğimde ise yazarken döngüyü sonsuzlaştırmış oluyor. Belki ben yanlış yazmışımdır. Ben sadece pythonda(ve diğer bildiğim yorumlamalı dillerin) direk hatasız türkçe dosya kaydetmesine karşın -belki windows'un hatası olsa da- üzüldüm.

Onu ileride düzelteceğim. Şimdilik hedefim linux olacak. Ama programı tasarlarken iki işletim sistemine uyacak şekilde tasarlayacağım. Sonra windowsa geçip programın hatalarına bakıp hataları düzelteceğim.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

Evet uzun zaman sonra bu konuyu canlandırdım.

Sorun şu :


dmd ezberletici.d dkv/dkvG.d dkv/bilgi.d dkv/dkvB.d
ezberletici.o:(.data+0x24): undefined reference to `_D8oluştur12__ModuleInfoZ'
ezberletici.o: In function `_Dmain':
dkv/dkvB.d:(.text._Dmain+0x91): undefined reference to `_D8oluştur6girişFZv'
collect2: ld returned 1 exit status
--- errorlevel 1
make: *** [derle] Hata 1


Burdaki hatanın farkındayım. "undefined reference to `_D8oluştur12__ModuleInfoZ'" yani oluştur.d derlemek için kullanılan koda eklenmemiş. Evet çok iyi ama bu hata neden derleyiciden gelmiyorda bağlayıcıdan geliyor ?

Derleyicinin import oluştur; kod parçacığının doğru çalışması için konsol satırına gerekli şey eklemediğim için hata vermesini beklerdim. Hadi olmadı kodumda oluştur.d'de tanımlanıp ana bölümde çağrılan işlev var. Eğer oluştur.d'yi eklemediysem giriş() işlevi tanımsız olmalı. O zaman niye giriş() işlevi tanımsız diye hata vermiyor?

Bence bu bağlayıcıdan önce derleyici hata vermesi gerekir. Derleyici hata vermediği için 2 saat hata nerede diye aradım.

Sizce neden derleyici derliyorda bağlayıcı hata veriyor ? Derleyici böyle bir kodu nasıl derleyebilir ? Hiç bir şeyden haberi yok mu ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

Sanırım hata bende. Çünkü konsoldan ne türlü hata çıktısı verilirse verilirsin anlayamıyorum:

dmd ezberletici.d dkv/dkvG.d dkv/bilgi.d oluştur.d dkv/dkvB.d
oluştur.d(5): Error: non-constant expression new dkvG
make: *** [derle] Hata 1

5.satır:

auto taban = new dkvG;

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

Alıntı:

>

Acaba hiçbir işleve dahil olmadan, evrensel alanda mı yazıyorsun?

Evet. Dediğinizi yaptım ve çalıştı.

static this() ne anlama geliyor ? Daha öncede söylemiştiniz sanırım ama anlamadım.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

Alıntı (canalpay):

>

bu hata neden derleyiciden gelmiyorda bağlayıcıdan geliyor ?

Derleme, program parçalarını oluşturur. Yazım hataları olmadığı sürece, ve bir ismin ne olduğu bilindiği sürece derleme yeterlidir.

C ve C++'da derlemeyi memnun etmek için başlık dosyalarındaki bildirimler (declaration) kullanılır. Örnek:

int foo(double);

Derleyici, derlediği kod içinde bir foo çağrısı gördüğünde, onu "burada foo işlevi çağrılacak" olarak derler.

Bağlayıcı da derlenen bütün kodları bir araya getirerek programı oluşturur. Aslında bağlama, yakın bir zaman önce Walter Bright'ın forumlardan birisinde anlattığı gibi, derlenen program parçalarını (object files) uç uca eklemek kadar basit bir işlemmiş. Demek ki "burada foo işlevi çağrılacak" bilgisi ile foo işlevinin adresinin bağlanması, belki de programı başlatırken işletim sistemi tarafından hallediliyor. (Emin değilim. Belki KUTALMIS düzeltir... :))

D'de de modül dosyalarında bütün tanımların bulunmaları gerekmediğini öğrenmiştik. Şu konuda hatırlamıştık:

http://ddili.org/forum/thread/231

Tanımların el altında bulunmaları gerekmediği için, derleyici eksik tanım için şikayet edemez.

Derleyici bazı durumlarda, işlevleri çağrıldıkları yere gömebilir ("inline" olarak derleyebilir). Buna eniyileştirme seçenekleri veya kendi kafasına göre karar verebilir. Bunun nedeni, her işlev çağrısının bir bedeli olması ve özellikle küçük veya hızlı işlevlerde bu bedelin fazla kaçabileceğidir. Öyle olduğunda bağlanacak bir işlev olmadığı için bağlayıcının hatası da oluşmaz.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

Acaba hiçbir işleve dahil olmadan, evrensel alanda mı yazıyorsun? Eğer gerçekten evrensel bir değişken olmasını istiyorsan, modülün 'static this()' bloğunda ilklemek gerekir:

dkvG temp;

static this()
{
   temp = new dkvG;
}

Bir Google aramasıyla emin oldum ama asıl şüphelendiren, "non-constant expression" kısmıydı... Sabit olmayan ifadelerle ilklenmek, evrensel sabitler için bir sorundur. Onu biliyordum. Örneğin şu çalışır:

int i = 42;

Ama sağ tarafta çalışma zamanında çalışması gereken bir ifade varsa, derleme zamanında işletilemez.

Öte yandan, D'nin derleme zamanında işlev işletebilme olanağı (CTFE - compile time function evaluation) bu konuda da yardımcı olabilmeli ama ne zaman olabildiğinden emin değilim...

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 21, 2010

static this, bir modülün en başta tek kere çalıştırılacak olan ve bir anlamda o modülü ilkleyen kodlarını içeriyor. main()'in başlamasından önce işletiliyor.

Açıklaması şuradaymış:

http://www.digitalmars.com/d/2.0/class.html#StaticConstructor

ddili.org'da anlatmamışım. :( Google'da şöyle aratınca bir kaç bilgiye rastlanıyor:

"static this" site:ddili.org

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 22, 2010

Alıntı (canalpay:1271873436):

>

Evet uzun zaman sonra bu konuyu canlandırdım.

Sorun şu :


> dmd ezberletici.d dkv/dkvG.d dkv/bilgi.d dkv/dkvB.d
> ezberletici.o:(.data+0x24): undefined reference to `_D8oluştur12__ModuleInfoZ'
> ezberletici.o: In function `_Dmain':
> dkv/dkvB.d:(.text._Dmain+0x91): undefined reference to `_D8oluştur6girişFZv'
> collect2: ld returned 1 exit status
> --- errorlevel 1
> make: *** [derle] Hata 1
>
>
>

Burdaki hatanın farkındayım. "undefined reference to `_D8oluştur12__ModuleInfoZ'" yani oluştur.d derlemek için kullanılan koda eklenmemiş. Evet çok iyi ama bu hata neden derleyiciden gelmiyorda bağlayıcıdan geliyor ?

Derleyicinin import oluştur; kod parçacığının doğru çalışması için konsol satırına gerekli şey eklemediğim için hata vermesini beklerdim. Hadi olmadı kodumda oluştur.d'de tanımlanıp ana bölümde çağrılan işlev var. Eğer oluştur.d'yi eklemediysem giriş() işlevi tanımsız olmalı. O zaman niye giriş() işlevi tanımsız diye hata vermiyor?

Bence bu bağlayıcıdan önce derleyici hata vermesi gerekir. Derleyici hata vermediği için 2 saat hata nerede diye aradım.

Sizce neden derleyici derliyorda bağlayıcı hata veriyor ? Derleyici böyle bir kodu nasıl derleyebilir ? Hiç bir şeyden haberi yok mu ?

Derleyicinin görevi o değildir zaten, derleyici sadece bir modülü derler, diğer modüllerle olan ilişkisiyle ilgilenmez.
Örneğin kod içinde, aslında hiç var olmadığı halde abuzittin() diye bir fonksiyon kullanırsan, derleyici bunun diğer modüllerden birinde olduğunu varsayarak obj modülüne ekler. C de önüne _ ekleniyor normalde ama linux da eklenmediğini farkettim :) (gcc 4.3.2).

Bağlama aşamasında ise, burada kullanılan fonksiyonlar modül içerisinde aranır, eğer bulunursa, kodda yerine bu adres yazılır, bulunamazsa birlikte derlenen kütüphanelere bakılır, statik kütüphane ise, oradaki fonksiyon koda yazılır ve diğer modüllerde ilgili yerlere adresi eklenir, dinamik kütüphane ise, geçici adres yazılır, import tablosuna fonksiyon adı yazılır ve program yüklenene kadar sadece isimler vardır, asıl adresler ancak program yüklendiğinde bilinir.
Ayrıca hem statik kütüphanelerde hem de dinamik kütüphanelerde, windowsda .lib, linux da ise, .a dosyaları projeye eklenir, ama çoğunlukla bizim kullandığımız .a lar, fonksiyon içermez, sadece dinamik kütüphanelerdeki fonksiyonlar hakkında bilgi içerir. Ancak fonksiyon yine .so ya da .dll içindedir. Örneğin windows da soket fonksiyonlarını kullanmak için projeye wsock32.lib dosyasını eklememiz, soket fonksiyonlarının bu kütüphanede olduğunu göstermez. Fonskiyonlar yine wsock32.dll dedir. Amma saptırdım konuyu :)

Özetle derleyicinin undefined reference diye hata vermesi saçmadır çünkü tüm modüllerle tek tek ilgilenir, tümünü bağlayan ise bağlayıcı olduğundan mesajı vermesi gereken o.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 23, 2010

Hocam tabiki aynı zamanda arşiv dosyasılar, bunu kabul ediyorum, ancak bir statik kütüphane var bir de import kütüphanesi, ikisinin de uzantısı aynıdır ancak birisi doğrudan kod içerirken diğeri dinamik kütüphane içindeki fonksiyonlar hakkında bilgi içerir.
Bizim çoğunlukla kullandığımız ikinci yöntem, yani import kütüphaneleri, örneğin windows da bir dll oluşturulurken, yanında def dosyası ve lib dosyası da çıkar. İşte bu lib dosyası kesinlikle statik kütüphane değildir, test edilebilir.
Oluşan dll içindeki fonksiyonları kullanabilmek için bu lib ya da a dosyası projeye dahil edilir ancak program çalışmak için yine dinamik kütüphaneye ihtiyaç duyar.
Bu import kütüphaneleri windows da _MessageBoxA@16 gibi satırlar içerirler, @ karakterinin sonrası toplam parametre boyutudur.
Son olarak, herhangi bir kütüphaneyi kullanarak bir programı statik oluştur dediğinizde gerçekten statik olarak oluştuğunu test ettiniz mi?
(windows da .a lar sadece mingw de kullanılıyor)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

April 22, 2010

Alıntı (KUTALMIS):

>

ama çoğunlukla bizim kullandığımız .a lar, fonksiyon içermez, sadece dinamik kütüphanelerdeki fonksiyonlar hakkında bilgi içerir

Windows'da .a dosyaları var mı bilmiyorum ama Linux'taki .a'lar aslında arşiv (archive) dosyalarıdır. Bu dosyaları ar programı ile yönetebiliriz. Örneğin içine bakmak için t seçeneği ile:

$ ar t /usr/lib/libm.a
k_standard.o
s_lib_version.o
..
slowpow.o

nm programı da bu dosyaların hangi sembolleri tanımladığını gösterir:

$ nm /usr/lib/libm.a

Onun çıktısında başında örneğin T bulunan satırlar, o sembolün "text (code)" bölümünde tanımlı olduğunu söyler. Bir örnek:

..
w_sqrt.o:
00000000 T __sqrt
00000000 W sqrt
        U __csqrt
        U __csqrt
..

Alıntı:

>

Ancak fonksiyon yine .so ya da .dll içindedir

Benim bildiğim, o dosyalarda da vadır ama .a dosyalarında da vardır. (Yine Linux için söylüyorum.)

Alıntı:

>

Örneğin windows da soket fonksiyonlarını kullanmak için projeye wsock32.lib dosyasını eklememiz, soket fonksiyonlarının bu kütüphanede olduğunu göstermez. Fonskiyonlar yine wsock32.dll dedir.

Acaba programı "dynamic" olarak oluşturunca mı öyle olur? O söylediğin programı "static" olarak oluşturunca da geçerli mi?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]