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()でデータベースのテーブルを削除したらアドインを終了する事で回避しています。