http://www.cmagazine.jp/src/kinjite/c/n ... ml#index38
このサイトで少しずつ勉強しています。
1.エンディアンの存在を無視する
2.ポインタをlong型変数で保持できると決めつける
3.stdio.hと同じディレクトリにプライベートヘッダを置く
4.構造体のパッキングを無視する
のそれぞれで
1.エンディアンの意味は知っていますが直接的にプログラミングにどう関わってくるのでしょうか?
2.言いたいことがなにかわかりません><。
3.stdio.hと同じディレクトリにプライベートヘッダを置くことの弊害(?)がわからない・・・
4.説明が短すぎてよくわからない・・・
と4つの問題が発生しました・・・・
ご協力おねがいします><。
ちょっとしたことですが・・・
Re:ちょっとしたことですが・・・
ソフトバンククリエイティブがこの3月に発行した
「すべてのプログラマに効く 危険なプログラムの処方箋」という書籍が、
どうもそのサイトの内容をもとに単行本化したもののようです。
「すべてのプログラマに効く 危険なプログラムの処方箋」という書籍が、
どうもそのサイトの内容をもとに単行本化したもののようです。
Re:ちょっとしたことですが・・・
改めて 2000年4月号の記事を見直してみました。
いいこと書いてありますね。
ホント、廃刊が残念です。
>1.エンディアンの存在を無視する
単独のプラットフォームで完結するプログラムにとっては影響がないです。
しかし、例えば Intel+Windowsと PowerPC+Macとか複数の環境でバイナリーデータの
やりとりを行うときにエンディアンの問題が発生します。
例えば
そして、aというファイルにはファイルの先頭からバイナリーデータで
[color=#d0d0ff" face="aria[/url]12 34 56 78[/color]
という4バイトのデータが入っていたとしましょう。
さて、freadが終わった後 valueに入っている数値はいくつになるでしょうか。
或いは
で、valueの値はどうなるでしょうか。
それぞれの環境での valueの値を考えてみて下さい。
>「2.ポインタをlong型変数で保持できると決めつける」
>言いたいことがなにかわかりません
ポインタをlong型変数で保持というのは
こういうようなコードです。
もし、この環境が sizeof(long) < sizeof(int*)だったら??
>3.stdio.hと同じディレクトリにプライベートヘッダを置く
>弊害(?)がわからない
サイトにも書いてありますが、弊害はあまり顕著ではありません。
しかし、確実に存在します。
stdio.hと同じディレクトリは普通はコンパイラが管理しているディレクトリであり、
コンパイラをバージョンアップしたりアンインストールしたりしたときに、
そのプライベートヘッダが消えてしまうかもしれません。
又、コンパイラベンダーが提供するヘッダ名と名前が被った場合、
コンパイル時に間違ったファイルを includeしてしまうかもしれません。
他にも、ソースを管理する上で様々な不都合が生じます。
複数人で開発をしていて、バージョン管理とかしはじめると特に。
>4.構造体のパッキングを無視する
同じ構造体でも環境が違えば、構造体のサイズが異う可能性があります。
それどころか pragmaが使われれば、同じ環境も異なってくる可能性があります。
それを念頭においた上で fwriteで構造体を丸ごとファイルなどに書き出した場合、
別の環境ではどう読み込めばいいのか、を考えてみて下さい。
あともう1つ。構造体同士の比較で memcmp1回で比較できるかも
考えてみるといいかと思います。
いいこと書いてありますね。
ホント、廃刊が残念です。
>1.エンディアンの存在を無視する
単独のプラットフォームで完結するプログラムにとっては影響がないです。
しかし、例えば Intel+Windowsと PowerPC+Macとか複数の環境でバイナリーデータの
やりとりを行うときにエンディアンの問題が発生します。
例えば
[color=#d0d0ff" face="monospace] int value;
FILE *fp = fopen("a", "r");
if(fp)
{
fread(&value, sizeof(int), 1, fp);
fclose(fp);
}[/color]
というプログラムがあったとしましょう。そして、aというファイルにはファイルの先頭からバイナリーデータで
[color=#d0d0ff" face="aria[/url]12 34 56 78[/color]
という4バイトのデータが入っていたとしましょう。
さて、freadが終わった後 valueに入っている数値はいくつになるでしょうか。
或いは
[color=#d0d0ff" face="monospace] int i, value;
unsigned char *pc = (unsigned char *)&value;
for(i=0; i<sizeof(int); ++i)
*pc++ = (unsigned char)(i+1);
[/color]
で、valueの値はどうなるでしょうか。
それぞれの環境での valueの値を考えてみて下さい。
>「2.ポインタをlong型変数で保持できると決めつける」
>言いたいことがなにかわかりません
ポインタをlong型変数で保持というのは
[color=#d0d0ff" face="monospace]int value = 0x12345678;
long l = (long)&value;
[/color]
こういうようなコードです。
もし、この環境が sizeof(long) < sizeof(int*)だったら??
>3.stdio.hと同じディレクトリにプライベートヘッダを置く
>弊害(?)がわからない
サイトにも書いてありますが、弊害はあまり顕著ではありません。
しかし、確実に存在します。
stdio.hと同じディレクトリは普通はコンパイラが管理しているディレクトリであり、
コンパイラをバージョンアップしたりアンインストールしたりしたときに、
そのプライベートヘッダが消えてしまうかもしれません。
又、コンパイラベンダーが提供するヘッダ名と名前が被った場合、
コンパイル時に間違ったファイルを includeしてしまうかもしれません。
他にも、ソースを管理する上で様々な不都合が生じます。
複数人で開発をしていて、バージョン管理とかしはじめると特に。
>4.構造体のパッキングを無視する
同じ構造体でも環境が違えば、構造体のサイズが異う可能性があります。
それどころか pragmaが使われれば、同じ環境も異なってくる可能性があります。
それを念頭においた上で fwriteで構造体を丸ごとファイルなどに書き出した場合、
別の環境ではどう読み込めばいいのか、を考えてみて下さい。
あともう1つ。構造体同士の比較で memcmp1回で比較できるかも
考えてみるといいかと思います。