June 17, 2010

Galiba pencere yaratılmadığından dolayı bu şekilde oluyor. En iyisi bir birleştirici yazmak.

Düzeltme : Tamam hallettim. Sorun Pencerenin boyutlandırılmaması. Ayrıca konum belirlemede kullanılan mvprintw yi yanlış kullanmışım.
Eski Hali;

int mvprintw(int x,int y,...);

Şimdiki Hali;

int mvprintw(int x,int y,const char *fmt,...);

Ali abi 3 noktayı anlatırsa iyi olur :)

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

June 17, 2010

Benim curses.d dosyam : http://paste.linux-sevenler.org/index.php?id=32352

Benim örnek.d dosyam :

import curses;
import std.stdio;
void main()
{
   writeln(getmaxy(stdscr,5));
}

Derleme komudum :dmd -w -L-lncurses örnek.d
Ve ardından çalıştırma : ./örnek

Eğer çalışmaz ve parçalama hatası verirse dmd klasörünün(dizininin) içinde D ile örnekler var. Onları derleyin. Yada en basitinden merhaba dünya programını derleyin:

import std.stdio;

void main()
{
   writeln("Merhaba dünya!");
}

Bunlarda da çalıştırır ve parçalama hatası yada benzeri bir hata alırsanız derleyiciyi tamamen bütün herşeyi ile silin ve yeniden kurun. Çalışır. Çünkü benim başıma böyle bir şey gelmişti. Sizinde başınıza gelmiş olabilir.

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

June 17, 2010

Çok teşekkürler Ali abi :) ellerine sağlık olayı anladım.

Bende ufak ufak masa çervesini çizmeye başlıyorum. Aynı anda dcurses diye birleştiriciyi çıkarmaya başlıyorum. Senin örneklerini taban alarak devam ediyorum.

kartui.d

import dcurses;
import std.stdio;

struct masaSınırBölgesi{
   int ls,rs,ts,bs,
	tl,tr,bl,br;
}
struct masaYapısı{
   int baslangicx,baslangicy;
   int yükseklik, genişlik;
   masaSınırBölgesi sınırBölgesi;
}

void main()
{

   int c;
   int row;
   int col;
   // Baştan bunu cağırmak şartmış
   initscr();
   getmaxy(stdscr,col);
   getmaxy(stdscr,row);

   // Bunların çağrılması öneriliyor
   noecho();
   cbreak();
   noecho();
   keypad(stdscr, TRUE);
   row = 5;
   col = 4;
   mvprintw(1,1,"Cikmak icin q tusuna basin");
   mvprintw(row,col,"Masa ");
   while (c != 'q') {
       c = getch();
   }

   // Temizlik
   endwin();
}
void MasayıÇiz(masaYapısı m){
   m.baslangicx = 10;
   m.baslangicy = 20;
   m.yükseklik = 30;
   m.genişlik = 40;

}

dcurses.d

module dcurses;

extern (C){

enum TRUE = 1;
enum FALSE = 0;

alias void WINDOW;

WINDOW * initscr();
int getmaxy(WINDOW *win,int y);
int getmaxx(WINDOW *win, int x);
int raw();
int cbreak();
int noecho();
int nonl();
int start_color();
int init_pair(short pair, short f, short b);
int init_color(short color, short r, short g, short b);
bool has_colors();
bool can_change_color();
int color_content(short color, short *r, short *g, short *b);
int pair_content(short pair, short *f, short *b);
int intrflush(WINDOW * win, bool bf);

// Hile: extern NCURSES_EXPORT_VAR(WINDOW *)   stdscr;
__gshared WINDOW * stdscr;
int keypad(WINDOW *win, bool bf);
int refresh();
int getch();
int printw(const char *fmt, ...);

int mvprintw(int x,int y,const char *fmt,...);
int endwin();
}

Türkçe karakter sorunu var. Onuda en sona bırakayım. Şuan çerçeveyi oluşturmaya devam ediyorum :).

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

June 17, 2010

Alıntı (Racih):

>
> int mvprintw(int x,int y,const char *fmt,...);
> ```

>
> Ali abi 3 noktayı anlatırsa iyi olur :)
>

Ben C'den gelen üç noktayı şu derste 'Belirsiz sayıda parametreler' başlığı altında bilerek eksik bırakmıştım: :)

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

_argptr kullanan yöntem hem daha zor, hem de güvensiz. C kütüphaneleriyle etkileşirken kullanmak zorundayız. Onun yerine, D'nin daha kolay kullanılan olanağını göstermiştim.

Bence bu ayrıntılar tam forumlara göre işte... :)

İngilizce belgelerde 'C-style Variadic Functions' başlığında geçiyor:

 http://www.digitalmars.com/d/2.0/function.html

Oradaki örneklerdeki gibi kullanmak riskli. Onun için std.c.stdarg modülü öneriliyor:

 http://www.digitalmars.com/d/2.0/phobos/std_c_stdarg.html

O sayfa boş olduğu için kendimiz yazmaya çalışalım...

Asıl modül dmd'nin altında şu dizinde:

 src/druntime/src/core/stdc/stdarg.d


import std.stdio;
import std.c.stdarg;

/*

  • Bu işlev, D'nin C'den aldığı 'belirsiz sayıda parametreli işlev' olanağının

  • kullanımını gösterir. (variadic function parameters).

  • Önce va_start çağrılır, parametrelere va_arg ile erişilir, en sonunda da

  • va_end çağrılır.
    /
    void printf_gibi(string düzen, ...)
    {
    /

    • Bizimle doğrudan ilgisi yok; va_ işlevleri bunu kullanacaklar
      */
      va_list parametreler;

    /*

    • Birinci parametre, bizim yukarıda tanımladığımız va_list. İkinci
    • parametre ise, '...'den önce gelen parametrenin nerede olduğunu
    • bildiriyor. Bu işlevde '...'den önce 'düzen' olduğu için onu yazıyoruz.
    • Bu işlevden çıkılırken va_end'in de çağrılması gerekir. Unutmamak için
    • onu da scope(exit) ile bildiriyoruz.
      */
      va_start(parametreler, düzen);
      scope(exit) va_end(parametreler);

    /*

    • Bu gibi işlevlerde, '...' ile gelen parametrelerin türleri

    • bilinemez. Zaten riskli olmalarının nedeni de odur. Örneğin printf'te de

    • %d yazıp float gönderilebilir ve hatalar oluşabilir.

    • Burada, düzen karakterlerine bakarak ve onlara güvenerek asıl türleri

    • kendimiz açıkça yazacağız.
      */
      foreach (sayaç, düzenKarakteri; düzen) {
      write(sayaç, ": ");

      switch (düzenKarakteri) {
      case 'i':
      /*
      * 'i' olduğuna göre bir 'int' olduğunu düşünüyoruz va va_arg!int
      * ile dönüştürüyoruz.
      */
      int sayı = va_arg!int(parametreler);
      write(sayı);
      break;

      case 'd':
      /*
      * Aynı şey, ama açıkça değişken tanımlamadım:
      */
      write(va_arg!double(parametreler));
      break;

      default:
      throw new Exception("Bilinmeyen düzen karakteri: " ~ düzenKarakteri);
      }

      writeln();
      }
      }

void main()
{
printf_gibi("idii", 42, 1.25, 7, 100);
}



O program scope(exit)'in de güzel bir örneği oldu! :) va_start kullanılmışsa, va_end'in de çağrılması gerekir. scope(exit) ile bunu garantiliyoruz. scope(exit) ve arkadaşları şurada:

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

Ali

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

Alıntı (canalpay):

>

parçalama hatası yada benzeri bir hata alırsanız derleyiciyi tamamen bütün herşeyi ile silin ve yeniden kurun. Çalışır. Çünkü benim başıma böyle bir şey gelmişti

Yeni derleyiciyle eski libphobos.a'yı karıştırınca olabilir öyle hatalar.

Eski kurma adımlarında libphobos.a'yı /usr/lib'e kopyalamak da vardı. Artık o adımı çıkarttım; çünkü gerek yok. dmd, kendisine uygun libphobos.a'yı zaten kendi alt dizinlerinde buluyor.

Ali

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

June 17, 2010

Güzel, güzel! :)

Yol yakınken gözüme çarpan bir iki şey... Bunların hiçbirisi önemli değil, ama belirli bir standart oturtmuş olmak için:

  • tür isimlerini büyük harfle başlatıyoruz: MasaYapısı

  • işlevleri küçük harfle başlatıyoruz: masayıÇiz

  • ls,rs gibi isimleri ancak tahmin edebiliyorum ama emin olamıyorum

Ayrıca daha sonradan ncurses'ün D'sini de bulmuştuk galiba; ama elle yazmak deneyim de kazandırıyordur. :D

Ufak bir şey de, MasayıÇiz aslında MasaYapısı'nın kurucusu, değil mi? O zaman belki de onun içinde olsa daha temiz olur:

struct MasaYapısı
{
   // ...

   this(int başlangıçx, int başlangıçy, int yükseklik, int genişlik)
   {
       this.başlangıçx = başlangıçx;
       this.başlangıçy = başlangıçy;
       // vs.
   }
}

Ali

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

1 2
Next ›   Last »