人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【C言語マクロ】についての質問ですが、昔、N88BASICの命令ライクなマクロを作って使っていたのですが、昔のマクロは今のCでは、エスケープシーケンスが使えなかったり、PC9801に機種依存していて使えないようです。以下のマクロを今風に実現しようとしたらどうなりますか?教えて下さい。コンパイラはBorland C++です。部分回答でもよいです。

#define CLS() fprintf(stderr,"\x1b[2J")/* Noリダイレクト */
#define LOCATE(x,y)fprintf(stderr,"\x1b[%d;%dH",((y)+1),((x)+1)) /* (0-79,0-24) */
#define COLOR(c)fprintf(stderr,"\x1b[%dm",(c)+30) /* 0:黒,1:赤,2:緑,3:黄,4:青,5:紫,6:水,7:白.(+10:反転) */
#define INKEY_S()(bdos(6,0xff,0) & 0xff)/* dos.hが必要 */
#define mpeek(seg,off)(*(char far *)(((unsigned long)seg<<16)+off))/* POS_0, CSRLIN で使用 */
#define POS_0()(mpeek(0x0060,0x011c))/* カーソル列取得 98メモリ直接読取り */
#define CSRLIN()(mpeek(0x0060,0x0110)-mpeek(0x0060,0x011e))/* カーソル行取得 */


●質問者: rsc
●カテゴリ:コンピュータ ネタ・ジョーク
✍キーワード:24 Borland C++ Char COLOR
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● koriki-WeKan
●10ポイント

DOS窓アプリでやろうとしているなら、いずれも無理

◎質問者からの返答

アプリというよりコンソールプログラムです。ちなみに、自分でも検索していますが、CLS()とLOCATE(x,y)は、なんとかなりそうです。ヒントは、Borland C++では、Turbo Cの関数が使えるようです。(^_^;


2 ● キチョー id:Kityo
●100ポイント ベストアンサー

LOCATE()とCLS()の例をお見せします。

#define LOCATE(x,y)gotoxy( (x)+1, (y)+1 )/* conio.hが必要 */
#define CLS()system( "cls" )/* stdlib.hが必要 */

/* 以下はBorland C++ 5.5.1 for Win32で「bcc32 a.cpp」のようにコンパイル&リンクして動作確認した使用例 */
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>


void main( void )
{
system( "mode CON COLS=80 LINES=25" );
CLS();
LOCATE( 1,1 );printf( "*" );
LOCATE( 2,2 );printf( "*" );
LOCATE( 3,3 );printf( "*" );
LOCATE( 4,3 );printf( "*" );
LOCATE( 4,3 );printf( "*" );
LOCATE( 5,3 );printf( "*" );
LOCATE( 5,4 );printf( "*" );
LOCATE( 5,5 );printf( "*" );
getch();
}

上のCLS()マクロは、ほぼ全てのDOSとWindowsのDOS窓及びそれら用のC/C++コンパイラの環境で使えると思います。

LOCATE()マクロは、Borland系のC/C++コンパイラの環境でDOSとWindowsのDOS窓に互換性がある筈です。

LOCATE()マクロについて、WindowsのDOS窓にスクロールバーが表示されるような状況では期待と違う動きをするかも知れません。

f:id:Kityo:20100703082822j:image

予めDOS窓のプロパティで、バッファサイズとウインドウサイズを80x25などの無難な大きさで揃えておくなどすると良いと思います。

DOS窓のプロパティを手動で設定する代わりに、main()関数の冒頭などで「system( "mode CON COLS=80 LINES=25" );」をコーディングしておくのでも良いと思います。

カテゴリに「ネタ・ジョーク」とあり・質問文面でも「部分回答でもよい」と言って頂いているのに甘えて、ごく一部分だけの中途半端な回答をさせて頂きました。

rsc96074さんがもしFreeCommandLineToolsとして公開されている無償版のbcc32コンパイラをお使いなら、ライブラリヘルプが付属していないことが主なご不便なのだろうと思います。登録は必要ですが、BCB6 Japanese Help Contentをダウンロードしてみては如何でしょうか? バージョンは異なりますが、充分に役立つと思います。

rsc96074さんであれば、上のヘルプを見たほうが手っ取り早いのだろうと思います。ダウンロードした場合は目も眩むほどのヘルプファイルが得られますが、取り敢えずは~/Japanese/Help/bcb6.hlp辺りを開けば便利と思います。

◎質問者からの返答

回答ありがとうございます。LOCATEは私の考えたのと同じでした。CLSは、その方法は思いつきませんでした。私の質問は頭の体操の一面もあるので凝った回答大歓迎です。

ちなみに、私の考えたというか、見つけたのは、CLSの場合、clrscr()関数で代用するものです。COLORもtextcolor(c)という関数がありましたが、実際に試してみましたが、エラーにはなりませんでしたが、色は変わりませんでした。(^_^;

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ