作者: davi
日時: 2008/12/25(09:17)
Bruce.さん  <  こん??は でび です

On Wed, 24 Dec 2008 16:45:27 +0900
"Bruce." <kbk@...> wrote:


> > MSDNの引数説明、書式をどうにかして欲しいですね。

> 基本的にあれは機械翻訳そのまま(らしい)ので、

あ、なる…。

> > ところで、fopen_sを使うと、出力の改行がCR+CR+LF(0D+0D+0A)に
> > なっちゃいました。
> 
> 呼び出した後は通常の fopen と変わらないはずなので、切り替えたことによって
> 改行がそのようになってしまったというのは考えづらいのですが。
> そもそも、オープンモードで 'b' (binary) 指定しているんだし。

ん〜…。すると、読み込みがbだからそれはチャンと効いていて、
出力の改行デフォがWindowsだとcrのみになるのかなぁ…。

VBAとかでも、単に改行出力させるとcrのみになるみたいだし。

なお、その部分、昨日メールをpostしたあと、"rt" にしました。
"t"だと文脈に従ったテキストモードになるんじゃないかなぁ、
と期待してのことです。

> それ文字コード関係ありません><

そっかなぁ? crのみ、lfのみ、cr+lfとかって結構扱いが面倒ですよね。
UTF-16のエンディアンとか、BOMの有無とかの扱いなんかと同列にイヤな
感じがするんですが。
日々コードに接していて、「そこはもう、そんなもん。」と割り切って
処理できるかどうか、反射能力の差なんでしょうか。

> '' の中に書けるのは1バイト分だけです。'\r\n' とかしたら
> 警告が出ると思うんですが。

ん?警告出ないよぉ?と思ってコード見たら、エラー時の出力指定を
している関数内だった。><
printfの中だから問題なさそうだったけど、一応、修正しておきました。
ありがとうございます。

−−−−−−−−−−−−−−−−−−−−

> この断片だけ見てもなんとも判断できませんが、0x80 や 0x8000 は
> それぞれ char, (DOS用Cコンパイラの大半での) int の最上位ビットを示してま
> すからまあその辺でなんかやってるんでしょう。
> 0xffは unsigned char の max value ですね。

0x80      → charの最上位ビット
0xff      → unsigned char の max value

おぉ、確かに

|	POS read_txt(unsigned short  *buf, char* file)
|	{

とあるぞな。

でも0xffと決め打ちしているのは、どーして?
標準関数にそういう文字クラスなり定数なりが存在しないんでしょうか。
ライブラリに依存する可能性があるから、それを配慮して決め打ち?

それとも、どうせ直接指定してもたいした記述量じゃないので…、
という好みの問題?

−−−−−−−−−−−−−−−−−−

0x8000    →  (DOS用Cコンパイラの大半での) int の最上位ビット

え〜と、"DOS用"つーことは、"16ビットの"最上位、ということですか?

今いじっているソースは

1993年 オリジナル Turbo C++ Version 1.01
http://www.vector.co.jp/soft/dos/util/se049991.html

2000年 別の人によるWin32化 日本語版フリー BCC 5.5

2004年 更に別の人による MS Visual C++ 2003への移植

…という変遷をしているようです。

んで、ベクターから1993年のオリジナル版のソースを取得して、
VC++2003版と比較しながらVC++2005に移しているんですが、
VC++2003版のcppでも「0x8000」をそのままにしているようです。

例えば、

|	unsigned short *Buf;

と宣言していて、このBufに読み込んだ文字(列)を詰め込んで、常に

|	op = old_s;
|	while ((op_remain_eval = old_e - op) > keep_len) {
|		if ((Buf[op] & 0x8000) != 0) {
|			op++;
|			continue;
|		}

みたいに比較しています。

え〜と、素人の考えかもしれませんが、これってひょっとして、せっかく
32ビットのアドレス空間を使えるのに、昔のコンパイラの制限であった
16ビット分の範囲内に制限して計算しているよ、ってことになりませんか?

もし、この理解で良いのならば、「0x8000」を「0x80000000」に
置換しちゃうのがホントの32ビット化だろ、ヲイ。
ということになるんじゃないかと思うんですが、その理解でおけ?

char と signed char と unsigned char の型の違い(説明読んだけど、
よくわからんかった。計算以外では違いはなさそうですが…)があるから
そのままにしておくのが無難、という落ち?


でび  http://davi.txt-nifty.com/1984/