since : 2001.11.1 Junk Shop
DataSlim2's Room
ここでは、私がプログラムしているときに気がついた情報を提供します。
基本的に、プログラミング初心者の私が嵌った所です。(上級者に対して有用な情報は少ないかも・・・)
EW Z80のインストールマニュアルにはドングルが認識しないとき、環境変数SSI_ACTをAutoexec.batで変更するように記載されていますが、アドイン開発手順書に記載されているAddin.batの中にset SSI_ACT 10,10,20
と記載されており、この数値を変更したほうが早いようです。
ちなみに私の環境(K6-2 500MHz)は70,70,100で動いています。
(10,10,20の時はまったく認識せず。50,50,100でも稀に認識しなくなります)
DsSleep(int time)
timeの値を0にすると無限ループに突入するみたいです。
また、timeの値をn/TIME_CLOCKTICKとした場合、nの値を15以下に指定する同じような状態になります。
この事から、TIME_CLOCKTICK=16であることが判りました。
DsPrintf(...)
う〜ん・・・そのままでは数値を表示することが出来ません。
私はソースの中に次のような関数を用意し、数値をテキストコードに変換して表示させています。(面倒なので桁数を決め打ちしています。)
/*3桁の整数表示関数*/ void DsPrtnumf(char x,char y,char z,int num){ char a[4],i; //3桁なのにa[4]としているのは、文字列の最後にnullを //入れて文字列が終了している事を示すためです。 DsDisplayBlockClear(x,y,18,12); //表示範囲の消去 //ここからのif文で各桁の数値の取得と+−の変換を行っています。 if(num < 0){ num=num*-1; a[2]=num%10; a[1]=(num%100)/10; a[0]=45; //45はマイナス記号のASCIIコードです } else{ a[2]=num%10; a[1]=(num%100)/10; a[0]=(num%1000)/100; } //ここからのif文で先頭に0がの時表示されないようにしてます。 //ついでに数値をASCIIコードに変換しています。 if (a[0]==0) { a[0]=32; //32はスペースのASCIIコードです if(a[1]==0){ a[1]=32; } else { a[1]=a[1]+48; //48は0のASCIIコードです } } else { a[1]=a[1]+48; a[0]=a[0]+48; } a[2]=a[2]+48; //この状態で、DsPrintf()にa[0]のアドレスを指定すれば数値の表示 ができます。 DsPrintf(x,y,z,&[0]); return; }
カレントレコードの無い時の戻り値がDB_NO_CURRENT_RECORDとなっていますが、DB_NO_CURRENT_RECの間違いのようです。
int sprintf(*char,*format,...)と言う数字をASCIIコードに変換する関数を使用すれば上記のようにややこしいルーチンを作らずに済みます。
ただしSDKの標準では%%,%d,%o,%c,%s,%x識別子しか認識しないsmall formatterが採用されています。
使い方はICCユーザーズガイド1-108を参照して下さい。
ANSI 標準のformatterを使用する時は、DsSdkフォルダーの下のlnkフォルダー内に有るaddin.xclファイル内に書かれてある下記項目を削除すれば使用できます。
-e_small_write=_formatted_write
ただし、ANSI 標準のformatterを使用した時は標準に比べて約3.5kbytほど余分にメモリーを消費します。
DsTextButton()の最後のテキストを入力する引数ですが、マニュアルでは char *str となっていますが、const char *str でないといけないようです。
DbDestroy()でデータベースのテーブルを削除した直後に、データベーステーブルを作成するとDataSlim2が不安定になるみたいです。
(データが表面上は書き換わるが、実は書き換わっていないと言う症状が「縦めも」で発生しました。)
「縦めも」では、DbDestroy()でデータベースのテーブルを削除したらアドインを終了する事で回避しています。