環境のためのメモリが足りません

 またしても、Windows起動時に「環境のためのメモリが足りません」現象、発生。セーフモードからの再起動しか受け付けられない…。CONFIG.SYS、AUTOEXEC.BATをちょっといじっては再起動を繰り返し、何とか正常起動できるようになった。結果からすると、AUTOEXEC.BATに入れた「大量のREM文」が原因であったらしい。

Delphi6 UP1

 Borland Delphi 6にUpdate Pack 1を適用。

Memo1.Lines.Add(BcdToStr(StrToBcd('0.1')));

で’1’と表示されていたのが’0.1’と表示されるようになった。

 NormalizeBcd関数の第1パラメータがconst指定で、wsprintfがstdcall指定のままだが、ま、これは簡単にどうにかできるから良いか。

ZAURUS

 今まで何とはなしに敬遠していたキーボード付きZAURUSを店頭で触る。うー、大きさのワリに打ちやすいじゃないか。グラグラ…。

ニッケル水素電池

 SANYOのニッケル水素電池、HR-3Uが寿命を迎えて以降、Nikon E900にはアルカリ電池を使っていた。が、ここんとこまた少し使用頻度が上がってきたので、替えのニッケル水素電池を買いに行く。…HR-3U(min.1400mAh)はどこにもなかった。その次に出たと思しきHR-3US(min.1500mAh)すら僅少で、主流はすでにHR-3USV(min.1600mAh)。結局、N-M54S(HR-3USVx4本、NC-M54のセット品)を買って帰ったのであった。手元のNC-M43(急速充電器)があぶれたな。ていうか、地球にやさしくないぞ。

テレビ

 ・今クールのTVドラマ視聴リスト(お気に入り順/特撮モノ含む)。

 「救命病棟24時」、「世界で一番熱い夏」、「ファイティングガール」、「恋がしたい恋がしたい恋がしたい」、「仮面ライダーアギト」、「できちゃった結婚」、「生きるための情熱としての殺人」、「ルージュ」、「百獣戦隊ガオレンジャー」、「非婚家族」、「フレーフレー人生!」、「ウソコイ」。

 ・今クールのTVアニメ視聴リスト(お気に入り順)。

 「デジモンテイマーズ」、「機動天使エンジェリックレイヤー」、「も~っと!おジャ魔女どれみ」、「フルーツバスケット」、「スクライド」、「だぁ!だぁ!だぁ!」、「コメットさん★」、「NOIR(ノワール)」、「コスモウォーリアー零」、「ZONE OF THE ENDERS Z.O.E dolores, i」、「シャーマンキング」。

BCD

 Delphi 6のFMTBcdルーチン。いたるところで精度の自動調整が行なわれるのだが、その際、絶対値が1未満の数値に対する処理が×らしく、小数点が行方不明に。例えば、

Memo1.Lines.Add(BcdToStr(StrToBcd('0.1')));

で’1’と表示されるし、

BcdDivide('1','10',B); // B := 1 / 10
Memo1.Lines.Add(FormatBcd('#.#',B));

も’1’、

if BcdToDouble(DoubleToBcd(0.1)) = BcdToDouble(DoubleToBcd(1.0)) then
begin
  Memo1.Lines.Add('一致');
end;

が’一致’してしまう。1.111を10で割ると1111となり、

B := StrToBcd('1111');
for I := 1 to 50 do
begin
  BcdDivide(B,10,B); // B := B / 10
  Memo1.Lines.Add(BcdToStr(B));
end;

という処理では1.111から1111までの間を行ったり来たり…。
まあ、整数部が常に1桁以上となるよう調整、つまりは、

CurrToBCD(0.1,B);
Memo1.Lines.Add(BcdToStr(B));

NormalizeBcd(StrToBcd('0.1'),B,64,32);
Memo1.Lines.Add(BcdToStr(B));

とでもすれば良いのだが、そうするくらいなら通常の実数型を使うほうがマシというもの。また、上記の処理を

B := StrToBcd('0.1');
NormalizeBcd(B,B,64,32);
Memo1.Lines.Add(BcdToStr(B));

とすると’0’になる。これはNormalizeBcd関数の第1パラメータがconst指定であるが故。あらかじめ、

function NormalizeBcd(InBcd: TBcd; var OutBcd: TBcd; const Prec, Scale: Word): Boolean;
begin
  Result := FMTBcd.NormalizeBcd(InBcd,OutBcd,Prec,Scale);
end;

とでもしておかないと危険。
にしても、精度が命のBCDにおいて、「自動調整」ってのは…?

varargs指令

 Delphi 6。Windows.pasを覗いてみたが、wsprintfは相変わらずstdcallのままであった。D6からはvarargs指令が使えるので、ちょいと実験。

function wsprintf(Output: PChar; Format: PChar): Integer;
 cdecl; varargs; external user32 name 'wsprintfA';

var
  Buf: string;
 N: Integer;
begin
 Memo1.Lines.Clear;
 N := 64;
 SetLength(Buf,1024);
 wsprintf(PChar(Buf),'N: %d %x',N,N);
 SetLength(Buf,StrLen(PChar(Buf)));
 Memo1.Lines.Add(Buf);
end;

 呼べた。確かに呼べた。うー、気色悪…。

ActionManager

 Delphi 6。ActionManagerってのががどんなもんか、体感してみるべくチュートリアルにかかる。…私が使うような代物ではないな。まどろっこしくって。ていう前に、ちと不具合が多すぎるよ、これ。

Delphi6

 Borland Delphi 6が届き、さっそくインストール。が、インストール後の再起動がよろしくない。AUTOEXEC.BAT内のタブが改行に置換えられ、しかもDelphi 6へのPATHが登録されていない。ま、手作業で編集したから良いけども。ファイル名をAutoExec.batに変えたのもインストーラの所業か? Delphi 5に比べ、Userリソースは抑え目だが、GDIリソースをかなり喰う。「インストール番号」、「インストールキー」に加え、「使用許諾コードの取得」が必要になってしまったってのが物悲しい。