Thread overview
Terminalde basılan tuşları algılamak
Mar 21, 2011
erdem
March 22, 2011

Alıntı (acehreli):

>
> import std.stdio : writef, writeln;
> ```

>

Aslında bu çok kullanışlı bir özellikmiş. Yani sadece ihtiyacımız olan modülün parçalarını ekleyebilmek. O zaman dosyalar dersinde bahsettiğiniz, bir dosyaya File nesnesi eklediğimizde derleyici bunun bir '**std.stdio.File**' mi yoksa '**std.stream.File** ' mı olduğunu anlayamıyordu. . O zaman bu kullanım ile uzun uzun yazma derdi de ortadan kalkıyor yanlış anlamadıysam.

Bir de acaba tüm bu eklenen modüller dilin kendi olanağı mı acaba? Geçenlerde forumlarda birisi *'konsolda örneğin kullanıcı şifre olarak 1234 girdiğinde bunu **** şekline nasıl çevirebiliriz?' *diye soruyordu.  Bu o sorunun da cevabı olmuş oldu  :-)

Ben D için pek yorum yapamadım açıkçası ama ilk planda standart C++ ile bu yapılamaz gibi geldi (başka kütüphaneler olanaklar kullanmadan)

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

D'de de C ve C++'ta olmadığı gibi klavye kavramı yoktur. Standart giriş karakter akımı olarak gelir ve çoğu konsolda karakterler Enter'a basılana kadar programa görünmezler.

Klavyenin bulunduğu ortamlarda basılan tuşu algılamanın yolunu öğrendim ve Türkçeleştirdim.

Bu programı bir Linux konsolunda başlatırsanız bastığınız tuşların onaltılı değerlerini yazıyor. Ctrl-F10 gibi bazı tuş bileşimlerinde de birden fazla kod görünüyor.

Sonlandırmak için Ctrl-D'ye basın.

import std.stdio : writef, writeln;
import std.c.stdio;
import std.c.linux.termios;

/*
* Verilen termios yapısını yalın (raw) hale getiren
* işlev. (Nedense bunun bildirimi yukarıdaki modüllerde
* bulunmuyor; onun için kendimiz bildiriyoruz. (?))
*/
extern(C) void cfmakeraw(termios *termios_p);

void main()
{
   /*
    * tty durumunun eski halini kaydediyoruz ve programdan
    * çıkıldığında eski haline çevrilmesini scope (exit) ile
    * garantiliyoruz.
    */
   termios eskiDurum;
   tcgetattr(1, &eskiDurum);
   scope (exit) tcsetattr(1, TCSADRAIN, &eskiDurum);

   /*
    * Yeni durumunu yalın (raw) moda çevir
    */
   termios  yeniDurum;
   tcgetattr(1, &yeniDurum);
   cfmakeraw(&yeniDurum);

   /*
    * Bu terminalde bu yeni durumu kullan
    */
   tcsetattr(1, TCSADRAIN, &yeniDurum);

   /*
    * Şimdi bu yalın moddayken karakterler okuyacağız
    */

   /*
    * Linux'ta Ctrl-D'nin karşılığı (Windows'da Ctrl-Z)
    */
   immutable akımSonu = '\4';

   char karakter;
   while (karakter != akımSonu) {
       karakter = cast(char)fgetc(stdin);
       writef("%x ", karakter);
   }

   writeln();
}

Ali

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

March 22, 2011

Alıntı (erdem):

>

Bir de acaba tüm bu eklenen modüller dilin kendi olanağı mı acaba? Geçenlerde forumlarda birisi 'konsolda örneğin kullanıcı şifre olarak 1234 girdiğinde bunu **** şekline nasıl çevirebiliriz?' diye soruyordu. Bu o sorunun da cevabı olmuş oldu :-)

Bende bilmeden konuşuyorum ancak bence bu da writeln gibi bir dil olanağı değil. Bir çalışma zamanı(runtime) kütüphane olanağı.

Alıntı:

>

Ben D için pek yorum yapamadım açıkçası ama ilk planda standart C++ ile bu yapılamaz gibi geldi (başka kütüphaneler olanaklar kullanmadan)

writeln niteliğinde bir işlev yazılamıyorsa o da yazılamaz bence.

Alıntı:

>

O zaman dosyalar dersinde bahsettiğiniz, bir dosyaya File nesnesi eklediğimizde derleyici bunun bir std.stdio.File mi yoksa std.stream.File mı olduğunu anlayamıyordu. . O zaman bu kullanım ile uzun uzun yazma derdi de ortadan kalkıyor yanlış anlamadıysam.

stream.File kullanmak istersek ve stdiodan sayılı işlev çağırmak istersek evet. Yalnız std.stream file yapısını çağırırsak parametre olarak stream'de tanımlanmış olan enum türünde bir değişken alıyor. Onuda belirtmek gerekiyor.

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

March 22, 2011

Bu dillerde klavye olmadığı için konsol veya terminal diye kavramlar da olamıyor. Bir POSIX.1-2001 ortamındaysak bunları kullanabiliriz. Eğer programı böyle yazmışsak, çalışma koşulu olarak öyle bir standart gerektiğini belgeleyebiliriz.

dmd'nin std.c ile başlayan modülleri, benzer C kütüphanelerini kullanma olanağı veriyorlar.

Örneğin benim ortamımda dmd altındaki

'src/phobos/std/c/stdio.d'

dosyası doğrudan

'src/druntime/src/core/stdc/stdio.d'

dosyasını içeriyor. Onun içinde de şunun gibi C bildirimleri bulunuyor:

int printf(in char* format, ...);

Böylece C'nin standart kütüphanesini bile kullanabiliyoruz:

import std.c.stdio;
import std.string;

void main()
{
   string selam = "merhaba";
   int sayı = 42;
   printf("%s %d\n", toStringz(selam), sayı);
}

std.string.toStringz, C'nin anladığı '\0' ile sonlanmış dizgi üretiyor. (z'si "zero terminated"dan geliyor)

Onları niye yazdım? :) <termios.h> olanaklarının D'nin iç veya standart kütüphane olanakları olmadıklarını ama dmd dağıtımıyla gelen ilinti dosyaları ('D binding'e öyle mi diyorduk? :D ha ha) ile halledildiklerini göstermek istedim.

Bu arada std.stream'i de derslerden çıkarttım. Phobos'a başka şekilde eklediklerinde BOM konularını tekrar ekleriz.

Ali

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