Jump to page: 1 2
Thread overview
SDL ilinti çalışmaları
May 07, 2011
erdem
May 07, 2011
erdem
May 07, 2011
erdem
May 08, 2011
erdem
May 08, 2011
erdem
May 08, 2011
erdem
May 08, 2011
erdem
May 08, 2011
erdem
May 09, 2011
erdem
May 09, 2011
erdem
Aug 22, 2012
Salih Dinçer
Aug 22, 2012
Salih Dinçer
May 07, 2011

SDL kütüphanesinin D ilintilerini kullanmaya çalışırken bir hata aldım.

Hata mesajı şu şekildeydi.

Alıntı:

>

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

May 07, 2011

Çok teşekkürler! :)

Sizin söylediğiniz değişiklikleri yaptıktan sonra derlendi. Ama şöyle bir hata çıkıyor:Alıntı:

>

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

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

May 07, 2011

Maalesef ilk denememde böyle hatalar aldım.
Alıntı:

>

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:

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

May 07, 2011

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

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

May 07, 2011

İş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

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

May 08, 2011

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

Alıntı:

>

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.

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

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

May 08, 2011

Sonunda oldu! :) 'dmd' yerine 'gdc' kullandım. Şu adresteki gönderinin de çok faydası oldu:

http://digitalmars.com/d/archives/digitalmars/D/D_Ubuntu_SDL_image_said_undefined_reference_104169.html

Bu adresten D-porting (http://shinh.skr.jp/d/porting.html) 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
'

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

May 08, 2011

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?

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

May 08, 2011

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.

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

May 08, 2011

Bir de örneğin şöyle bir kodda:

   loaded_image = SDL_LoadBMP("hello.bmp");

Şu şekilde hata veriyordu:
Alıntı:

>

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

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

« First   ‹ Prev
1 2