Tech Note 07: NS BasicからCルーチンを呼ぶ

July 29, 2002

© NSB Corporation. All rights reserved.


[英語版]

この情報はRon Glowka氏から提供頂いたものの日本語訳です。 glowkar© flash.net.

NSBasicからユーザが作成したCプログラムを呼ぶことが可能です。(これは共有ライブラリ(Shared Libraries)にとって代わる方法です) もしCプログラムを書くのに興味がないようでしたら、この先は読む必要がないでしょう。興味があり、共有ライブラリを書くほどの時間、意欲、知識がない人にはお勧めです。

新しいNSBasicステートメントの「AppLaunch」を使うと、サブルーチンのようなあるタイプのPalmプログラムを呼ぶことが出来ます。AppLaunchコマンドが実行されると、そこで指定する処理を行い、NSBasicの一旦離れたポイントへと戻ります。その時、スクリーン、変数、およびプログラムの全てはそのまま状態で残っています。

NSBasicではまだ使えないAPIコール(例えば、整数、少数、構造へのポインタが必要なAPIなど)を「Cサブルーチン」を用いて使いたいと思った事があるかもしれません。または、複雑なコードをCを使って早く処理したいと思う事があるかもしれません。いずれの場合にしても、簡単なCプログラムで行うことができます。欠点は多くの場合に於いて共有ライブラリよりは遅くなることと、戻り値が文字列の形の為、必要な時はこれを変換して複数の戻り値を得なければなりません。

一つの「Cサブルーチン」はいくつものタスクをこなすことが出来ます。AppLaunchコマンドで、データを起動するプログラムへ渡すことが出来ます。このデータはコード化された文字列(例:カンマで区切られた文字列)でもよいので、必要なファンクションやパラメータを渡すことができます。Cプログラムは必要な処理を行い、結果をコード化された文字列で戻します。この戻されるデータは、実際にはCプログラムの「Preferences」に保管されますので、NSBasicからSysTrapのPrefGetAppPreferencesを使用して、このデータを読み込みます。

CSubsは小さなサンプルプログラムで、次のファンクションを持っています:FldCopy、FldPaste、FldGetSelection、newFieldCopy。FldCopyとFldPasteはすでにNSBasicで行えますが、実行時間の違いを確認したくて作りました。FldGetSelectionは、整数ポインタがパラメータとして必要な為、NSBasicでは行えないものです。newFieldCopyは、ユーザがフィールド内に選択されたデータを持っている時はFldCopyを呼び、何も選択されていない時はFldGetTextPtrとClipboardAddItemを呼び、そのフィールドの内容全てをクリップボードぼバッファにコピーします。これは単純であり、あまり実用的ではありませんが、どのようなことが出来るかのアイデアは提供できていると思います。

FldCopyとFldPasteの実行結果を見ると、Cサブルーチンを使うより、NSBasicのSysTrapコールを使用した方が、早いことが分かりました。これらのコマンドはとても単純ですが、AppLaunchコマンドを使用することのオーバーヘッドによるものです。より複雑な処理をCサブルーチンで行わせると、スピードの見返りが得られるでしょう。

ここからサンプルコードをダウンロードできます。

PS. さらにクリエイティブな事に挑戦したい場合、Cサブルーチン内にアセンブラコードを挿入することもできます。

AppLaunchコマンドの使用 More on using the AppLaunch Command

この情報はRick Ragnini氏から提供頂いたものの日本語訳です。 lisa2© xnet.com.

20以上年前は、BASIC言語を使うと、マイクロコンピュータ上で手早くアプリケーションができました。しかし、BASICは処理が遅かったり、機能が足りなかったりで、いつも自分の要求を完全に満たしてくれませんでした。それからサブルーチンをアセンブラーで書き、メモリーに埋め込み、それをBASICから呼ぶようになりました。

上記で示されているように、NSB-PalmはCで書かれた小さなプログラムを呼ぶことができます。でも、C言語のエキスパートになる必要はありません。他の多くのNSB-Palmユーザ同様、私もCプログラマーではありません。ここでは私が習ったテクニックと裏技を記載します。

まず、Palmプログラミングの良い本を探してきましょう。大抵はPalm用のCプログラミングの初級コース、PalmOSコールのリファレンス、サンプルコードとCコンパイラー(GCCやCodeWarrior Demo Version)が含まれています。

サブルーチンで何をしたいのか、できるだけシンプルにしておきます。Cサブルーチンを呼ぶ前に、NSB-Palmでできる限りのことは行います。

NSBからはAPPLAUNCH関数を使ってサブルーチンを呼びます。以下はマニュアルに載っていない、APPLAUNCHを使った詳しい説明です。

Result as integer = APPLAUNCH(cardNo as integer, pgm as string, cmd as integer, data as string)

これは結果コードを整数型で返します。この結果コードは、RETURNステートメントを使ってCプログラムにセットできます。例えば、Cプログラムの最後のステートメントが"RETURN 5"とすると、APPLAUNCHの結果は"5"になります。これは、NSBプログラムに整数(short)を返す簡単な方法です。

CardNoは0にすべきです。ほとんどの他の関数同様、これは0にセットしておきましょう。

pgmは起動するプログラムの名前です。APPLAUNCHはアプリケーションを起動するだけだと思っている人もいますが、Palmに入っているどのデータベースでは起動するように試みます。これは単純で、サブルーチンが"Csub.prc"という名前の場合、"Csub"(大/小文字は重要)を使います。問題はサブルーチンはアプリケーションと見なされ、Cコンパイラーはアプリケーションに対し、'appl'タイプを与えます。'appl'タイプを持つプログラムは全て、ホームに現れてしまいますが、Cサブルーチンは独立したアプリケーションではないので、これは望ましくありません。また、ホームは同じクリエータコードを持った2つアプリケーションがあるのも問題にします。私はタイプを'Csub'のように変更し、NSBアプリケーションと同じクリエータコードを使います。こうするとサブルーチンはホームでは現れることはなく、NSBアプリケーションと同じクリエータコードのため、このアプリケーションが削除されるとき、サブルーチンも削除されます。APPLAUNCHはどのタイプであるかは気にしません。

cmdはpgmに渡すコマンドです。PalmOSがこの起動コードを呼びます。cmdは呼ばれたアプリケーションで使われます。例えば、検索アプリケーションでは、起動コードを使ってアドレス帳に対して名前を探すように伝えます。起動コードはアプリケーションによってしか使われませんし、サブルーチンのタイプを'Csub'に変更したので、この数値は使いたいように使えます。サブルーチンにどんな整数(short)でも渡すことができます。

起動コード0から32767はPalm OSが使う目的で予約されています。実際はいくつかは値は使えますが、32768から65535の値を使うことが安全です。

dataはpgmに渡される文字列です。このデータは実際ここでは渡されません。この文字列へのポインターだけが渡されます。他のOS関数と違って、この文字列はかなり大きくできます。1000バイト以上の文字列を渡してみましたが、問題はありません。

アプリケーションを配付するには、サブルーチンをリソースとしてプロジェクトに追加し、実行時にDBCREATEDATABASEFROMRESOURCE関数を使って取り出します。