小ワザ
logmes †
HSP2.61のlogmesはメッセージをファイルに書き出しました(知らなかった!)が、HSP3.0aではデバッグウィンドウを表示していると
logmesを使ってもファイルには書き出されず、デバッグウィンドウに書き出されます。
ウィンドウが小さくて見難い、行番号を確認したい、などという場合には不便です。
そこでこんなマクロを作ってみました。
汎用的に使えるようにログファイルの名前はコンパイル対象のファイルに拡張子 ".log" をつけたものになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
| #module "mylog"
#undef logmes
#define global logini \
logname@mylog = getpath(__FILE__,1)+".log":\
bsave logname@mylog, str_log@mylog, 0, -1
#define global logmes(%1) \
logmes@hsp %1:\
str_log@mylog = "#"+strf("%%8d",__LINE__)+" ["+__FILE__+\
"] ("+__DATE__+") ("+__TIME__+")\t|>"+%1+"\n":\
bsave logname@mylog, str_log@mylog, strlen(str_log@mylog), p_log@mylog: \
p_log@mylog += strlen(str_log@mylog)
#global
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
| #module "mylog"
#undef logmes
#deffunc logini
logname = getpath(__FILE__,1)+".log"
bsave logname, log, 0, -1
return
#deffunc _logmes str msg, int row
logmes@hsp msg
log = "#"+strf("%d",row)+" ["+__FILE__+"] ("+__DATE__+ ") ("+__TIME__+")|>"+msg+"\n"
bsave logname, log, strlen(log), p
p += strlen(log)
return
#define global logmes(%1,%2=__LINE__) _logmes %1, %2
#global
|
こちらはぷまさんに言われて作ったモジュールバージョンです。
モジュール内に__LINE__を書いた場合、コンパイル前のプリプロセッサ処理で__LINE__がその行番号に置換されてしまうので、
そのままでは書き出す行番号が固定になってしまいます。
ぷまさんとこではそういう理由でマクロにしましたと言ってるけど、だったら行番号をモジュールに渡しちゃえばいいじゃない?とか自分で思いました。
ただし、logmesに行番号を受け取るパラメータを用意しちゃうと元と書式が変わってしまうので・・・そこで新規命令はlogmesではない名前で定義します。(例えば_logmes)
そしてこの_logmesに行番号を渡すための置換マクロをlogmesとして公開します。
置換マクロlogmesは第二パラメータを省略することで自動的に__LINE__を付加して_logmesに渡します。
実際には__LINE__が渡されるのではなくプリプロセッサで置き換えられた行番号が渡されるのでこれでOKです!
やっぱりモジュールの方が見易いよねぇ〜^^
- 行番号は8桁固定です。固定じゃなくしたほうがいいという場合は文字列操作で可変幅にすることもできます。 -- kz3
- が、printf("%*d",w,num);などのように「*」を使って幅を指定できると便利なのですが・・・(以外と「*」は知られていない?!) -- kz3
- 申し遅れました。今日はぷまさんの掲示板へ行ってネタを拾ってきましたorzでもスクリプトは自作ですので -- kz3
- このマクロ結構使えますね、使わせてもらいます。 -- QIG
- それにしても、なぜlogmodeがなくなったんでしょうか? 便利だったのに・・・orz -- QIG
- logmodeなんて命令まであるとは!履歴付き実行はいつもメニューから・・・;; -- kz3
- (それから)あっQIGさんこんばんわ〜^^ -- kz3
- こんばんは〜 初編集に見えて、実は初でなかったりします。 -- QIG
- コマンドラインコンパイラのソースを勝手に編集してます。 -- QIG
- logmodeは便利でしたよ。HSPのやってることがすべて読み取れるんですから。 -- QIG
- 編集してたのはQIGさんだったんですね!教えてくれてもいいのに〜(・公・; 笑い -- kz3 -- kz3
- 初めはこちらで実現しようかと思ってたんですが、結局独自に作ってしまいました・・・。 -- QIG
- んむ?!logmesですか?ログは人によって必要な情報が違うのでバシバシ加工してくださいな!とりあえずラップ命令(ラップ関数といいたい)の作り方みたいなのをHSP3掲示板で習ったので・・・。(#undefがそうです。) -- kz3
- まぁでも#undefしなくてもマクロが定義できればいいわけだから
1
|
| #define _logmes(%1) ...
|
と定義しておけば標準命令と何か区別されているんだな、って視覚的に分かってそっちのほうが良かったり・・・。 -- kz3
- logmsg って、MS-DOSでいうところのパイプみたいなもの? Cコンパイラのすごいエラーメッセージを、ファイルに記録するのに使ってたけど...。 -- hiroki?
- いや・・・たしかstderrでしたっけ・・・標準エラー出力。それとは多分違うような・・・。 -- kz3
- いまいちlogmsgの使い方が解りません。 いつでもいいから教えてね。 -- hiroki?