Ta funkce signal nastavuje obsluhu signálu a nemá nic společného se čtením standardního vstupu. Nevidím důvod používat Fortran, když ho znáš tak málo, že na tom příkladu nevidíš, že tam není žádné I/O.
Implementace náhrady ifbrk (nevím, jak přesně má fungovat) v Céčku může vypadat třeba takhle:
== keys.c
#include <unistd.h>
#include <termios.h>
static char readchar(int block)
{
char c;
struct termios oldtios, newtios;
if (tcgetattr(STDIN_FILENO, &oldtios) < 0) return 0;
newtios = oldtios;
cfmakeraw(&newtios);
newtios.c_cc[VTIME] = 0;
newtios.c_cc[VMIN] = block ? 1 : 0;
if (tcsetattr(STDIN_FILENO, TCSANOW, &newtios) < 0) return 0;
if (read(STDIN_FILENO, &c, 1) != 1) c = 0;
if (tcsetattr(STDIN_FILENO, TCSANOW, &oldtios) < 0) return 0;
return c;
}
int getkey()
{
return readchar(0);
}
int waitkey()
{
return readchar(1);
}
== main.f
program main
integer :: i
interface
integer(c_int) function ifbrk() bind(C, name="getkey")
use, intrinsic :: iso_c_binding, only : c_int
end function
end interface
i=0
do while (i.eq.0)
i=ifbrk()
end do
if (i.eq.86.or.i.eq.118) then
write(*,*)'Vkladat'
else if (i.eq.80.or.i.eq.112) then
write(*,*)'Prohlizet'
end if
end
Pokud máš i GCC, tak ten céčkový soubor jen přihodíš do kompilace
gfortran main.f keys.c -o test
Je to samozřejmě pro Linux, pro jiný systém to třeba přepíše někdo jiný. A nemá smysl, aby to čekání na klávesu valilo v cyklu a místo "getkey" v tomhle případě můžeš použít čekající "waitkey".