May 07, 2011

Alıntı (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?

Alıntı:

>

Ş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

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

Alıntı (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.

Alıntı (erdem):

>

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

http://www.libsdl.org

Aslında yapsak mı acaba. Proje olarak :-p
Alıntı (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 (http://ddili.org/forum/thread/517) 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.

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

May 08, 2011

Çok yeni d.learn'de çıktı:

http://thread.gmane.org/gmane.comp.lang.d.learn/12305/focus=12310

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#toStringz

Ali

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

May 08, 2011

Alıntı (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.)

Alıntı:

>
  • 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.

Alıntı:

>
  • 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ı.

Alıntı:

>
  • Önceki mesajlardan birinde Ali bey ilinti yazmaya (http://ddili.org/forum/thread/517) 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.

Alıntı:

>

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.

Alıntı:

>

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... ;)

Alıntı:

>

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

Alıntı:

>

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

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

Ali

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

May 09, 2011

Alıntı (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);

Alıntı (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.

Alıntı (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 gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
May 09, 2011

Alıntı (acehreli):

>

Alıntı:

>

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.

Aslında 20 kadar *.o uzantılı dosya oluştu demek istemiştim. Ama bu da faydalı bir program. Sanırım libxml2 kütüphanesini de bağımlılık olarak istiyormuş. Tahminim D1 için ama ben gene bir kaç SDL başlığını çevirmeyi deneyeyim.

Alıntı (acehreli):

>

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

Evet haklısınız. Bazen aklıma Türkçe karşılıkları gelmiyor :)

Bu arada dediklerinizin hepsini denedim. Benim açımdan çok faydalı bir başlık olmuş oldu ;-)

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

August 23, 2012

Belki de bu başlığın ismini "SDL ilinti çalışmaları" çalışmaları şeklinde değiştirebiliriz?

Ben de elimden geldiğince, bu kütüphanenin kullanımını arttırmak için çaba sarf etmeye başladım. Gerçi SDL2 üzerine yoğunlaşmak istiyorum ama ilk sürümleri tam anlamadan zıplamak olmaz. Mesela ilintilerde ilk dikkat çeken SDL_Surface yapısı geliyor. Bakınız bu yapı (içinde 3 yapı daha var!) aslına ne büyük bir yapıymış:

struct SDL_Surface {
 uint flags;
 SDL_PixelFormat *format;//struct SDL_PixelFormat {
 int w, h;               //  ubyte BitsPerPixel;
 ushort pitch;           //  ubyte BytesPerPixel;
 void *pixels;           //  ubyte Rloss, Gloss, Bloss, Aloss;
                         //  ubyte Rshift, Gshift, Bshift, Ashift;
                         //  uint  Rmask, Gmask, Bmask, Amask;
                         //  SDL_Palette *palette;<- struct SDL_Palette {
                         //  uint  colorkey;           int ncolors; // Number of colors
                         //  ubyte alpha;              SDL_Color *colors<- struct SDL_Color {
                         //}                         }                       ubyte r; // Red intensity
                         //                                                  ubyte g; // Green intensity
                         //                                                  ubyte b; // Blue intensity
                         //                                                  ubyte unused;
                         //                                                }
 /* clipping information */
 SDL_Rect clip_rect;                     /* Read-only */
 /* Reference count -- used when freeing surface */
 int refcount;                           /* Read-mostly */

 /* This structure also contains private fields not shown here */
}

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

August 23, 2012

Belki de 4, çünkü SDL_Rect yapısı da var:
Alıntı:

>

SDL_Rect (http://www.libsdl.org/docs/html/sdlrect.html)

Name

SDL_Rect -- Defines a rectangular area

Structure Definition

> typedef struct{
>   Sint16 x, y;
>   Uint16 w, h;
> } SDL_Rect;
> ```

> **Structure Data**
>
> x, y	Position of the upper-left corner of the rectangle
> w, h	The width and height of the rectangle
>
Biz bunu BlitSurface() işlevi ile kullanıyoruz ama erişilemediği için ayrı bir tane oluşturuluyor. Maskeleme(w, h) ve taşıma (x, y) işlemleri için biçilmiş kaftan.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
1 2
Next ›   Last »