実身を読む

では、能書きはいいのでとにかく実身を読むプログラムを作りましょう。UNIXで言えばO_RDONLYでopenすることに相当する部分です。

#include <sample.h>

VOID main(W argc, TC ** argv)
{
  LINK SrcLink;
  WERR WErr, SrcFD;

  WErr = get_lnk(L"test", &SrcLink, F_NORM);
  SrcFD = opn_fil(&SrcLink, F_READ, NULL);
  cls_fil( SrcFD );
  printf( "test01\n" );
}

このプログラム一式を置いておきます。型については仕様書第1章 基本データタイプ又はinclude/typedef.hを見て下さい。

プログラムの解説

sample.hを用意する

まず、BTRON用の宣言をしておかなければなりませんが、それを毎回やるのは馬鹿らしいのでsample.hの中にまとめておきます。

#include <basic.h>
#include <bstdlib.h>
#include <bstdio.h>
#include <bstring.h>
#include <errcode.h>
#include <tstring.h>
#include <tcode.h>
#include <btron/btron.h>
#include <btron/dp.h>
#include <btron/hmi.h>
#include <btron/vobj.h>
#include <btron/libapp.h>
#include <btron/tip.h>

これだけあれば大丈夫でしょう。プログラム一式の中に入っています。

main関数

プログラムの実行開始部はmain関数とMAIN関数のどちらかが使えます。ここではmain関数だけ扱います。ファイル操作関数については仕様書1.6.8 システムコールにまとめられているので適宜参照して下さい。システムコールごとに見られるといいのですが…

  1. WErr = get_lnk(L"test", &SrcLink, F_NORM);
    テスト用の実身「test」を読もうとしているのでそれの一意識別子を取得してSrcLinkに格納します。UNIXでは、open("test", O_RDONLY);でよかったのですが、BTRONでは同じ名前を複数持てますから、実身名で指定することはできず、一意識別子でもって特定します。その一意識別子を「test」から作成しているところです。「は?それでもtestという名前から識別子を作っているんなら、testが二つあったらどうすんだ?」はい。おっしゃる通りです。本当はこの方法はまずいのですが、とりあえずtestという実身名を持つ実身が一つしかないようにしておいて下さい。F_NORMは何だかよく分かりませんがこれで動いているのでよしとしましょう。
  2. SrcFD = opn_fil(&SrcLink, F_READ, NULL);
    作った一意識別子について、読み込みモードでファイルディスクリプタを作ります。これは特に説明の必要はないでしょう。
  3. cls_fil( SrcFD );
    作ったファイルディスクリプタを閉じます。
  4. printf( "test01\n" );
    これだけだと何がなんだか分からないので動いている証拠として何かコンソールに出力させましょう。なお、よく分からないのですが、最後にprintfを実行して終了すると、そのときに出力した文字のバイト数がExit : 7のようにコンソールに表示されます。

エラー処理

このプログラムではエラー処理を全く行っていません。get_lnkはエラーが起こった場合には負の値を返します。従ってWErrの値に応じて処理をすべきです。例えば

  WErr = get_lnk(L"test", &SrcLink, F_NORM);
  if ( WErr < 0 ) {
    printf( "error: get_lnk" );
    exit( 0 );
  }

のようにします。以下のプログラム例でもエラー処理を省きます。ここでの主眼はTADを読み書きするための勉強であって、エラー処理を入れるとプログラムが繁雑で見にくくなるからです。

復習

ここで出てきた関数はget_lnkとopn_filとcls_filです。


Tamakoshi Hiroki
Last modified: Wed Nov 27 00:33:58 JST 2002