Forum: SDL RSS
SDL ilinti çalışmaları
Sayfa:  1  2  sonraki 
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 ilinti çalışmaları
SDL kütüphanesinin D ilintilerini kullanmaya çalışırken bir hata aldım.

Hata mesajı şu şekildeydi.

SDL_thread.d(37): C-style function pointer and pointer to array syntax is deprecated. Use 'function' to declare function pointers

Biraz araştırdıktan sonra bu şekilde değiştirdim.
    void function (void *userdata, Uint8 *stream, int len) callback;
C versiyonu:   
    //void (*callback)(void *userdata, Uint8 *stream, int len); 

Gene genelde diğerleri de bu yapıdaydı
    typedef int function (SDL_RWops *context, int offset, int whence) _seek_func_t;
C versiyonu:
    //typedef int (*_seek_func_t)(SDL_RWops *context, int offset, int whence); 

Sadece iki tane kaldı. Ama bunları çeviremedim. Bir tanesi bir yapının içinde olduğu için yapıyı da yazdım.

struct SDL_AudioCVT {
    int needed;            /* Set to 1 if conversion possible */
    Uint16 src_format;        /* Source audio format */
    Uint16 dst_format;        /* Target audio format */
    double rate_incr;        /* Rate conversion increment */
    Uint8 *buf;            /* Buffer to hold entire audio data */
    int    len;            /* Length of original audio buffer */
    int    len_cvt;            /* Length of converted audio buffer */
    int    len_mult;        /* buffer must be len*len_mult big */
    double len_ratio;     /* Given len, final size is len*len_ratio */
    void (*filters[10])(SDL_AudioCVT *cvt, Uint16 format); // <-- bunu çeviremedim
    int filter_index;        /* Current audio conversion function */
}

Yani çeviremediklerim bu ikisi.Açık olsun diye üsttekini de ayrıca yazayım.
    SDL_Thread * SDL_CreateThread(int (*fn)(void *), void *data);
    void (*filters[10])(SDL_AudioCVT *cvt, Uint16 format); // <-- bunu çeviremedim 

Bunları nasıl D'ye çevirebiliriz acaba. Umarım bu kadar uğraştıktan sonra çalışır :)
Bu mesaj 3 defa değişti; son değiştiren: erdem; zaman: 2012-08-23, 03:31.
Değişiklik nedeni: çözüldü ekledim
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ı
Bu derleniyor:

alias short Uint16;
 
struct SDL_Thread
{}
 
struct SDL_AudioCVT {
    // C gibi:     void (*filters[10])(SDL_AudioCVT *cvt, Uint16 format);
    // Anlamı: 10 tane işlev göstergesi
 
    void function(SDL_AudioCVT *cvt, Uint16 format)[10] filters;
}
 
// C gibi: SDL_Thread * SDL_CreateThread(int (*fn)(void *), void *data);
// Anlamı: "int döndüren void* alan işlev" türünde parametre
 
SDL_Thread * SDL_CreateThread(int function(void *), void *data);
 
void main()
{}

Ama daha anlaşılır olsun diye alias'tan yararlanılabilir:

alias short Uint16;
 
struct SDL_Thread
{}
 
alias void function(SDL_AudioCVT *cvt, Uint16 format) FilterFunction;
alias int function(void *) ThreadFunction;
 
struct SDL_AudioCVT {
    // C gibi:     void (*filters[10])(SDL_AudioCVT *cvt, Uint16 format);
    // Anlamı: 10 tane işlev göstergesi. Göstergelerin türü:
 
    FilterFunction[10] filters;
}
 
// C gibi: SDL_Thread * SDL_CreateThread(int (*fn)(void *), void *data);
// Anlamı: "int döndüren void* alan işlev" türünde parametre
 
SDL_Thread * SDL_CreateThread(ThreadFunction func, void *data);
 
void main()
{}

Ali
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok teşekkürler! :)

Sizin söylediğiniz değişiklikleri yaptıktan sonra derlendi. Ama şöyle bir hata çıkıyor:
SDL_version_.d(66): Error: undefined identifier bit
SDL_version_.d(66): Error: bit is used as a type
Derleyicinin yakındığı kısım şunun gibi
bit CD_INDRIVE(int status) { return status > 0; }
Ve SDL_types.d isimli bir dosyaya bakınca şu şekilde tanımlamalar var.
alias ubyte    Uint8;
alias byte    Sint8;
alias ushort    Uint16;
alias short    Sint16;
alias uint    Uint32;
alias int        Sint32;
 
alias ulong    Uint64;
alias long    Sint64;
Ve bakınca bit için böyle bir tanımlama yok. Bir şekilde uçurmuş herhalde bu ilintiyi yapan kişi  :-p
acehreli (Moderatör) #4
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ı
İşlevin ismine ve dönüş değerine bakılırsa bool olurmuş gibi geliyor:

alias bool bit;

bool başka yerlerdeki işlemlere uymuyorsa bir de ubyte'ı dene:

alias ubyte bit;

Ali
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ı
Maalesef ilk denememde böyle hatalar aldım.
deneme.o: In function `_Dmain':
deneme.d:(.text._Dmain+0x9): undefined reference to `SDL_Init'
deneme.d:(.text._Dmain+0xe): undefined reference to `SDL_Quit'
collect2: ld returned 1 exit status
--- errorlevel 1
Bu arada bit'i ubyte olarak değiştirmiştim. Ama ilk denediğim hata verince bende başka bir yerden indirip teker teker değiştirdim. Şimdi bir tane çeviremediğim C işlevi kaldı.
void SDL_qsort(void *base, size_t nmemb, size_t size,
           int (*compare)(void *, void *));
Bu arada ne kadar zormuş D'de SDL kullanmak  :-(  En çok bilinen Derelict başında Windowsçular olduğu için Linux'u pek önemsemiyormuş. Diğerleri de çok eski sanırım. Bu gidişle biraz zor alacak galiba oyun sektöründe C++'nin yerini  :huh:
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:
Maalesef ilk denememde böyle hatalar aldım.

Onlar artık bağlayıcı hataları. Kütüphaneyi yazdığın halde çıkıyorsa extern "C"leri unutmuş olabilir misin?

Şimdi bir tane çeviremediğim C işlevi kaldı.
void SDL_qsort(void *base, size_t nmemb, size_t size,
           int (*compare)(void *, void *));

Onu öncekilere bakarak yapamadıysan bu sefer açıklama gerekiyor. :)

int(void*, void*) -> iki tane void* parametre alan ve int döndüren işlev türü. C'nin yazımının garipliği nedeniyle işlev gösterge değişkenlerinin isimleri bu türün ortasına yazılır. O yüzden (*compare) ortaya yazılıyor. Anlamı: "compare, o türden bir işlev göstergesidir".

D'de işlev gösterge türleri function anahtar sözcüğü ile yazılıyor. Yani türün ismi şu:

int function(void *, void *)

D'de C'deki ortaya yazma garipliği bulunmadığı için değişken isimleri sonra yazılır:

void SDL_qsort(void *base, size_t nmemb, size_t size,
               int function(void *, void *) compare);

Ama gerçekten, alias herşeyi çok kolaylaştırır:

alias int function(void *, void *) KarşılaştırmaİşleviTürü;
 
void SDL_qsort(void *base, size_t nmemb, size_t size,
               KarşılaştırmaİşleviTürü compare)
{
    // ...
}

Örneğin şöyle bir işlevimizle çağırabiliriz:

int benimKarşılaştırmaİşlevim(void * soldaki, void * sağdaki)
{
    int sonuç;
 
    // ...
 
    return sonuç;
}
 
void main()
{
    // Bunlar bir yerden gelmiş olsun:
    void *base;
    size_t nmemb;
    size_t size;
 
    SDL_qsort(base, nmemb, size, &benimKarşılaştırmaİşlevim);
}

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:
Onlar artık bağlayıcı hataları. Kütüphaneyi yazdığın halde çıkıyorsa extern "C"leri unutmuş olabilir misin?

Aslında extern "C" ler eklenmiş. Ama örneğin C++ ile aynı programı derlerken

g++ program.cpp -o program -lSDL

şeklinde kullanılan kütüphaneyi de belirtmek gerekiyordu. Ama benim denediğimde sadece *.d uzantılı dosyalar var. Şu şekilde derlemeye çalışıyorum ama maalesef gene aynı linker hataları

$ dmd deneme.d -I/home/avni/sdl_2006_05_21/

deneme.o:(.data+0xc): undefined reference to `_D1c3sdl3sdl12__ModuleInfoZ'
deneme.o: In function `_Dmain':
deneme.d:(.text._Dmain+0x10): undefined reference to `SDL_Init'
collect2: ld returned 1 exit status
--- errorlevel 1


Sanırım bu kütüphaneyi de belirtmek gerekiyor. Örneğin /usr/lib/dkms dizininde libSDL.so gibi bir dosya var.

acehreli:
Onu öncekilere bakarak yapamadıysan bu sefer açıklama gerekiyor. :)

Açıklamalar için teşekkürler! :) Konuyu kaptım. Biraz da geç vakitlere kadar bunu yapayım diye uğraştım. Dediğiniz gibi aslında o kadar da karışık değilmiş.

Artık olmazsa DigitalMars forumlarında sorayım. D için linux altında kullanılabilen, çalışan SDL ilintisi varmıymış.
erdem (Moderatör) #8
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Sonunda oldu! :) dmd yerine gdc kullandım. Şu adresteki gönderinin de çok faydası oldu:

http://digitalmars.com/d/archives/digitalmars/D/D_Ubuntu_S…

Bu adresten D-porting isimli ilintiyi indirdim.

$ gdc -c test.d -ISDL
$ gdc -c SDL_video.d -ISDL
$ gdc -c SDL_image.d -ISDL
$ gdc -otest test.o SDL_video.o SDL_image.o -lSDL -lSDL_image
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ı
gdc'de D1'i kullanmışsın sanırım. Çünkü gdc'de d2 kullanmak için ayrı bir argüman daha veriyorduk diye hatırlıyorum. Ayrıca o kadar eski bir ilintinin D2 ile çalışması bir mucize olurdu :-D

Ama yinede D2 için çevrilebilir belki?
erdem (Moderatör) #10
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Haklısın galiba :) Çünkü diğer D2 kullanan örnekleri derlemiyor.

Sitesi burası ama ben hiç yapabileceğimi zannetmiyorum  :-O

http://www.libsdl.org

Aslında dmd'de derledi de gdc'nin bu bağlayıcı ve derleyici seçeneklerinin karşılığı ne onu bilmiyorum.
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ı
Bir de örneğin şöyle bir kodda:
    loaded_image = SDL_LoadBMP("hello.bmp");
Şu şekilde hata veriyordu:
deneme.d(30): Error: function SDL_video.SDL_LoadBMP (char* file) is not callable using argument types (string)
deneme.d(30): Error: cannot implicitly convert expression ("hello.bmp") of type string to char*

Ben de bunu şu şekilde değiştirdim. Ama bilmiyorum doğru bir yöntem mi.
        string file ="hello.bmp";
 
        char * name = cast (char*) file.ptr;
        
        loaded_image = SDL_LoadBMP(name);
acehreli (Moderatör) #12
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ı
Çok yeni d.learn'de çıktı:

  http://thread.gmane.org/gmane.comp.lang.d.learn/12305/focu…

Yöntem doğru ama aslında doğru olmamalı! :-p Çünkü C tarafı en sonda '\0' bulunan art arda karakterler bekliyor. string'in ise perde arkasında şöyle bir yapı olduğunu biliyoruz:

string Dizi
{
    immutable(char) * ptr;
    size_t length;
}

Yani o yapıyı doğrudan (char*) olarak dönüştürünce çalışmamalı diye bekleriz. En azından C tarafına .ptr gönderilmeli. Ama string'in (char*)'a dönüşümü doğru işi yapıyormuş.

Ben olsam yine de açıkça toStringz()'yi çağırırım:

  http://digitalmars.com/d/2.0/phobos/std_string.html#toStri…

Ali
erdem (Moderatör) #13
Ü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 #9
canalpay:
Ayrıca o kadar eski bir ilintinin D2 ile çalışması bir mucize olurdu :-D

Evet Can doğru söylüyor. Ama sorun SDL sürümünün çok eski olmasından kaynaklanıyormuş. O sürümü indirip derlemeyi denedim gcc ile bile derlenmedi.

erdem:
Sitesi burası ama ben hiç yapabileceğimi zannetmiyorum  :-O

http://www.libsdl.org
Aslında yapsak mı acaba. Proje olarak  :-p
acehreli:
Ben olsam yine de açıkça toStringz()'yi çağırırım:

Aslında bu yöntem benim de aklıma gelmişti. Ama hata veren dosyalar SDL'in kendi dosyaları için ve birden fazla string modülü ekleyince ne olur açıkçası bilmediğim için kararsız kaldım :)

Hala eksik parçalar anlamadığım noktalar var.

  • dmd ile kütüphane dosyalarını nasıl kullanıyoruz. Bu şekilde mi:
    $ dmd test.d -L-L/usr/lib -L-L/usr/local/lib -L-lSDL -L-ldl
  • dmd linux'un paylaşılan kütüphane dosyalarını *.so uzantılı dosyalar kullanabiliyor mu. Kullanıyorsa nasıl.
  • dmd'nin varsayılan kütüphane dosyalarını aradığı klasör nerde. Belki bu kütüphane dosyalarını oraya kopyalayarak da olabilir.
  • Önceki mesajlardan birinde Ali bey ilinti yazmaya bir örnek vermişti. Orada oluşan *.o uzantılı dosyaları (aslında bunlar C programın kaynak dosyaları) sadece başlık dosyalarını *.h uzantılı dosyaları D'ye uyumlu hale getirerek bunları D programları arasından kullanabiliyorduk. Ben SDL'in son sürümünü indirdim ve *.o uzantılı dosyalar oluştu. Şimdi başlık dosyalarını da D'ye geçirirsek bunları kullanabilirmiyiz acaba.

Ama bunlardan herhalde bir 20 kadar var :-p

Derlerken bu kadar dosyayı eklemeyi düşünemiyorum. Normalde gcc bunları *.so uzantılı paylaşılan bir kütüphane yapıyor ve örneğin -lSDL dediğimizde bu *.o uzantılı o kadar dosyanın birleşimini programa dahil edebiliyoruz. DMD'de böyle bir seçenek var mı bilmiyorum açıkçası.. Yani gcc ile oluşturulan *.so uzantılı dosyaları DMD'de kullanabiliyor mu.

Yukarda uğraştığım şeylerden bir sonuç alınmamasına şaşırmamak gerekir. Çünkü başlık dosyalarında sadece işlevlerin tanımları var. O işlevleri kullanabilmek için bir şekilde kaynak dosyalarını da programa dahil etmek gerekiyor. Yani bir şekilde kütüphane dosyalarını kullanabilmeliyiz.
acehreli (Moderatör) #14
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:
  • dmd ile kütüphane dosyalarını nasıl kullanıyoruz. Bu şekilde mi:
    $ dmd test.d -L-L/usr/lib -L-L/usr/local/lib -L-lSDL -L-ldl

Evet, doğru görünüyor. (-L seçeneğine yazılanlar bütünüyle bağlayıcıya gönderilir.)

* dmd linux'un paylaşılan kütüphane dosyalarını *.so uzantılı dosyalar kullanabiliyor mu. Kullanıyorsa nasıl.

.so'larda uyum sorunları olabilir. .a'ların çalıştığını biliyorum. Deneyelim... /usr/lib klasörüme şöyle bir baktım ve gözüme libfontconfig.* diye kütüphaneler kestirdim.

Onunla ilgili bir başlık dosyası olduğunu düşündüğüm /usr/include/fontconfig/fontconfig.h dosyasını buldum. İçini açtım, D ilintilerini yazdım ve şöyle bir programla deneyeceğimi düşündüm:

struct _FcCharSet;
alias _FcCharSet FcCharSet;
 
extern(C) {
    FcCharSet * FcCharSetCreate();
    void FcCharSetDestroy (FcCharSet *fcs);
}
 
void main()
{
    auto charSet = FcCharSetCreate();
    scope(exit) FcCharSetDestroy(charSet);
 
    // ...
}

Ne işe yaradığını bilmiyorum tabii. :) Amacım, herhangi bir C kütüphanesini D'den çağırmak. Programı oluşturdum:

$ dmd deneme.d -ofdeneme -unittest -L-lfontconfig

Bağlayıcı libfontconfig'i nereden bulduysa buldu; ve program hatasız oluşturuldu ve çalıştı:

./deneme

nm programını biliyor musun? Program kodlarının hangi sembolleri kullandıklarını gösterir. deneme programı üzerinde çağırıp 'Fc' içerenleri süzersek:

$ nm deneme | grep Fc
         U FcCharSetCreate
         U FcCharSetDestroy


Satır başlarında U, "use"dan geliyor ve deneme'nin o işlevleri kullandığını söylüyor. nm çok yararlıdır. Bunu dene lütfen: D programını extern(C) belirteci olmadan oluşturmayı dene. Bağlayıcı hata verecek. Olsun... Program oluşamadı ama deneme.o oluştu. Bu sefer deneme.o'nun hangi sembolleri kullandığına bak:

$ nm deneme.o | grep Fc
         U _D6deneme15FcCharSetCreateFZPS6deneme10_FcCharSet
         U _D6deneme16FcCharSetDestroyFPS6deneme10_FcCharSetZv


extern(C) denmediği zaman isimler işlev yükleme olanağını desteklemek için parametre türlerine göre oluşturuluyor.

nm bu konularda yararlı olur.

ldd'yi biliyor musun? O da dinamik kütüphane bağımlılıklarını gösterir. extern(C)'yi tekrar koyarak programı doğru olarak oluşturduktan sonra:

$ ldd deneme
    linux-gate.so.1 =>  (0xf7742000)
    libfontconfig.so.1 => /usr/lib32/libfontconfig.so.1 (0xf76f6000)
    librt.so.1 => /lib32/librt.so.1 (0xf76ed000)
    libpthread.so.0 => /lib32/libpthread.so.0 (0xf76d3000)
    libm.so.6 => /lib32/libm.so.6 (0xf76ad000)
    libc.so.6 => /lib32/libc.so.6 (0xf7552000)
    /lib/ld-linux.so.2 (0xf7743000)
    libfreetype.so.6 => /usr/lib32/libfreetype.so.6 (0xf74db000)
    libz.so.1 => /usr/lib32/libz.so.1 (0xf74c6000)
    libexpat.so.1 => /lib32/libexpat.so.1 (0xf749f000)


deneme'nin hangi kütüphanelere bağımlı olduğunu görüyoruz.

* dmd'nin varsayılan kütüphane dosyalarını aradığı klasör nerde. Belki bu kütüphane dosyalarını oraya kopyalayarak da olabilir.

Emin değilim ama dmd/linux/bin/dmd.conf dosyasında bir şeyler yazılı.

* Önceki mesajlardan birinde Ali bey ilinti yazmaya bir örnek vermişti. Orada oluşan *.o uzantılı dosyaları (aslında bunlar C programın kaynak dosyaları) sadece başlık dosyalarını *.h uzantılı dosyaları D'ye uyumlu hale getirerek bunları D programları arasından kullanabiliyorduk. Ben SDL'in son sürümünü indirdim ve *.o uzantılı dosyalar oluştu. Şimdi başlık dosyalarını da D'ye geçirirsek bunları kullanabilirmiyiz acaba.

Bence öyle. Ubuntu sistemimdeki rastgele bir kütüphane olan libfontconfig.so'yu kullanabildim.

Ama bunlardan herhalde bir 20 kadar var :-p

Bu işi kolaylaştırmak için şöyle bir proje var:

  http://dsource.org/projects/bcd

D2 ile ne kadar uyumlu olduğunu bilmiyorum. Yine de işe yarayabilir.

Derlerken bu kadar dosyayı eklemeyi düşünemiyorum. Normalde gcc bunları *.so uzantılı paylaşılan bir kütüphane yapıyor ve örneğin -lSDL dediğimizde bu *.o uzantılı o kadar dosyanın birleşimini programa dahil edebiliyoruz. DMD'de böyle bir seçenek var mı bilmiyorum açıkçası.. Yani gcc ile oluşturulan *.so uzantılı dosyaları DMD'de kullanabiliyor mu.

D'yi satarken "C kütüphanelerini olduğu gibi kullanabilir" diyoruz ya... ;)

Yukarda uğraştığım şeylerden bir sonuç alınmamasına şaşırmamak gerekir. Çünkü başlık dosyalarında sadece işlevlerin tanımları var. O işlevleri kullanabilmek için bir şekilde kaynak dosyalarını

.o'lara da kaynak dosya deyince işler karışabilir diye ben "program parçası" demeyi seçmiştim.

deneme.c: kaynak dosya
deneme.o: program parçası
deneme: program

da programa dahil etmek gerekiyor. Yani bir şekilde kütüphane dosyalarını kullanabilmeliyiz.

Bakınız yukarıdaki deneme... :)

Ali
Bu mesaj acehreli tarafından değiştirildi; zaman: 2011-05-08, 19:50.
erdem (Moderatör) #15
Üye Tem 2009 tarihinden beri · 939 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Onunla ilgili bir başlık dosyası olduğunu düşündüğüm /usr/include/fontconfig/fontconfig.h dosyasını buldum. İçini açtım, D ilintilerini yazdım ve şöyle bir programla deneyeceğimi düşündüm:

Çok teşekkürler! Süper açıklamalar :)

Yalnız bunu denemem biraz zaman alacak. Gene de dosyayı açtığımda ilk karşıma çıkanları sorayım.

Bu önişlemci komutlarını tamamen kaldıracağız değil mi. Bir de nedense close_code.h başlık dosyasını en sona eklemiş. Başlık dosyaları da d modüllerine dönüşecek sanırım.

#ifdef __cplusplus
extern "C" {
#endif
 
// ...
 
#ifdef __cplusplus
}
#endif
#include "close_code.h"
 
#endif /* _SDL_H */

extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags);

Buradaki DECLSPEC'leri de atıyoruz sanırım. Aşağıdakine dönüşüyor.

extern (C) void SDLCALL SDL_QuitSubSystem(Uint32 flags);

acehreli:
Onunla ilgili bir başlık dosyası olduğunu düşündüğüm /usr/include/fontconfig/fontconfig.h dosyasını buldum. İçini açtım, D ilintilerini yazdım

Aklıma ilk planda tümünü yazmak geldi :) Sonra sadece bazılarını yazdığınızı anladım.

acehreli:
ve şöyle bir programla deneyeceğimi düşündüm:

struct _FcCharSet;
alias _FcCharSet FcCharSet;
 
extern(C) {
    FcCharSet * FcCharSetCreate();
    void FcCharSetDestroy (FcCharSet *fcs);
}
 
void main()
{
    auto charSet = FcCharSetCreate();
    scope(exit) FcCharSetDestroy(charSet);
 
    // ...
}

Bunların orijinalleri de şu şekilde değil mi:

    typedef struct _FcCharSet FcCharSet;
    FcPublic FcCharSet* FcCharSetCreate (void);
    FcPublic void FcCharSetDestroy (FcCharSet *fcs);

alias'ı sizin kolaylık olsun diye tanımladığınızı anladım ama bu FcPublic'ler nereden gelmiş onu anlayamadım.
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-05-09, 12:04.
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:
Sayfa:  1  2  sonraki 
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:21:15 (UTC -07:00)