Forum: Duyurular RSS
GameDev - Binding D to C Part Four
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: GameDev - Binding D to C Part Four
Merhaba,

Dlang'ın Twitter'ında bir duyuru gördüm ve nakletmek istedim. Hani derler ya "Kelin ilacı olsa başına sürerdi". Evet bu kelalaka bir söz oldu, n'apayım aklıma tek bu geldi. Uygun bir söz bulursanız lütfen renklendirin çünkü tam da bana lazım olan bir makale:

İlk üç bölüm: http://www.gamedev.net/blog/1140/entry-2254003-binding-d-t…
Dördüncü bölüm: http://www.gamedev.net/blog/1140/entry-2254910-binding-d-t…

Hah buldum, "Kör istemiş bir göz, Allah vermiş iki göz!" Yukarıda ise dört göz var...:)

Bu arada makalenin üçüncü parçasından dördüncüsüne doğru bağlantı verilmemiş. O yüzden bir yere kayıt edecekseniz her iki adres de önemli; son bölüme ulaşamayabilirsiniz. Şimdi birinin bu hatayı yazara duyurması lazım ya...

Aslında bizim bu makaleye benzer bir şey yazmamız lazım. Şimdi Türkçe'ye çevirmeye kim uğraşacak...:)

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
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ı
Teşekkür; çok güzel bilgiler.

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Daha önce paylaşmıştım  :-D

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

Evet ben de o şekilde düşünüyorum. Birebir çeviri yapmak yerine o makalede anlatılanları özümseyip biz bir makale yazabiliriz.
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Derelict'in programcısı olduğunu bilmiyordum

Ama benim paylaştığım 4. parça ki bu yeni bir haber...:)

İlinti hazırlamada uzmanlaşmış olduğu belli ki yazı dizisi bu konu üzerine. Şöyle bir tekniğini incelemeye niyetlendim de kafam karıştı! Bakınız, benim extern(C) olarak geçtiğim ilintiyi, herhalde hafızayı daha iyi kullanabilmek adına nasıl yapmış:
(Bu arada export ... ile align(16) struct gibi şeyler gördüm!)
class DerelictSDL2Loader : SharedLibLoader
{
    protected
    {
        override void loadSymbols()
        {
            bindFunc(cast(void**)&SDL_Init, "SDL_Init");
    :    :    :
Yukarıda ilk dikkat çeken bindFunc() işlevi. Şimdi bir dedektif gibi iz sürelim. Ayrıca sınıfı destructor'ünde DerelictSDL2.unload(); şeklinde çağrılan bir işlev de olduğunu belirtmeliyim!

1. İlk olarak derelict.util.loader'a gidiyorum ve oradaki SharedLibLoader sınıfını görüyorum:
class SharedLibLoader
{
public:
    this(string libNames)
    {
        _lib = new SharedLib();
        _libNames = libNames;
    }
    :    :    :
Ama dikkat, burası sadece bir sıçrama tahtası! Çünkü asıl işi yapan _lib isimli nesne üzerinden SharedLib sınıfı olmalı. Yukarıdaki satırların hemen altında da üç tane aynı isimde load() üyesi var. Tabi peşine düştüğüm bindFunc() işlevi orada ama bütün iş burada değil. Sanırım burada tablo (libNames) küçük parçalara bölünerek aşamalı bir yükleme yapılıyor. Devam edelim...

2. Şimdi ise derelict.util.sharedlib'e ışınlanıyoruz ve 47. satırda extern(C)'mi görüyorum...:)
final class SharedLib
{
    public
    {
 
    :    :    :
 
        void load(string[] names)
        {
            if(isLoaded)
                return;
 
            string[] failedLibs;
            string[] reasons;
 
            foreach(n; names)
            {
                _hlib = LoadSharedLib(n);
                if(_hlib !is null)
                {
                    _name = n;
                    break;
                }
 
                failedLibs ~= n;
                reasons ~= GetErrorStr();
            }
 
            if(!isLoaded)
            {
                SharedLibLoadException.throwNew(failedLibs, reasons);
            }
        }
    :    :    :
Burada da dikkat çeken yüklenip yüklenmediğini denetlemesi ve hata atması. Sanki bütün mevzu buradaymış gibi ama tüm kodu incelerseniz değil. Bu da bir sıçrama tahtası sayılır ve asıl işi dopen() ile dlclose() işlevleri yapıyor. Peki bunlar nerede...:)

3. Hatırlarsanız bundan önceki adımda 47. satırdan bahsetmiştim. İşte o bölümde şu yazıyor:
 /* From <dlfcn.h>
  * See http://www.opengroup.org/onlinepubs/007908799/xsh/dlsym.html
  */
            const int RTLD_NOW = 2;
 
            void *dlopen(const(char)* file, int mode);
            int dlclose(void* handle);
            void *dlsym(void* handle, const(char*) name);
            const(char)* dlerror();
Meğer extern(C) yukarıda bahsettiğim iki işlevi çağırıyormuş. Bu işlevler ise kütüphanenin içindeki işlevi arayıp buluyor ve zannedersem adresini (getSymbol) geri döndürüyor...

Benden bu kadar! Sürebildiğim iz bu ki bana fazla geliyor. Hep diyorum ya basit şeyleri seviyorum. İşin içine bir çok sınıf girince ürkütüyor. Sanırım bu huyumdan vazgeçmeliyim çünkü yazılım sektörü böyle...:)

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2012-08-11, 14:02.
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: Duyurular 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, 00:48:35 (UTC -08:00)