C'de klavyeden karakter alan aynı zamanda...

Kapalı Hesap (107285)
11-03-2011, 13:38   |  #1  
OP Kapalı Hesap
Teşekkür Sayısı: 0
853 mesaj
Kayıt Tarihi:Kayıt: Oca 2009

C'de klavyeden karakter alan aynı zamanda karakter girilmemesi durumunda da kendisinden sonraki komutların çalışmasına izin verecek bir fonksyon var mı ? yoksa bu fonksyonun nasıl yazılacağını basit bir dille anlatabilir misiniz ? 

Ya da ben direk programı kopyalayayım da demek istediğimi daha iyi anlatabileyim. Aşağıdaki programın bir tuşa basınca durmasını, tekrar basıldığında ise devam etmesini nasıl sağlarım ? ( program linuxta yazıldı )

#include <stdio.h>
#include <unistd.h>

void chronometer(void);

int main(){
chronometer();
return 0;
}

void chronometer(void) {
int hour=0,min=0,sec=0,i;
while(1){
for(i=0; i != 23; i++) printf("\n");
if(sec==60) {sec=0;min++;}
if(min==60) {min=0;sec++;}
printf("%d:%d:%d",hour,min,sec);
sleep(1);
sec++;
}
}

Son Düzenleme: Kapalı Hesap (107285) ~ 11 Mart 2011 13:41
muh34
11-03-2011, 21:05   |  #2  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

Yapmanız gereken tek sey ekranı belirtilen milisaniye degerine gore içinde bulundugu kanalı uyutan sleep() fonksiyonunun hemen ustunde bir kosul yaratmaktır.Bu kosul;

if(flag)
sleep(1000);
şeklinde deklare ediniz.

Ayrıca kullanılacak bu flag degiskenini herhangi bir tusa basildiginda yonlendirmek gerekir.Şöyleki,kullanıcı herhangi bir tusa bastıgında flag degeri aktif olurken sleep() fonksiyonunu uyandıracaktır.Ote yandan bir kez daha herhangi bir tusa bastıgında ise flag degerini pasif yapacaktır(0).Bu kod satırları ise;
karakter=getche();
if(isalnum(karakter))
flag=!flag; 
şeklinde,while(1) dongusunun hemen altında deklare ediniz.' isalnum() fonksiyonu C programlama dili icerisinde ctype.h header dosyası icerisinde bulunurken,programda kullanılan karakter ve flag degiskenlerini int tipinde tanımlamayı unutmayınız.

Başarılar

Kapalı Hesap (107285)
16-03-2011, 18:52   |  #3  
OP Kapalı Hesap
Teşekkür Sayısı: 0
853 mesaj
Kayıt Tarihi:Kayıt: Oca 2009

Öncelikle geciken cevap için özür.

getche standart olmadığı için kullanamadım onun yerine getch'İn elle yazılmış bir türevini buldum. Onu kullandım ve şöyle birşey ortaya çıktı fakat istediğim sonucu alamadım. Nerede hata yaptım acaba ?

#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <ctype.h>

void chronometer(void);
int mygetch(void);

int main()
{
    chronometer();
    return 0;
}

void chronometer(void) {

    int hour=0,min=0,sec=0,i,karakter,flag;

    while(1){
        karakter=mygetch();
        if(isalnum(karakter)) flag=!flag;
        for(i=0; i != 23; i++) printf("\n");
        if(sec==60) {sec=0;min++;}
        if(min==60) {min=0;sec++;}
        printf("%d:%d:%d",hour,min,sec);
        if(flag) sleep(1000);
        sleep(1);
        sec++;
    }
}
int mygetch(void)
{
    struct termios oldt,newt;
    int ch;
    tcgetattr( STDIN_FILENO, &oldt );
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newt );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldt );
    return ch;
}

Son Düzenleme: Kapalı Hesap (107285) ~ 16 Mart 2011 20:28
muh34
16-03-2011, 19:14   |  #4  
Yıllanmış Üye
Teşekkür Sayısı: 0
215 mesaj
Kayıt Tarihi:Kayıt: Eki 2010

getche() fonksiyonu standart C programlama dili icerisinde,' conio.h> kutuphanesinde tanımlı bir fonksiyondur.Yukarıdaki koda baktıgım zaman,sadece kronometre gorevi gören fonksiyonu calıstırmaktasınız.Ancak Kullanmak istediginiz mygetch() fonksiyonu hic bir noktadan cagrılmamaktadır.
karakter=mygetch(); kısmını kullanarak karakter girişini bu sekilde gercekleştirebilirsiniz.Yalnız yukarıda yazılan kod satırlarına baktıgım zaman,yazılmıs olan programın baska bileşenlerinin nerede tutulduğu onemlidir.Şu durumda bu kodu derlemeye calısırsanız mygetch() fonksiyonu icerisinde cagrılan tüm fonksiyonların tanımlı olmadıgı uyarısını alırsınız.

Başarılar

Kapalı Hesap (107285)
16-03-2011, 20:08   |  #5  
OP Kapalı Hesap
Teşekkür Sayısı: 0
853 mesaj
Kayıt Tarihi:Kayıt: Oca 2009

pardon, programı buraya aktarmak için ikinci defa yazmak zorunda kalmıştım mygetch i yazmayı unutmuşum. yalnız mygetch yazıldığı taktirde de çalışması istediğimiz şekilde olmuyor.

conio.h kütüphanesi linuxtaki gcc derleyicisinde yok, bu yüzden kullanamadım.

Kodları düzelttim.

Son Düzenleme: Kapalı Hesap (107285) ~ 16 Mart 2011 20:11