Forum: SDL RSS
SDL D ilintileri
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: SDL D ilintileri
SDL C kütüphanesi için yavaş da olsa ilintileri yazmaya başladım. Bu arada yanlış çevirdiğim varsa düzeltebilirseniz sevinirim.

C :
#define    SDL_INIT_TIMER        0x00000001 
D :
const Uint32 SDL_INIT_TIMER       = 0x00000001;
Bir de yardımcı olarak baktığım bu sayfada şu şekilde bir örnek vermiş.
C :
typedef struct Foo
{   int a;
    int b;
} Foo, *pFoo, *lpFoo;
D :
struct Foo
{   int a;
    int b;
}
alias Foo* pFoo, lpFoo;
Benim çevirmek istediğim örnek bu şekilde:
C :
typedef struct Foo 
{
    
}Foo;
O zaman bu şekilde mi çevirilecek acaba:
D :
struct Foo 
{
}
Bir de asıl anlamadığım içiçe geçmiş iki tane yapı var. Ve bunlardan içteki yapının parantezleri yok.
C :
typedef struct SDL_Surface {
 
    struct private_hwdata *hwdata;
} SDL_Surface;
Bu arada D öğrenmenin şöyle faydaları da var : C kültürümüz artıyor  :-D

C++ kullanırken 1 gram C bilmeye gerek yoktu.

Bu arada ilk denemem başarılı bir şekilde çalıştı :)

import std.stdio;
 
alias uint Uint32;
 
 
extern(C) 
{
    
    int SDL_Init(Uint32 flags);
    void SDL_Quit();
}
 
int main(string[] args) 
{
    SDL_Init(SDL_INIT_EVERYTHING);
    writeln("Sdl ilklendirildi");
    
    SDL_Quit();
    
    return 0;    
}
Bu mesaj 2 defa değişti; son değiştiren: erdem; zaman: 2011-05-10, 06:15.
Değişiklik nedeni: ufak değişiklik
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
const Uint32 SDL_INIT_TIMER       = 0x00000001;

Olur ama daha da uygunu immutable olur:

    immutable Uint32 SDL_INIT_TIMER       = 0x00000001;

Ve daha daha uygunu da enum:

    enum Uint32 SDL_INIT_TIMER       = 0x00000001;

enum'un bu anlamda kullanımı C'de ve C++'ta yok. Derleme zamanında bilinmesi gereken hazır değer anlamını taşıyor.

typedef struct Foo
{   int a;
    int b;
} Foo, *pFoo, *lpFoo;

Ben öyle kısaca yazılmasını hiçbir zaman anlamamışımdır. Şöyle daha açık:

struct Foo
{   int a;
    int b;
};
 
typedef struct Foo Foo;
typedef struct Foo* pFoo;
typedef struct Foo* lpFoo;

Tabii aslında önceki typedef'lerden yararlandıkça:

typedef struct Foo Foo;
typedef Foo* pFoo;
typedef pFoo lpFoo;

D :
struct Foo
{   int a;
    int b;
}
alias Foo* pFoo, lpFoo;

Doğru. Ama işte son iki alias ayrılabilir de:

alias Foo* pFoo;
alias pFoo lpFoo;

Benim çevirmek istediğim örnek bu şekilde:
C :
typedef struct Foo 
{
    
}Foo;
O zaman bu şekilde mi çevirilecek acaba:
D :
struct Foo 
{
}

Evet, bu typedef numarası yalnızca C'de gerekiyor.

Bir de asıl anlamadığım içiçe geçmiş iki tane yapı var. Ve bunlardan içteki yapının parantezleri yok.
C :
typedef struct SDL_Surface {
 
    struct private_hwdata *hwdata;
} SDL_Surface;

Onlar iç içe yapı değil. private_hwdata'ya ya typedef numaraları daha önce uygulanmamış; ya da uygulanmışsa bile uzuncu yazmışlar. hwdata bir üye ve türü 'private_hwdata yapısı göstergesi.'

Daha önce private_hwdata diye bir yapı tanımlanmışsa şöyle de yazılabilir:

// Daha once tanimlanmis olsun:
struct private_hwdata
{};
 
// Kisa ismi:
typedef struct private_hwdata private_hwdata;
 
// Simdi soyle olur:
typedef struct SDL_Surface {
 
    private_hwdata *hwdata;
} SDL_Surface;


Bu arada ilk denemem başarılı bir şekilde çalıştı :)

Harika! :)

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ı
Bu arada curl'nin ilintisi Phobosa eklendi. https://github.com/D-Programming-Language/phobos/blob/mast…

Orada htod ile çevrilip düzeltildiği yazıyor. D2 içinde uyum sağlatabiliriz

Ayrıca D2'ye ilinti yazmak için örnek proje: https://github.com/tbolsh/mysql-wrapping-for-D-programming…
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bağlantılar için teşekkürler. Kodun son durumu şu şekilde:

http://paste.pocoo.org/show/386530/
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Gene burda makrolarla değişik bir yapı tanımlamışlar.

C :
typedef struct SDL_RWops {
    // ...
    Uint32 type;
    union {
#if defined(__WIN32__) && !defined(__SYMBIAN32__)
        struct {
        int   append;
        void *h;
        struct {
            void *data;
            int size;
            int left;
        } buffer;
        } win32io;
#endif
#ifdef HAVE_STDIO_H 
        struct {
        int autoclose;
         FILE *fp;
        } stdio;
#endif
        struct {
        Uint8 *base;
         Uint8 *here;
        Uint8 *stop;
        } mem;
        struct {
        void *data1;
        } unknown;
    } hidden;
 
} SDL_RWops;

Ben windows kullanmadığım için bu makro kısmını attım :) Ama aslında her iki platformda çalışması için sanırım o kısmı kesmemek lazım. Bir de böyle  makro kullanmasındaki espriyi anlayamadım.

Ayrıca std.c.stdio olduğu için ve FILE tanımlı olduğu için o kısmı da yorum haline getirmedim.
D :
struct SDL_RWops
{
    // ...
    Uint32 type;
    union
    {
        struct
        {
            int autoclose;
            FILE * fp;
        }
        struct
        {
            Uint8 * base;
            Uint8 * here;
            Uint8 * stop;
        }
        struct
        {
            void * data1;
        }
    }
}
C :
#define SDL_LoadBMP(file)    SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1)
extern DECLSPEC SDL_Surface * SDLCALL SDL_LoadBMP_RW(SDL_RWops *src, int freesrc);
extern DECLSPEC SDL_RWops * SDLCALL SDL_RWFromFile(const char *file, const char *mode);
D :
extern(C)
{
    SDL_Surface * SDL_LoadBMP (const char * file)
    {
        return SDL_LoadBMP_RW(SDL_RWFromFile(file, "rb"), 1);
    }
    
    SDL_Surface * SDL_LoadBMP_RW(SDL_RWops * src, int freesrc);
    SDL_RWops * SDL_RWFromFile(const char * file, const char * mode);
}
Gene aynı şekilde SDL_LoadBMP işlevini makro olarak tanımlamışlar. alias olarak tanımlayabilirmiydik bilmiyorum.

Bu da çalıştı :) Ve ilginç bir şekilde daha önce örneğin şu şekilde SDL_LoadBMP işlevini çağırdığımızda bir hata verirken:

    merhaba = SDL_LoadBMP("merhaba.bmp");
Error: cannot implicitly convert expression ("hello.bmp") of type string to char*

Bu sefer vermedi. Demek ki derleyici string ile const char* arasındaki tür dönüşümünü yapabiliyor. Ya da ben öyle anladım.
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-05-13, 03:24.
Değişiklik nedeni: ek
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
Bir de böyle  makro kullanmasındaki espriyi anlayamadım.

Bunun yerine başka başlık dosyaları eklemek daha iyi bir yöntemdir. Kod içindeki işlevlerde de #ifdef'ler kullanmışlarsa dertlidir.

Ayrıca std.c.stdio olduğu için ve FILE tanımlı olduğu için o kısmı da yorum haline getirmedim.

Hem de yapıya stdio diye isim vermen de gerekmemiş:

        struct
        {
            int autoclose;
            FILE * fp;
        }

Gene aynı şekilde SDL_LoadBMP işlevini makro olarak tanımlamışlar. alias olarak tanımlayabilirmiydik bilmiyorum.

Senin yaptığın gibi, olabiliyorsa işlev olmalı zaten.

Demek ki derleyici string ile const char* arasındaki tür dönüşümünü yapabiliyor

Evet, bunu geçen gün konuştuk: toStringz'yi çağırmak gerekmiyor; D bunu otomatik olarak ve doğru şekilde yapıyor.

Ali
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Hem de yapıya stdio diye isim vermen de gerekmemiş:

        struct
        {
            int autoclose;
            FILE * fp;
        }

O zaman bu şekilde bir isim vermek daha doğru mu olurdu acaba.
        struct stdio
        {
            int autoclose;
            FILE * fp;
        }
Örneğin bu ikisi de C yapısı olsun.
        struct foo
        {
            int a;
            int b;  
        }
        struct
        {
            int a;
            int b;  
        } foo;
Bunlar aynı mı olmuş oluyor. Bir de benim elimin altında online bir C kitabı olsa çok iyi olacak galiba :) Ben bakıyorum arıyorum ama bu kadar ayrıntılı anlatan bir kaynak bulamadım.

Yardımlar için çok teşekkürler! :)

Bu arada kodun en son hali şu şekilde :

http://paste.pocoo.org/show/388108/
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
erdem:
O zaman bu şekilde bir isim vermek daha doğru mu olurdu acaba.
        struct stdio
        {
            int autoclose;
            FILE * fp;
        }

Eğer o yapı türünün ismi (stdio) daha sonradan programda kullanılmayacaksa yazmak gerekmez. O yüzden daha doğru olduğunu söyleyemeyiz.

Ama dikkat edersen SDL kodundaki stdio üye ismiydi. O gösterdiğin kodda ise stdio tür ismi olmuş. (Aşağıdaki sorudaki fark.)

Örneğin bu ikisi de C yapısı olsun.
        struct foo
        {
            int a;
            int b;  
        }

O foo isminde bir tür tanımlıyor. Daha sonradan o türden çok sayıda değişken oluşturabiliriz.

        struct
        {
            int a;
            int b;  
        } foo;

O, tür ismi belirtilmemiş olan bir yapının foo ismindeki tek değişkenini tanımlıyor.

'Anonymous union' ve 'anonymous struct' konularına bakabilirsin. D'de de var:

import std.stdio;
 
struct Değer
{
    union                        // isimsiz birlik (anonymous union)
    {
        uint hepsi;
 
        struct                   // isimsiz yapı (anonymous struct)
        {
            ubyte[4] baytları;
        }
    }
}
 
void main()
{
    auto değer = Değer(0x01020304);
    writeln(değer.hepsi);               // 'hepsi' diye üyesi varmış gibi
    writeln(değer.baytları[0]);         // 'baytları' diye üyesi varmış gibi
}

Dikkatli bakılırsa aslında Değer'in ne hepsi diye, ne de baytları diye üyeleri var. Değer'in içinde isimsiz bir birlik tanımlı. Onun içinde de isimsiz bir yapı. İsimsiz birliklerin ve yapıların üyeleri dışarıdaki türün üyeleri haline gelirler.

Ali
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
C onaltılık sabitleri nasıl yorumluyor acaba. İşaretli olarak mı işaretsiz olarak mı ? (örneğin 0x23FE) gibi bir değerimiz olsun.

Ben daha önceki konuştuklarımızdan işaretsiz olabilir diye düşündüm ama tam emin olamadım.

Bunu sormamın nedeni SDL yanında OPENGL kütüphanesi için de ilinti yazmaya başladım :)

C :
#define GL_ALL_ATTRIB_BITS          0x000FFFFF
#define GL_MODELVIEW                0x1700
#define GL_NO_ERROR                 0x0 
D :
enum uint   GL_ALL_ATTRIB_BITS = 0x000FFFFF;
enum ushort GL_MODELVIEW       = 0x1700;
enum ubyte  GL_NO_ERROR        = 0x0;

İlkönce yukardakilerin hepsinin yerine basitçe uint yazmayı düşündüm. Ama örneğin en baştaki 4 bayt, diğeri 2 bayt alttaki 4 bit. Bu yüzden yukarıdaki gibi yaptım.

En değişiği de alttaki. Anladığım kadarıyla 4 bit ama onun karşılığı olarak örneğin bool kullansak olur muydu bilmiyorum.
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4481 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
O sabitlerin kullanıldıkları taraf daha önemli. Eğer program sonuçta doğru olarak oluşturulup çalışıyorsa tamamdır.

C ve C++'ta ne tür kabul edildiklerinden emin değilim. Tür, D'de şu sayfadaki "The type of the integer is resolved as follows: " altındaki tablodaki kurallara göre belirleniyor.

  http://digitalmars.com/d/2.0/lex.html#integerliteral

Ben de "Tamsayı değerlerin türleri" başlığı altında şurada daha genel olarak tarif etmişim:

  http://ddili.org/ders/d/hazir_degerler.html

Şüpheye düşüldüğünde typeof(hazırDeğer).stringof yöntemiyle de öğrenilebilir.

Ali
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler. Görünüşe göre bu değerler typeof(değer).stringof şeklinde yazdırılınca D ile hep int yazdırılıyor.

Ama C ile bu değerlerin karşılıklarına baktığımda, D karşılıklarının fazlasıyla bu değerleri tutabildiğini gördüm.
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: SDL 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-09-25, 15:20:08 (UTC -07:00)