日本人のBYTEへの異常な愛情

このエントリーをはてなブックマークに追加
1田部:02/04/15 10:40
田部です。
日本人って小さい物が好きですね。
盆栽が好き!

システムヘッダでBYTEを提供している開発環境ならともかく、
プロジェクトリーダーがわざわざ、
BYTEをtypedef して、
開発担当者を、地獄に突き落としてる例がこれです。

で、またまた「2ch.pc.program」の皆様に質問、
質問1:
現代の32BIT以上のCPUにおいて、
なぜ、素直に int 型や、char *を使用しないで
BYTEなんか導入する
プロジェクトが存在するんだろう?
質問2:
なぜ、整数型 int を記述すべきところで
char LoopCnt ;
char i ;
と、char を使用する人が後を絶たないのだろう
補足:
構造体の中や、
I/Oを伴う物では
unsigned char が必要である事は承知してます。

以下に BYTE を愛する人のコードを示します。
以上よろしくお願いします。
2田部:02/04/15 10:41
――――以下:BYTEへの異常な愛情――――――
#include <stdio.h>
#include <string.h>
/*******************************/
typedef unsigned char BYTE ;
/*******************************/
static BYTE *mes[] = {
(BYTE *)"BYTEが、",
(BYTE *)"好きなら、",
(BYTE *)"ゲロを吐く"
} ;
static BYTE byte(BYTE id)
{
BYTE i ;
BYTE buf[BUFSIZ] ;

switch((int)id) {
case 0:
for(i = 0 ; i < 0x100 ; i += 3) {
(void)strcpy((char *)buf,(char *)mes[i%3 + 0]) ;
(void)strcat((char *)buf,(char *)mes[i%3 + 1]) ;
(void)strcat((char *)buf,(char *)mes[i%3 + 2]) ;
(void)printf("%s\n",(char *)buf) ;
}
return 0 ;
case 1000:
return (BYTE)-1 ;
}
return (BYTE)-1 ;
}
int main(void)
{
int i ;
for(i = 0 ; i <= 1000 ; i += 1000) {
BYTE ret = byte(i) ;
if(ret == (BYTE)-1) {
(void)printf("%d\n",ret) ;
}
}
return 0 ;
}
――――――――――――――――――――
以上
見て、勝手使って http://rec.ncos.co.jp
>>1 はウンコ
もしかして、fj.comp.lang.cのコピペ?
5田部:02/04/15 12:27
あげ
まあ春先だから
バイトの小娘への異常な愛情なら自信アリアリですが
>>6
春です。
今ごろ、新人達は
C言語の初歩をやっている頃でしょう。
気分を変えて、新しいスレッドを立ててみました。

現象:
char cs[1024] ;
if(cs[0] == '\0') {
}
と、記述すべきところを

unsigned char ucs[1024] ;
if(strcmp(((const char *)ucs,(const char *)"\0") == 0) ==1) {
;
}
と、記述する人がいます。
疑問:
(a) なぜ、文字列に unsigned を付けるのか?
(b)   なぜ、キャストを好んで大量に付けるのか
(c) なぜ、1文字比較にstrcmp()の関数を呼ぶのか?
(d)   なぜ、文字列の末尾にプログラマが自分で¥0を書くのか
(e) なぜ、「0と等しい事が真ならば」としつこく書くのか

上記の(a) 〜(e)の
どれかに当てはまるコーディングを、
見たことがある方、

なぜ、
「無意味に書いて、無意味に遅いコード」が、
後を断たないのでしょう。
1ステップ幾らの名残だから。
2.プログラムは難解な程美しいという社風だから
11AYAM:02/04/15 14:53
キューブリックに謝れ
12見る増すカラス:02/04/15 14:57
>>8
(a) なぜ、文字列に unsigned を付けるのか?
答 0xffを-1ではなく255と評価したいから

(b)   なぜ、キャストを好んで大量に付けるのか
答 constの意味が良くわかっていないから

(c) なぜ、1文字比較にstrcmp()の関数を呼ぶのか?
答 比較関数を呼ばないと「互換性が無くなる」と上司に怒られるから

(d)   なぜ、文字列の末尾にプログラマが自分で¥0を書くのか
答 安全な方に振ってみたつもり

(e) なぜ、「0と等しい事が真ならば」としつこく書くのか
答 !などを使うと「見難い。保守性が無い」と上司に怒られるから


(b)〜(e)はバカだと思うけど(a)は納得できるかな。
13デフォルトの名無しさん:02/04/15 15:02
>>8
田部って、へんなコード出して
「なぜこんな書きかたをする人がいるのでしょう」
ってパターンばっかりだよな。

「なぜ、あなたの周囲にはレベルの低いプログラマが多いのでしょう?」
ってこっちが聞きたい。
私は小姑みたいに愚痴ってる人が1を真として使うことには
文句をつけないのか不思議でしょうがないです。
(b) 将来誰かがstrcmpを書き換え、引数の型がchar*にされたときエラーを出すために。
16そりゃ:02/04/15 15:53
ロリコンが多いからだろう >>1
田部は帰れ!
って言うか田部って誰よ?
MLスレで、漏れが「関数型言語=盆栽」理論を講釈してやった
相手だと思う。
その説明では田部が何者か全然分からんのだが。
それより BIT はなぜ休刊になりましたか?
bit復刊を願おう。.netがどうだとか
そんな毛唐の一商品についていくら詳しくてもだめろ。
あの雑誌が別に日本の技術レベルを底上げしてるとは
言わないが、象徴的な出来事ではある。
23下司野郎:02/04/15 17:52
コンピュータ・サイエンス娯楽誌
という微妙なジャンルを成立させていた、
読者層が一般誌に流れたのと、
笑いを取れる執筆者が枯渇したからでは?
と勘繰ってみる
バイトをクビになって、今帰ってきました。欝
俺、今日バイトの面接だった。
なんかあっぴぃぃ〜るが足りなかったよ。
たぶん不採用だろうな。
でもいいんだ。いざとなったら親のすねかじって生きてくから。
親が死んだら遺産で(俺んち金持ちなのよね・・・これが唯一の救いだわ)
相続税の計算しとけよ。
27デフォルトの名無しさん:02/04/16 10:49
早朝に田部さんから痛いレスがついてる模様。
指摘された問題点を改めようという姿勢がまるでみうけられませんな。
もはやこれまでかと。
それともfj.comp.lang.cの懐はさらに深いのか?
コンゴノテンカイニキタイ
>>8

(b) なぜ、キャストを好んで大量に付けるのか
答 コンパイラが弾くから。 変数の整合性見直す時間ないし。

答’ コンパイラが弾くから。 後で極力直します。 沢山あると、読みにくくてかなわん。


(c) なぜ、1文字比較にstrcmp()の関数を呼ぶのか?
答 もっともらしい。 ソースサイズを、コメントの次に稼げるし。

答’ 比較が1文字でも文字列だしなあ、とか思うものの何て面倒な事を・・・。
 私は N88-BASIC 出身ってのもあるのだろうけど、初心者が1行に
こんなに詰めて書いているのを見ると、非常に嘘臭く見えるよ。


(d) なぜ、文字列の末尾にプログラマが自分で¥0を書くのか
答 自分で書いておけば、間違えて書き潰してしまっても安全だし。

答’ 初心者の頃、よく分かってなくて私もやってました(笑)。
 先頭に文字数書いておけばこんな苦労しないで済むのにぃ!!とか、
分かってね〜事を叫んだ記憶も(笑)。
 と言うか例題のどこに、自分で '\0' 書いているトコがあるのか?


(e) なぜ、「0と等しい事が真ならば」としつこく書くのか
答 成立する、とはイコール「1」だから。 「==1」と「==0」を定型文化
する事で慣用句となり、可読性が向上する。

答’ C的思考が出来ずBASIC発想だった頃、自分の思考手順をそのまま
書き下すと最後に「〜は成立する」で終わるので、どうしてもそうなっていた
頃がありました。
 初心者ならともかく、玄人さんになってまでコレやってたら適性疑うけどね(笑)。


 ちなみに私は仕事屋さんではなく日曜趣味なんで、それっぽい答と自分の
現状の答’を書いてみました。
 (a) に付いては私もこうしているので、特に言う事ナシ。
31      :02/05/16 16:41



  素朴で単純な、ひとつのもの(箸とか)をいかに使うか
32田部:02/06/15 22:31
ちょっと胃液が臭いでちゅ
>>30
頭に何も付けずに char だけ書くと、signed になるか unsigned になるか
処理系依存だったんじゃなかったっけ?
だから処理系依存にならないようにわざわざ unsigned 付ける人がいたような。
漏れはどっちかというとdereferenceしてからキャストするな。

const char *p = "カラアゲうまうま";

for (; *p; p++) {
  if (((unsigned char)*p - 0xa1) < 0x5e) {
    ...
  }
}