Thread overview
alias'a değer atama
Aug 08, 2013
agora
Aug 08, 2013
Salih Dinçer
Aug 08, 2013
Salih Dinçer
Aug 08, 2013
agora
Aug 09, 2013
Salih Dinçer
Aug 09, 2013
agora
August 08, 2013

Selam, C'de Header File'da şöyle bir satır var

#define copy_rect(g,dp,src,sr) ((g)->copy_rect((g),(dp),(src),(sr)))

Bunu D'ye nasil ceviririm alias olacak sekilde?

Ben D için diger degerleri soyle yaptim bunlarda sorun yok ama usttekinde sorun var. Diger yaptiklarim bunlar

module graphapp;

import app;

alias app_activate_control activate_control;
alias app_add_button add_button;
alias app_add_check_box add_check_box;
alias app_add_control add_control;
alias app_add_drop_field add_drop_field;
alias app_add_drop_list add_drop_list;
alias app_add_field add_field;
alias app_add_image_button add_image_button;
alias app_add_image_check_box add_image_checkbox;
alias app_add_image_label add_image_label;
alias app_add_label add_label;
alias app_add_list_box add_list_box;
alias app_add_note_button add_note_button;
alias app_add_password_field add_password_field;
alias app_add_radio_button add_radio_button;
alias app_add_radio_group add_radio_group;
alias app_add_scroll_bar add_scroll_bar;
alias app_add_seperator add_seperator;
alias app_add_splitter add_splitter;
alias app_add_tab_button add_tab_button;
alias app_add_text_box add_text_box;
alias app_alloc alloc;
alias app_append_to_image_list append_to_image_list;
alias app_arm arm;
alias app_ask_file_open ask_file_open;
alias app_ask_file_save ask_file_save;
alias app_ask_ok ask_ok;
alias app_ask_ok_cancel ask_ok_cancel;
alias app_ask_string ask_string;
alias app_ask_yes_no ask_yes_no;
alias app_ask_yes_no_cancel ask_yes_no_cancel;
alias app_attach_to_control attach_to_control;
alias app_attach_to_window attach_to_window;
alias app_beep beep;
alias app_bitmap_to_image bitmap_top_image;
alias app_bring_control_to_frong bring_control_to_front;
alias app_center_rect center_rect;
alias app_change_default_font change_default_font;
alias app_change_list_box change_list_box;
alias app_change_scroll_bar change_scroll_bar;
alias app_check check;
alias app_check_menu_item check_menu_item;
alias app_clear_text clear_text;
alias app_clip_line_to_rect clip_line_to_rect;
alias app_clip_rect clip_rect;
alias app_close_file close_file;
alias app_close_folder close_folder;
alias app_rgbs_equal colors_equal;
alias app_rgbs_equal colours_equal;
alias app_copy_bits copy_bits;
alias app_copy_image copy_image;

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

August 08, 2013

İlgili başlık şurada (http://sydney.edu.au/engineering/it/~graphapp/package/src/app.h) ve içinde şöyle bir bölüm var:

Alıntı:

>
> /*
>  *  Drawing primitives (implemented as macros for speed):
>  */
>
> #define app_copy_rect(g,dp,src,sr) ((g)->copy_rect((g),(dp),(src),(sr)))
> #define app_fill_rect(g,r)         ((g)->fill_rect((g),(r)))
> #define app_draw_utf8(g,p,utf8,nb) ((g)->draw_utf8((g),(p),(utf8),(nb)))
> #define app_draw_line(g,p1,p2)     ((g)->draw_line((g),(p1),(p2)))
> ```

>
Sanırım aynı şeylerden bahsediyoruz?

Bunlar ise bir yapı içinde kullanılıyorumuş, tıpkı Ali hocamın yaptığı gibi:

struct Graphics {
GraphicsExtra * extra; /* platform-specific data */

Colour          colour;             /* current drawing colour */
long            pixval;             /* current colour index */
Font *          font;               /* current text font */
int             line_width;         /* current pixel line width */
int             text_direction;     /* current text direction */
int             xor_mode;           /* currently XOR drawing? */

App *           app;                /* if required */
Window *        win;                /* target window, or */
Bitmap *        bmap;               /* target bitmap, or */
Control *       ctrl;               /* target control, or */
Image *         img;                /* target image */

Rect            area;               /* target's drawable area */
Region *        clip;               /* clip drawing to region */
Point           offset;             /* (0,0) is actually here */

CopyRectFunc    copy_rect;          /* pointer to drawing func */
FillRectFunc    fill_rect;          /* pointer to drawing func */
DrawUTF8Func    draw_utf8;          /* pointer to drawing func */
DrawLineFunc    draw_line;          /* pointer to drawing func */

};


Peki başlarındaki ifadeler de ne ola ki?

Onlar da şurada tanımlanmış ve zannedersem tüm parçalar oturmuş oluyor:

Alıntı:
>
>
>

/*

  • Drawing operation prototypes:
    */

typedef int (*CopyRectFunc)(Graphics *g, Point dp, Graphics *src, Rect sr);
typedef int (*FillRectFunc)(Graphics *g, Rect r);
typedef int (*DrawUTF8Func)(Graphics *g, Point p, const char *utf8, int nbytes);
typedef int (*DrawLineFunc)(Graphics *g, Point p1, Point p2);

>

Başarılar...

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

August 08, 2013

Sanırım ilgili ilintileri şu hale de getirebiliriz:

/*
*  Drawing primitives (implemented as macros for speed):
*/

alias CopyRectFunc = int function (ref Graphics, Point, ref Graphics, Rect);
int function (ref Graphics, Point, ref Graphics, Rect)
            app_copy_rect = (g, dp, src, sr)
                          => g.copy_rect(g, dp, src, sr);

alias FillRectFunc = int function (ref Graphics, Rect);
int function (ref Graphics, Rect)
            app_fill_rect = (g, r)
                          => g.fill_rect(g, r);

alias DrawUTF8Func = int function (ref Graphics, Point, ref const char, int);
int function (ref Graphics, Point, ref const char, int)
            app_draw_utf8 = (g, p, utf8, nbytes)
                          => g.draw_utf8(g, p, utf8, nbytes);

alias DrawLineFunc = int function (ref Graphics, Point, Point);
int function (ref Graphics, Point, Point)
            app_draw_line = (g, p1, p2)
                          => g.draw_line(g, p1, p2);

alias'ları yukarı, yapılardan önce alıp tüm ilintiyi gözden geçiriyorum...

Bitince bir yere yüklerim inşaallah.

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

August 08, 2013

Alıntı (agora):

>

#define copy_rect(g,dp,src,sr) ((g)->copy_rect((g),(dp),(src),(sr)))

Bunu D'ye nasil ceviririm alias olacak sekilde?

C'de makro kullanmanın bir çok nedeni vardır. Bunlardan birisi, parametrelerin referans olarak geçirilemiyor olmasıdır. C++'ta makronun o kullanımına gerek yoktur. D'de ise makrolara hiç gerek yoktur. En sıkışılan durumlarda string katmaları (mixin) kullanmak gerekiyor ama ona da çok az gerek oluyor.

Önce şu C koduyla başladım:

// Yapi turunun bildirimi
struct Yapi;

// Uyesi olacak kopyalama islevinin bildirimi
typedef int (*KopyalamaIslevi)(const struct Yapi *, int, int, int);

// Yapi turu
struct Yapi
{
   // ... baska uyeler ...
   KopyalamaIslevi copy_rect;
};
// Kolaylik olsun diye takma ismi
typedef struct Yapi Yapi;

// Asil kopyalama islevi
int Yapi_kopyala(const Yapi * yapi, int dp, int src, int sr)
{
   // ...
   return 0;
}

// Yapi ilkleyen islev
int Yapi_ilkle(Yapi * yapi)
{
   // ...
   yapi->copy_rect = &Yapi_kopyala;
   return 0;
}

// Soz konusu makro
#define copy_rect(g,dp,src,sr)       ((g)->copy_rect((g),(dp),(src),(sr)))

int main()
{
   Yapi nesne;
   Yapi_ilkle(&nesne);
   copy_rect(&nesne, 1, 2, 3);
}

D'ye bire bir olarak şöyle çevrilebilir:

// Üyesi olacak kopyalama işlevinin bildirimi
alias Kopyalamaİşlevi = int function(ref const Yapı, int, int, int);

// Yapı türü
struct Yapı
{
   // ... başka üyeler ...
   Kopyalamaİşlevi copy_rect;
}

// Asıl kopyalama işlevi
int Yapı_kopyala(ref const Yapı yapı, int dp, int src, int sr)
{
   // ...
   return 0;
}

// Yapı ilkleyen işlev
int Yapı_ilkle(ref Yapı yapı)
{
   // ...
   yapı.copy_rect = &Yapı_kopyala;
   return 0;
}

// Söz konusu makronun eşdeğeri
int copy_rect(ref const Yapı yapı, int dp, int src, int sr)
{
   return yapı.copy_rect(yapı, dp, src, sr);
}

void main()
{
   Yapı nesne;
   Yapı_ilkle(nesne);
   copy_rect(nesne, 1, 2, 3);
}

Ancak, D'de üye işlevler de olduğu için bire bir çevirmek yerine yapının D karşılığının normal üye işlevleri olur:

struct Yapı
{
   void copy_rect(int dp, int src, int sr)
   {
       // ...
   }

   // ... başka üyeler ...
}

void main()
{
   auto nesne = Yapı();
   nesne.copy_rect(1, 2, 3);
}

Tabii biraz fazla ileri gitmiş olabilirim. C kodunu D'ye bire bir çeviriyor olabilirsin. O zaman özet: O makronun karşılığı, birinci parametresi ref olan normal bir işlevdir.

Ali

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

August 09, 2013

Sagolun Ali ve Salih hocam. Belki bu ilintileri halledip gui araci olusturabiliriz :)

Duzenleme:

Ben simdi yukaridaki kisimlarda esittir(=) koymadim alias'in ilk degerlerinde. Onlara da esittir koymam gerekecek degil mi?

Diger duzenleme:

Evet olmasi gerekiyormus takma isim oldugundan dolayi. Umarim bu graphapp'i D diline tasiyabilirim :)

Bir baska duzenleme daha:

Soyle bir yardim buldum

dmc -c graphapp.h -e -l

bu .h dosyalarini D modulune ceviriyormus. sadece ifndef gibi onislemci bilgilerini silmemizi istiyor cikan lst uzantili dosya'ya baktim da daha kolay degil mi bu yontem? bir kotu yani vs. yok sanirim?

http://dlang.org/htomodule.html

Bu editler uzuyor:

yuksek boyutlu dosyalarda satir sayisindan bahsediyorum cevirme islemi yapamiyor galiba bazi ifade hatalari veriyor ";,." gibi.

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

August 09, 2013

Evet, bende de hatalar verdi. Örneğin FILE * ifadesinin olduğu yerdeki yıldızda...:)

Bir de çift yıldızlar var. Bunları ben, örneğin: ref Graphics * g şeklinde yaptım. Bilmem doğru mu?

Son hali şurada (http://goo.gl/0fkhI0) ve henüz 1020. satırdayım. Birazcık sıkıldım...:(

Düzenlemeye açık, isteyen herkes devam edebilir...

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

August 09, 2013

Hocam elinize saglik ben buradakileri aldim. Eger butun bilesenleri vs. uyarlayabilirsek belki D icin de bir arayuz eklentisi daha olmus olur :)

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