DTDT-900 高速ファイルサーチラ イブラリ ユーザマニュアル Version 1.00 1.
目次 I. 概要 1 A. はじめに B. 機能 1 1 II. ファイル構造 2 A. 用語説明 B. HASH関数 HASH関数 C. 注意事項 2 2 2 III. HASHライブラリとアプリケーション HASHライブラリとアプリケーション 3 IV. HASHライブラリ( HASHライブラリ(DOS ライブラリ(DOS用および DOS用および DTDT-900用) 00用) 4 A. IHASHASSIGN 1. 概要 2. コーリングシーケンス B. IHASHREAD 1. 概要 2. コーリングシーケンス C. IHASHWRITE 1. 概要 2. コーリングシーケンス D. IHASHADD 1. 概要 2. コーリングシーケンス E. 開発環境 F. サンプルアプリケーション G. リリース媒体内容 Hash Library User’s Manual ver 2.
I. 概要 A. はじめに 本高速ファイル検索ライブラリは、HASH法を使用した高速ファイル検索機能セットです。 HASH法とは、キーデータを数値に変換した特別なインデックスファイルを用い、データレコ ード検索時間を最小限にする技法です。 本ライブラリを用いることにより、特に大容量ファイルを扱う場合、従来の逐次検索に比べ、 高速にファイルを検索することができます。 B.
II. ファイル構造 INDEX FILE (*.IDX) DATA FILE l W V L l N : : : 8 A. CR,LF : : : : : : : V W 2 Bytes DATA data : : : : : : CR, LF : : : : : : L 用語説明 1. 2. 3. 4. l L V W : : : : キーフィールドの長さ (Bytes). データレコード長 (KEY+DATA) 総データレコード数 総インデックス数 インデックスの衝突を避けるために、最低でも W≧1.2×V が必要です。 WをVの2~3倍程度確保すると、より効率の良いファイルが構 築できます。 : 使用レコード数 5. N B.
III. HASHライブラリとアプリケーション HASHライブラリとアプリケーション 本ライブラリは、以下の環境下で動作するものを提供します。 • DT-900 • PC running MS DOS • PCs running Windows 95. 以下にHASHライブラリとアプリケーションの関係を記します。 DT-900 MS DOS アプリケーション Small model Medium model Large model MS DOS アプリケーション (Win 3.11下で動作) Small モデル Medium モデル Large モデル Windows 95 コンソール アプリケーション Windows 3.1, 3.
IV.
A. iHashAssign 1. 概要 本関数は、データファイルからインデックスファイルを作成します。 2. コーリングシーケンス int iHashAssign (FILE* DataFilePointer, FILE* IndexFilePointer, long ll, long lV, long lL, long lW1); DataFilePointer : fopen関数によりオープンされたデータファイルポインタ。 本関数を使用する前に、データファイルは以下のようにオープンされていなければ なりません。 #include FILE *DataFilePointer; DataFilePointer = fopen (char* file,char* mode); file : データファイル名 mode : ファイルアクセスモード (“r”) IndexFilePointer: fopen関数によりオープンされたインデックスファイルポインタ。 本関数を使用する前に、データファイルは以下のようにオープンされていなければ なりません。 #include
実行時に必要なメモリ(単位=バイト): DTPC(16ビット) DT-900 PC(16ビット) 490+2×キー長 460+2×キー長 PC(32ビット) PC(32ビット) 442+2×キー長 リターン値: 意味 正常終了 データファイルリードエラー データファイル未オープン データファイルシークエラー インデックスファイルリードエラー インデックスファイルライトエラー インデックスファイル未オープン インデックスファイルシークエラー 実行メモリ不足 パラメータエラー Hash Library User’s Manual 0 102 105 111 202 203 205 211 320 400 リターンコード (HASH_OPERATIONOK) (DATA_NOFILEREAD) (DATA_NOFILEOPEN) (DATA_NOFILESEEK) (IDX_NOFILEREAD) (IDX_NOFILEWRITE) (IDX_NOFILEOPEN) (IDX_NOFILESEEK) (HASH_NOMEMORY) (PARAM_INVALID) 6
B. iHashRead 1. 概要 本関数は、入力キーデータに対応するデータを検索します。 2. コーリングシーケンス int iHashRead (char *pszKey, FILE *DataFilePointer, FILE *IndexFilePointer, char *pszBuff); pszKey: 検索するキーデータのポインタ。 キーデータの末尾には、NULL文字を入れて下さい。 キーデータ長が、データファイル内の実際のキーデータ長と一致しない場合は、エ ラーとなります。 DataFilePointer : fopen関数によりオープンされたデータファイルポインタ。 本関数を使用する前に、データファイルは以下のようにオープンされていなければ なりません。 #include
実行時に必要なメモリ(単位=バイト): DTPC(16ビット) DT-900 PC(16ビット) 512+2×キー長 482+2×キー長 PC(32ビット) PC(32ビット) 462+2×キー長 リターン値: 内容 正常終了 データファイルリードエラー データファイル未オープン データファイルシークエラー インデックスファイルリードエラー インデックスファイル未オープン インデックスファイルシークエラー 実行メモリ不足 該当インデックスなし 不正キー入力 (キー長不一致) キーポインタ不正 (NULL) Hash Library User’s Manual 0 102 105 111 202 205 211 320 330 331 332 リターンコード (HASH_OPERATIONOK) (DATA_NOFILEREAD) (DATA_NOFILEOPEN) (DATA_NOFILESEEK) (IDX_NOFILEREAD) (IDX_NOFILEOPEN) (IDX_NOFILESEEK) (HASH_NOMEMORY) (HASH_KEYNOTFOUND) (HASH_INVALIDKE
C. iHashWrite 1. 概要 本ファンクションは、指定キーのデータレコードを書き換えます。 データファイルのデータレコード以外は、不変です。 2. コーリングシーケンス int iHashWrite (char *pszKey, FILE *DataFilePointer, FILE *IndexFilePointer, char *pszBuff) pszKey: 変更するデータのキーデータポインタ。 キーデータの末尾には、NULL文字を入れて下さい。 キーデータ長が、データファイル内の実際のキーデータ長と一致しない場合は、エ ラーとなります。 DataFilePointer : fopen関数によりオープンされたデータファイルポインタ。 本関数を使用する前に、データファイルは以下のようにオープンされていなければ なりません。 #include
実行時に必要なメモリ(単位=バイト): DTPC(16ビット) DT-900 PC(16ビット) 500 470 +2×キー長 +2×キー長 +データ長 +データ長 PC(32ビット) PC(32ビット) 452 +2×キー長 +データ長 リターン値: 内容 正常終了 データファイルリードエラー データファイルライトエラー データファイル未オープン データファイルシークエラー インデックスファイルリードエラー インデックスファイル未オープン インデックスファイルシークエラー 実行メモリ不足 該当インデックスなし 不正キー入力 (キー長不一致) キーポインタ不正 (NULL) 不正データ入力 (データ長不一致) データポインタ不正 (NULL) Hash Library User’s Manual 0 102 103 105 111 202 205 211 320 330 331 332 333 334 リターンコード (HASH_OPERATIONOK) (DATA_NOFILEREAD) (DATA_NOFILEWRITE) (DATA_NOFILEOPEN) (DATA_NOFILESEEK)
D. iHashAdd 1. 概要 本ファンクションは、データファイルに新しいレコード(キー+データ)を追加します。 一度に 追加できるレコードは、1レコードで、既存レコードの末尾に追加されます。 (既存レコードの間に追加することはできません) データ・ファイルがオーバーフローしていないこと、データレコードの数が、インデックスヘッダ ーに指定されている数より少ないことが条件です。 2.
実行時に必要なメモリ(単位=バイト): DTPC(16ビッ DT-900 PC(16ビット) (16ビット) 514 484 +キー長 +キー長 +2×データ長 +2×データ長 PC(32ビット) PC(32ビット) 466 +キー長 +2×データ長 リターン値: 内容 正常終了 データファイルライトエラー データファイルフル データファイル未オープン データファイルシークエラー インデックスファイルリードエラー インデックスファイルライトエラー インデックスファイル未オープン インデックスファイルシークエラー 実行メモリ不足 該当インデックスなし 不正キー入力 (キー長不一致) キーポインタ不正 (NULL) 不正データ入力 (データ長不一致) データポインタ不正 (NULL) Hash Library User’s Manual リターンコード 0 (HASH_OPERATIONOK) 103 (DATA_NOFILEWRITE) 104 (DATA_FILEOVERFLOW) 105 (DATA_NOFILEOPEN) 111 (DATA_NOFILESEEK) 202 (IDX_NOFILER
E. 開発環境 ライブラリ開発環境は以下の通りです。 ライブラリ PC 32 Bit PC 16 Bit DT 900 使用コンパイラ Microsoft 32-Bit C/C++ Optimizing Compiler Microsoft Incremental Linker (Supplied with VC++ version 4.2) Microsoft (R) C/C++ Optimizing Compiler Microsoft segmented executable Linker (Supplied with VC++ version 1.52) KJ_CNVRT SH SERIES C Compiler (SHC) SH SERIES LINKER (LNK) SUBFILE’S B SECTION MAKE TOOL (SUBMK) OBJECT CONVERTER (CNVS) AP CONVERT PROGRAM (APCNVY) バージョン 10.20.6166 for 80x86 4.20.6164 8.00c 5.60.339 --2.0D 5.1 1.
F. サンプルアプリケーション 本章では、SAMPLEディレクトリにあるサンプルアプリケーションを説明します。 サンプルアプリケーションは、次のような構成になっています。 Start iHashAssign () iHashWrite () iHashRead () iHashAdd () End /************************************************************************** Copyright information : Casio Computer Co. Ltd., Japan File Name : Sample.c Project Name : HASH LIBRARY Author Name : Jei, Srinivasa Murthy, Vijay Mantri Date of Creation : 18/8/1998 Version Number : 1.
変数 W, V, L, Iの初期値は以下のとおりです。 l = キー長 = 8 L = レコード長 = 10 V = 総レコード数 = 40 W = 総インデックス数 = Vの1.2倍 = 48 int iI; char *pszBuff, *pszReadBuf; /* To hold result of HashFunctins.*/ /* Key input to Hash Functions. */ /* To hold read/write data. */ /* ap_init(); */ /* Removed on info from CASIO 28-NOV-1997 */ /*--------------------- HASH ASIGN START ----------------------------------*/ fpData = fopen("a:\\sample.dat","r"); fpIndex = fopen("b:\\sample.
/*--------------------- HASH WRITE START ----------------------------------*/ fpData = fopen("a:\\sample.dat","r+"); fpIndex = fopen("b:\\sample.
/*--------------------- HASH READ START ----------------------------------*/ fpData = fopen("a:\\sample.dat","r"); fpIndex = fopen("b:\\sample.
iHashAdd() 関数は、10個のレコードをデータファイルに追加します。 本関数が正常に終了すると、データファイルは以下のようになります。 00000000xy } 00000001xy } 00000002xy } 00000003xy } 00000004xy } 以前から存在するデータレコード 00000005xy } 00000006xy } 00000007xy } 00000008xy } 00000009xy } 0000000Ann } 0000000Bnn } 0000000Cnn } 0000000Dnn } 0000000Enn } 0000000Fnn } iHashAdd HashAdd () 関数により追加されたレコード 00000010nn } 00000011nn } 00000012nn } 00000013nn } このとき、インデックスファイルは、以下のようになります。 00000030 indicates W = 48 } 00000028 indicates V = 40 } 0000000A indicates L = 10 } ヘッダ 00000008 i
注意事項 インデックスファイルの総データレコード数(V)は、重要です。 サンプルプログラムでは、V=40でデータファイルを定義しています。 インデックスファイルの総インデックス数(W)は、総データレコードの1.2倍の48となっています。はじめ に、10レコードを消費し、さらに10レコードを追加するとデータファイルの残容量は20になります。.も し、残容量(20)以上のデータを追加する必要が生じた場合は、Vの値を増やし、再度 iHashAssign() 関数を実行する必要があります。 以下に、プログラム例を示します。 1. Vをより大きな値 (80)に書き換えます. 2. iHashAssign() 関数を実行します。 long ll = 8, /* To hold Length of Key. */ lV = 80, /* To hold Volume of Data file. */ 80 lL = 10, /* To hold Length of Data record. */ lW1 = (lV*120)/100, /* To hold volume of Index file.
オペレーション Startup iHashAssign() for 40. iHashWrite() iHashRead() iHashAdd() for 10. iHashAdd() for 10. iHashAdd() for 10. iHashAssign() for 80. iHashAdd() for 5.
G. リリース媒体内容 リリースディスクの内容は、以下のとおりです。 DT900 LIB SAMPLE PC16BIT LIB SAMPLE PC32BIT LIB SAMPLE Hash Library User’s Manual HASH900.LIB HASHLIB.H SAMPLE.C SAMPLE.DAT SAMPLE.MAK SHASH.LIB MHASH.LIB LHASH.LIB HASHLIB.H SAMPLE.C SAMPLE.DAT LSAMPLE.BAT MSAMPLE.BAT SSAMPLE.BAT HASH32.LIB HASHLIB.H SAMPLE.C SAMPLE.DAT SAMPLE.