fortran66のブログ

fortran について書きます。

DOS窓でLOCATE

いつの間にかDOS窓コマンドプロンプト)でANSIのESCシーケンスが使えなくなっていたのですね。16ビット互換のDOS窓でしか機能しないようです。

BASIC時代のLOCATE命令のようなものが欲しかったので、Win32API呼び出しでやることにしました。

実行例

ソースコード

MODULE m_locate
USE ifwinty
USE kernel32
IMPLICIT NONE
CONTAINS
!
SUBROUTINE locate(ix, iy)
INTEGER, INTENT(IN) :: ix, iy
INTEGER (HANDLE) :: hout
INTEGER (BOOL)   :: bret
TYPE (T_COORD) :: tpos
hout = GetStdHandle(STD_OUTPUT_HANDLE)
tpos = t_coord( INT(ix, SHORT), INT(iy, SHORT) )
bret = SetConsoleCursorPosition( hout, tpos )
RETURN
END SUBROUTINE locate
!
SUBROUTINE pr(ix, iy, text)
INTEGER, INTENT(IN) :: ix, iy
CHARACTER(*), INTENT(IN) :: text
CALL locate(ix, iy)
WRITE(*, '(a)') text
RETURN
END SUBROUTINE pr
!
END MODULE m_locate
!=================================
PROGRAM test
USE m_locate
REAL :: pi = 4.0 * ATAN(1.0)
INTEGER :: ix, iy
CALL pr(35, 0, 'SIN CURVE')
DO ix = 1, 79
 CALL pr(ix, 12, '-') 
 iy = 12 - INT(10.0 * SIN( REAL(ix) * pi / 40.0))
 CALL pr(ix, iy, '*') 
END DO
CALL pr(0, 23, '')
STOP
END PROGRAM test