- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:06:26 ]
- malloc(sizeof(char)*(strlen(s)+1))
ではなく malloc(strlen(s)+1) と書くような糞コードばかり見て育った、 悪しき慣習を引きずった人は引退すべし
- 486 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 09:10:16 ]
- 高さを表わすint型の値と重さを表わすint型の値は、
型は同じだけれども、値の意味が違う。 だから、 height = weight ; のような代入は、 C言語の言語仕様的には間違っていないが、 プログラムの意味的には間違っている。 それを機械的に検出できないとは言ってない。 工夫して検出可能にすることもできる。 工夫して検出可能にするか、 あるいは、 小細工せず検出不可能のままにするかは、 自由だ。 ただ、ソフトウェアの規模が大きくなってくると、 「人間が注意してコーディングして、しっかりテストすればいいんだ」 なんて言ってられなくなるので、 機械的に検出できるものは検出しよう、ということになるわけ。
- 487 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 09:28:17 ]
- >>486
そのプログラムの「意味」というのには、 ソースが英語で書かれてる というのが大前提としてあるよね。 仮に、heightが横幅でweightが縦幅を意味する言語があったら、 そのプログラムの「意味」は全く正しいということになる。
- 488 名前:474 mailto:sage [2008/03/26(水) 09:55:54 ]
- >>487
このスレを読み書きしている人で、 heightとweightが英語だと理解しなかった人がいたら、 手をあげて欲しい。 そういう人がいたなら、次からは何か改善するよ。
- 489 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 10:02:53 ]
- height = weightを機械的に検出しなきゃいけないってどんだけw
なんのための変数名だよ
- 490 名前:474 mailto:sage [2008/03/26(水) 10:25:44 ]
- 例がわかりやすいように、わざと豪快に間違ったコード片を書いた。
ここまで豪快なミスは少ないだろうが、このタイプのミスをしたことの ある人はいるでしょう?
- 491 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 10:37:20 ]
- その手の間違いでNASAの火星探査が失敗したってニュースがあったような
- 492 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 10:37:42 ]
- >>488
問題は人間じゃなくて、機械がそれを英語かどうかを判断できないってこと
- 493 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 10:41:07 ]
- >>488
例えば、heightをheiと省略したらその「意味」は通じなくなるし、 他にもhaightとミスタイプしたら通じなくなる。
- 494 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 10:43:10 ]
- >>491
そりゃデバッグが足りなかっただけで、 それを言語仕様のせいにするのはちゃんちゃらおかしいだろw
- 495 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 11:27:35 ]
- そこでアプリケーションハンガリアンですよ。
local.joelonsoftware.com/mediawiki/index.php/%E9%96%93%E9%81%95%E3%81%A3%E3%81%9F%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AF%E9%96%93%E9%81%95%E3%81%A3%E3%81%A6%E8%A6%8B%E3%81%88%E3%82%8B%E3%82%88%E3%81%86%E3%81%AB%E3%81%99%E3%82%8B
- 496 名前:474 mailto:sage [2008/03/26(水) 11:34:13 ]
- >>492
>>493 貴方達が人工知能的なアプローチしか頭にないのは、わかった。 俺らはtypedefを使ってコーディングして、それを機械的にチェックする。
- 497 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 11:47:31 ]
- >>494
そういう考え方だと大きなプログラムのデバッグは大変だな。
- 498 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 13:11:47 ]
- 機械的ってのはコンパイラが検出という意味ではないのか。
TypedWidth redBoxWidth; TypedHeight redBoxHeight; : TypedWidth blueBoxWidth = redBoxHeight; TypedWidth GreenBoxWidth = (redBoxWidth + redBoxHeight) / 2 とかコンパイルエラーになったら途方に暮れるもんな。 幅と高さは、型を分ける必要は感じないな。 熱量と体積とか、加速度と質量とかなら、型を分けて演算や代入に制限を加えるのは望ましいと思う。
- 499 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 14:48:04 ]
- heightとweightの話をしてるのに気づかない人がいた
- 500 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 15:59:06 ]
- >>496
>474に出てくる変数はすべてint型ですが? 少なくとも、今の話題にtypedefは関係ないよね。 それはまた別の話。 >>497 というかさ、コンパイラにプログラムの意味を解釈させるというのは、全く現実的な話じゃないわけさ。 プログラマの意図する「意味」とコンパイラの意図する「意味」の整合性を保つのがどれだけ大変かわかってるの? テストを行う方が圧倒的に簡単だし、 そもそも俺には「コンパイラに意味を解釈させれば論理エラーが減る」 という考え方の方がよっぽどデバッグを大変にすると思うんだよね。 >>499 そこで質問なんだが、なぜ重さを高さに代入してはいけないの? BMI指数なんかは、体重/身長^2 で計算するんだがこれは論理エラーなのか? 超体重理論の公式が、高さ=重さ*2.5 だった場合はどうなんだ? 他にも、例えば Tundere = Deredere はエラーになるのか? Yandere = Tundere の場合はどうなのか?
- 501 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 17:07:34 ]
- >>500
>BMI指数なんかは、体重/身長^2 で計算するんだがこれは論理エラーなのか? BMI指数の次元が 重さ/長さ^2 であるってだけのことだなぁ。 >超体重理論の公式が、高さ=重さ*2.5 だった場合はどうなんだ? それはきっと次元を持つ比例定数が省略されてるな。(超体重理論って何?) PV=nRTのRみたいな。
- 502 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 17:19:08 ]
- www.boost.org/libs/mpl/doc/tutorial/dimensional-analysis.html
C++なら次元解析なんかメタプログラミングで独自の型システム構築すればいいだけなのにね!
- 503 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 17:19:45 ]
- >>501
例えば、PV=nRT で V=1, nR=1 なら簡略化して P=T と書けるよね。 つまり、pressure = temperature、圧力 = 気温 となるわけだ。 これは正しいんだよな? そこで何度も同じ事を聞いて申し訳ないんだが・・・ なぜ height = weight が絶対に間違いだと言い切れるんだ? どうして重さを高さに代入するのが「論理エラー」になるんだ? 比例定数1が隠されてる可能性は絶対にないと言い切れるのか?
- 504 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 17:27:12 ]
- 仮にheight = weightが正しい(意図してそうする)のであれば、
型でいうところのキャストみたいに、明示すればいいということだと思う。
- 505 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 17:57:12 ]
- 前提を隠されて「圧力 = 気温」と言われたら、間違ってるとしか言えない。
間違いと言われたくないなら前提を隠さないでくれ。
- 506 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 18:32:12 ]
- >>504, 505
>>474の > int height ; > int weight ; > 中略 > height = weight ; をエラーにするっていうのはこういう意味だよ。
- 507 名前:474 mailto:sage [2008/03/26(水) 18:55:09 ]
- >>500
> 少なくとも、今の話題にtypedefは関係ないよね。 いや関係ある。 1. 引数の型が違う → 型をチェックすれば、検出できる間違いがある 2. 引数の型は同じだが、値に互換性がない → 値の互換性をチェックすれば、検出できる間違いがある 3. 引数の型が同じで、値にも互換性があるが、変数を取り違えている → お手上げ こういう3段階があるものの、基本的には同一の問題だろう。 > コンパイラにプログラムの意味を解釈させるというのは、全く現実的な話じゃないわけさ。 その通り。俺に対して反論してる人が現実的ではない話を持ち出してるだけだぞ。 なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。 > BMI指数なんかは、体重/身長^2 で計算するんだがこれは論理エラーなのか? そういう計算をする関数は数が限られているのだから、 それが意図したものであれば、慎重にチェックの対象から外せばいい。
- 508 名前:474 mailto:sage [2008/03/26(水) 19:05:52 ]
- >>503
> 例えば、PV=nRT で V=1, nR=1 なら簡略化して P=T と書けるよね。 そこでスレタイ。1だからといって省略すべきではない。 そして、間違える余地を減らすためにも、 PをV、n、R、Tから求める関数を作って必ず使うようにすべき。 関数を使う以上、引数には1を渡すしかあるまい。 いまどきのコンパイラはinline展開してくれるからP=Tと同じ結果になろう。 > なぜ height = weight が絶対に間違いだと言い切れるんだ? なぜなら、間違ってheight = weightと書いたという例だから。 >>506 色々とバグで痛い目を見ると、考え方が変ってくるかもよ。
- 509 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:45:35 ]
- >>507
型が同じか違うかで、この問題の解答が全く変わってくる。 「基本的には同一の問題」というのはダウトだろう。 実際、>>507の1,2,3で間違い検出の可能性が全く違っているし。 > なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。 > >>474 を見たら、「コンパイラによる意味解釈」ということしか思いつかないのだけど。。。 他に>>474の解釈があるなら是非教えて欲しい。 「型が同じでも違っても基本的には同一の問題だから、型チェックでどうにかする」 みたいな詭弁は無しの方向で頼む > それが意図したものであれば、慎重にチェックの対象から外せばいい。 > チェックの対象から外すというけど、そもそもそのチェックって一体どうやってやるんだい? 型チェックなら、古の言語Cでもすでにやってし、 なによりそれでで解決がつくなら、>>474でint型しか出さなかった理由がわからない。 確認するけど、型チェックは大前提としあって、 他にも意味論を持ち出せばさらにバグが減らせるという主張でいいんだよね?
- 510 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:47:23 ]
- > そこでスレタイ。1だからといって省略すべきではない。
> 仮に sizeof(char) が省略すべきでないとしても、省略することは常に可能。 つまり、1は常に省略される可能性があるし、それは常に正しくあるべき。 というか、1をかけるかどうかで意味が変わってきたら、 「だから○○は使えねえんだよw」 (○○には好きな言語やライブラリ名をどうぞ) とか言われそうなんだけど > なぜなら、間違ってheight = weightと書いたという例だから。 > たしかに>474はそれを間違いだと知ってるかもしれない。 でも、少なくとも俺にはそれが分からなかったし、もっと言えばコンパイラにはなんのことやらチンプンカンプンだろう。 なのでコンパイラにそれが間違いだと教える必要があるのだけど、それは一体どうやってやるの?
- 511 名前:デフォルトの名無しさん mailto:sage [2008/03/26(水) 19:59:24 ]
- 省略すべきでないのは型の使い分け・型変換の明示だろう。*1なんかいらない。
charとかstrlenとかをハードコーディングしちゃうのではね。
- 512 名前:498 mailto:sage [2008/03/27(木) 14:19:26 ]
- 素で間違えてた。眼鏡買ってくる。
>474とそのフォロワーが何人かいるのだとおもうが、 >509 多分フォロワーは、(現実的に可能なら)型を分けるべきという議論をしていると思う。 >474は、>496でtypedefでも機械的にチェックできると言ってるが、フォロワーは同意しないかもしれない。 圧力と気温を別の型として扱う型システムが手に届くところにあったら >509 も使うでしょ? 今は自前で定義するもの大変だし定番ライブラリも無いしね。
- 513 名前:デフォルトの名無しさん [2008/03/27(木) 16:10:03 ]
- 関数をハードコーディング?
- 514 名前:474 mailto:sage [2008/03/27(木) 22:48:04 ]
- >>509
変数の取り間違い、という同一の問題です。 段階0として、人間が目を皿にして探す、ってのを入れてもいいよ。 > >>474 を見たら、「コンパイラによる意味解釈」ということしか思いつかないのだけど。。。 > そもそもそのチェックって一体どうやってやるんだい? LINTの類いを使っていないと、それしか思いつかないのかもしれないね。 > >>474でint型しか出さなかった理由がわからない。 C言語のtypedefはtypedefしてたってintはintだよ。 > 確認するけど、型チェックは大前提としあって、 > 他にも意味論を持ち出せばさらにバグが減らせるという主張でいいんだよね? 「意味論」なんて持ち出してないぞ。
- 515 名前:デフォルトの名無しさん mailto:sage [2008/03/27(木) 22:57:35 ]
- >>510
> つまり、1は常に省略される可能性があるし、それは常に正しくあるべき。 省略したらバグるべきだとは主張してませんが? してもしなくても動作は変らないけど、 プログラムを読んだ人間に意図がわかるようにするために省略すべきではないのよ。 > 少なくとも俺にはそれが分からなかった 例や文章が不適切でゴメンね。 でも、今までの話で分かったでしょ? > なのでコンパイラにそれが間違いだと教える必要があるのだけど、それは一体どうやってやるの? 機械的に検出するためには、機械的に検出できるようにコーディングするのよ。 コンパイル時にエラーになるだけが、検出ではないよ。 >>513 charやwchar_tを直に書かず、マクロやテンプレートによって切り換え可能にすることに対して、 それらを直に書くことをハードコーディングというのだろう。
- 516 名前:474 mailto:sage [2008/03/27(木) 22:57:56 ]
- おう、515は名前欄かきわすれた。
- 517 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:02:37 ]
- >プログラムを読んだ人間に意図がわかるようにするために省略すべきではないのよ。
それは常識が共有できている時しか成り立たない。 変なコードが書いてあったら書いた奴に意図を聞きたくなる。 そしてスレタイ。*sizeof(char) を書くべき派といらない派は、この点において常識を共有できていない。
- 518 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 00:39:49 ]
- 問題はいらない派がわかってて省略しているのかどうか
- 519 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 14:45:44 ]
- >>514
LINT の類でお勧めは何だ?
- 520 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 15:18:57 ]
- splint
- 521 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:25:44 ]
- >>514
> LINTの類いを使っていないと、それしか思いつかないのかもしれないね。 > LINTでどうやって間違いを検出するのかというと・・・ C言語ならforとかwhileとかを「キーワード」という特別な扱いにして その周辺の文法や、他にもよくありがちな構文上の間違いが無いか検証するわけね。 話を戻すとつまり、weightとかheightや他の英単語をキーワードとして扱うということ? > C言語のtypedefはtypedefしてたってintはintだよ。 > >>474で重要なのは、weightとheightが「同じ型である」ということなわけ。 同一の型の代入を、「変数名が間違っている」という理由でどうやってエラーにするの? と何度も聞いているのだけど。 > でも、今までの話で分かったでしょ? > ぜんぜん分からないのだけど。。。 >>474は一体何が問題なのか? というところから分からない
- 522 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 19:41:51 ]
- >>515
> 機械的に検出するためには、機械的に検出できるようにコーディングするのよ。 > コンパイル時にエラーになるだけが、検出ではないよ。 > 間違いを検出するのは、コンパイル時ではないということ??? あなたの主張が全く見えないので、以下で確認させて欲しい。 問1) >>474は具体的にどこが間違っているのか? 1、weightとheightが同じ型であるところが間違っている。これらは型を分けるべき 2、(同じ型であっても)名前が間違っているのは明らかだから、代入したらエラーがでるべき。 3、その他 問2) あなたのいう「機械的に検出」とは具体的にどのような方法で行うのか? 1、weightとheightの型を分ける 2、weightやheightや他の英単語をキーワードとして登録し、その使われ方をチェックする 3、コンパイラや他の何か(例えばLINTやリンカなど)に意味解析をさせる 4、その他 問3) >>474の間違いを検出するフェーズは具体的にどこか? 1、コンパイルの開始前(いわゆるLINT) 2、字句解析時 3、構文解析時 4、構文木を作った後の独自のエラーチェック時 5、コード生成時 6、実行時 7、その他
- 523 名前:474 mailto:sage [2008/03/28(金) 22:06:15 ]
- >>521
> weightとかheightや他の英単語をキーワードとして扱うということ? No. > 同一の型の代入を、「変数名が間違っている」という理由でどうやってエラーにするの? さぁ。 それはあなたが言い出したことなのだから、自分で考えてくださいな。 >>522 > 間違いを検出するのは、コンパイル時ではないということ??? コンパイル時に限らない。 > 問1) 3 > 問2) 4 > 問3) 7
- 524 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:10:35 ]
- ワラタ
答えられないのかよ
- 525 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:47:39 ]
- >>523
電波に付き合うなよ
- 526 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 22:56:07 ]
- 適当に振ったネタが予想以上に好評でウケタw
- 527 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 23:18:40 ]
- そもそも変数名にheightやweightってつけるのは、人の目から見て意味のある名称にして
人間が間違えないようにするため。 それを機械的にって根本的におかしいだろ。
- 528 名前:デフォルトの名無しさん mailto:sage [2008/03/28(金) 23:26:51 ]
- >>527
> なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。
- 529 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 01:45:42 ]
- 趣味で独自の作法でプログラム書いてる人間には理解できない世界のお話。
- 530 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 16:29:22 ]
- >>524の未熟さが微笑ましい
- 531 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:11:22 ]
- 世の中には、
mallocしたものをfreeするとバグの原因になるからfreeしないほうがいい どうせプロセスが終了するときに解放されるのだから なんて言う人もいるのですよ。
- 532 名前:デフォルトの名無しさん mailto:sage [2008/03/29(土) 23:28:43 ]
- また古い話を持ち出してきたなぁ。
- 533 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 00:43:34 ]
- そのネタ飽きた
- 534 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 16:27:19 ]
- ていうかmallocするとバグの元になるから
そもそもなるべくmallocしないで済む設計にするのがいいよ
- 535 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 17:45:10 ]
- プログラム組むとバグの元になるから...
- 536 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 21:25:10 ]
- だからデバッグ済みのライブラリを使うのですよ。
- 537 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 21:51:22 ]
- そのライブラリを呼び出すコードがバグの元になるから...
- 538 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 21:53:52 ]
- > なんで明らかにダメな方向に誤解して、その誤解の上でしか成りたたない反論をするんだろ。
- 539 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 22:58:15 ]
- ネタだから。
- 540 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 23:37:05 ]
- ネタをネタとわからない人には(
- 541 名前:デフォルトの名無しさん mailto:sage [2008/03/30(日) 23:51:53 ]
- >>474 が書いたコードを見てみたい・・・
何か放流してくれないかな?
- 542 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 07:39:29 ]
- typedef int WEIGHT;
typedef int HEIGHT; WEIGHT weight; HEIGHT height; height = weight; // warning: 型の異なる代入ですというコンパイラは存在するのか
- 543 名前:デフォルトの名無しさん mailto:sage [2008/06/12(木) 07:51:23 ]
- PODと非PODを区別しろよ
- 544 名前:デフォルトの名無しさん mailto:sage [2008/06/14(土) 23:56:31 ]
- そういうのはクラス化するという例をEffective C++で最近読んだ。
- 545 名前:デフォルトの名無しさん mailto:sage [2008/06/15(日) 00:44:21 ]
- >>543
そう言う問題じゃなくて、POD であることはわかってるけど、 プログラマが別の型と定義したんだから、 警告するようにすれば 身長 × 体重 なんてしてしまうバグを減らせると言うことなんだ ろう。 >>542 言語は違うけど、Pascal とか Ada はそう言う型を定義できる。 現状の枠内でやろうとするなら、>>544 の方法がいいと思う。
- 546 名前:デフォルトの名無しさん mailto:sage [2008/09/16(火) 23:54:11 ]
- strong typedefを知らずにこんなスレに書き込む奴がいたのか
2008年だぞ今年…
- 547 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 09:21:36 ]
- 後からのこのこ現れて間抜けな事を書き捨てていく奴って何なの?
流行ってんの?
- 548 名前:デフォルトの名無しさん mailto:sage [2008/09/17(水) 23:29:21 ]
- >>547
よう、低脳
- 549 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 00:57:02 ]
- >>548
よう、ド低脳
- 550 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 07:56:04 ]
- 独自の拡張にメリットを見い出せないからこそBOOST(ライブラリ)やD(派生言語)でstrong typedefを実現しているのだけれど
>>547 間抜けだという理由をどうぞ さぞかし説得力のある解説をして下さるのだろう 単純に既存のC/C++処理系の拡張としてtypedef警告が実装されていたら WindowsやOpenGLのプログラムなんてやってられないと思うのだがね
- 551 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 08:41:21 ]
- 3ヶ月も経ってからレスしてたらやっぱり間抜けだろ。
- 552 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 11:44:15 ]
- スレ違い…ってのはまあ、3月以降全部そうか。
- 553 名前:デフォルトの名無しさん mailto:sage [2008/09/18(木) 17:42:08 ]
- >>551
わざわざ煽りレスして理由がそれってのは苦しいと思うが…
- 554 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 05:21:06 ]
- IDないと句読点や三点リーダの不備が余計目立つな。
- 555 名前:デフォルトの名無しさん mailto:sage [2008/09/21(日) 06:25:06 ]
- 日本語でokというか、独り言なら書かなくてよし
- 556 名前:デフォルトの名無しさん [2008/10/20(月) 09:05:31 ]
- 馬鹿な>1っているもんだな
- 557 名前:デフォルトの名無しさん mailto:sage [2008/10/24(金) 01:19:22 ]
- #define strlen(a)
って宣言してみる。
|

|