Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Funkcja getch();

Ostatnio zmodyfikowano 2009-08-04 14:31
Autor Wiadomość
manfred
» 2009-07-26 16:28:20
O to chodzi?
C/C++
#include <cstdio>
#include <conio.h>

int main()
{
    do
    {
        std::puts( "Wcisnij ESC aby zamknac" );
    } while( getch() != '\x1B' );
   
}
P-19093
manfred
» 2009-07-30 15:12:19
Bo nie ma literałów znakowych, to trzeba robić magic numbers, tja...
Hehehe, mogę jeszcze krócej:
C/C++
#include<conio.h>
int main() { while( getch() - 27 ); }
Da ktoś wię... mniej?
P-19107
manfred
» 2009-08-03 20:24:00
Da się. Goto. Czyli już prawie jak pisanie w języku asemblera.
Hm... eu? Fajny dyftong. Jako skrót oznacza tą nowoczesną wersję ZSRR. Jednak w moim imieniu jest ae, i tego się trzymajmy ;)
P-19126
manfred
» 2009-08-04 11:32:21
No bo piszesz, że się nie da bez pętli, to udowadniam, że się da :P.
po co bawić się w te etykiety, tylko zmniejszają wydajność.
Idę o zakład, że ten kod który podałeś wygeneruje identyczny kod maszynowy co pętla.
P-19133
manfred
» 2009-08-04 14:31:49
Aż z ciekawości sprawdziłem. Kod:
C/C++
#include <conio.h>

int main()
{
    // 1
    foo:
    if( getch() != 27 ) goto foo;
    // 2
    for(; getch() != 27; );
   
}
Wynikowy asm (składnia MASMa, tak, jak to wygenerował cl z opcją /FAs):
_main PROC
; 4    : {
$foo$2966:
; 5    : // 1
; 6    : foo:
; 7    : if(getch()!=27)goto foo;
call _getch
cmp eax, 27 ;porównujemy wartość zwracaną z 27 ; 0000001bH
jne SHORT $foo$2966 ;jeśli nie równe to skaczemy do etykiety $foo$2966, czyli foo
npad 6 ;align, żeby pętla była sobie szybsza, ten wyżej nie ma, bo początek _main i tak jest na granicy 16 bajtów.
$LL2@main:
; 8    : // 2
; 9    : for(;getch()!=27;);
call _getch
cmp eax, 27 ;to samo co wyżej ; 0000001bH
jne SHORT $LL2@main
; 10   : }
xor eax, eax
ret 0
_main ENDP
Czyli kod jest raczej taki sam, różnią się tylko cele skoków.
P-19134
1 « 2 »
Poprzednia strona Strona 2 z 2