この会社辞めようと思ったソースコード。
プログラマとして幻滅するソースコード。
プログラマを悩ませるソースコード。
をつらつらと綴っていって頂戴。
ちなみにここは質問スレじゃないので
技術的な質問がしたいならム板に逝って。
2 :
仕様書無しさん:2005/04/16(土) 16:16:31
2げと
ぬる
乙>1
ぬるぽぉおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおおお
0xは?
>7
そう言えば前スレにも0xもなけりゃ&hもないな。
まぁ>1乙
9 :
1:2005/04/16(土) 19:57:42
前スレどころか過去スレ全部 #n だったと思う。
ぐちスレとかと勘違いしてない?>7
11 :
1:2005/04/16(土) 22:31:30
>10
ありがとん。ノシ
dat落ち云々が分かんなかったんでさぼりました(*'▽'*)エヘッ
まあ#11はいいんじゃね?
おれは#19のあとのスレ立てに要注目かと。
static void usage(void){
char usage[] = USAGE;
fprintf(stderr, "%s",usage);
exit(1);
}
さて、まずどこからつっこんだものか
4 つくらいかな? つっこむべきところは。
本スレあげ
>13
関数内で配列をわざわざ宣言せずに、
直接fprintfの中にUSAGEをぶち込めよ
・・・ぐらいしかツッコミどころがわからんorz
ほかはどこがおかしいんだ?
17 :
仕様書無しさん:2005/04/18(月) 20:58:47
voidなのにexit(1)してる
18 :
仕様書無しさん:2005/04/18(月) 21:12:26
あとは
・fputsでええやんとか
・呼んだ先で不用意にexitするなとか(これは許容範囲か?)
>16
そして fprintf(stderr, USAGE) と書いてはまるクチだね、君は。
\nは?
考えていたことは大体、出たな。あと
なぜわざわざ関数にする?マクロで充分じゃないか
くらい
inline で(ry
うさ毛ってどこの毛ですか
24 :
16:2005/04/18(月) 21:57:57
>19
いや直接ぶち込むってそういうんじゃなくって、
fprintf(stderr, "%s",USAGE);
とすることだったんだけど・・・
俺の書き方まずかったかな
usageが重複してるのがきもいと思った。
あと、fputsで良いのでは?も同意だが、辞めようと思うほどのことかね?
>>17 何で駄目なんだっけ?
>>20 USAGEに含まれてれば問題ないじゃん。
> char usage[] = USAGE;
なぜ配列なのかと
やるとしたら const char *usage だろ
>>25 ダメじゃないと思われ。たぶん、
>>17 は ret(ry
>>19 > そして fprintf(stderr, USAGE) と書いてはまるクチだね、君は。
ん、どうはまるんです?最後にセミコロンがないってこと…?
>>28 #define USAGE "このプログラムは100%sprintf互換です。"
だったらどうなるかな。
というか、USAGEってどこにも定義されてないと思われ。
提示されたソースコードに含まれていない定数を勝手に想像するのはいかがなものかと。
きっと、こんなふうにオーバーランさせてるんだよ
#define USAGE "",*c;memcpy(c,CODE)
32 :
仕様書無しさん:2005/04/19(火) 01:55:40
× USAGE
○ USAGI
>>14 上の口と、下の口と、菊と...に、尿道もか!?
つりでした
>>29 なるほろ。
と思いましたが、コンパイルで気付きますね。
>>36 試しにやってみたけど、手元のVC7.0ではスルーされた。
というか、「間違っててもコンパイラが教えてくれるからいいや」ってのは
かなり危険だし、そもそも問題の焦点がズレてるんじゃないかと思うが。
>36
そこはコンパイル時に気付か(け)ない。 printf系関数の弱点というかなんというか。
>>38 gccだとリテラルなフォーマット文字列に限り、
可変個引数部分との整合性チェックしてくれるんじゃなかった?
char *format = "%s";
printf( format );
みたいなことすると駄目だった気がするけど。
ライブラリ関数についてコンパイラが知っているというのは
本来期待できないことなので、見つけてくれたら御の字だけ
どそれを当てにしてはいけない。
GCC言語の場合は期待できるのです。
Cの場合は無理だな。
GCC言語?
GCCって'GNU Compiler Collection'の略ということにされてなかったっけ?
今はそう。
ガッデム!コンチクショー!コンパイラ
ゴキブリコイコイ
ゴスリングこのやろうこのやろう
あー、これはemacsかも。
0番地: DI
LD SP,STACK ;<--これは0
JP START
・・・
START: CALL INIRAM
CALL INIIO
DI
LD SP,STACK
CAL INICC
・・・
この2度目のSP設定は何なんだ・・・
Set RJOB = DB2.OpenRecordset("hogehoge", dbOpenTable)
If RJOB.BOF And RJOB.EOF Then
たぶん用心深い人だったんだろうね
CALLしたあとでSPが保持されてないんじゃない?
てか、その言語なにかよくわからんけど
言語はZ80。リターンしたときSPが違ってたらふつうはここに戻ってこられないじゃん。
もともと0番地はSTARTへジャンプする命令だけが書いてあって、その後付け足した
際の修整ミスっぽいんですよね。でも今となっては呼んだ先がSPを壊して戻る可能性
が1%でもあると外せないです。
>>51 >リターンしたときSPが違ってたらふつうはここに戻ってこられないじゃん。
50は組み込み系の仕事をしたことがないと思われる。
SPがスタックポインタであるとか
関数が呼ばれた時どういう処理が行われているかとか
知らないんだと思う。
人のことはどうでもよいのだが
CALL から RET 使わずにもとの処理に
もどることもできる
ソフトウェアリセットで START: のとこに飛ぶケースがあるんじゃない?
まぁ、本当にただの無駄だったとしても、そんなに気にしなくてもいいような。
printf (" や ら ま い か");
>55
浜松人ハケーン
>CALL から RET 使わずにもとの処理に もどることもできる
このテクニックはタスク機能を提供するモニタなどで実際に使われるね。
反対にRETで「呼ばれた以外の所にジャンプする」テクもある。
ジャンプ (Reg)の機能を持つ機械語が無いとできないけど。
>57
「ジャンプ(Reg)」って、レジスタの示すアドレスにジャンプするってこと?
何の関係があるんだ…。
飛び先をスタックに積んでRETするだけだと思うんだが。
通常の戻り先アドレスにデータを配置して、サブルーチン側で
スタックを操作して、戻り位置をデータの直後に変更してからRET
というテクニックもあるね。
Z80なんかだと、幾つかの特定アドレスへのCALL命令を1byteで
記述できるから、1byteでも短縮するために、MSXなんかでは
BIOSがこの方法を採用してた。(うろおぼえ)
CALL命令の直後にパラメータを並べといて
パラメータの後ろにRETなんてのは良くやったよな
スタックにパラメータを積むってのも見たことある
何のメリットがあるのかは分からんけど
>>60 コンパイラのオブジェクト見てみろ。
それが普通だ。
つか、いわゆる関数呼び出しとはどうゆうものか知っとくように。
ここは一応プログラマ板だろ。
>>58 RSTですな。PC88ではあんまり用事がなかったような希ガス。
>>62 古株とかHW系やってないと意識しないよ。
register変数の取り扱いなんてコンパイラ依存だったりするし。
>64
ぅぃ?register変数てのは関数内部での話じゃないっけ@C言語
…いや、static関数なら別な可能性もあるのかな?忘れた。
register指定なんてしたことないからなぁ。
>64
register変数の取り扱いなんてコンパイラ依存であることと
スタックにパラメータを積むことと何の関係が?
auto変数がスタック上に作られることと誤解しているんじゃないの?
とりあえずアセンブラ勉強しろ
そうすりゃ関数呼び出しくらいはわかる
>>64がなぜregister変数を出したかは知らんが・・・
古株とかHW系やってないと意識しないことの別の例としてregister変数持ち出したんでないの?
或いは、register 修飾した引数を想定してるとか。
int register;
int auto;
警告: 空の宣言です。
このコンパイラ、壊れてる!
int entry;
も欲しいところです。
printf(" と に か く や ら せ ろ ");
>>74 printf(" と に か く や せ ろ ");
puts( "お 断 り だ" );
puts( "お と こ わ り だ" );
>>73 あー、entryもか。実際には見たことないけど、何だっけ、これ?
歴史的事情による古語?
>>71 引数にregisterをつけたとして、その情報を活用できる
コンパイラ実装というのは実際にありえるのか?
# つか、ねえよな。
>79
現存するかはぁゃιぃがあり得ないとも言い切れないのでは。
いや、実例も知らないしコンパイラ作れないけど漏れ
entryはK&R初版時代には予約語だったはず。結局具体的な意味を与えら
ないままANSI Cでは予約語ではなくなった。K&R第二版ならそのへんのこ
とが書いてあったと思う。
第二版には「entryは、もはや予約語ではない」と書いてあるぞ。
第2版はANSICだからね。81が言ってるのもそういうことでしょ。
グローバル変数どころか、非表示のテキストボックスで値を保持している前任者を
頃してもいいですか?
>84
CEditViewの文字列をCWndのウインドウタイトルに持たせている
MFCを先にヌッコロしてからにしてください。
>>87 ( ゚д゚)
(つд⊂)ゴシゴシ
(;゚д゚)
(つд⊂)ゴシゴシ
_, ._
(;゚ Д゚)
スレ違いだけど
まだ自分がビット演算を知らない厨房だったとき、
代わりに素数の積でフラグを持たせていたことがあったな
普通1,2,4,8,16…のビット和で持つのを3,5,7,11,13…の積で変数に持たせる
>>84を見てふと思い出した
そんな全然違うこと無理矢理思いださんでも。
INT WINAPI WinMain(HINSTANCE hInsatnce ......
んっ?
ん?
>>88,89
おれは
>>87じゃないけどさ、VBなんかだと、アプリケーション全体ではなくて、
ウインドウ単位で情報を保持しておきたい時なんかに良く使われてたのは事実だよ。
いまでもそうなのかは俺は知らないけど。
95 :
仕様書無しさん:2005/04/30(土) 22:41:49
VBとかでウインドウ(フォーム)単位で情報保持する為だとしても、
非表示テキストボックスする必要性が分からないな。
普通に変数に格納しておけば良いだけじゃん・・・
これだからVBerは嫌われるんだよ
Web開発じゃねえんだからよ
配列のソートのため、非表示istboxを用意してSortメソッド呼ぶようなのが「VB的」と
言われていた時期があったのは確か。
textboxはわからないけど。
確かにとってもVB的ではある。
いい意味か悪い意味かはあえて申しますまい。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| $data=~ s/(\W)/sprintf( "%%%02X",unpack('C',$1))/ge;
\
 ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・) ∧ ∧ < Perlで16進か?
( ⊃ ) (゚Д゚;) \____________
 ̄ ̄ ̄ ̄ ̄ (つ_つ__
 ̄ ̄ ̄日∇ ̄\| BIBLO |\
 ̄ ======= \
>101
Perlでバイナリデータをいじってどこが悪いんだよヽ(`Д´)ノ
売り飛ばし先が決まるまでの暇に任せてJScriptでBlowFishを実装しようと目論んだ漏れよりゃましだ。
(ちなみに「目論んだ」というだけあって未完だ_| ̄|○)
>>94 ウィンドウプロパティが使えなかった頃の話かな?それなら納得だ。
全否定的なこと書く人たち、Windowsをよく分かってないぞ。
口空けて笑っていいですか。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| $data=~ s/(\W)/'%'.unpack('H2', $1)/ge;
\
 ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・) ∧ ∧ < >101の改良版か…
( ⊃ ) (゚Д゚;) \____________
 ̄ ̄ ̄ ̄ ̄ (つ_つ__
 ̄ ̄ ̄日∇ ̄\| BIBLO |\
 ̄ ======= \
>>101 つか、何をしようとしてるの、これ?
わからんけどPerlならもっと簡単(≠きれい)に書けるよな、きっと。
# そこが笑いどころなの?
>Windowsをよく分かってないぞ。
うぷぷぷ。
109 :
仕様書無しさん:2005/05/01(日) 18:38:24
printf(" そ ろ そ ろ や ろ う か ? ");
漏れの前の会社でもVBで同様のやり方をしてるのを見たことあるが
それはそれでいいかと思てた
フォーム名も明示的に書くからどの情報を操作してるかわかりやすいし
単体のときは表示させて動的に値を書き換えられるから異常系のテストも
やりやすいし・・・
つか、実際何がどう悪くてどうするべきか教えてもらえるとありがたいな
今後VBをやるかどうかは別として・・・
長文スマソ
>>VB/隠しコントロール
CGIで<INPUT TYPE=HIDDEN>を使うような感覚なんだろうか。
>111
悪いとは言わないよ。
ただ、そこから出てこないでね。
後はVBから他への乗せ換え案件でそういうのがもう出て来ないのを祈るだけさ。
VB経験者はちゃんと隔離しなきゃいかんってことだな
>>111 上にあったListBoxなんかだと、自分でソート実装するよりは安全で手間いらずで、
まあいいと思う。
けどTextBoxとなるとロジック上のメリットもないし、ウィンドウある分だけ変数より
負荷かかりそうだし、悪意のあるユーザが非表示TextBoxにPostMessage
したら困るでしょ?
デバッグだって、TextBoxじゃなく変数使ってもVBならイミディエイトで値書き換え
られるしね。
VBでは他の言語に比べてソートのプログラム書くのが難しい、とかあるの?
ループ制御が貧弱だったりするけどね。 まぁgoto使えば同じ事出来るし。
それ以前に、すでにあるsortを自分で書くのはおかしいと思わんか?
>>117 え?
まさかループ処理から抜けるのにGOTO使わないと抜けられないと思ってる?
ちゃんと用意されてるよ?
つうか、知識も無いくせに、ループ制御が貧弱とかよく言えるよねw
exit for だろ。 つーかそれしか無いじゃん。
do-whileやwhileを抜けるためのexit doもある。
貧弱とまでは言わんけどcontinueに相当するものがない
そんなもの つかわなくても 書けるだろ
>>117 「すでにあるsort」っつーのがListBoxのソートのことなんだったら、
自分で書くのはおかしくないと思う。ライブラリと一緒にしちゃいかん。
「ListBoxに突っ込んでソート」はたしかに常套手段だったな
汚くてイヤだったが
汚かろうが邪道だろうが、得られるものと失われるものをよくよく考えた上で実装したのならそれで構わないはずではある。ではあるが。
VBやるとSTLが神に思えてくる。
>>122 > そんなもの つかわなくても 書けるだろ
「つかわなくても書けるから必要ない」が通用するのであれば,全ての高級言語は必要ない
川柳だったのか
sortなぞ 自分で書けよ ばかやろう
コンティニー みんなでつかえば こわくない
それにつけても 金の欲しさよ
132 :
127:2005/05/06(金) 13:56:30
> 川柳だろ
ここは五七五スレだったのかーーー!
ContinueはVB.NET2005でやっとつくな。
>132
川柳=五七五
五七五≠川柳
川柳 ⊂ 五七五
川柳 is a 五七五
abstract class 川柳 implements 五七五{}
interface 川柳 extends 短歌;
interface 短歌 {
String get上の句();
String get中野区();
String get下の句();
}
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| 川柳!
\
 ̄ ̄ ̄|/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄
( ・∀・) |\|\< 五七ゴルァ!!
( ⊃ ) (; ) \______
 ̄ 。__ ̄⊂_ \丿_
 ̄ |)・))3< ̄\|VAIO-Z|\
占 ̄ ̄ ======= \
↑しまい忘れ
138 =~ s/川柳/狂歌/;
そりゃ辞めたくもなるわな
このスレの流れを見ていたら、ふとヤマログの、
だからさあ セーブしろって 言ったじゃん
を思い出した。
川柳 extends 短歌 implements 狂歌、かなぁ。
などと無意味な考察。
このスレにパタリロ殿下が降臨された様子
動いていればいいじゃない
プログラムだもの
みつヲ
printf(" イ ッ パ ツ や ら せ ろ よ 、 な?");
ことわります
なにいわれても
ことわります
やりますよ
うちはなんでも
できますよ
営業
分け入っても
分け入っても
バグの山
山頭火
150 :
111:2005/05/07(土) 22:46:15
>>113 >>115 遅くなったけどレスありがと
まぁ確かに他の言語に移行するときにはやりづらいな
デバッグ面も納得
>悪意のあるユーザが非表示TextBoxにPostMessageしたら困るでしょ?
これはマジ気付かなかった 教えてくれてありがとー
>悪意のあるユーザが非表示TextBoxにPostMessageしたら困るでしょ?
もし、そんな手当たり次第にPostMessageするウィルスがあって、
実際に被害が出るのが少ないから発見されないでいるとしたら、
ユーザからクレームが来ても原因不明で、、、ガクガクブルブル
> 手当たり次第にPostMessageするウィルスがあって
ローカルシステムに侵入できたなら、
そんなまどろっこしいことしないと思うyo
>そんなまどろっこしいことしないと思うyo
いや、擬装方法としたらいい手かもしれん。
もしそうされたらおそらく、そのアプリに関係する原因の調査が行われるだろうから、
充分な時間稼ぎにはなりそうだ。
>悪意のあるユーザが非表示TextBoxにPostMessageしたら困るでしょ?
これで目から鱗っていっているやつは、
ゲームの改造等でよく使われているメモリエディタのことを知ったらどう思うんだろうか
教えてくれんね。
156 :
111:2005/05/10(火) 01:31:55
>>154 >メモリエディタのことを知ったらどう思うんだろうか
それは知ってる 自分でも作ろうと思ったし
ただなぜか 非表示TextBoxにPostMessage は気付かなかった_| ̄|○
157 :
仕様書無しさん:2005/05/19(木) 00:56:05
>148
りちぎだね
そうがんばると
あとこまる
158 :
仕様書無しさん:2005/05/19(木) 01:08:44
>157
All Right!!
159 :
MID:2005/05/19(木) 01:43:59
>158
kill
printf("もう我慢ならん やらせろ");
急速にスレの質が低下してまいりました
>161
最初からこんなものw
All Rights Reserved!!
hoge.a = hoge.a;
最初何やってんだか分からんかった。
なんでも、Setterの中で更新用のコードが動くからだそうで。
C言語で1関数12K Line、しかもメイン関数
All Rights Reversed!!
>>166 全ての権利を取り消してどうするんだよw
Copywrite 2005
Copirite 2005
Copy 205
Kopiiraito 2099
UwaWrite '05
コンボボックスで一覧にある物以外入力できない仕様で、
DropDownListにして一覧以外入力出来ないようにするのではなくて
DropDownでテキスト入力可にしてフォーカス外れた時に
今入力されてるテキストが一覧にあるテキストかどうかをチェックしてやがった。
無駄な努力しやがって。
>>173 デバッグ用の隠しコマンド仕込む時にたまにやるな。駄目?
>>174 たぶんだめ。
つか、わざわざコンボボックスでそんなことをする意味がわからん。
止めやしないけど
隠しコマンドならもっと他の方法で実装すればいいような気もする。
余計なバグを生むリスクを抱えてまではやらないかなあ…。
>174
iniファイル、レジストリの読み込み専用のキーでデバッグモード
ある操作でそれを読みに行くようにして起動中切り替え
>173
DropDownListを知らなかったというオチ?
>>172 Writeがちゃんと書けてる時点で
本家より上
180 :
仕様書無しさん:2005/05/26(木) 22:47:41
tyosakuken hyouji 2005
extern struct Foo *m;
printf(" なかなかヨカッタ またくるからな");
入社半年くらいに自分が作ったソースにこんなコメントがあった
while( fgets( buf, 1024, ncfile)){//(б・∀・)бゲッツ
10行くらい上を課長が修正してたけど見られたのだろうか不安だ
見ました
185 :
VB:2005/06/05(日) 00:38:29
こんなようなの。本末転倒だよな。
For i = 1 To 10
Select Case
Case 1:
Case 2:
Case 3:
Case 4:
Case 5:
Case 6:
Case 7:
Case 8:
Case 9:
Case 10:
End Select
Next
switchの前後に処理があるかcaseにfall throughがあるなら
問題ないけど、それだけだと意味不明だな。
>185
Select文の変数がi以外ならいいのでは?
前後に処理はなかったし本当はこうだったかな。
× Select Case
○ Select Case i
確か、中では配列に対して処理をしていたはず。
きっと、配列か何かをループで処理することに拘るあまりに
生まれた糞コードなんじゃないかと思うのです。
>188
配列[i]の値を見て、ってことでなくて?
>>185 漏れは配列の要素数が変わる可能性があるならそんな感じに書くな
Toの値はUboundで求めるけど
>>185 1.
元々はSelect Caseの前に配列への共通処理があった
または想定されたのでそう書いた説
2.
hoge(0) = ...
hoge(1) = ...
....
と直に書くよりは、処理の記述漏れが少ないと思った説
(Select CaseならCase Elseで捕まえられる)
3.
やはり添字直書きするよりは、配列全体を処理してますよー
という意図が伝わりやすいと思った説
いずれにしても、その程度では会社辞めようとは思わないなあ
会社をやめようとは思わないけど、そいつとはもう一緒に仕事したくないかも。
>>185 あまりコメントする気になれないけど
俺はその種の記述方法が良いケースは知らん
194 :
仕様書無しさん:2005/06/05(日) 14:02:24
>>173 >DropDownListにして一覧以外「入力出来ないようにする」
文脈からして「選択できないようにする」の間違いだと思うが、
要するに「テキスト入力は不可にする」ってことだよね?
リストの数によってはいちいちリストを展開&探す&選択より
テキスト入力したほうが早いし、そういう要望も多い。
まともな技術者ならLookupItem()を実装してるよ。
195 :
仕様書無しさん:2005/06/05(日) 14:39:58
case の要素が多くなるなら直値はどうかと・・。
>hoge(0) = ...
>hoge(1) = ...
>....
>と直に書くよりは、処理の記述漏れが少ないと思った説
いったいどんな処理だ、想像できん(;_;)
>>196 こんなの想像して..(;_;)
hoge(0) = ...
hoge(1) = ...
hoge(1) = ...
hoge(3) = ...
>>198 じゃあこっち?
For i = 0 To 10
Select Case i
Case 0
hoge(i) = ...
Case 1
hoge(i) = ...
Case 1
hoge(i) = ...
Case 2
hoge(i) = ...
Case Else
Debug.Print i
Debug.Assert False
End Select
Next
>>199 > Case 2
Case 3
と読み替えてくだされ(><)
VBで作ったプログラムがあった。
俺はリリースした段階でその仕事から外れ、
その後客からの仕様変更・機能追加依頼は外注に任せてたんだけど、
その後どんどん原因不明のバグ出るようになって、
また俺にメンテが回ってきた。
ソース見たら宣言せずに使われてる変数や、外部変数がてんこ盛りで
目を覆うような有様に成り果ててた。
明日からリファインの作業します・・・
>>201 最初にお前さんがリリースしたときに、
ソースコードの先頭にOption Explicitつけなかったお前が悪い。
>202
つけといたら外されたことがあるorz
「コンパイル通らないじゃないか、困るなあ」とまで言われた・・・
会社は辞められなかったが、部署は変えてもらったよ。
204 :
201:2005/06/06(月) 21:50:23
>>202 うかつでした。
C上がりの俺には宣言しない変数を使うと言う事が思いつかなかったんでorz
詳しくソース見ていったら、
hogeって変数使って作業してるのに、仕様変更で加わった部分で
スペルミスしてhageって変数が発生して、そっちに値入れてしまってたり、
1つの外部変数にある場所では回数、ある場所では人数といった具合に
意味不明な使い回ししてるしorz
一回テストすれば確実に判明するバグが放置されてるしorz
このリファインの仕事、「動くべきものが動かない」との
客からのクレームで発生したので、会社に収入入ってこないんです。
3ヶ月ぐらい掛かる予定だけど、ボーナスに響くだろうな・・・
>3ヶ月ぐらい
そこで根性で一から作り直しですYo!、1カ月半で
外注使った香具師の責任の方が重いとは思うが。
機能は少ないけど問題ない状態で引き渡したんだろ?
201が外注の管理者ならダメぽ。
>>206 でもわからんぞ。
OptionExplicitも知らないで組んでたみたいだし、
自分は変数とかちゃんと宣言したつもりでも、スペルミスとかしてても気が付かず、
実際は自分で作った時からバグってたかもな。
>>204 客に納品前に自社でチェックしてないの?
>>207 同感
人のせいにばっかりしているが、201自身がちょっとアレなんだろう
少なくとも顧客から見て201の会社に責任があるのは間違いない事実だな。
害虫が動かん糞コードを生み出してる事に気付けない管理体制に問題がある。
それが201の責任かは、201の立場に拠る。
害虫の仕事をチェックすべき立場にいたのかどうかだな。
「つけといたら外されたことがある」で思い出したけど
パラメータ変えて同じような処理をするところがあって
//○○の場合の処理(○、×、□)
//△△の場合の処理(△、◎)
みたいなコメントつけておいたところがあったんよ。
そしたら、漏れの次に修正した人になぜか片方のコメントだけ消されてて(多分ミス)
やたら浮いてるコメントになってた。
気付いたのは半年後ぐらいにソースを見たときで
自分で「なんだこの中途半端なコメント?
漏れが書いた記憶があるがなんでこんなコメントを?」とか悩んでしまった。
212 :
201:2005/06/07(火) 21:09:33
>>210 最終的には無論うちの会社の責任ですが・・・
外注は客先に常駐してPCに不慣れな客に操作指導しつつ、リアルタイムで
機能追加や仕様変更を受ける事になっていました。
プログラムをいじる時にはドキュメント書いて、うちの会社の品質管理グループの
レビュー受けるというルールを外注には事前に説明して、
ルールブックも渡したのに、「少しぐらいだから良いや」ぐらいに思って
その辺のルールぶっちぎった上、
客から「動きが怪しい」と、うちの社長に連絡が入って課長クラスが見に行った時に
「OSがおかしかったみたいでOS入れなおしたら直りましたよ」とごまかして
その場をしのぐような事をしやがってくれました。
>>207 俺は素で知りませんでしたが、確認したら最初の開発段階で他のメンバーが
入れてました。元のソースを見て記述されていたのを確認しています。
外注の香具師らが小手先改造の時に邪魔だからと削除したようです。
バグが取れなくて行き詰った時に、
「OSの調子が悪い」と言ってリカバリすると、
なぜかバグの原因が見つかるのは俺だけですか?
直面している問題を単に解決するだけの行為は、単なる対症療法に過ぎず、
本当の問題を看過してしまうという原因になりかねない。
風邪を引いて頭痛がするなら、休養して風邪を治すべきであり、
頭痛薬で頭痛を取り去るだけでは風邪は治らないのと同じだ。
ここで指摘したいのは「ソースコードやその場凌ぎや外注」は症状に過ぎない事を理解せず、
真の疾患は何であるかを考えずに他者を悪者にして済まそうとする
>>212の姿勢はどうよ?
ということである
>>214 よく読め:
>プログラムをいじる時にはドキュメント書いて、うちの会社の品質管理グループの
>レビュー受けるというルールを外注には事前に説明して、
>>214の落ち度は、Option Explicitとかを知らんかったくらいじゃないか。
どうして害虫を弁護するのか。
「レビューしていない=変更していないはず」なのに
外注が手を入れたバイナリをリリースしたって事?
それはそれで問題。
218 :
仕様書無しさん:2005/06/07(火) 22:27:19
>216=214
自演乙
いくら品質管理の部署があったって、機能してなきゃいみねーよ
レスが付きまくるのは、みんな他人事じゃないからなんだろうな…
>216
客観的に見てどっちに非があろうと、他人を変えるより自分が変わる方が楽。
他人に対策させても裏切られる事は良くあるが、自分の方で対策するならば確実だしな。
今後再び糞害虫に当たる可能性もあるわけだし、対策はしておくに越した事は無い。
害虫にルールを守れと言うだけなら簡単だが、対策にはならない。
もっと害虫が守りやすいルールを考えるとか、レビュー無しで製品が通るのを水際で防ぐ方法を考えた方が建設的。
>>219みたいな修行僧が近くにいると楽かも。
もうどんどん対策して欲しいね。俺の分までw
わざわざスパゲッティな言い回しするなよ、
要するに「害虫なんか使うな」って言いたいんだろう?
外注管理工数と品質管理工数をもっとよこせ
だと思うが
仕事が出来ないことで社内でも問題になっていた先輩が失踪したため、
彼が抱えていた仕事のうち、半分程度が漏れに廻ってきた。
大した仕事をしてなかったのは知っていたため、「まあ仕方ねぇな」と思って引き取ったのだが、
ソースを見ると、脱力ポイントが次から次へと・・・。
中でも一番グッタリしたのがこれ。
SELECT CASE hoge
CASE ELSE
hoge = hoge
END SELECT
ナニガシタカッタンダアンタワ。
>>223 失踪する程なんだから、まともなコード書ける訳が無い。
寧ろ、まともなコード書いてた方が何故?という風になる。
VBやってるような底辺が何いってんだか
VBって意外に目に付くところにあったりするのな。
しらんかった。
おい
>>199のコードを見てくれ
こいつをどう思う?
普通にクソ。
でもVBだからOK。
>228
不粋な奴めw
>>228 もっと詳しく解説してくださいな。
一応メリットもあるみたいだけど。
そんな昔のことよりも新しいことがいいなあ。
もうネタ切れなの?
よーし、じゃぁ、パパ、携帯電話にのってるソースコード公開しちゃうぞー
nullp
>>227 何に対し「どうよ?」と問うているのよ?
「Case 1」が二つある事か?
>>234 Case ElseでAssertしてるとこ
>>185だけ見るとなしだけど
>>199見るとありのような気がしてきた
で、一般的にはどうなのか?と
>227としては、
「すごく・・・・クソコードです・・・・」という返答を期待した上のボケではなかったかと。
いまどき、
Dim hoge$
Dim moge%
辞めないで案件を放り投げた。
>>237が理解できない俺は負け組みか?
VB辺りかな
VBの古い文法だから知らなくていいよ。
241 :
191:2005/06/13(月) 21:17:49
>>235 一般的な意見かは別にして
>>199はネストが深くなるのが
嫌なのでナシ
>>197よりはタイプミスを見つけやすいけど、そんなのは
ステップ実行で確認すべきで、見た目を犠牲にするほど
のメリットはないと思う
>>237 辞めてよし!
懐かしいなぁ、A$、B%、SPRITE$……
ちうかSPRITE$って文字列型変数だったんや!! と気付いたときは一人カルチャーショックだった。
&
逆Perl?
ちゃうねん
行番号が必須やったころのBASICの名残やねん。
型宣言文字すらないソースと現在激闘中ですが何か_| ̄|○
>246
大丈夫。VBScriptなら問答無用で全部Variantだから……(つ´д`;)
248 :
235:2005/06/14(火) 02:27:42
うまくオチをつけたつもりかころすぞ
>>247 そんなこといったらJavaScriptだってぜんぶvarだぞ。
まあ、Cでもdoubleを平気でintにたたきこむバカもいるわけだし
>251
コンパイルの段階でwarningが出るからいいよなあ、Cは・・・・
VBじゃスルーされちまうからな_| ̄|○
>>251 void (*foo)()
double a = (double) foo;
まじっすか?
関数ポインタがdoubleにキャストされてるよ!!!
>>251 そんなこといったらPerlなんか全部doubleだぞ。
>>253 ネタだよなあ?信じられん。。。
マジにマジなら、それはマジで辞めたくなるなあ。
0.5番地にジャンプしてみたい
ゼロ番地の後半4バイトと1番地の
ごめんいまのなし
壁の中にいる!
>>259 初心者向け記事としてはそんなに特記するほど悪くはないんじゃないの。
なにしろもとはCマガみたいだし。
>>259 さすがになぁ…
役に立った、って思うのは0xffffffffの表現方法か?
油断していると思わずやっちゃうかも
でもなぁ…もしこれを使うなら、(~0)という表現を推奨するべきだろう
>>260 Enterprise内だから、たぶんプロ向け
うんこすぎる。Cというものを本当にわかっていれば問題にすらならないことばかりだ
いや、これは、バカが32で書いたコードをあなたが64に移植するはめになったとき、
こういうところに注意しなさいというメッセージに違いない。
実行例(実行結果?)の
'data model = ' が
'data nodel = ' に見えるのは俺の目が悪いのか?
#スマン。あーコマカイ。そんな事どうでもイイじゃないか
| List3 間違ったprintf関数の使い方
| long value_l;
| ...
| printf("%d\n"), value_l);
うわ、確かに間違ってる。
>>264 | もちろん、32ビット環境でプログラムを書いたことのないプログラマにも有用な情報です。
らしいので、16bit 環境の人 (…ヴビ?) にもやさしい記事。
つまり、「初心忘るるべからず」ってことだな
漏れはprintf書式の %ld を %d と書きそうですよ
>267
俺は「32bit環境も64bit環境も大差ないよ」というメッセージだと受け取った。
>>64ビット環境
今からきっちりやるなら、longに64ビットを期待するより、int64_tを使えよ。
long long
じゃねーの
long long ago
int64_t ........
ププ
1メソッドが1000行オーバー。
似た業務が増えるたびにこのでかいメソッドを
同じソースにコピペしてちょっろと変更。
これを3回繰り返したため、このソースは5000行突破した。
ちなみにjavaだorz
え、リファクタリングじゃん
インライン化
>274 はC99を知らないと見た。
for(i=0;i==sizeof(hoge)/sizeof(char)&&i==10;i++)
ちなみに
hoge char型の配列
直値のi=10 上の配列の数。
そして、この配列の数は共通ヘッダで#defineが切られている。
279 :
278:2005/06/18(土) 07:53:36
あ、書き忘れたけど、Bugの原因になってたコード。
>>275 1000行に及ぶ、巨大なPL/SQLのFUNCTION・・・
こいつのバグを直すために、俺は・・・俺は・・・っ_T)
半年前に自分が書いたコードを見て
会社辞めたくなった。。。。orz
>>281 気持ちは、わからんでもない。
つーより、ソースが糞すぎて全部無かった事にしたくなる。
284 :
仕様書無しさん:2005/06/18(土) 18:36:04
0x0fa5
この意味わかりますか?
見当違いの質問をしていたらすいません__
16進数で0FA5、10進で4005。
あるいはA50F(42255)をバイトオーダーを逆にして書いた可能性も。
数値の意味は知らん。
仕様かソース見ないと分かんないよ。
ソース見て意味不明ならクソソースだ。
>>284 ここで訊くことが見当違いだと気付けよ。
0000111110100101ってことじゃないの。
とりあえずx86のマシン語ではなさそうだ。
0F RRC、 A5 ANA L、 8085なら。
「既存のソースを削除する事は禁止」のプロジェクトに入ってしまった。
鬱だ。
>>292 修正の場合も既存部分をコメントアウトして、その下に書き足さんといかんのです。
//2005/6/18 hiroyuki: 引数を変更
//result = func(value);
result = func(value2);
テスト用に一時的なチェック用関数の挿入と解除を繰り返した場所なんかは
もうアフォかと。
//target_valueの値をチェックする場合はここで関数を呼び出す
//result = test(target_value);
//result = test(target_value);
//result = test(target_value);
//result = test(target_value);
result = test(target_value);
>>293 繰り返すのがわかってるんなら、if (debug) みたいので制御しろよ。
>294
それじゃ結局
//debug = 1;
//debug = 0;
//debug = 1;
//debug = 0;
になるんでね?
コンパイルオプションの方でプリプロセッサ定義するとかすりゃいいのか。
コンパイル時間が凄いことになりそうだが。
なぜそんなアフォなルールを変えようと動かないのか?
にやにや
何か変なのが紛れ込んでます?(・∀・)
変えたければ変えられるものばかりではない。
つか、それこそが%たいとる%なのでありんす。
かの軍曹の現場と同じクソルールか……と思ったがそれよりひどいのか。南無。
>>295 debugの入力元を設定ファイルにすればよくね?
設定ファイルはソースじゃないわけだし。
CVSからそういう感じのソースを吐くようなプログラムを書くというのはどうか(w
>>301 #ifdef _DEBUG
で切ってしまうのが、結局一番効率よくね?
自分が書いたものをチェックインして、
後日見たら勝手にコメントにされてたりとか改変されてるとか
一言断ってくれりゃいいんだけどな
>>1-1000
あんたが「自分のもの」気分でいるのが悪い
or
あんたの会社のコード管理のやり方が悪い
>修正の場合も既存部分をコメントアウト
関数まるごとコメントアウトしとけ
っつーかソースまるごとバックアップでもいいかも
#if 0
前のソース
#endif
新しいソース
やっぱ変なの紛れ込んでますね(・∀・)
308 :
仕様書無しさん:2005/06/20(月) 10:26:37
#include <stdio.h>
int main ( void ){
printf(" HELLO WORlD ! \n");
printf( "理系大卒で何も見ずに書けるのはこの程度...orz" );
return 0;
}
じゃぁおまいはディスプレイ無しでもなんでも書けるんだよな?
>printf(" HELLO WORlD ! \n");
突っ込むところはここ?
あと、もう一個のprintfにも\n入れようぜ
へろー をりど!
オルドシステムが正常に動作しません
printf("!!猫w\n")
Windows用のプログラムでループカウンタとしてint型の変数使っていたら、
レビューで
「このカウンタは仕様上1000までしか値を持たない。
よってintではなくshort型で十分である。
この点だけでも設計者がメモリの使用にルーズで、
また仕様の理解もいい加減である事が伺える」
とボロクソに言われたよ。
業界の大物とやらにさ。
#この程度コンパイル段階で最適化されて
メモリ使用量とか実質違いは無いんじゃなかったっけ?
>315
最適化はちとわからんが
32ビット環境ならintの方が良いこともあろうに、とおもゆ
……確か4バイト整数の方が2バイト整数よりもCPUに優しいと思ったが違ったかな(汗
>>316 コンパイラやコンパイルオプションによっても違うかもしれないけど、
大抵shortで宣言してもネイティブコードではintになってたりする。
つうかわざわざshortなんかでカウンタが指定されていたら、
その意味を深読みしちまうけどな。
>315
>よってintではなくshort型で十分である
ループカウンタをグローバル領域に確保するんですかね?
もちろん、組み込みなんかの場合は利いてくる場合もあるけど
普通はCPUに最適な型にする
だからintが正しいと思う
>業界の大物とやらにさ。
どういう人間?
レビューって要件の機能をやることじゃないのか?
つまりはそのレビューアは要件知らないからレビューの突っ込みどころ判らないから
粗探しでコードレビューしかできないわけだな。
さすが大物だな
320 :
315:2005/06/20(月) 22:45:35
>>318 どういう人間?
80年代初めごろうちの社長が下っ端だった頃のスーパーSEで、
そのころ本も出してたんで、社長と同じ世代の人間の間では
今でも影響力があるんだそうだ。
この人がレビューしてオッケー出せば単価が倍になるんだと。
正直、メモリがKB単位しかないミニコンの世界から発想が一歩も出てない
(最適化だとか)ように思える。
>>320 消え去るべき老兵ですな。
つか、只の莫迦じゃ?大物ってのも、周りの褌担ぎがそう言ってるだけとか。
ある意味、スレ違い。
業界の大物 = この会社辞めようと思った腐れ上司
その大物が、shortで書き直したら、糞ソース、ケテーイ。
メモリ使用量って確かに組み込み系だとシビアなんだけどね
Windows用のプログラムだよな
むしろループが非効率化される弊害があるんじゃね?
後、そのソースをメンテする人が,なぜわざわざshortにしてんだ?ってぜったい非効率
80年代の8ビット16ビットCPUあたりの発想ならそれがベター解かもしれないが
今なら普通に処理系に合ったビット長(つーかintか)で宣言するのがCに限らず基本だと思う。VBですらそうだし。
つーか、その人にアライメントについて質問してみるとどの変の時代で記憶が止まってるのかわかるかも。
あと、315がどういう意味でそう言ってるのかはわからんが、
「最適化されるから細かいことは気にしなくてもいい」と考えてるのなら投げっぱなしすぎると思う。考え無さ杉。
「shortで書いてもintに最適化されるから弄るだけ無駄ですよ」ってならまぁOKかも。
intが最適と考えたのでintで書いてますって言うべきかと。
それが宗教論争でしかなくても、(間違っていても)論拠を考えてる人間の声は何も考えてない人間より大きくなりがちなので
たいていそういうところからプロジェクトに問題が起き始める。
「その点もごもっともなんですが処理速度の効率を考えて今回はintにしました」
とでも言っとけばスーパーSEの顔は立つから問題なし。
それでも直せ直せ言うようなら辞めるしかなw
>>323 ていうか、組み込み系でも今時intをshortにして最適化になるCPUなんてあるのか?
68系も86系もそんなん意味無いよな???
最近はアセンブラで組むなんてことないから漏れもわからんって言えばわからんのだが・・・。
コンパイラによっては、intで確保して、演算のたびにマスク処理している場合もあるしな
>325
>intをshortにして最適化
H8とか
16bitの組込用CPUは大抵そうじゃないかな
16bit、32bit演算のステート数が同じと言うことはないでしょ?
猫
そもそもループカウンタの変数なんてほとんどの場合
レジスタが割り当てられるから、動作速度重視で int で
定義するべきじゃないの??
まあ、
>>315 は、そんな汎用性も拡張性も考えない
業界の大物が羽振り利かせてる職場など、
さっさと逃げた方が良いというのは間違いなさそうだが…
その場で反論できなかった315もなかなか
>>329 きっと、そのループカウンタを宣言している関数内で、
再帰呼び出しを1万回くらいやってるに違いない
と想像してみるw
↑訂正
1万回じゃたいしたことないな
スタックオーバーフローさせるには、
1000万回くらいに必要か?
>>325 そのへんはの環境は intとshortはおなじでないか
68000のレジスタは32bit、外部バスでメモリが16bit幅で接続されてるとしたら、
short使う意味はあるよ。
>>315 > #この程度コンパイル段階で最適化されて
> メモリ使用量とか実質違いは無いんじゃなかったっけ?
最適化でオブジェクトのサイズが変わったらたまったもんじゃない。
それ以前に、ローカル変数なら大抵はスタックに取られるから、
メモリ使用量に違いは出ない事がほとんどだ。
321の言うとおり、去るべき老兵つか、
OOを受け入れない年寄りとかと同じレベルだな。
もう辞める気マンマンなら真っ向から蹴散らしてやればいいし
穏便にすますなら324氏のいうようにやればいいんでない?
いま、もっとも興味があるのはその大物氏の書いた書籍のタイトル(w
>>336 > いま、もっとも興味があるのはその大物氏の書いた書籍のタイトル(w
禿同
>>335 >それ以前に、ローカル変数なら大抵はスタックに取られるから、
>メモリ使用量に違いは出ない事がほとんどだ。
これはOK
>最適化でオブジェクトのサイズが変わったらたまったもんじゃない。
これは4バイト境界へのアラインメントとかで変わる可能性はあるんじゃないの?
構造体にPACKEDとかつけないと。
339 :
335:2005/06/21(火) 20:59:56
>>338 int を使っていて short にすべき、
と言われた流れから、
>>315の
> #この程度コンパイル段階で最適化されて
> メモリ使用量とか実質違いは無いんじゃなかったっけ?
との発言が、
「最適化で、勝手にshortのサイズにしてくれんじゃないの?」
と読めてしまっただけだ。
だから、
「intが勝手にshortのサイズに変えられたらたまったもんじゃない」
と言ったわけだ。
きっと、オレの誤解だろうな…。orz
レジスタに割り付いて、実体は消失とか。
>>339 そんな誤解するのはおまいぐらいだと思う
Bit幅が減少する最適化があるなんて誰が想像するんだよ
普通はレジスタに割り当てられるだろうね。
逆に昔のCコンパイラじゃそういう最適化ってされなかったの?
はい
cのソースつくられるアセンブラは、想像ができました。
最適化に妙な夢を持ちすぎダゾ。
定数ループとかでオーバーフローが発生しないことを読み切れるコンパイラなら
どちらかいいほうに最適化するだろうが、そうそううまくはやってくれないだろう。
オーバーフローを考慮すると、勝手に型を変えるわけにはいかんからね。
つか、C言語的にはそういうときには黙ってint。
>315
とりあえずコレでも見せておけば?
「ループカウンタ」で検索すれば2個目に見つかる。
ttp://dennou-k.gaia.h.kyoto-u.ac.jp/arch/comptech/cstyle/cstyle-ja.htm 一般的に言って、もしもワードのサイズや範囲が重要なら、「大きさの決まった」型をtypedefせよ。
大きなプログラムなら、中心となるヘッダファイルで、共有できるような幅の決まった型をtypedefすれば、
そのような型の変更やそれを使ったコードの発見が容易になる。 unsigned int 以外の符号なしの型は、
大いにコンパイラ依存である。
もし16ビットか32ビットで十分な大きさの単純なループカウンタを使うときは、
int を使えば、そのマシンにとって最も効率のよい(自然な)単位を得られる。
char a,b,c; 〜 a=b+c; が1)符号拡張b 2)符号拡張c 3)intで加算 4)下位
だけaに代入というコードになるお馬鹿コンパイラも実在する。(最適化ありでも)
規格通りだけどね。
た、たしかに結果としての動作は規格どおりだが、
内部でそんなことやってんのか。なんと言ってよいやら。
>>347 そりゃ、バイトデータの加算が出来ないプロセッサだってあるんだし
そうした方が速いプロセッサだってあっておかしくはない。
enumのサイズは表現できるサイズに丸められますな。
shortネタで:
PentiumPro以降は16bitサイズのデータだと
ペナルティがあるんじゃなかったっけ?
あとコードがちょっと膨れる(operand size prefix)よね
それでもshortが使いたいんだろうか・・・
プロジェクトの成功は、ソースコードではなく、社会学で決定するので、こんな感じかなー
・その場で大物に指摘する
→間違い。目をつけられてとんでもないデスマに
・その場でスルーして、後で直す
→正解。どうせ大物は、後で見ねぇって
・その会社をやめる
→大正解。ただし、色々準備した後なら
とか思ったPM1年生
なんつーか、上にはアフォしかいないのか、と最近オモタ。
俺もそうだろうが。
階層型組織において、各個は無能レベルまで昇進する
一見高級なことを言ってるようだが、わけわからん!
key word は ピーターの法則
課長はやれるけど、部長ではダメダメという潜在能力を持った人間は、
課長の間はボロを出さないので、部長に昇進する。つまり、ダメ部長のできあがり。
降格すればいいが、そんなことはなかなかできるものじゃあない。
そうやって組織は腐って行くんだよな
>>350 C言語ではenum型のビット数は絶対にint。
あんたが言ってるのはC++言語の場合なので、念のため。
いい知れぬ不安
enum user_type_t {
UNKNOWN = 0, MASS, ENTERPRISE
};
class User {
public:
virtual int GetType() = 0;
};
class MassUser : public User {
public:
int GetType() { return MASS; }
};
class EnterpriseUser : public User {
public:
int GetType() { return ENTERPRISE; }
};
bool CheckUser( EnterpriseUser* eu ) {
if( eu -> GetType() == MASS ) {
CheckUser( (MassUser*) eu );
}
// : check処理
// :
}
bool CheckUser( MassUser* mu ) {
if( mu -> GetType() == ENTERPRISE ) {
CheckUser( (EnterpriseUser*) mu );
}
// : check処理
// :
}
えーっと
あれだ
この世界の人間の思考回路じゃないね
>>358 typeidとかdynamic_castをつかえよ、ってこと棚!!!
単純にタイプコード使ってるだけかと思いきやMassとEnterpriseがねじれてるのか。
意味がわからないね。
「継承は多用しない方がいい」とかってのを字面だけ忠実にやってるんだったりしてな。
HOGE hoge:
memset(&hoge,0x00,sizeof(HOGE*));
onz
ナカーマ
HOGE* hoge = malloc(sizeof(HOGE*));
367 :
365:2005/06/26(日) 01:04:37
続編
HOGE *hoge;
{
memset(hoge,0x00,sizeof(hoge));
えーっと
あれだ
この世界の人間の思考回路じゃないね
HOGE hoge;
memset(&hoge, sizeof(hoge), 0);
370 :
365:2005/06/26(日) 12:21:54
>369
流石にそれはお目にかかった事ない
何って指摘すればいいのだ?その場合は
「bzeroの導入でも検討するか」
かな
えっと。俺は
0x00やその他諸々を単に0と書く習慣なんだけど
0x01や0x02なんかを0と書くのはまずい習慣だと思う。
>>374 が笑えるかどうかは解らんが
ポインタを 0 にしたいのなら
hoge = 0;
ポインタの指す領域を 0 にしたいのなら
memset(hoge, 0, sizeof (hoge *));
素で解らんとか言ってるわけじゃないよね?
377 :
367:2005/06/26(日) 17:13:00
>>374 いや、笑い事じゃないんで、いやマジで、、、
378 :
375:2005/06/26(日) 17:26:32
ぶ、死ね>俺
×sizeof (hoge *)
○sizeof (*hoge)
>>374 HOGE hoge[256];
本来ならこうなっててほしいんだろ
そうや、派生付クラスをmemsetで初期化してvfptrまで潰してて
vfptrなんてものがあること自体知らなくてはまってた記憶があるな
> vfptrまで潰してて
ナカーマ
>369
ごめん。それやったことある…
memsetって普段あまり使わんものでつい。
memsetで初期化しなきゃならんような構造体の使い方をしなければ良い
HOGE hoge={};
でいんじゃね、ポインタも正しくNULLになるし。
宣言時以外で初期化したいときは代入する。
というか、
memsetはstring.hで定義されてることからわかるように、
本来は文字列に文字を詰め込むための関数であって
オブジェクトをクリアするためのものではないのだが
「本来」とかにこだわる必要は無いんじゃないの。
オブジェクトにベタで0埋めって保証されてる?
っていうか、別にオブジェクトとも限定されてないような、構造体じゃね?
>>386 が何を言いたいのか、イマイチ分かりません。
>>382 やっぱり
VOID ZeroMemory(LPVOID,SIZE_T)
だよな。
>>382 そんなこといってるとWIN32APIを使えません。
そんなことよりもだ。
そろそろ%たいとる%をよろちくおながいしもす。
構造体の初期化は、memsetが基本だと思ってたんだけど違うのかな?
いちいち、かいてられねーよ、と。
構造体はmemsetでいいだろ。移植性が必要なときにclassのメモリを構造前提に
書いてはいけないだけで。
>>391 おれは、0埋めでいいなら
>>383だな。
メンバ毎にバラバラの初期値が必要なら、初期化用の定数マクロ作っとく。
typedef struct {
int hoge0;
int hoge1;
int hoge2;
int hoge3;
} HOGE;
#define STHOGE_INITIALIZER { 0x29, 0x29, 0xbe, 0xef };
:
HOGE hoge = STHOGE_INITIALIZER;
C99なら宣言部でなくても
hoge = ( HOGE )STHOGE_INITIALIZER;
みたいに使えるし。
memsetは、これが使えんとき(F埋めとか)くらいしか使わんなぁ。
>>393 一行目同意。
それ以降は勘弁してくれ。
struct S {
std::vector<int> a;
};
とかだとだめだよ。memsetできるのはPODだけだ。
396 :
393:2005/06/27(月) 23:34:55
>>394 駄目っすか。
ここ2年くらいの間にリリースしたコードで何ヶ所か使ってもうたよ。
どこかで見かけたらかわいがってやってね。
>>393 わざわざマクロにしなくてもいいじゃん。
初期化用にconstのグローバルオブジェクトを用意しとけば。
>>391 構造体の要素にdoubleがあったりしたらあまり良くないと思われ
IEEE754では全bitが0なら値は+0となる
準拠してない環境はステ
昔
>>383のコード書いたら、レビューのときに
「こんなコードねーよpgr」
と言われたことはある。
まぁ、ちゃんと初期化されてるなら、なんでもいーや、と最近思うようになった
printf(" や ら せ ろ た の む か ら " );
>>400 よくない理由は?ポリシーか?
でなければ非難するほど悪くもないと思われ。
>>401 初期化はされないですよ?staticなら別だけど。
>>405 プリミティブ型(int や double など)と同様に、構造体でも宣言と同時に初期化ができるんだよ。
その場合、 {} の中に構造体のメンバに代入したい値を記述する。
struct Hoge { int a, b; };
という定義なら、
struct Hoge h = {100, 200};
みたいに。
ここで、{} の中の値の個数がメンバの個数よりも少ない場合…
struct Hoge h = {100};
上の初期化の例では b に対応する値が無いんだけど…この場合、
残りのメンバは 0 で初期化されるんです。
これを利用して、そもそも {} に何も入れなければ、h の全メンバが 0 初期化されるってワケ。
>>383,406
{} はC++の文法では許されるが、Cの文法では許されない。
{0} ならどちらの文法でも大丈夫だが、これはC++での空の構造体には使えない。
>>403 準拠してない環境はステることになるので、あまり良くないと思われ、ってことだろ。
char str[100] = "test"
だった場合、後ろの要素は0で埋まってるのが保障されるんだ
てっきり不定だと思ってた…
>>409 古いシステムでは不定だね
最近のシステムでは、セキュリティーの問題から
なんかの値に埋めることになってるよね
詳しい人help me
>>399 いちいち環境を調べるのもあれなんで、準拠度を評価するツールでも作ろうかな?
>>410 それって、
>>383のコードもコンパイラがたまたまやってくれているだけ?
個人的には、仕様書の規定にないコードはあんまり使いたくないなぁ…
>>412 配列および構造体は、宣言時に各初期要素を{}でくくって初期化できる。
このとき、ANSI Cでは{}の中身が少なくとも1個は必要である。
要素の数が足りない場合は、足りない部分はすべて0を指定したものとしてコンパイルされる
(ビット0を埋めるわけではない。浮動小数点数も0.0となるし、ポインタは正しくヌルポインタとなる)。
要素の数が多い場合には、エラーとなる。
複数の条件A、B、C・・・があって、それぞれのONとOFFで複合的に
判断する、っちゅう処理があったんだが、if文が長くなるのが嫌だったんで
それぞれにビットを割り当てて、フラグ変数は一つでまかなうことにしたのね。
条件AがONだったら 0x01
条件BがONだったら 0x02
条件CがONだったら 0x04
みたいなので、ORで判別。。別に珍しくないよな、VBでもw
ところが、同じチームの奴に
「ビット操作なんてマニアックなことしないでくれ、デバッグがしづらい」
とクレームをつけられ、そいつのほうが立場が上だもんだから
Public Flg_A As Integer
Public Flg_B As Integer
Public Flg_C As Integer
・
・
・
てな具合に書き換えさせられた('A`)
これだから汎用機のCOBOLer上がりVB厨は・・・・_| ̄|○
ビットマニア…
orz
つ[決定表]
書き換えるにしても何故にInteger
Booleanじゃないのか…
>>417 関係無いが、場所によってはIntegerとBoolの使用を禁じている所がある。
疲れそうなので理由は聞かなかったが。
/* グローバル変数 */
HOGE01 hoge01;
HOGE02 hoge02;
HOGE03 hoge03;
・
・
・
HOGE15 hoge15;
grep 結果
hoge01は3箇所で見つかりました。
・・・
hoge15は3箇所で見つかりました。
使用しているところ見ていったら、値代入して、条件文で参照してるだけ。
しかも同一関数内で。
コボラーだな
>>414 VBなら
Flg_A のほうが自然だろ
というか
フラグがある時点で糞だということに気がつけよ
API呼び出しでもないのにVBでビット操作フラグの方がいいだろうなんて言う馬鹿がいる方が辞めたくなるもんだけどな。
ウチの営業所で一番 Java に詳しいと言われている、Java 歴 5 年目が書いた
プログラム。横に長くてすまん。実際はもっと長かった。
for (int i = 0; i < count; i++) {
if (i == 0) {
if (MyCompanyUtilClass.convertStr(condition).equals(A031205X_SomeFunctionConst.CD1205_CODE_INPUT_INVALID)) {
label = "<span class=\"invalid\">" + MyCompanyUtilClass.replaceStr(tABLE_HOGE_FUGA_LIST.getSelect_COLUMN_A(i)) + "</span>";
}
else {
label = MyCompanyUtilClass.replaceStr(tABLE_HOGE_FUGA_LIST.getSelect_COLUMN_A(i));
}
}
else {
if (MyCompanyUtilClass.convertStr(condition).equals(A031205X_SomeFunctionConst.CD1205_CODE_INPUT_INVALID)) {
label = label + "<br>"
+ "<span class=\"invalid\">" + MyCompanyUtilClass.replaceStr(tABLE_HOGE_FUGA_LIST.getSelect_COLUMN_A(i)) + "</span>";
}
else {
label = label + "<br>" + MyCompanyUtilClass.replaceStr(tABLE_HOGE_FUGA_LIST.getSelect_COLUMN_A(i));
}
}
}
似たようなコードがあちこちにある。こんなコードを書く奴にコード
レビューを受けたのか、俺は…… _| ̄|○
# 0x10 の 829 で愚痴ったのと同一人物です。
424 :
423:2005/07/01(金) 10:34:18
う、字下げ失敗。吊って来ます。
半角スペースは省略されるから字下げするときは全角スペースで。
マとしては全角スペース入れるのはキモチワルイが・・・。
>>423 まず会社の命名規則がクソだと思うんですが
マ暦5年程度で一番詳しい営業所の方が問題
を使えば良いのでは
専ブラだと、空白やTABを に変換してくれる。便利。
(全部がそうなのかは知らん)
VBなんだけどさあ・・・・・
いま引き継いでいるソース、日付型データが全部文字列で宣言してやんの。
一万歩譲って「日付型」を使いたくない事情があったとしても、それなら
WIN32APIのSYSTEMTIME構造体とかだったらまだしも・・・・
なんで文字列なのさorz
制作者がDATE型の存在を知らんかったんだろ
直すのもめんどいから皆スルーとか
古い資産をずるずると使い回しているとそうなるね。
Date型ってVB5以降で実装された型だろ?VB4時代のソースをそのまま
使い回しているんじゃないかな。
CSV文字列を自動的に切り分けてくれるSplit関数という便利なもんも
あるんだが、これがVB6からしか使えないんで、俺の周りでも意外と
知らない人が多い。
invalidじゃないときにclass=""なSPANになるのがそんなに嫌か、とちょっとズレた感想を抱いた
>>430 前提わからんのでなんとも言えんが
入力ソースが文字列で出力も文字列なら文字列でも別に良いと思うが。
少なくとも構造体にするにしてもAPI使わないんならわざわざAPI型にあわせる理由なんか無い。
なんか昨日もそんなのいたな、藻前414か?
>>434 初期化して+=にすればif文ひとつ要らないのと読み辛い。
>432
まぁCSV以外でも使えるけどな
>>430 日付を文字列で確保するのは普通に使われるよ。
古くからやっている人や怪しいマイナーDBを触ったことがある人ほどそういう
テクニック?を使う傾向があるかなぁ。
そういえばDatetime型って何バイトだっけ?
>434( == >414?)氏は、もしかして最近になってVBにシフトした
元C使いかなんかではなかろうかと推測してみるテスト。
×>434( == >414?)
○>430( == >414?)
スマソ
>430
VBのDateとCurrencyは内部実装がDoubleだから
それが嫌で……ってんじゃないだろうなぁきっと……
# .netも↑みたくタコな実装だっけ?
おながいですからVB6ではByRefとByValを省略せず書いて
ちゃんと使い分けもしてください。
まだあまり関わったことのないけど
VB.netでは言語仕様が改善されてるから今後はましになってくるのかな?
444 :
443:2005/07/02(土) 21:02:45
VBやってない人に補足。
6では関数の引数は何も付けなければ参照渡しのByRefが既定で
.netでは値渡しのByValが既定。
>>444 それは・・・互換性が全く無いじゃないか。
何故同じ言語名で呼ぶんだろう
>>443 自分で宣言書いてDLL呼び出しした事あるかないかで大きくずれるな、その辺の認識は。
>>445 ドトネトって要はC#がまずありきで予約語と一部文法をVB風に置き換えただけだし。
要はユーザー囲い込み。
VB一筋ですJavaだC#だの言われてもわからんす、って言ってる奴でも
知らない間にオブジェクト指向言語の世界に引き込まされる。
まぁ、選別用の篩でもあるってこった。
>443
VB.netなんて使わねえよ、夏 な漏れは
Declare以外の文脈ではByRefなんてLet並みの価値しか認めてないんだが……
ダメ(・∀・)?
>445
VB .net と VC# .net との間でさえ、Boolean の互換が取れないんだから(w
VARIANT_BOOLじゃないんだ?
まあなにせあの会社のつくるもんだからなぁ
>>447 別に気にしなくてもあんまり問題になることは無いな。
API以外だと、普通は再帰関数書く時に初めて気にするんじゃなかろうか。
あと、なんとなく引数変数には代入しないってのが
なぜかVBユーザーの集合意識の中で統一取れてるような感覚はある。
(というか、引数に代入できるの知らないだけか?)
それですごい偶然にたまたま地雷を回避できてるみたいな。
漏れの周囲でもByRef気にしてなそうなプログラマ多いが、
それで大きな問題になったという話は今の所一度も聞いたこと無い。
あらためて考え直してみるとかなり不思議。
えーーーー
いつから ByRefになつたんですか
>>452 漏れの知る限りではVB2.0からの仕様だったが。
>>449 じゃないわけじゃないけどVBだとIntegerにキャストできてTrueが-1になる、ってことかと。
ByRef?なにそれ?
グローバル変数でデータ返す方が便利じゃん
グローバル変数をメソッドのByRef(というか宣言なし)引数として渡して
呼びだし先で書き換えると、検索だけでは見つからないので最狂
10カ所の参照渡しのうち、本当にデータ変更されてるのは1カ所でも
調べる箇所は10カ所なんだよな・・・
まさか保守費用をぼったくるトリックか?
多言語との連携取るなら意識しないとまずいだろ。
サブルーチンの再利用性とか考えないのか?
と思ったがこういったことを意識しないからVBが嫌われる、という落ちか。
>>458 多言語で再利用するようなもん普通VBで書かんでしょ。
逆ならDLL化されるのでそこではもちろんDeclare宣言するので意識する。
ありがちというべきか、いまさらというべきか、とにかく脱力した。
void strncopy(char* t, char* s, int n)
{
for (int j = 0; j < n; j++);
*t = *s;
}
>>460 一瞬、あってるじゃん、と思った俺は負け組
つか、ソースはやっぱり、等幅フォントで見たいな
いや、nが0以下のときは「想定される仕様」通りに動くぞw
strncpy系としての実装なら文字列終端チェックが無いな。
memcpyにしかなってない。
ネタくせー
むしろ0以下は想定の範囲外のような。
467 :
462:2005/07/07(木) 11:31:18
>>465 おぅスマンスマン。確かにご指摘のとーりだ(爆笑)。修正する。
nが1のときのみ想定通りに動く
\0挿入してないから全部ダメなんでねーの?
むしろj++するのを忘れて無限ループにしちゃうことが年に一度はあるな俺
文字列終端チェックとかって関係あるか?
471 :
463:2005/07/07(木) 14:06:20
>>470 「strncpy系としての実装」と断り書き入れている意味わからないか?
468もそれに関連した指摘をしてくれている。
strncpyとmemcpyの動作くらい区別しろよ。
↑まあまあ。どうにもこうにも
代入は一回しか動作しないコードなんだから、
そんなにムキになるだけエネルギーが勿体ないよ。
473 :
仕様書無しさん:2005/07/07(木) 18:21:34
?
なぜカウンタがiじゃなくjなのか、ずっと考えていた
きっと、iをグローバル変数で既に使っているのだろうと思い至った
要するに( ´∀`)<ぬるぽ
476 :
465:2005/07/07(木) 19:31:08
>>460 やべ、forの行のセミコロンに今やっと気づいた・・・
新人研修のとき、プログラムを作れ!といわれてプログラムを渡された。
JUnitのテストケースだった・・・ミッションは緑を出すこと。
そこまではいい。そこまでは。
むしろいきなりテストファースト教えるなんて、
…なんて…なんてgoodな会社なんだ!とも思った…
30個のメソッド検査するテストケースがたった1メソッドとは一体どういう事だ!!!
forの最後に「;」があるから、jもnもまったく意味ないね。
>>478 急に分かりきったことを言い出してどうしたんだ?
どういうネタだかさっぱりわからん。
今頃気付いたんだろ
そっとしておいてやれっつーに
>>479 すまん、今頃気付いた。
t++; s++;がないから先頭コピーと考えてたよ。
まぁ、動作は同じか。
コードじゃないけど、コメントの変更履歴
「変更点はソースを調べれば判るはず。
ソッチもプロなんだから、自分で調べろ。
履歴を入れるで、俺の作業時間が減るほうが、
会社の損になるくらいわかるだろう。
だいたい、こんな変更履歴に頼ろうとするお前が、
間抜けすぎるんだよ」
そのPGは、この変更の直後、会社を辞めた。
483 :
仕様書無しさん:2005/07/08(金) 00:32:00
それはスレ違いなのかスレにぴったりなのかよくわからんソースだなwwっうぇ
ふと思ったんだがよォ・・・
Uキーを2回押しても「っう」じゃなくて「うう」になるよなァ・・・?
それってつまり「っ」をわざわざ「xtu」と入力してるってことだよなァ?
VIPPERってハイテンション気取ってるけどよォ・・・
けっこう冷静だったりするんじゃーねぇか?
weと入力してみたらどうだ。
まあ、月配列使いの漏れには関係ないが。
we -> wwe
>>484 Wキーを押し下げつつ、
Eキーをすばやく叩く。
wwwwっうぇwwwwwwの書き方を素で知らん奴って案外多いんだよな。
つーか、どうしてエが入るのかちょっと考えれば分かると思うんだが。
問題解決能力ヒクス
この程度のキーバインドもしらんのか
ふつうにスクリプト書いて M-x wwe あたりにするよな。。。
嫌過ぎるVIPPERだ
493 :
仕様書無しさん:2005/07/08(金) 16:26:33
print "<input type=hidden name=password value='{$form['password']}'>";
HTML文法違反
496 :
仕様書無しさん:2005/07/08(金) 19:06:16
main(){
fprintf(prn, "なんちゃら帳票 Page:1\n");
fprintf(prn, "---------------------\n");
fprintf(prn, "| %s |\n", data[0].no);
fprintf(prn, "| %s |\n", data[0].name);
:
:
fprintf(prn, "なんちゃら帳票 Page:2\n");
fprintf(prn, "---------------------\n");
fprintf(prn, "| %s |\n", data[1].no);
fprintf(prn, "| %s |\n", data[1].name);
:
:
fprintf(prn, "なんちゃら帳票 Page:3\n");
fprintf(prn, "---------------------\n");
fprintf(prn, "| %s |\n", data[2].no);
fprintf(prn, "| %s |\n", data[2].name);
奴のプログラムにループは存在しない。
#勘弁して
ありえない
なにかのまちがいではないのか
そうだといってくれ
感動的なダメソースだな
500 :
仕様書無しさん:2005/07/08(金) 20:09:05
ループアンローリングだろ?
きっと行数で支払われるんだよ
Dim TXT_038 AS TextBox
Dim CMD_030 AS Button
VB やるだけでもうぜーのになんだよこの名前。
ふざけんな。
503 :
仕様書無しさん:2005/07/08(金) 20:37:14
ちなみに496のプログラム終了方法はセグメンテーションフォルト。
482はSCM使えってことか?
元COBOLのプログラムをCに移植したやつ、それのメンテの仕事に就いたんだが、
COBOLの元のソースコード1行をコメントアウトして、
それに対応するCのコードがその後1行。
でまたコメントアウトされたCOBOLのコードが…という繰り返し。
1行対1行のセットにするためにCのコードのほうで無理しまくり。
仮に今からCのコードを新規に追加するとしても「わかりやすいように」
COBOLのコードとセットでCのコードを書かなければならないので、
COBOLの勉強もしてる…
でも他の面々の苦労談聞いたら俺なんかまだましだな。
506 :
仕様書無しさん:2005/07/08(金) 21:51:11
>505
結構珍しくないぞ。
507 :
仕様書無しさん:2005/07/08(金) 22:17:39
移植分はさておき追加分をCOBOLで書く必要性が全く感じられない気がするのだが。
移植分を書く必要性も感じられないが
if (...) {
100行ぐらい
}
if (...) {
同じ100行ぐらいのを1〜10行だけ変えたやつ
}
が延々と続き1関数で10,000行を超えてた似たような関数が2つあって
1ファイル20,000行をこえ/ucb/bin/ccでコンパイル通らず
コンパイラのライセンスないからgccをインストールさせた極悪ソースコード。
ヘッダーのファイル
#define begin {
#define end }
等延々と
実際の関数とか
begin
....
end
ていうCのソース、新人に見せるな、最初何でコンパイル通るのかわからんかったぞ
>>512 藻毎、本当は見た事無いだろ。本には載ってるけど、、、スレタイみたいな紹介文で。。。
>>510 なぜ二万行も書いてしまうまで放っておいた。
半分はコピペだとしても一万行書くのに何日かかる?
>>513 見たよ10年以上前に、3日だけ、先輩が手伝えって、なので記憶はいい加減
某大企業の電子顕微鏡のシステムだ
>>514 知るかー(笑)、機能追加するプロジェクトだったのだが
すでにVersion4だった、5年かけて成長させたらしい。
夏場の行楽地のごみ箱みたいだな
入り切らなくなった空き缶が積み重ねられ、
大きなオブジェに
そしていつかくる崩壊の時。
崩壊する時に関わってなければおk
C#にて
#region 適用範囲FROM1
txb適用範囲FROM1.Text = row["適用範囲FROM1"];
#endregion 適用範囲FROM1
#region 適用範囲TO1
txb適用範囲TO1.Text = row["適用範囲TO1"];
#endregion 適用範囲TO1
#region 適用基準1
txb適用基準1.Text = row["適用基準1"];
#endregion 適用基準1
:以下同じような代入文が30個位
regionうぜー
>519
てゆーか、命名規則がまんまVBなんだが……所詮VBの代替言語なの? > C#
文末に ; ついてるだろうが
すごい、さすがC#だ。
C#って日本語変数名使えるのかよ
勘弁してくれ
>>493のまずい部分、まずそうな部分を考えさえるのは新人への課題に良いかもしれない
VC++でもVBの命名規則使う人いるよ。
528 :
仕様書無しさん:2005/07/12(火) 00:05:59
>>520 実は命名規則はVB.NETからはプレフィックス式じゃなくなってるという2重ガックリ。
オブジェクトに何かさせるという処理が連なるわけだから
プレフィックスに意味は無くなる。
いやそれでもおれはプレフィックスつか版画利杏を使うぞ。
C#でもPerlでも、ナニがナニでも。
>530
N88BASICでも。
>>530 N60BASICだっけ、変数は3文字までの奴
ハンガリアン話はスレ違い
if (!(obj.getXXXFlag() == false)) {
オブジェクト指向でいこうってのに○○flagが多すぎるソースコードは疲れるな。
MVCモデルでいこうってのにView側でソートとかやらせたり。
ビューでソートはありうると思うんだが
>>534 flag を指摘するべきか、false を指摘するべきか…。
>537
あと ! もな。
if (obj.isXXX()) {
void hoge() {
HOGE_STR hoge;
// hogeにいろいろセット
AfxBeginThread(ThreadFunc,(LPVOID)&hoge);
Sleep(100);
}
ベテランの書いたソースです。
Sleep取ったらまともに動きゃしねぇ(あたりまえだが)。
恐ろしいのが、これが某所で既に運用始まって3ヶ月たってるシステムの
とある部分のソースなことだ…。
こんな会社もういやorz
そもそもスレッド起動してる理由はなんなわけ?
542 :
仕様書無しさん:2005/07/15(金) 00:53:23
>540
Sleep以前にマシン入れ替えてもハマリそうだなぁ。
ところでイベントやセマフォ+WaitForSingle(Multi)Objectって
使われていないのかなとおもう今日この頃。
#それ以前に作りがどうこうという問題はべつだが
543 :
540:2005/07/15(金) 00:59:25
>>541 平行で複数の対象に同じ処理をする必要があるから。
具体的に言うと何屋だかバレバレなので勘弁…。
>>542 グローバル変数を排他無しにスレッドの内外から
操作しまくりですがなにか?
運用開始してるから大規模に治すわけにも行かずorz
ほんとまぁよく動いてるなぁ…。
たいして使われて無い1票
>542
とりあえずCreateProcessしてWaitForSingleObjectはしょっちゅう。
>>535 しかもそのflagが決まってString型なんだ。
if(fooFlag.equals("1")){
ムキー! なんでみんなそんなStringが好きなんじゃー!
>>542 Keなんて頭付けるくらい余裕あるならDISPATCH_LEVELで呼んでも飛ばないようにして欲しかったよ、MS。
550 :
537:2005/07/15(金) 21:50:05
>>538 いや、だから、false と比較して ! するくらいなら
true と比較しろよ、って意味だったのですが。
false 絡みで、他にも指摘する部分があるということかしら?
まぁ、言語によってtrueは実体値が違うので比較はfalse基準でやるのが無難、ってノウハウもあるにはあるんだが
ぶっちゃけ厳格にどうこう言う程のもんではない。
if( foo != 0 )
て書いてあると虫唾が走る体質ですがなにか
>>552 条件追加した時のミスが若干減るからいいじゃん
if(userCode == null || userCode.equals(null)){
userCode = "";
}
おかしいですよカテジナさん!
ぬるぽ
がっと言って欲しいのか?この腐れま○○が!
>>554 おかしいけどありえなくはない気はする。
equalsメソッドの実装次第で。
まぁ、それはそれでとてつもなくおかしいんだが。
>>557 userCode == nullが既に真なら後ろのは実行されないんで
ホントに無意味なんですけどね……。
あと、いまjava.lang.Object#equals()のjavadoc読んで来たんですが、
・null でない任意の参照値 x について、x.equals(null) は false を返す
なんて明記されててちょっとだけ驚き。
a.equals(b)とb.equals(a)を同じ意味にするためにぬ○ぽを投げるとか
勝手に思いこんでました。
#ちゅーか、equals()って結構細かいこと決めてあるのね……
>>557 userCode.equals(null) を有意にするには null.equals(null) を成立させなければならない
つまり「null インスタンス」が存在しなければならないw
>>560 それは逆だろ。
userCodeがnullじゃないときに後の式が評価される。
563 :
560:2005/07/16(土) 11:31:15
>>561 んなこた〜わかってるw
その上で
>>557 の
>おかしいけどありえなくはない気はする。
>equalsメソッドの実装次第で。
に対して userCode.equals(null) に意味を見出すための
思考実験をしただけ
>>552 やっぱこうだよな
if( (foo != 0) != 0 ) // 念のため
>>563 そうか、コレが噂の「nullオブジェクトパターン」か!(違
0,true,false,null
!をつけての大小比較
みんなぬllp
>>566 論理型と論理型を比較した結果は論理型なんだが、それも比較するのか?
このような疑問で夜も寝られなくなってしまうので、論理型とそのリテラルの
比較が存在すると困る。
>>568 あぁ、なるほど。こういうことですか?
× if (!(論理型 == false))
× if (論理型 == true)
○ if (論理型)
if 文に渡すのは論理値なので、論理型ならそのまま渡せと?
普通そうじゃね?
>570
ありきたりのレスですまんが、>569の3番目は
コーディング規約で禁止されてる場合もある。
しかもbool型はNGでBOOL型を使え、だったり…orz
当然↓のような書き方をしてハマることは日常茶飯事。
if( bHoge == TRUE )
>>571 とりあえず!!付けさせとけ。
if (!!bHoge == TRUE)
if (!!!!!!!!bHoge == TRUE)
if(A==B) という書き方のほうが「人間にわかりやすい」ことは確か
どうせ最終的にできるコードはたぶん同じなのだから、
流儀の問題でしかないと思うが
>>571 >コーディング規約で禁止されてる場合もある。
だから辞めたくなるんでしょ?
>>571 BOOL 型ってどの言語なのか良くわからんのですが、ハマるとは?
577 :
仕様書無しさん:2005/07/17(日) 00:51:20
>>576 Cで typedef int BOOL がよく見るケースだな。
でいっしょに #define TRUE 1 とかしてある。
たとえば、
int bit_flags;
BOOL is_xxx = bit_flags & XXX_BIT;
んで、 XXX_BIT が 0x0004 とかなってると、
bit_flags = 0x000f のとき、 is_xxx が 0x0004 になって、
if(is_xxx == TRUE) とかしてハマる。
これを避けるために「FALSEと比較しろ」とかいう
アフォなルールをどっかのバカが広めたらしい。
「論理値を等値比較するな」が正解だろう。
「intをBOOLにtypedefするな」でもいいと思う。
>>578 じゃぁANSI Cしか使えない環境ではどうすれば・・・
>>577 false と比較しろっていうのは、
論理型が言語仕様に無い場合の話だったのですね。
論理値と true が比較できないなんて、
処理系のバグじゃないかと思ってましたわ。
>577
_、_
( ,_ノ` )y━・~~~ アフォなルールかもしれんが、地獄で生き抜くには必要だ。
せっかく論理型として typedef した BOOL 型に、
bit 演算の結果を代入してるのが、そもそもの間違いでしょう。
BOOL 型への代入には define した TRUE、FALSE を使え、
というルールの方がしっくりくるなぁ。
>>583 そのルールだと BOOL x = a < b; こんなのもダメってことかい?
>577
VBだかなんだかでTRUEが1じゃなく-1だとかでバグるって話じゃないのか?
まぁ他の言語も考えるならFALSEが0とも言い切れない気がするが。
>せっかく論理型として typedef した BOOL 型に
せっかくとか言うな。そもそもそんなことするからだ。
>>580 >論理値と true が比較できないなんて
比較するのが阿呆だ、と何度言えば。
588 :
583:2005/07/17(日) 03:24:13
え〜っと
#define true (0==0)
#define false (!true)
ってのどっかでみたよ
>>589 Cでは比較式の偽の値は0で、真の値は1と決まってるから、そんな凝った宣言しても意味無い。
#define true 1
#define false 0
にくらべて、まったく可搬性が向上していなくて、可読性が悪くなってる。
違うぞ、0は偽だが0以外は全部真だ。
だから==でtrueと比較するとハマるんだよ。
いままでの話を総合するとこれが正解か?
if( !!( b != false ) != false )
さらに確実にしてバグを減らすにはするにはこう?
if( !!!!( ( b != false ) != false ) != false )
品質のためにはもう2、3個 != false 追加しといた方がいいかな?
「Cでは真の値は1と決まってる」伝説って何故こんなに広まってるんだろ。
if(a!=0){b+=a};
>>593 Cでは、0以外のすべての値を真として扱う
が、評価式においての真の値は1になることは保障されている
結局if(true)と書くのが一番読みやすいし間違いもない、と。
それをコーディング規則で禁止するなんていうアフォがいるから話がややこしくなる、と。
>>592 そりゃ大変だ。
int a, b;
:
if (a == b)
なんてのも全部
if ((a == b) != false)
にしないと!
C89ではTRUEをdefineしなければ解決。
>>596 たとえばif(foo)だったものに条件追加する時、まちがえてif(foo & bar)ってしてしまった
とします。
それを後で見た人がif(foo && bar)のまちがいなのか、そのままであってるのか
一見してわからないから、そういうコーディングルールがあるのです。
もし始めにif(foo != 0)と書いておけば、上記のようなまちがいはif(foo != 0 & bar != 0)
となり、これなら誰が見ても間違いだとわかるでしょう。
intとtrueの比較とは別の問題ですが。
>>599 うちは規約で禁止されてないけどif(foo)は怒られる。理由は「意味がわかんないから」
それはfooの名前の付け方次第では?
>>601 f(foo)
こう書くとfooに何入ってるとif文の中が実行されるかっていうのがわかんないだって
遅れた話だけど
null と equals はJava House MLで散々モメて
最後にひろみちゅせんせーがぶち切れたという
話がある。
>>599 無さそうな間違いをする前提で妙なルールを押しつけるのはおかしいよ。
ポインタ禁止とかと変わらん。
極端に能力が低い人でも間違わないように という前提で作られるコーディング規約
なんてマスターベーションを下げるだけ
>>605 マスターベーションが上げる職場なんて、激しくイヤだ
マスターベーション ワロタ
> 無さそうな間違いをする前提で
絶対にタイプミスしない人ですか?
それともビットマスクを使わない?
> 極端に能力が低い人でも間違わないように という前提で
一定以上のスキルがある人間しか触らせないという保証があるなら
別に縛らなくてもいいと思いますが。
でもそれは流石に低い方に合わせすぎでしょう(w
こうなればMS法式でいくしか
if SUCCEEDED(hr) { ... }
if FAILED( hr ) { ... }
>>608 タイプミスもあるしビットマスクも使うが、あの間違いは無い。
&を1つと2つでは視覚的にも大きく異なるし、その場で見逃すことは
考えにくい。もっと他の間違いのほうがありそうだ。
if (foo & bar !=0)とかな。
逆に聞きたいのだが、何かデータを持っているのか?
> &を1つと2つでは視覚的にも大きく異なるし、その場で見逃すことは
&にしたのはあくまで例で、|だったら1つと2つでは視覚的に見過ごしやすい
でしょう。
> if (foo & bar !=0)とかな。
いや・・だから、常に!=0と書く習慣があれば、if (foo !=0 & bar !=0)となって、
これならすぐわかるでしょう、という話なのですが。
> 逆に聞きたいのだが、何かデータを持っているのか?
体験や伝聞はありますが、データはありませんよ。
ソフトウェア作法あたりの影響かも。
613 :
612:2005/07/17(日) 16:35:38
誤)これならすぐわかるでしょう
正)これならすぐ間違いだとわかるでしょう
>>599のケースは論理型を意図してない変数にif(foo)ってやるから書き間違いの考慮
する必要があるわけだよね。
でも論理型を意図してなくてif(foo)がありかは別の議論じゃない?
俺はif(!memcmp(a,b,sizeof(a)))みたいな書き方は反対だよ
>612
& と && だろうと | と || だろうと大して変わらないと思うのだが。
プロポーショナルフォント使ってるとか無駄にサイズ小さくしてたりする人ですか。
どうでもいいけど最近なんか学生っぽいのが多いね。
世間はそろそろ夏休みなんだっけか? orz
>>612 だからなんでレアケースな間違いを救うためにまぬけな規則を作るのか?
だいたい、数値に!=0をつける習慣があるなら、if (foo & bar)は
if (foo && bar)の間違いとすぐに分かる。
論理値に!=0など不要だ。
別に短絡評価が発生しないだけで、
if( a & b ) も、 i( a && b )も結果は同じだろう?
if (foo & bar)
って必ず警告出るんでないの?
C言語プログラムならaやbが副作用のある式である場合も多いので
短絡評価の違いは侮れない。
if (foo && bar) にちて register つければいいと思いまつ。
> だからなんでレアケースな間違いを救うためにまぬけな規則を作るのか?
レアかもしれないですが、より安全ですよね。
> if( a & b ) も、 i( a && b )も結果は同じだろう?
a, bとも論理型でしたら。
ですが、
bool a = false;
int b = 1;
こんな場合は結果は違いますよね。
「条件式には論理型しか使ってはいけない」というルールがあるなら
構いませんよ。
>>617 (a == 1 && b == 2) の場合を考えてみな。
>>621 > こんな場合は結果は違いますよね。
いや、同じだよ。
>>621 変数を数値と比較することで、変数が数値だと思われてしまう危険性が
高まる。
論理値を数値と比較することのおかしさが分からんのか?
「条件式には論理型しか使ってはいけない」これは良いルールだ。
>>623 > 「条件式には論理型しか使ってはいけない」これは良いルールだ。
Java ではこれが採用されているそうですね。
625 :
621:2005/07/17(日) 18:26:06
>>622 すいません。例えが間違ってました。
bool a = true;
int b = 2;
>>623 > 論理値を数値と比較することのおかしさが分からんのか?
それをわかっていますよ。
だからこそ、たとえ冗長でも常に==なり!=を書くようにしておけば
わかりやすいし安全だと。
>>625 おかしな事をやった方がわかりやすいし安全?
>>627 それは論理値と論理値の比較だよ。
数値と比較するよりはちょっとまし。
> ちょっとまし
つうかそのレベルのミスって
IDEのワーニングなりlintなりcheckstyleなり
FindBugsなりのツールで一括して弾けないか?
面倒な割りに発生確率の非常に低い(と思われる)バグの対策にしか
ならないであろう規約を設けるぐらいだったら、
「コミット時XXXツールによるチェックでエラーが0件であること」
みたいな規約を増やしたほうが有益だと思うがどうよ?
確かにこんなことでグダグダやってる職場なら、その手の
ソース見ただけで会社辞めようと思うのかなぁ・・・
とスレ違いにならんように引き戻しちゃろ。
if ( a =1 & b = 1 )
==true程度も打つのが面倒な奇形はプログラマ辞めとけ。
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
| 糞ソースしか書けないおまいがな。
\___ ______________
V
, _ ノ)
γ∞γ~ \ ,,;ξ
| / 从从) ) ハニャ-ン!! ::)。m゚)ぃぎょっ!
三 ヽ | | l l |っ .,;;‘ V
三`从ハ~ ワノ/~)Σ ///
三 ⊂ `' / : : ;;
三\ / ※;ζ8
三 ゝ > (x )〜 ←
>>634 三 (,,ノ U U
つまり if ( a && b ) とシンプルにしか書けない奴は辞めろと
if((a==true && b==true) == true)
プログラマ辞めたくなかったらこう書かないとだめなのか...俺には無理。
if (a.isHoge()) // アリ
if (a.isHoge() == true) // ナシ
if (a.isHoge() == false) // アリ
if (!a.isHoge()) // キライ
個人的には true との比較は意味がないのでやらない。
文頭の ! は見にくいので false との比較はわりと好き。
!は使うか結構悩みどころだな。
漏れは if(!(a))と括弧付きで少しでも自己主張するように書いてるがやっぱ読みにくいかな・・・
(あとは空白挟むとかも手か)
一番は!を使うのを避けられるような設計がいいんだろうけど。
また糞コテが増えたのか
指が滑ってこんな↓コードになってしまい、
「う?上位7bitコネー!?いや8ビット目もなんかちょっと違う」と
しばし悩んだことが俺にはありました。
眠くなったら帰って寝たほうがいいねえ。
for (p = buf, i = words; i--; ) {
word = *data; // memory mapped i/o
*p++ = word && 0xff; // (byte swapped)
*p++ = (word >> 8) & 0xff;
}
>>638 >if (a.isHoge() == false) // アリ
キモイとは思わないのか…
まだ
if (a.isHoge())
;
else
の方がマシ。
>>641 まったくしょうがないやつだな
for (p = buf, i = words; i-- != 0; ) {
word = *data;���// memory mapped i/o
*p++ = word != 0 && 0xff != 0;���// (byte swapped)
*p++ = (word >> 8) != 0 && 0xff != 0;
}
>>643 そのソースはなんでつか。。。。。。。。。。。。。。。
>>642 昔VBでifには必ずelseをつけろ、っていってた奴を思い出した。
IF ... THEN
...
ELSE
ENDIF
IF ... THEN
ELSE
...
ENDIF
今でもVBで頑張ってんのかなあ…
仕方ないとは思うんだが…
if (a) foo(a);
void foo(void *a){
if (a == NULL) return;
goo(a);
}
void goo(a){
if (a ==NULL) return;
...
}
こんな感じで10個ぐらい続いているのを発見
単体から見れば安全に作っているつもりなんだろうけどねぇ…
>>646 単体から見れば安全に作っているつもりならいいんだけど、こう書かないと上に怒られることもある
>>646 returnのところは実際にはエラー処理してると見込んだ上で。
「防衛的プログラミング」っていうんだっけか。
外部から与えられる環境・パラメータを一切信用しないって言う。
インターフェースの仕様がキッチリ決まっててしかも守られてれば
いらないんだろうけどねぇ。
ユーザ入力でもない部品間の呼び出しでコレやる羽目になるのは
切ないな。
falseとの比較か…
Win32APIとか生で叩いてるとそんな癖が付くなあ。
似非BOOL関数に数値返しが混じってるからな。名前で区別つかんし。
if(hoge())だけじゃ成功したんだか失敗したんだか。
それに加えてUNIX系のif(hoge()) {失敗}が
既存のソースにあったりすると('A`)ウボァ
>>648 普通にやってますよ。
他人の担当部分では、そうなっていないコードを良く見掛けます。
その度にイライラしているのですが、見なかったことにしてあげてます。
>>650 なるほど、そういうところもあるのね。
DbCってわけでもないんだよね?
パラメータ・環境は呼ぶ側で保障して、
呼ばれる側はチェックするとしてもアサーションって感じだな
こっちだと。
事前条件・事後条件がビタイチ守られないような状況だと
>>650のとおりチェックするしかないとは思う。
切ねぇけど。
>>651 個人的にやってるだけです。
なので、他人のコードにケチ付けたりはしてません。
ただの部品なのでユーザ入力のような複雑なチェックまではしませんが、
部品が (一応) ちゃんと動く程度の NULL チェックの様なものはやってます。
単体として、どこに出しても恥ずかしくない娘にしてます。
ところで、DbC ってなんれすか?
自分が書いたソースは娘なのか・・・萌えてきたよ
>>650 イライラするだけで、NULLが渡された時にはどうするかをきっちり決めようとは
思わないのか?
他人のコード、自分のコードじゃなくて自分達のコードだろ?
>>657 まぁ、落ち着いて。
>>650 をもう一度ちゃんと読めば、私以外の人が、
きっちり決めようとは思ってないんだ、ということがわかるでしょう。
どうせなら、ぬるぽが渡されたときは別の特別な処理をするよーな関数にしてしまえ
万一呼び出し間違いが合った場合、クラッシュしてくれたほうが開発者にとっては良い
が、客からすると、意味は解らないけどエラー出る、のほうが精神に良い
>>658 コミュニケーション能力が欠けていることは読み取れるよ。
他人の担当部分は…見なかった事にとか、他人のコードにケチをつけるとか
発想が間違ってる。自分のコードの不具合を指定されたらケチを付けられたと
思うか?感謝するだろ?
663 :
661:2005/07/18(月) 20:40:53
>>659 こうか?
try {
do something...
} catch (NullPointerException e) {
Hammer hammer = new Hammer();
while (true) {
hammer.doGa("
>>659");
}
}
またそうやって文字列を使う・・・
せめて hammer.fall とかにしてくれ
殴り方が一種類ならね
そこで多態ですよ。
多態だと得物が増えね?
殴り方を多態化すると、なんで得物が増えるの?
ああ、そっか。「殴り方」の方を汎化してIoCするのか
Strategy Pattern ですな.
もっともだったら
Hammer hammer = new Hammer();
は
Weapon hammer = new Hammer();
にするべきだけどね.
>652
型だけでも int とかに書き換えときゃいいじゃんとか思うのが普通だと思うけど、
なんかそれを出来ない理由とかあるのかね。興味もないけど。
>>673 そこまで言うと Factory Pattern も導入したくなる
「ガッ」したいだけなのにw
>>675 「当てはまるパターンがあることと、それを当てはめた方が良いかどうかは別である」
保守性が上がるわけでもないのに「xxパターンに当てはまるから」という理由で
無意味にコードの書き直しをしたがる人が最近増えた気がする。
いや、別に
>>675を非難してるわけじゃなくて、なんとなく愚痴を思いついただけなんだが。
abstract class Weapon に抽象メソッド use() を用意して
Hummer extends Weapon で定義するべきではないのか
流れとは外れるが、"use"というメソッド名はあまりに汎用的すぎないだろうか。
名前には"attack"等の何をするかはっきり分かる動詞を選ぶべきでは。
#undef __TITLE__
#define __TITLE__ 【ぬるぽ】お前ら殴打クラス実装しようぜ【叩き】
辞めたくなったというほどでもないが。
if (!(!foo.getHogeFuga1().equals("") && !foo.getHogeFuga2().equals("") &&
!foo.getHogeFuga3().equals(""))) {
...
}
!(!A && !B && !C) == A || B || C ではないか。
>>680 ついでに条件式丸ごとExtractMethodしてMoveして、
foo.hasAllHogeFuga()あたりにリファクタリングしてやってくれ
>682
嘘書くなよw
VBだと全ての式が評価されるのではないでちょうか。
書式は明らかにC系でつが。。。
ああ、そういや VB ってショートカットができないんだっけ。
すっかり忘れてた。
>>683-683 あぁ、真が出れば途中で抜けるか、確率は変わらんな。
んでも、頻度を考えると本当の意味で等価なのは
!(!A && !B && !C) == C || B || A
じゃないのか。
漏れまだなんか勘違いしてる?
>>685 VBはANDだろうがORだろうがIFの条件式は全部評価される。
こういうコードって、気持ち悪くない?
if (str == null || str.length() == 0) {
689 :
仕様書無しさん:2005/07/20(水) 22:09:04
Eコマースサイト。リリース前でサーバーは遊んでる状態のはずなのに、
「商品詳細画面」を1枚だすのに0.5秒くらいウエイトがかかる。
「検索結果」に至っては体感2秒くらい待たされる。
不思議に思って、SQLへの問合せ文を全部ブラウザに表示するように
フックを入れてみた。
するとブラウザ一面が文字でびっしりと埋めつくされた。IN ( SELECT が
6重になってるところまであった。
多分、途中から書いてる本人もワケワカんなくなっちゃったんだろう。
ん?
str.length() == 0 が間接的で嫌だってこと?
あるいは…括弧を付けろってこと?
if( hogehoge != 1 ) {
if( hoge.equals( "hoge" ) ) {
hogeFlag = 1;
}
} else {
if( hogehoge != 1 ) {
hogeFlag = 2;
}
}
おわああ、このソースコードの主人は病気です。
>>688 言語が C++ なら、str の型によってはキモい。
型ちゃうわ、クラス。
>>690 言語仕様で左から評価されるのはわかってても
右側でぬるぽが出そうな雰囲気醸してるあたりが。
696 :
仕様書無しさん:2005/07/20(水) 22:37:17
>>695 それは…さすがに気にし過ぎだと思うよ。
言語仕様の隅をつついたようなコードでもないし。
私としては、ごくごく普通の良い子ちゃんコードだと思うけどね。
なんか&&の短絡評価は直感的に理解できるんだけど、
||は一瞬考えてしまう。
>>697 半分同意。けど、nullか、長さ0か統一すべきだと思う。
まぁ、引き継いじゃったもんは仕方ないけど。
>>695 その意見からは、「心配だから、ぬるぽチェックは
if (str != null) {
 if( str.length() > ) {
...
のように分けて書け」なんてハゲチャビンな
コーディング規約が派生してきそうな気がしていやーん。
>>687 頻度って?
どっちにしても、左から評価されるんじゃないの?
>>687 勘違いしてる。もう一回じっくり考えなおせ。
>>700 このスレ見てると十分あり得るように思えてヤですな……。
ウチのとこのルール。
「クラス名の先頭には"HGE0100"などの識別IDを付与すべし」
単なるUtilクラスとかが"HGE0100Util"とかになって激しく邪魔なんですが。
と思ってたけど、最後にちゃんと「Util」が付けられるだけ幸せなんですね……。
Pure COBOL環境なコーディング規約の方々、ご愁傷様です。
>>634 if((foo == true) == true )
>>705 if( ( (foo == true) == true ) == true )
>>706 if( ( ( (foo == true) == true) == true ) == true )
>>707 if( ( ( ( (foo == true) == true) == true) == true ) == true )
いつまで続ける気だよw
>>687 評価を終える条件
&&:最初にどれかがfalseになったら
||:最初にどれかがtrueになったら
結局、
>>688 のは言語は何で、str はどーゆー型 or クラスなんだ?
別に気持ち悪いコードでも無いから、これ以上追求しても意味無いのでは。
>>711 nullが小文字、str.length()から考えると、
Java辺りと見たがどうよ?
C/C++じゃないのは確かだろう。
ごくふつーのJavaのコードだと思う
PHPだけど。
function printIchiran(){
global $database;
global $form;
global $html;
global $template;
global $shohin_list;
global $shonin_template;
global $now_page;
global $next_page;
global $prev_page;
global $pages;
:
}
止めてくれー。
↑(;'A`)・・・・
Ichiran
まで読んだ
色々端折ってるけど分かるはず。
何でこんな冗長なことするのかな
if( hage.getHoge() == null ) {
hage.setHoge( "" );
}
public class Hage {
private String hoge;
public String getHoge() {
if( this.hoge == null ) {
this.hoge = "";
}
return this.hoge;
}
.....
最初はgetHogeの中でnullチェックしてなかったんだろう。で、呼び側でチェックしてた
それを後に指摘されてgetHogeでチェックするようにしたんだけど、
もう書いちゃった部分を直し忘れたと。そんなとこじゃないかな
char *p=str;
if( strncmp(p,"a",1) != 0 ){...}
まあ初心者がやりがちではあるが・・・
>>718 やたらnullチェックしたがる人間は多いな……。
こーいうソースって、単体テストでnullチェックが働くこと全部検証してるのかな。
個人的には、メソッドのシグニチャで「オブジェクトを渡せ」って言ってるんだから、
nullを突っ込まないようにするのは呼ぶ側の務めだと思ってるんだが。
もちろんnullにちゃんと意味がある場合はその旨どこかに記述するけど。
おいおい、publicである以上、なにが渡されるかわからんというのが基本スタンスだろ。
おれは何か実行する前にnullとかlengthとかチェックしまくるぞ。
チェックしないよりはしとくべきだと思うが
>>721 普通はするわな。
大概nullチェックで引っかかったらログを出してエラーを返して終わるから、
テストはしないけどな。
>>720 最初何が間違い?と思った。
一文字チェックなら関数呼ぶ必要ないってことか。
そういうのはアサートでやってください
assertは内部のprivateな実装の「想定外の」障害を検知するためのモンであって、
見つかったらそれは即「プログラムミス」。
publicなもんはちゃんとそれなりの例外を返すもんだ。
特に複数の人員で開発を行っているときは渡されたパラメータが悪いのか
内部処理が悪いのかは早々にはっきりできるようなプログラムにしておかないと
後々面倒が起きるからねえ。
>>724 最初は"a"で比較しようとして動かないのでstrncmpになったと見た。
一文字なので'a'になる、つー部分の罠だと思われ。
729 :
仕様書無しさん:2005/07/22(金) 11:39:50
>一文字なので'a'になる、つー部分の罠だと思われ。
・・・?
VBでのおはなし
フォーム直下に3500行、そこから引数をByRef(しかも省略)で10個渡すよーな
グローバル関数があり、そっちに飛ぶと今度は500行の代物、
んで、その中で更にグローバル変数が多数あり、何が帰って
きてるのかまるでワカラン...
マ板でネタかと思ってたモノが現実に目の前にくると、
最初眩暈がした...マジで目の前がクラっとする瞬間って
あるんだなぁと関心した。
んでトドメはボトムに
Resume Next
warosu
>>730 > フォーム直下に3500行
フォーム直下って何だ?
733 :
仕様書無しさん:2005/07/22(金) 19:25:25
これだからvb厨は
734 :
仕様書無しさん:2005/07/22(金) 19:27:45
ソースは評価対象として小さい
>732
bas かなんかに切り出せボケってことだろ
VB厨のくせにビット演算なんか使ってやがるのを見るとうんざりしないか?
VBなんて基本的にどうでもいい
738 :
:2005/07/22(金) 20:48:41
VBやってるつうだけで、会社辞める理由になるだろ
確か車関係の会社で「VBしか使いません」つーマ募集があったなぁ・・・
システム部作ったばかりで何も分からんちんですって感じの説明だった。
>>736 人が、というか、言語的にはビット演算が効率的とは思えないと言うのはある。
むしろ、VBでビット演算する例なんかAPI呼び出しくらいでしか見かけないので
いわゆる典型的なVB厨が、ってよりはCあたりから飛ばされてきた半端者の方がそういうわけ分からないコード書くな。
>>736 VBでも頻繁にビット演算してると思うが。
MsgBox "削除してもよろしいですか?", vbYesNo Or vbDefaultButton2
とか。
それ、確かにOrが正しいんだが、
実はVB6以前だと+で書くのが本流だったりする。
(もちろんOrでも通るが)
WS_BORDER + WS_CAPTION とかやったりしてドツボにはまるわけですね。
744 :
721:2005/07/23(土) 02:26:36
おおう、結構みんなnullチェックやってるのね……。
と、そいやリファクタリングにも「表明の導入」があったっけ。
一般的に有効なプラクティスみたいだし、
次の開発ではちょっと自分のコーディングを見直してみようかしらん。
というかそれ以前に
>>718は別に事前条件の表明の問題じゃ無かったな。スマソ。
>>726 「引数にnullを渡した場合の動作は保証しません」とかの
意図を表明するのにassertを使うのは正しいことじゃないかなぁ。
JavaならAssertionError投げられるし。
まぁ「例外」じゃなくて「エラー」だけど、
どっちにしろあんまりcatchするモノでも無いだろうし。
あ、C系のassertをイメージしてるなら分かるかも。
>743
俺はそんなコードを C で見たことがある orz
>>744 >「引数にnullを渡した場合の動作は保証しません」とかの
>意図を表明するのにassertを使うのは正しいことじゃないかなぁ。
assertion のデフォは off
開発(保守)時に意図的に on にするもの
RuntimeException とは目的が違う
>>726 >assertは内部のprivateな実装の「想定外の」障害を検知するためのモンであって、
ちょっと違う。
「想定外」を検知するっつーのはそのとおりだが、それが「内部のprivateな実装」に
ついてかどうかは関係ない。
ライブラリのデバグ版とか見たことがないのか。
748 :
仕様書無しさん:2005/07/23(土) 13:56:00
いやー普通
製品版でassertが出たらダメだろ
デバッグならいいけど
>製品版でassertが出たら
テスト不足!
assertを入力チェックに使うな、って入門書レベルの常識だと思うのだが。
744はほんとに職業プログラマなのかね?
製品版はReleasetビルドなんだからassertが出るわけないだろ。
>>750 入力には2種類ある。
誤りを受け入れるものと受け入れないものとだ。
受け入れるものについては、もちろんちゃんと(assertでなく)対処すべき。
しかし受け入れないものについては、それを表明するために(デバグ版で)assertする。
これが常識。
あんたのは常識じゃなくて、たんにいわゆる防御的プログラミングを
ポリシーにしてるだけじゃないのか。
>>752 同意
>たんにいわゆる防御的プログラミングを
>ポリシーにしてるだけ
本を読んだだけの学生さんとかがやりそうだよね・・・
errorとexceptionとassertの違いって何?
cppllの最近のログでも読んでみたら?
エラー・例外・表明
>752
いいよなー。
常に完璧なテストが行われる環境なんだな。
羨ましい。ほんとに。君はとても恵まれているよ。
>757
752じゃないけど、なんで?
>>757 752じゃないけど、完璧なテスト? 何を言いたいの?
プログラマというのは、コミュニケーション能力に欠陥のある奴のなる職業だから気にするな。
そうそう。
コミュニケーション能力が欠けてて、SEになれなかったから仕方なくマになった
っていう奴がほとんどだもんな。
ModConst.basという標準モジュール
private const AAAAACDE=0
private const BBBBBCDE=1
・
・
・
private const XXXXXCDE=454
こんなんばっか
イイカンジに狂っとるな
assertの概念も理解できない
>>757=750みたいな香具師でも
職業プログラマになれるんですね・・・
,j;;;;;j,. ---一、 ` ―--‐、_ l;;;;;; 所詮独学、アマチュアの俺は
{;;;;;;ゝ T辷iフ i f'辷jァ !i;;;;; 職業プログラマの足元にも及ばないだろう
ヾ;;;ハ ノ .::!lリ;;r゙
`Z;i 〈.,_..,. ノ;;;;;;;;> そんな風に考えていた時期が
,;ぇハ、 、_,.ー-、_',. ,f゙: Y;;f 俺にもありました
~''戈ヽ `二´ r'´:::. `!
学生やアマチュアに自信を持たせる750は偉い人
>>757 には胴衣できんが
>>750 って「製品版で使うものじゃない」って
逝ってるだけだと思うのだがこんなに叩かれているのはなぜ?
結局
>>762 ってこと?
あっ!自作自演に釣られたのか?>漏れ
>758
受け入れられない場合にassertするということは
リリース版では受け入れられない場合にそのまま
受け入れちゃうということだろ。
完璧にテストが行われるならば、受け入れられない
場合が発生する可能性はすべてリリース前に潰されるから
そのコーディングでも全く問題ない。実行時
例外を考える必要が無い。楽そうだ。羨ましい。
>770
テスト漏れが考えられる場合は
>もちろんちゃんと(assertでなく)対処すべき。
になるんじゃないのかな。
何を持って、受け入れる場合/受け入れられない場合を判断するかは状況次第だと思うので、
それを抜きにして「受け入れられない場合」のことだけを抜き出して
そんな風に乱暴な言葉で罵ったっていいこと無いと思う。
最近はあまりないと思うけど、1バイトでもコード量を減らしたい場合に
入力チェックを省略してその代わりテストを完璧にする、ってのもあるかな?
>>772 最近も昔も基本的に関数は仕様どおりに実装する。
テスト仕様は関数の仕様に基づいて設計される。
入力値のチェックをする・しないに関わらず、テストは完璧に行われる(←嘘)。
っていうか速度等の理由で「入力値のチェックをしない」という仕様は
ごくあたりまえに存在するわけで。有名どころでは std::vector の operator [] とか。
>>772 その逆の「入力チェックするからテストをいい加減にやる」ってこと自体あり得ないでそ。
時間がないからいい加減にやる、というのは良く有るけど。
速度等の理由で「入力値のチェックをしない」という仕様は最近でももちろん
ごくあたりまえに存在するし。有名どころでは std::vector の operator [] とか。
>っていうか速度等の理由で「入力値のチェックをしない」という仕様は
>ごくあたりまえに存在するわけで。有名どころでは std::vector の operator [] とか。
他にあるか?w
>>776 VC7 での std::string では、operator 〜 関連は
(恐らく)ほとんどが境界チェックをしていないようだね。
778 :
752:2005/07/26(火) 20:52:02
>>769 >>750が非難され気味なのは、assertというものを理解しようとしていないからだろう。
問答無用にassert不要論を主張しているようにみえるからね。
たぶん冷静な
>>771が正解。
>>776 あとはstd::dequeとかもたぶん。w
つか、STLのポリシーからいくとあんまり防御してないんじゃないか。
STLportはしてるみたいだけど。
vectorの場合はop[]がガードなしでat()がガード付きだった希ガス。
STLportはチェックするようにオプションで設定できるだけじゃないっけ?
実行時の効率や例外安全についても規格で決まってるから弄りようがない。
STLportはチェックするようにオプションで設定できるだけじゃないっけ?
実行時の効率や例外安全についても規格で決まってるから弄りようがない。
本番稼働コードにバグが残ってた場合に備え、
それを検出したら例外投げるコードは残しておくべきだ!という
主張は分からなくもないかな……と思いはじめてしまった
>>744 == 私。
上位のフレームワークとかで予期しない例外を丸ごとcatch(Throwable)し、
バグを検出した部分だけ無効化してシステムから切り離すとか。
「すんませんバグ検出しました。
[email protected]まで報告キボンヌ」とメッセージ出すとか。
このへんはassert使ってるとうまく出来ない……かな?
それとも、いっそリリース時にもassertをonにしておけばいいのか?
# どうでもいいけど
>>774と
>>775が見事に同じこと言ってるのはなんでだろう。
二重カキコになっただけでしょ。
なんか重かったのか?そこら中で二重カキコ多発してんだがw
if (本番稼働でバグが残ってたらヤバい) {
例外を throw & catch
}
else if (速度がクリティカルな要件ではない) {
assert の行を残しとく
}
else {
チェックなし・使用者責任
}
>>775 > その逆の「入力チェックするからテストをいい加減にやる」ってこと自体あり得ないでそ。
うむ。
つうかそれだと入力チェック自体が正しいことを保障できねぇw
750がド素人っていう結論が出たところで、次の話題どうぞ↓
素人っていうか、アサーションを理解できてないだけ
いいから次の話題どうぞ↓
│↑
└┘
おらっしゃあぁぁ!!!
∩∧ ∧
ヽ( ゚Д゚)
\⊂\
O-、 )〜
∪
791 :
仕様書無しさん:2005/07/28(木) 00:53:07
では早速。
別会社だが、納期に間に合わず夜逃げしたプログラマが書き残したコード。
if(a){
if(b){
if(c){
xxxx
}else{
xxxx
}
}else{
if(c){
xxxx
}else{
xxxx
}
}
}else{
if(b){
if(c){
xxxx
}else{
xxxx
}
}else{
if(c){
xxxx
}else{
xxxx
}
}
}
たかだか3重じゃないか。 まだまだ緩いな。
まさかとは思うが「まんま」じゃないよな?
795 :
仕様書無しさん:2005/07/28(木) 01:41:39
javaで3項演算子のこんな使い方があった。
boolean b = (x == 1) ? true : false;
っていうか、3項演算子とか使われてる時点で臭いと思う。
>>791 if(c){
xxxx
}else{
xxxx
}
だけでいいって話?
それ、コピペだけして処理書き換えてないだけじゃねーの?
まぁ、書きかけのコード放置で逃げられたら本来の意味で辞めたくなるが。
>>797 いや、検索部分のコードなんだけど、入力値が3種類あって、それぞれを
使う・使わないで条件分けしてSQL文を8種類用意してたんだわそのプログラマ。
しかも長いのなんの。こっちまで夜逃げしたくなったよ。
条件式を' AND 'で挟むのにいい方法を思いつかなかったらしい。
コメントアウトの中にこれまた涙ぐましい努力の跡があった。
って書かれればコードなんぞ書かんでも分かるのに。
SQLの問題をCだかJavaだかの問題と勘違いしてるコミュニケーション不全と一緒じゃ逃げたくもなる罠。
RDBで2次元配列って扱えるか?
「テーブルから2次元配列で取ってきて・・・」って話だけで脳が逝きそうになった。
例でいうと、AAAテーブルんなかに A1, A2, A3, B1, B2, B3, C1, C2, C3, ... てな感じの列がずらっとあって・・・('A`)
CUBEとかPIVOTとか?
3項演算子ってだめなん?
boolじゃないけどC++で795風に変数宣言しつつ
値入れるときによくやってしまう orz
3項演算子の部分が40文字超えてくると嫌になってくる。
あとは2,3項目に副作用のある式があったりとか。一瞬悩む。
>804
胴衣。
同僚に通ぶってプログラム書く香具師がいて迷惑してる。
副作用を持つ式を3項演算子に入れるのは勘弁して欲しい。普通にif文使えよ。
2倍するところも、わざわざシフト演算子使わなくても、最近のコンパイラはちゃんと最適化してくれるから。
>>803 漏れも if よりコンパクト且つ副作用なく書ける場合なら使う
3項演算子ってだけで脊髄反射する宗教家もいるが要は使い方しだい
つーか795の場合、
boolean b = ( x == 1 );
でいいんでない?
ここで三項演算子をネストして使った事があるのを告白しておこうw
>>804-806 俺も同意だ!
a = cond ? foo : bar;
で済むものを
if( cond ) a = foo;
else a = bar;
にしろと言うのなら断る!
>>796 >>808 if〜elseで書くよりも簡潔に書けるんであれば問題ないと思うけど?
>>808 変数に値を入れるだけのちょっとした条件分岐では常套だと思ってたが。
こんなんだろ?
x=A?p
:B?q
:C?r
: s;
condA?(condB?a:b):(condC?d:e)
とか、さらなるネストとか
>>800 コード上で文字列の組み立てが出来なかったから3重条件分岐に
しちゃったわけで、SQLの問題だとは思えないが。
仮にどうしても条件分岐でSQL文を8種類用意しなきゃならん状況だとしても、
>>791のコードは有り得ないだろ。
あと、夜逃げしたのは全然知らない会社のプログラマ。
それでお得意さんが困っててなんとかしてくれって渡されたのが
>>791。
よく考えずにコーディング始めて、途中で思いついて継ぎ足していったって印象だな。
814 :
795:2005/07/28(木) 19:15:43
俺が言いたかったのは
>>807のことだったんだが。
3項演算子のネストなんか絶対使わない。即、代入のためだけに使う。
うろ覚えなので間違ってたらスマソ。
SELECT A.HOGE, B.HAGE FROM A, B WHERE A.ID = B.ID
UNION
SELECT A.HOGE, NULL FROM A WHERE NOT EXIST(
SELECT * FROM B WHERE A.ID = B.ID
)
眺め始めてから3日目くらいに、この人は外部結合を知らないらしいと気づいた。
プロジェクトの終わり頃に、会社で使われているSQLチューニング用ソフトが、
最適化と称して外部結合をこんなふうにバラしてくれることを知った。
>>815 そのSQLを組んだ人は、実は外部結合を知っていたのに、
会社の最適化ソフトが外部結合をばらすから、あえて使わなかった。
というオチなのか?
>815
なんかそれ逆に効率悪そうだなぁ…。
Oracleだよね?
ぽすぐれはJOINの最適化効率良くないとは聞いたことあるが。
819 :
815:2005/07/29(金) 01:32:33
>>817 Oracleっす。最適化ソフト、実行計画も一緒に表示できるけど、
全然改善されてなかった。
SQLもホントは一つのSELECTが1画面に収まらないくらいで、
それが4つか5つくらいUNIONされてますた……。
ちなみに受けた指令は
「これが今稼働中のシステムのSQLだから、
ここから仕様を読み取って同じ意味になるようにJavaに移植して」
しかもビミョーに列の型とか意味とか違う。
>>816 その人が外部結合知ってたかは分からないんですが、
内部仕様書には同じSQLが載ってますた。
知ってたら、元のSQLはこうだけどツールで最適化したらこうなった、
くらい書いてあってもいいような。
「ツールに最適化させたらこうなったぞ。外部結合は使わないでこうする方がいいのか!」
なんて学習してませんように……。
821 :
仕様書無しさん:2005/07/29(金) 08:05:51
そのツールなんてツール?
>>820 そんなまどろっこしいこと書くなよ。
同じ内容のことは一通りだけにしてくれ。
823 :
仕様書無しさん:2005/07/29(金) 11:48:58
ソースの問題はソースで片付く
ソースの問題を放置する文化は現場や会社の問題
仕様変更くらいがちな関数の変更履歴
//変更点:疲れた[2005/xx/xx A]
//変更点:俺も[2005/xx/xx B]
//変更点:俺も[2005/xx/xx C]
//変更点:暑いね[2005/xx/xx A]
//変更点:そうですね[2005/xx/xx チーフ]
//変更点:仕様変更に対応。紆余曲折の末こうなりました[2005/xx/xx A]
消していいか
>>824 まぁ、それってバージョン管理として日付だけ残ってれば良いってだけなんだろうな。
そういうのはチームとかプロジェクトのノリにもよるだろ。
漏れもコミットする時にコメント付けないことのほうが多いのでどうこう言えん。
827 :
仕様書無しさん:2005/07/29(金) 17:13:25
>>824 ユーザー側と仕様をネゴッた履歴などを記録した方が
後々に通りが良かったりする。
>>827 そりゃそうだけど。
記録方法がソースである必然性がわかりません
829 :
仕様書無しさん:2005/07/29(金) 19:39:36
ソースは消えてなくならない管理がされている場合が多いから
>>828
>>827 どういう経緯でその結論に至ったかって残して欲しい…
// TODO:fix me!
>831
それ、antか何かで見たなぁ、実際 orz
>>831,832
そういうときはXXXだ。
塩兄ちゃんもオススメ。
1.壊れたプログラムを直せ!なのか
2.壊れたプログラマを治せ!なのか
2だとしたらなんか感慨深いな。1だろうけど
汎用機で動かせるギリギリのサイズまで大きくなってしまったプログラムを改造。
仕様の要求自体、無茶だから仕方ないのだろうけど俺は始めてコンパイルで
”システムで動かせるプログラムサイズをオーバーしています”という意味のエラーコードを見た。
いったい何億行のコードだよそれ
分割するかなんかしろよって思うな。
メモリ空間の限界まで使いきってるってことか?
アドレス24ビットのOS/マシンなのかなあ
4104バイトだったりして
>>835 けど、デバッグ用にメモリを確保しようとしたら、
足らんくなる事はよくある。
とりあえず、チューニング汁。
>>840 エラーはコンパイルで起こるらしいから、それは関係ないだろ。
結局、後日プログラムが長過ぎて仕様変更できないので何本かに分割されました。
やっぱり無理があったか。
プロなら分割して書くのは当然と思っていたけど、ホントにそんなコードが存在するのにビックリ
最初の予定だとそこまでいかないハズだったんだよね。
しかし客がケチだったから、パソコンにまで対応するためにドンドン、プログラムが長くなっていった。
>>844 2行目の後半辺りから素人臭がするのは気のせいか。
━━━('A`)━━━・・・・・
private int l;
言語書け言語
多分JavaかC#。
で、lはインスタンス変数。
……グローバル変数でiとか宣言するのと変わらんセンスでつなorz
まあ汎用機の連中のすることだしな。
汎用機だったらいいんだけど
・・・どっちにしろ良くはないか
すまん、Javaだよ。
private int l;
public void test() {
// この中でも l を宣言して同様にカウンタとして使う
}
上の方で書いたのを忘れただけ。
>>848 まさに今 int i,x,y; がグローバル変数として宣言されているCソースをメンテしてる。
ローカルで十分な用途でしか使われて無いので大きな問題は無いけど...
.
i,x,y がローカルでしか使われていないってどうやって検索ちたのでちょうか。。。
いいアイディアが浮かびまちぇん。。。
ひたすら追う
855がどうやったかは知らんが、
最近のIDEならグローバルで宣言してるとこ潰せば芋づる式に解析してくれるだろう。
で、使ってるとこので宣言文だけ頭に付けて値未定義の警告出なけりゃソース読まんでもそこはローカル宣言で十分ってことだべ。
int i;
int main()
{
i = 0;
hoge();
printf("%d", i);
}
void hoge()
{
i = 999;
}
このパターンは?
あー、それだとダメか。
たぶん関数とか使ってないんだろうな>十分にローカルな
\bi\bとかでひたすらgrepくらいしか思いつかない。
ソースの書かれ方にもよるが、
egrep -n "(^[a-z]|\bi\b|^{|^})" *.[ch]*
でダイジェストっぽいモノを作れれば多少は助けになるかもだ。
>>856 漏れならグローバルな方の宣言や定義をコメントアウトして
ビルドしてみる。
>>864 それもコード中に散らばってるという罠。
>864
externの存在とか忘れてない?
867 :
855:2005/08/12(金) 07:58:48
非常に遅レスですが...
858 の書いた通りですよ。
もっともエラーになった関数はじっくりチェックして 859 の様なケースが無い事も
確認しますた。
新しい現場のソースコードを調べてみたら、
800ファイル15万行以上のソースの中に、インターフェイスが10個のみ。
その内7個は定数が定義されてるだけでメソッドが存在しない。
明らかにシグネチャが同じクラスも何も実装していないので、
ポリモーフィズムを実現するのにリフレクションを使わないといけない。
abstractでGREP検索したら3ファイルのみヒットした。
二つはインターフェイスなのにメソッドにabstractが付いていて、
一つはabstractメソッドが存在しなかった。
コメントとかはすごく丁寧に書かれているんで書いてる本人達は
いい仕事してるつもりだと思うが、定規と分度器で正確に書かれた
幼稚園児の落書きみたいなもんだ。
早く撤退させてくんないかな。
printf(" のーばでぃーnullpo ww ");
870 :
仕様書無しさん:2005/08/12(金) 23:59:31
>>868 あのな、現場のソースはお前の遊び場じゃねぇんだよ
企業活動なんだから金になるかならないかなんだよ
そんな細かいこと気にしてんじゃないよ。
さっさと撤退した方がプロジェクトの為だな。
>そんな細かいこと気にしてんじゃないよ。
( ゚д゚)ポカーン
>>870 お前みたいな勉強しない三流PGは中国に仕事持ってかれて終わるぞ。
その前に引退しろよ。
>>868 java棒よ
abstractはなんとか意味かわかるが
インターフェイスは意味がわからないのだよ
java棒以外にも伝わるようにかいてくれないか
>>868 あんまりでかいシステム(でもって個々の機能はそんなに複雑でもない)システムだと
変に凝った事されるよりも「オブジェクト指向って何?」みたいなベタなコードの方が後のメンテナンスは楽だったりする事がある。
まー、要はWebシステムの事なんだけど。
っていうか、今雇ってる派遣の香具師が
全画面共通ならともかく1画面ごとにインターフェース定義したり、
明らかに1行で書ける処理を別クラスにしてたり(それによって他と共通化とか省力化ができてるというわけでもない。なぜなら画面ごとに別に作ってるからwwwっうぇw)、
voidで良いメソッドにthis返して1行でいくつもメソッドつなげて呼べるようにしてたり、
なんかもうわけわからんソースを書いてた事が判明して、
新人とかにバグ鳥やらせようにも不可能なので、技師の肩書き付いてるような奴ら駆り出してわざわざつまんねータグの打ち直しとか事やってる。
マジ辞めたい。
まぁ、辞めねーけどな。
>873
アセンブラ使いしか分からんコード、VB使いしか分からんコード、C++使いしか分からんコード。
そんなもんがスレにしか登場する事はまったく珍しい事じゃないわけだが。
分かった振りして放置するか、勉強しろ。
コード書きならC++、Java、VBは読める程度には知っておかないとヤバいと思うがな。
VBのこと全部忘れていいから代わりにJavaの知識あたまんなかにはいらねーかな
>>876 べんきょうしないと入るわけないじゃないか、のび太くん。
昨日、ドラえもんに「アンキパン」という便利?なアイテムが登場ちていまちた。
そうでつかー
よかったでちゅねー
はいはい
880 :
仕様書無しさん:2005/08/13(土) 18:31:32
PM「何でもいいからとにかく完成させてくれや」
>>876 VB.NETやれば勝手にJavaもできるようになると思うんだけど。
>>874 変に凝って作ると逆にメンテが難しいよな。
シンプルに書くのが一番だ
>>883 シンプルが一番なので関数はmainだけです。
ツマンネ
>>874 OOが悪いんじゃなくそいつがアフォなだけでは。
モチロンソウヨ
会社の英知が結集して開発したというシステムの中にあった、
数百行規模のwhileループがあちこちにあるPerlのコード
ソフト作ってる会社のくせにたかが、年賀状の住所印刷するプログラムのバグが何年も直らない。
株式会社ヤシマ
なぜか、std::dequeしか使わないウチの会社の技術者達。
(制御系で主にC++使用)
なぜそんなマイナーなコンテナにこだわるのかと
思っていたのだが、最近理由がわかった。
どうやら、約10年前に開発環境がCからVC++に移行したとき、
イベントキューを実装するためにdequeを使い始めて以来、
どんな用途にもdequeを使うようになったみたいだ。
std::vectorなど、他のコンテナの存在を知らないらしい。
技術者間の会話でも、「デキュ−が・・・」
「そこはデキューを使って云々・・・」など、
できゅーできゅー云ってて凄く打つになる orz
>>890 デフォルトを deque にしとくのは、実際のところそんなに悪くは無い。
vector では再確保の問題、 list ではランダムアクセス不可という
明らかな問題があるが、 deque ではそれらの問題がマイルドブレンドされている。
最適では無いが問題は起こりにくい。
たしかに「マイナーである」と言うのが明らかな問題と言えなくも無いが。
>>891 おお、こんな時間にレスありがとう。
確かにdequeは「明確な短所がない」ところが長所ですね。
でもウチの技術者達はそこまで考えてはいないと思う・・・。
>たしかに「マイナーである」と言うのが明らかな問題と言えなくも無いが。
それもそうだが既存コードのコピペがまかり通っていて、
「学ぶ意欲がない」のが一番の問題かも。
制御系でC++使うのは革新的なのでちょうか、それとも認識が古い?
でもVC使うってことはWindowsCE or Mobile なのかな。。。
久しぶりだねキモコテ
>>893 OOらしい実装から better C としての用途まで
環境に合わせてどうにでも書けるのがC++のメリットなわけで。
>でもVC使うってことは
eVC ならそうだね。
deque知っててvectorもlistも知らないってすごいな。
dequeの使い方調べたらどうやってもそれらの存在に気づかざるを得ない気が。
>>891 ちなみに読み方はデキューじゃなくてデックが正解だね。
>>874 OOP - OOD = 糞コード
>っていうか、今雇ってる派遣の香具師が
コードレビューで指摘して直させれば?
・・コードレビューなんかする会社ならこんなところで愚痴らないか('A`)
>>891 ランダムアクセスはdequeもできないぞ
でも、俺もdeque大好き
件数が1000件、場合によっては1万とかなら
vectorはありえないんで、listかdequeになるんだけど、
追加削除が起きてもイテレータが失われないというメリットが必要なければdeque
その辺になると、双方向のポインタ分の容量も気になってくるし…
1万件でも80kbって対したことないんだろうけど、
RAM8kbの時代からプログラムやってるから、気になって仕方ない
900 :
890:2005/08/21(日) 10:18:35
>>893 >>895 組み込みもやってますけど、この場合は
Windows NT系です。
>>897 本気でしらなかった・・・。
まわりがそう呼んでるから、そうなんだと・・・。
自分も同類だったわけか orz
deque=デック
dequeue=デキュー
おぼえました。
>>899 dequeはランダムアクセスできるよ。
vectorとdequeの使い分けを件数で語るのもよくわからん。
Borland C++3.0 あたりだったと思うが、クラスライブラリの説明書に
Deque: double ended queueの略でデックと読みます。
と書いてあった記憶がある。
MtGのデックと同じ意味だと思ってた。
> deque=デック
> dequeue=デキュー
ガ━━(゚Д゚;)━━ソ!
違いに気付いてなかったよ。読むときは何となくdequeueに脳内変換してた。
>>903 それはdeckだな。
カード一組という意味なので、トランプ52枚(+ジョーカーs)でも
そう呼ぶ。
dequeueは、キューから要素を除くという意味で使うね。
入れる方はenqueue。
入れるぜ
「え〜ん」
「きゅぅ〜っ」
初めて、queueって単語を見たときに「くえうえ?」と読んだのは内緒だ
>910
('A`)ナカーマ
お、お、俺だけかと思ってだば
おぉ。俺もデータ構造としてのキューはしってたがqueueはよめんかった。
何で読めないんだよ。。
queueはなぜか最初からちゃんと読めたが、
pseudoをずっと「ぷしゅーど」と言っていた過去を消してしまいたい。
queueって、なんでqueじゃいけないんだろう?
>>916 だったら、いっそのことQと表記すればと思う漏れ学生
いま何気なくBabylonでqueueを調べたんだが、弁髪っていう意味もあるそうだ。
よりによって弁髪かよ。
ワロス
なるほど
>>916 「qu」は「kw」の音を表す。だからqueだけだと「クウェ」とか「クィ」とかに読める。キューとは読みにくい。
>>918 > 弁髪っていう意味もあるそうだ。
っていうか、そっちのが語源に近い。queueの語源は尾→結った髪→列
ポニテじゃなくて辮髪かよぉ
>>915 読めなかったので調べてみた。
knifeを「くないふ」って読むのと同じなわけね。
>>924 ×:読む
○:書く
やっちまった・・・
前提として、iDatには整数値でセンチメートルの値が入る。これをいろいろ計算してから
結果を画面に表示するんだが、このとき、単位をメートルにするので、100で割って
小数点二桁まで表示、と仕様書には明記してある。
int iDat;
double dDat;
char cStr[256];
sprintf( cStr, iDat / 100, "%.2f" );
dDat = atof( cStr );
全ソースにわたってこんな具合。
しかもcStrは一度も初期化してない。
もう見直すの疲れたよママン・・・・
cStrの初期化必須って考え方が古いよ
プラットフォームが古いOSなのでわ
そういう問題ではないのでわ
辞めようと思うほどじゃないな。
元制作者を絞めたくはなるがw
寧ろ、
>>926 の sprintf の前に memset(cStr, 0, sizeof cStr) なんか
してたら莫迦。
>>931 そういうコードは良く見かけるけどねw
初期化欠落に起因するバグを避けるために全ての変数を初期化しなければならない
という強迫観念に取りつかれている人がまだまだ多いようで
sprintf( cStr, iDat / 100, "%.2f" );
ってコンパイルとおるか?
>>933 #include <stdio.h> してなけれりゃ、通るんじゃね?
ところで
sprintf(cStr,"%.2f",(float)iDat/100.0);
sprintf(cStr,"%d.%02d",iDat/100,iDat%100);
どっちが好き?
結果として得られる文字列は同じだね
でも普通に考えたら前者だよな
後者は完全に固定小数点として扱ってて誤差が無いって意図なんではないかと。
>>937 double の仮数部が 52bit で iDat がたぶん高々32bit位だとするなら、
sprintfの表示桁に丸める処理の実装具合によっては、同じ文字列が
得られるかも知れないけど、
そんなこと検証したりテストしたりしたくないし、普通は後者にすると思う。
この場合、有効数字が全部残るのがわかってるわけだから、
十進と二進の誤差があったとしてもきっちり理論値に丸まるはずじゃない?
%fって四捨五入だろ?
どちらかというと、十進やら二進やらの誤差よりも、
iDatをfloatに変換するときの精度落ちの方が気になるかな。
floatの仮数部は実質24ビット分しかないわけで。
iDatって多分32ビット符号付き整数でしょ?
仮に(float)iDatを(double)iDatに読み替えて、誤差の計算をしてみる。
(double)iDatと100.0を2進小数に落とし込むところでは誤差0。
除算は計算結果の丸め(多分四捨五入)による誤差しか発生しない筈なので、
誤差は"2^(計算結果の指数部-54)"ぐらい。
で、計算結果の指数部ってのはiDat == -2^31の時に最大となり、
その値は25あたり。
だからこの段階での最大の誤差は2^-29 ≒ 0.000000002程度。
2進→10進小数変換は、計算方法にも依るけど誤差なしなので、誤差は変わらず0.000000002程度。
(double)iDat/100.0の正確な値は0.01刻みで変化するので、
四捨五入されても多分余裕で大丈夫。あんまり自信ないけど。
まあ、こんな計算してまで確かめるくらいなら俺は後者の書き方をするかも。
クミコで3MHzの石という理由で後者を選びます。前者は論外。
除算が2度あるのも気になるところ。div関数の結果をそこに書けばintが2つpushされるので
除算が1度で済みます。
>>941 分かるも何も、floatの有効桁が3桁の実装なんて存在しないだろ。
cmで計算してmに直す、なんてことを言ってる値が
16ビット以上あるとも考えにくいな
整数値を実数化して100で割ったら0.01以上の誤差が発生する
のは何桁以上の整数なのかを考えなよ
だからそんなに計算誤差を気にするんならCOB(ry
>CO(ry で実数演算
実数つーか、計算自体は整数としてやっといて、出力時に「ここ小数点はいる」ってやるだけだが。
速度その他を考えると分からんが、できんもんでもないんじゃ。
もちろん、できるからといって適しているとはかg(ry
インラインアセンブリ入れればPentiumの十進整数命令が使えるんじゃないかな。
いつだったかfloatで7だか9だかを表示しようとしたら
6だか8になって以来double使うことにしてる。
>>952 floatの代わりにdoubleを使えば誤差のことは考えなくて済むってこと。
済むわけないだろ。
955 :
952:2005/08/27(土) 16:19:39
>>953のいいたいことも
>>954のいいたいこともわかるが、
なんで7とか9とかが6とか8とかになるわけ?
マルチスレッドプログラムでも、volatileさえ使っていれば完璧です。
単にintに代入して切り捨てられたという話だな
>>951ではないが、
#include<stdio.h>
main(){
float a;
int count;
for(count = 0; count < 70; count++) a += 0.1;
printf("%d\n", (int)a);
}
% cc test.c && ./a.out
5
%
6どころか5になっちまった。
>>95 aの初期化ちてないからでちょ。。。
VCだとちゃんと6になるよ
>>960 ぎゃーホントだ。すまねえ。初期化してやりなおしてみたら俺もちゃんと6になった。
「ちゃんと」ってのも変な話だが。
なんつうか、結局Cって糞だな。
なんつうか、結局963って糞だな。
浮動小数点の誤差の研究はいろいろ文献があったなぁ。
いずれにせよスレ違いだが.......。
そうか・・・議論がかみ合ってなかったんだね>浮動小数点の誤差の研究
マルチポストしすぎ
データクラスのインスタンス変数が皆Public
そのくせgettersetterがある
さらに別のファイルにも同じ名のグローバル変数がある
さらに別のファイルにgettersetterがあり
setterで↑のグローバル変数に↑↑のgetterで取ってきた値を入れて
getterで↑↑のグローバル変数参照
>969
わけがわかりません
それは心の病気だ。
どうどうとSTL使えるだけ羨ましいな
今度の派遣先、MFCのコンテナだらけ。CPtrList, CArray, CList, CMap _| ̄|○
俺「なんでここではSTL使わないんですか?」
プ「STLって何?」
俺「え?」
MFCか。もう、何もかもが懐かしい……。
MFCよ!! 973は帰って来た!!
MFCなど邪道
糞コテなど邪道
MFC
My Favorite C
979 :
仕様書無しさん:2005/09/04(日) 12:46:54
最近はboost使ってもいいところあるけどなぁ。
やぱーりCodeCompleteは必読書ですかね?
>>980 自己流のみより百倍マシ。とはいえ、読むべき人ほど読まないジレンマ
それジレンマじゃなくて悲しい現実って言うんだよ。
使う側の意見だろ>ジレンマ
>>983 とは言うものの、使う側が買い与える訳でもない罠。
プログラミングの本って漫画よりずっと面白いと思うんだけど
なんで読まない奴が多いんだろうね。
絵が無いからでしょ。
>>984 自己投資は自分のお金でね。
生き残ったら使い続けてやるよ。
ってのが雇っている側の理論なんだろうorz
>980
訳書新版はとうとう2分冊ですよ旦那。
立ち読みした感じ、買って読むほどのことが書いてないと思ったのだが。
それだけ世間に浸透させたってことで旧版の功績か? >CodeComplete
int main(void){
return func1();
}