( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>1
1-2を書きたくてスレを立てた
4 :
仕様書無しさん:03/02/16 22:20
otsu
無駄スレたてんな。
速攻で削除依頼だしとけよ。
6 :
仕様書無しさん:03/02/16 22:27
さっき、会社で眺めてたコード。
void main(int argc, char *argv[])
{
for(;;){
funcA();
funcB();
:
(略)
:
funcM();
break;
}
funcN();
}
ヲイ、そのforループは、いったい何のためにあるんだ!?
>>6 きっと、昔はちゃんとループになってたんだよ。
そう思っておこうよ。
10 :
仕様書無しさん:03/02/16 22:29
>>6 途中にcontinueがはいってるだろ。よく読めよ。
11 :
仕様書無しさん:03/02/16 22:36
12 :
仕様書無しさん:03/02/16 22:48
13 :
仕様書無しさん:03/02/16 22:48
/* ディレクトリサーチ */
system("ls -F >ls.tmp");
fp = fopen("ls.tmp", "r");
while (fgets(buf, sizeof buf, fp) != NULL) {
if (buf[strlen(buf) - 1] == '\n') {
buf[strlen(buf) - 1] = '\0';
}
if (buf[strlen(buf) - 1] == '/') {
chdir(buf);
system("ls -F >ls2.tmp");
fp2 = fopen("ls2.tmp", "r");
while (fgets(buf2, sizeof buf2, fp2) != NULL) {
if (buf2[strlen(buf2) - 1] == '\n') {
buf2[strlen(buf2) - 1] = '\0';
}
if (buf2[strlen(buf2) - 1] == '/') {
/* 延々と続く */
}
}
fclose(fp2);
rmdir(ls2.tmp);
chdir("..");
}
}
fclose(fp);
rmdir(ls.tmp);
情状酌量で執行猶予つきという事か
>>13 popenぐらい教えとかないとダメじゃないですか(違
>6
昔、Cマガで、
「昔はgotoは嫌いだから、代わりにfor(;;;)とbreak使ってたYO」
みたいな話を見た記憶が
>>13 結構このコード妙な味わいがあって好きかも...(w
で、何段ぐらいディレクトリを降りてくれるの?
goto禁止令でてるので
do{...}while(0)とかつかっちゃってます
19 :
仕様書無しさん:03/02/17 00:21
char buf[256];
int pointer;
for (pointer = 0; pointer < 256; pointer++) {
c = buf[pointer];
// 処理がつづく
}
ポインタちゃうだろ!先輩しっかりしてください!
>>19 ポインタ=「指し示すもの」という意味ではあってるよ。
このばあいはカーソルのほうがしっくり来る気がする。
indexじゃないの?
>>18 gotoよりましだが・・・
ちゃんと処理見直してまともなコードに汁
DOSの頃は0番地書き込もうとするとデータセグメントの先頭アドレスへ書き込んでいたような気がするんだが、今はどうなんだろー。
26 :
仕様書無しさん:03/02/17 07:15
>18
私の所、開発言語はCなんですが、規則で、goto, continue, 途中でreturn, が禁止されています。
そのせいで、深いネストのif, 満艦飾のフラグ, エラー処理は随所にコピー&ペースト, のコードが大量生産されています。
変数の命名規則もすごいことになっていて、ソースが読みにくくてたまらんです。
その割にグローバル変数にはコメントがなかったりして。
開発規則ってなんでああやって当初の目的から乖離していくんでしょうね。
>>26 偉い人の中で一番出来の悪い奴に合わせるからじゃない?
28 :
仕様書無しさん:03/02/17 09:22
深いネストのifやフラグ、大量のコピペ等の大半は、
そのコーディング規約がなくても存在したのでは?と想像してみる。
ひとつの関数が1000行とか有ったりするだろ?お前の会社のソース。
>>28 26の言う途中でreturnってのがよくわからないんだが、
もしもこれが「関数の途中でreturnしてはいけない」というだけの
とんでもないものだったとしたら、
関数の途中で処理を抜け出したい場合(つまり途中でreturn)、
関数を呼び出し元の関数の中に展開して
その中でループをbreakするなりなんなりの実装をしなきゃいけない。
フラグを使うってのもその辺から生まれてくるかも。
全部が全部そうなるとは思えないけど、
ソースは汚くなりそうだよ。
グローバル変数にコメントが無かったりする、
深いネストのifが発生するってのは腕次第で何とかなると思うな。
>>29 > その中でループをbreakするなりなんなりの実装をしなきゃいけない。
いや、
>>26が書いていることから想像するに、ループからのbreakも禁止なんだろう。
その辺からifの深いネストやコピペの散在になるんじゃないの?
>>26 ひょっとしてexit()も禁止とか・・・だとしたらガクブルもんですな。
>>29 > 関数を呼び出し元の関数の中に展開して
> その中でループをbreakするなりなんなりの実装をしなきゃいけない。
この発想はすごい。
>>26 gotoはアレルギーのある人いそうだけど…
ごちゃごちゃになった関数を、continue、途中でreturnを使って
すっきり書き直してどっちがいいですかと訴えてみたらどう?
変なフラグとか条件判断とかなくなるからものによっては
行数で半分くらいになったりしないか?
>>26 それは「規則」の問題じゃなく「人間」の問題だろ、やっぱり。
そういう間抜けな規則に馬鹿正直に従って糞コードを量産する奴らが
問題。規則を疑問視したり問題提起したりということがしにくい職場
ならそれもまた問題。
「間抜けな規則」の存在は単なる氷山の一角に過ぎないよ。
漏れも途中 return は嫌い。メモリ解放のし忘れとかのバグを出しまくった後、
「やっぱり関数の出口は一つにした方がイイ!!」という結論に達した。
おかげでインデントは深い。昔、横80桁のモニタを使っていた頃は、そうでも
無かったのだが、最近のWindowsで広い画面(1600x1200)とかで使ってると、
インデントはどんどん深くなる。10段とか……。この前気になって調べてみたら、
最高14段だった。
書いてる本人は、特にわかりにくいとは思わない(自分で書いてるんだから、当た
り前)のだが、社内では、すこぶる評判が悪い。
多分、漏れのコードを見て、何人か辞めたと思う。
>>35 そういうときこそgotoの出番なんだがなあ。
一つの関数に一つのreturnってのは、
構造化プログラミングの最初期に盛り込まれていた規則だったと思う。
その後、
>>33みたいに可読性を重視する人間が現れて、
必ずしも守らなくていい規則に変わったはず。そう記憶している。
ので、これはもはや宗教論争ではないかと。
>>35 C++だったら「デストラクタを使え」というところだが…
42 :
仕様書無しさん:03/02/18 00:02
流れをぶったぎり、しかもソースコードじゃなくてスマソだが。
いま唐突に10年前の出来事を思い出したので書くぞ!
そのころ自分はC使いで、見よう見まねでデータ中心設計のようなやり方を
始めていた。変数のスコープはなるべく1ソースファイルに収まるよう
心がけ、各ソース間のデータフローを書いて、すっきり見える構造を模索した。
一人かせいぜい二人で作るシステムが多かったので、誰も導いてくれない
かわり、そうやって好きにやれる部分もあった。
本からヒントを得て、ほとんどすべてのソースにテスト用のメイン関数を
書いておいた。
単体でビルドして、ソース内の各関数をテストできる。当たり前の方法かも
しれないが、process_1(),process_2(),…process_20()なんて命名が
まかり通る社にいた自分には、なんてインテリジェントな作法だ!と感動さえ
湧いたものだった。
もちろん、テスト用メインは普段はコメントにしておく。(リンカ通らないしな)
あるとき、システム完成間近の時期に、1年先輩の人の手を借りることに
なった。
どういう形で手伝ってもらったか詳しくは覚えていないのだが、とにかく
二三日したある日、先輩がニコニコして言った一言。
「コメントになってるとこ、全部削っておいたからね♪」
そ れ は 要 ら な い か ら コ メ ン ト に し た ん じ ゃ な い で す。
と、最初に言わなかった自分が悪いんだろうきっと。しかしあんたも
プログラマなら、コードを見て少しは察してくれませんか。
process_20()を見ても辞めようと思わなかった自分だが、このときは
この人の後輩でいなければならないその会社を飛び出たくなった。
出る杭は打たれる。才能のある奴は足を引っ張られる。口のうまい奴は出世する。
>>44 いや、書き方が悪かったかもしれないが、先輩のニコニコは混じりけない
親切心に満ちていた。
むしろそれがイジメになると気づくくらいであってほしかった…
ちなみにその会社はその後数年で潰れ、自分は社員数こそ少ないが
はるかに居心地のいい社に移れました。
例の先輩は異業種に行ったそうだ(´∀`)
>26
そもそもループの制御構文である continue, break と、無条件ジャンプの goto を同
一視する時点で大きく間違いだと思うんだが……
構造化の結果として必要となったのが continue, break であるわけで、これを使うな
ってのは構造化をするな、っていうことになりはしないのだろうか?
ろんぐじゃーーーんぷ!!
49 :
仕様書無しさん:03/02/18 02:14
setjmp()すんの忘れてた〜!
50 :
仕様書無しさん:03/02/18 02:28
> 47
あのー、多重ループの中からエラー処理するときどうやってんですか?
>>50 47ジャ内が・・・
適宜関数化してリターン。
もしくは、多重ループをちゃんと論理展開して・・・
>>50 やった事ないからわからん。
今の会社に入ってからは、単なるCは使ってないし。
>>42 コメントにしないでたとえば、
#ifdef UNIT_TEST
#endif
なんかでくくっておけばよかったかもな。
その変な先輩とやらも意味がわからないだろうから手をつけないだろうし(w
すんません、書き間違いました。
多重ループからエラーで抜けるには云々は、35に書きたかったことでした。
42には、無条件ジャンプなんかより、無条件goto排斥派のほうが問題だよな、などと書くつもりでした。
>51
そういうときはgotoでいいと思うんだけ、だめ?
gotoを使わないがために面倒なコード書くのって本末転倒のような気がするんだけど。
>>54 gotoでいいんだけども、goto許しちゃうと変なところで使いまくる馬鹿がいるのよなあ…
おれは今ではフリーだが、かつて会社員だったときに新入社員の
後輩どもには「gotoは、おれは使うがおまえらは使っちゃいかんぞ」
と教育してた。もちろん、時期を見計らって「こういうときにだけgotoを使え」と教えてた。
>>54 gotoが入るようなソースが綺麗だとは思わん。
ちゃんと関数化したほうが書きやすいし読みやすいぞ。
…goto回避のためにフラグ使って読みづらいコード書くやつは論外(w
十数年C/C++使ってるがgoto使わないといけなかった場面なんて
片手で数えられるほどだったが?
goto回避のためにやたらめったら関数化して外に放り出してしまい
極端に可読性悪くなったソースってのも見たことある
>>56 その片手で数えられる場面ってのは何よ。
世の中にはそれを主に仕事している人もいるのでは?
gotoは適材適所だろ。
>56
そのソースが読みやすいと思うのはあんただけかモナー
わかった!
>>26の会社はHaskell使ってると見たね。
だからgotoだのcontinueだの途中でreturnだのは許されないんだ。
Cだと思ってるのは
>>26の勘違いだろ。l
goto使わないかわりに同じ関数の中でsetjmp/longjmp使うのって、どう?
・見づらいし
・必要以上に遅い(やらなくてもいいレジスタ退避とか)し
なかなか愉快そうじゃん?
gotoの話題が出ているので、wrapされたgotoをば。
#define throws(T) T exception;
#define throw(x) do{ exception=(x); goto catch_node; }while(0)
#define try if(1)
#define catch else catch_node:
// 使用例
int main( int argc, char** argv ) {
throws(int);
try {
if( argc < 2 )
throw( argc );
printf("# %s\n", argv[1]);
} catch {
printf("catch Exception [%d]\n",exception);
}
return 0;
}
// 一見例外のように見えて、実はただのgoto。
for(i=0; i<N; i++)
for(j=0; j<M; j++)
if(function(i,j)==ERRCODE)
goto ERRRRR;
...
ERRRRR:
ってのは51はどう書いているの?
>>62 昔はC++をCにコンバートしてたと聞くが、こんなCコードでも吐いてたのかな。
C++をCに変換してコンパイルしてた頃( Release 1.0の頃 )は、
まだ例外とか名前空間は言語仕様に含まれていませんでしたよ、確か。
goto禁止は困るんだが、許すと訳分からん使い方する奴が出るからなぁ…
いっそ自動二輪のように「goto解除」免許ある奴だけ許可とか(w
>50
フラグと while / repeat を使った書換で対応、かな。
基本的にはループの途中でキャンセル、ってのはあまり for ループでは使わんからなあ。
漏れが PASCAL 使いであることも原因かもしれんが。
(PASCAL では for は「回数の決まったループ」という考え方だから)
for( i = 0; i < N && ! IsContinueable( context ) ; i++ )
for( j = 0; j < M && IsContinueable( context ); j++ )
context -> error_code = func( i, j );
if( IsError( context ) ) {
// Error処理
}
へんな ! とかは気にしないで。
つか、漏れのコードはマジでこんな感じ。
>>70 会社辞めたくなったソースコード
ですか?
あ...ううん、64のコードを、gotoなしで書いてみたの。
goto嫌い=N88Basic世代?
>>64 /* 妥協案1 */
for( i=0; i<N; ++i )
for( j=0; j<M; ++j )
if( function( i, j )==ERRCODE )
{
i=N; // 一番内側のループカウンタ以外最大値に
break;
}
if( j<M ) //一番内側のループカウンタで判断
{
/* エラー処理 */
}
/* 妥協案2 */
for( i=0; i<M*N; ++i )
if( function( i/M, i%M )==ERRCODE )
break;
:
if( i<M*N )
{
/* エラー処理 */
}
>>74 おれはN88Basicはおろか、N-Basic以前のLevel1 Basicだったり、
4k Basicだったり、10k Basic(Applesoft Basic)だったりしたころの世代だが
gotoは嫌いじゃないよ。使うときはまずgotoを使わない方法を検討してからだけど。
77 :
仕様書無しさん:03/02/19 02:33
>使うときはまずgotoを使わない方法を検討してから
それをきちんとこなしつつ経験を積んできた人は、gotoを使うべき(安全に
使える)局面かそうでないかは自然に見えてくるよね。
goto文に過剰に反応する奴は、まだまだ修行が足りないと...
>>75 ごめん。そんな書き方するくらいならgoto使う。(w
>>64のコード、結局何がやりたいのかわからんので
展開の仕様が無いんだが・・・・
それだけの情報なら、return とかexit とかできれいにかけるだろ。
goto使うくらいなら、アルゴリズムを含めて見直せって事。
今さらgotoネタで(以下略
ついでに書いておくと、continue が一番嫌い (w
次がgoto で次がbreakの多用。
もうちょっとちゃんと構造化しろっていいたくなるソースって、
多重ループにif文いっぱいなんてことになって、
goto使わないとループからぬけられなかったり・・・
gotoって流れを切るから可読性損ねやすいし。
>goto使わないとループからぬけられなかったり・・・
ほう。具体例を見てみたい。
>80
>goto使わないとループからぬけられなかったり・・・
例えば?
C#では、フォロースルーをやろうとすればgotoを使わざるをえない。
>80
漏れも見やすくてステップ数を削減になるから
ある程度はgotoを利用するが、
しかし、if多重ループするならもっと構造化汁!(w
> 51
...
> gotoって流れを切るから可読性損ねやすいし。
すんません、ソフトウェア業界に移ってきて一年の新参者なんで、まちがってたら教えて。
例外処理ってのはなんにしたって流れを切るもんだと思っているんですがそういう話ではないのですか?
それからあなたの言う展開っていうのが何のことを指していっているのか判りません。
goto使うとすっきりかけるパターンは限られているんですけど、そういう局面なら無理するよか可読性も保守性も高いと思います。
どうしても使うなって言われたら、>70 とか >75がやってくれたみたいになっちゃう。
こんなときはgotoでいいと思うんですけど。
構造化 == gotoを使わないこと、では無いと思うんですが。
漏れはcontinue好きだがな。
ifの多重ネストに陥るより、条件が偽ならさっさとループ先頭に戻っちゃう。
gotoなぁ…「gotoは使うな」って教え馬鹿正直に守ってただけなんだけど、
いつの間にか毛嫌いするようになったなぁ…。きっとあの外ty(ry。
なんつーか、別に使わなくても continue と break だけで綺麗に書けると
思うんだが…。kernelのソースとかでは割と良く使ってるよね。
後藤有害論
89 :
仕様書無しさん:03/02/19 21:02
gotoはげんこつと一緒。
普段から使ってると人間関係なんて築けないけど
でも、使った方が相手のためになることもあるんだ。
>89
殴るのが快感になってしまう罠。
91 :
仕様書無しさん:03/02/19 21:31
gotoを使っているというか、gotoしかないという感じのソースきぼん。
>>91 > gotoを使っているというか、gotoしかないという感じのソースきぼん。
ほれ、これをgotoを使わずに書き直してみろ。
int n = (count + 7) / 8; /* count > 0 assumed */
switch (count % 8) {
case 0:do { *to = *from++;
case 7:*to = *from++;
case 6:*to = *from++;
case 5:*to = *from++;
case 4:*to = *from++;
case 3:*to = *from++;
case 2:*to = *from++;
case 1:*to = *from++;
} while (--n > 0);
}
countバイトだけfromによって指された配列からtoで指された場所までコピーする
まず、多段ループをフラグで抜けたり、
下層のループだけを関数に追い出したりするのは論外だよね。
可読性が落ちるってことで、このスレでも正当な解決策として見られてない。
だからそこでgotoを使うっていうのもアリだと思う。
でも、gotoを使うと飛ぶ先のラベルを探さないといけないし、
すぐ目の前に飛ぶ先のラベルがあったとしても
好きな場所に飛べてしまって危険性が高いから、嫌う人も多い。
きちんと使える人ならば構わないとは思うんだけど、
やっぱり人間が触るものだから、安全になりやすい方法を取った方がいいよね。
>>64みたいな行列処理なんかでは、
二段ループ全体を関数化して途中returnするっていう別の方法もあるよね。
/* すんごく適当なサンプル関数 */
int matrix(int row_start, int row_end, int col_start, int col_end)
{
int i, j, response;
for (i = row_start; i < row_end; i++) {
for (j = col_start; j < col_end; j++) {
response = set_data(i, j);
if (response == ERRCODE) {
return MATRIX_ERROR;
}
}
}
return MATRIX_SUCCESS;
}
こうすれば、行列処理全体を一つの構造として見ながら、
ループの多段抜けをすることができる。
やってることはgotoで抜ける時と同じなんだけど、
抜けていく場所がはっきりとしているし、
使う側も処理のまとまりを関数を呼び出している一行で
すぐ認識することができるよね。
実装は関数の実体を見ないといけないけど、
これは構造の一部を抽象化しているわけだから
関数のインターフェイスと戻り値をしっかりコメントに書いておけば済むよね。
なんかちょっと話が逸れたりもしたけど、
もっと良くできないか、可能な限り頭を捻ってみようってことで。
実際のコーディングの際には、
行列処理部分のデータ構造見直しなんかもできるだろうしね。
何かに捕らわれないようにすることが大切だと思うよ。
96 :
仕様書無しさん:03/02/19 22:30
>>96 現在のソースを別の書き方にしようとするとgoto使っちまうけど、
goto使わずに綺麗に書けるんかなって意味でそ。
98 :
仕様書無しさん:03/02/19 22:46
>>92 int i;
for(i=0; i<count; i++){
*to = *from++;
}
何度読んでも、これで同じ処理になると思うんだけど、わたし勘違いしてる?
>>92はDough's deviceっていうんだっけか。
そこまでするならアセンブラで書けば?という気もするね....
>>99 doughじゃなくても、うんこをわっかにしててもいいよね!!!
ウンコチンチン!!!!!!!!
>>92 それ、パフォーマンスを稼ぐためのやつだよね。
102 :
仕様書無しさん:03/02/20 00:43
構造化プログラミングを理解してない奴が安易にgotoを使う。
なぜならそうのほうがコーディングが楽だから。
決して他人のためにではない。自分の為にそうしてるだけ。
>>98 俺もそう思うんだけど‥‥‥
何か、間違ってるかなあ?
えー。
>>70 でいいような気がするけどなあ。
goto使うと開発環境の支援が受けにくいのが困る。
「デストラクタが実行されません」とか言い出されたような。
>>105 いや、C++使ってるんなら、例外処理使うなり、デストラクタに任せるなり、いろいろ手はあるだろ?
goto 賛成派が実際に実務なりで書いたコードを、ここにいる goto 反対派で書き直してみるとか…。
守秘義務あるから無理か。
>>105 俺は、goto 使わないとワケワカメなコードになる=他のどこかがオカシイ…と思ってる。
goto やゴチャゴチャしたコードでクリアしても、所詮氷山の一角だろ。一度全体を見渡すべき。
非常に素晴らしいことを言った
>>107タンのアヌスの臭いを嗅ぎたいよね?
私は嗅ぎたいです。
>>104 101が、
> それ、パフォーマンスを稼ぐためのやつだよね。
だってさ。
今ならコンパイラの最適化に依存して
可読性を高めることの方が重要だよね。
時々暇潰しにああいうソース読むのならちょっと面白いけど。
ダイクストラのgoto有害論にクヌースが反論したのって
どっかで読めないかな。
>85
例外処理ってのは、どこに移るかがはっきりとしたブロック(例外処理ブロック)と
して存在しているでしょ。
どこでも無制限に飛んでしまえる goto とは意味合いが違う。
構造化されている状態での流れの変化って、ようは「道路を変えて横道にそれる」程
度なんだけど、goto 使っちゃうと、そもそも道路を無視してワープしちまうのよ。
goto ってニトログリセリンみたいなもんでさ。うまく少量使えば心臓病の薬になるけ
ど、多用したら爆薬じゃん。それを理解しないで使われると困るよね。
つまり「あるものは使え」って結論ですね。
さて、次の話題いってみましょう!
>>108 勘弁してくれ(;´Д`)
「あるものは使え」で思い出したんだけど、メンバ変数に prefix 付ける奴ウザい。
this あるんだから this 使えや、プチ頃すぞ(ノ ゚Д゚)ノゴルァ ==== ┻━━┻
>>113 thisの付け忘れはどうやってチェックすんの?
>>113 prefixで保管し、prefixの付け忘れはthisで保管します。
両方使って意味の重複というリスクを背負って保守性を高めます!
素晴らしいです!
保管→補完
( ´д)ヒソ(´д`)ヒソ(д` )
>>114 >>107 と同じような考えなんだけど、this を付け忘れてパニくるような状況には必ず別に理由がある。
変な命名、深いネスト、不適切なアクセス修飾子…などなど。見直しすべき(キッパリ
public class A {
private int number;
public void setNumber( int number ) {
number = number;
}
}
// たまにやる。
つか、このスレのみんなって、C++とかの例外機構のある言語ではgotoは不要、
って考えてますか?
絶対要る/絶対要らない のどっちかを求めてないよね?
もしそうなら時間もったいないよ。
#そうでないなら、弊害が多いけど不要とは限らない と。
まぁ、実際Javaにはgoto文はないのに誰も困らないわけだが。
>>120 例外機構を利用するのはオーバーヘッドが結構バカにならないと思うが。
特に
>>92のようなパフォーマンス狙いのコードにはね。
結論:TPOをわきまえて使えや。
そう、あれが不思議だ。
なんで予約語には残ってるんだろう。
>>120 > C++とかの例外機構のある言語ではgotoは不要、って考えてますか?
C++ではCより必要なケースは少なくなったと考えている。
# まだ、C++でgotoが必要なケースを体験したことはないけど
多分、C++でyacc, lexのようなあるコードからC++を吐き出すプログラムが
存在するようになった場合、gotoが必要になってくると考えている
>>125 javaの言語設計者も、そこまで踏み切れなかったんだろうなあ。
Java->C++に移植なんていうことはないのかな?
変数名にgotoを使うアホもいないとは思うが。
ところで
>>92って、元は単なるバイトコピーじゃなくてmemory mapped I/O
だと聞いたことがあるのだが。左辺のインクリメントが無くて。
単なるバイトコピーなら、memcpyの方がずっと速そうな気がする。
memcpyがワード単位での転送を行う場合には。例えばVC++のmemcpy.asmは
そうなってるよね。
つか
>>92ってtoをインクリメントしとらんけど良いのか?
137 :
仕様書無しさん:03/02/21 09:51
>>92 8バイト出力するごとにwaitが掛かるデバイス用なのかな?
>>92 >>98 さらに最適化するとこうなる。
from+=count,*to=*(from-1);
Javaだと continue もラベルも使わないなあ
>>109 Dough's device そのものなら一目でわかる人間が多いから
問題にならないけど、似て非なるものを書かれたら嫌だね。
実はDuff's deviceだったりする罠。
>>122 Cでgotoを使うのは主に多重ループの脱出と例外処理。
Javaではbreakで多重ループを脱出できるし例外処理がサポートされているのでgotoが欲しい状況が少ない。
・・・だと思ってたんだけど違います?
学生ですスマソ。
>>143 同意見。それ以外でCでgoto使ったことはない。
Javaはそういう経験が元になってるのだろう。
何らかのソースコードジェネレータ(例えばyacc)でソースを生成する
ようなケースではgotoは重宝するのでは。
「gotoという予約語」の有無だけで議論す奴はDQN。
gotoがいらないというのはそういう意味じゃない。
>>118 ↓のコードがコンパイルエラーになってしまいます。
どこから見直していけば解決できますか?
class container
{
unsigned size;
public:
unsigned size() const { return this->size; }
};
>>147 解決の手がかりははエラーメッセージに書いてるだろ。
>>148 名前が同じなのが悪いらしいのですが、
変数もsizeで正しいと思うし、関数もsize()で間違いないと思うけど、
>>118ならプリ・ポストフィックス無しで解決してもらえるのかな、と思ったのですよ。
>147
Cコンパイラを使っている、に1票
頭の悪い奴がいるな。
153 :
仕様書無しさん:03/02/23 09:24
メンバにプリフィックスを使うと
class container {
unsigned m_uintSize;
public:
unsigned m_uintSize() const { return this->m_uintSize; }
};
とかになるの?
154 :
仕様書無しさん:03/02/23 09:37
>>153 ms流のプリフィクス見てるといつも思うんだが、
size_unsigned
this->size_unsigned
でいいだろ。
this->とm_を両方書くのは無意味だし。
unsignedとintを両方書くのも無意味だし。
Javaで、複数のクラスで同一の数値変数を共有するソースコード。
interface NumHolder{
static StringBuffer num = new StringBuffer();
}
class User implements NumHolder{
....
num.clear();
num.append(Integer(10).toString());
....
}
・・・どこから突っ込んだらいいものやら。
>>154 unsigned int
unsigned long
unsigned char
unsigned short は、
見分けられなくていいの?
まともなコードを見せてやるしかないのでは。。。
public class NumberHolder {
private static int number = 0;
getNumber() { return this.number }
setNumber(int argNumber) { this.number = argNumber };
}
class User {
private NumberHolder num = new NumberHolder();
....
num.setNumber(10);
....
}
>>156 unsigned int以外は、もちろんunsigned_longみたいに書くよ。
確かC/C++の言語仕様では、unsigned == unsigned int じゃなかった?
俺は共通認識として広まってることをわざわざ書く必要は無いと思う。
public class NumberHolder {
private static int num = 0;
public static getNumber() { return num; }
public static setNumber( int aNum ) { num = aNum; }
}
public class User {
....
NumberHolder.setNumber(10);
...
"外部にあるものには、あからさまに外部にあるように"
アクセスすべきだと思います。
つか、singletonにすべきかも。
つか、本当に複数クラス間で同じ変数を共有すべきかどうか検討した方がいいかもですが。
public class User {
private static int num = 0;
public static getNumber() { return num; }
public static setNumber( int aNum ) { num = aNum; }
....
NumberHolder.setNumber(10);
...
これでいいのでは?
161 :
仕様書無しさん:03/02/23 10:54
if( buf[0] == '0xCC' ) {
memset( buf, 0 sizeof buf );
}
>>162 で、リリースモードにするとワケワカメになっちゃうのね。
>>163 buf が配列じゃなくてポインタだからめむせっとが
想定どおりに動かないっつーことでつか?
というか、, が1コ抜けてますよ奥さん。
何にしても、辞めたくなるコードではあるな。
169 :
仕様書無しさん:03/02/23 21:53
この会社辞めようと思ったソースコード
をデバッグするスレはここですか?
ていうか、どんどん手がつけられなくなってくし。。。 。゚(゚´Д`゚)゚。
\xCC だと何で null 文字にセットするのか、コメント書いておいた方がいいような…。
おまいら、コードを見ればデバッグしやがらないでください。
もはや職業病でつね。
>>162 ていうか、たった3行のコードでここまで突っ込まれるのもスゴイような気がw
>>175 たった3行のコードにここまで突っ込みどころを収めているのがスゴイのだ。
>>178 うん。マジ。
長い間仕事してると、いらん行間よんだりする癖が染み付いちゃうのよ。
これも、
>>172の言うように職業病なんだろうな。
新規のソース書きを指導するときなんて、やかましいぞ俺 (w
作者の意図を読み取る能力はデバッグでは必須だしなぁ・・・・
ようやく
>>162の製作者の意図が読めた。(
>>163のツッコミの意味も)
要するにコレ、VC製なんだよね?
>>180 おれはVCを知らんので教えて欲しいのだが、
初期化してない配列をVCでは'\xcc'で埋めるのか?
autoのみ? staticも? staticはないだろな、さすがに。
sizeof使ってるからmallocじゃないだろうし。
あ。ああいうコード書くくらいだからmallocの可能性もありか(w
漏れも
>>180 見てやっと分かった(w
まじだめぽなソースだ(w
>>181 VCのコンパイラとリンカと標準ライブラリにはそれぞれ
リリース用とデバッグ用があって、
デバッグ用のときはmallocが領域確保したあとに0xCCで埋めて渡すんだよ。
0xCCCCCCCCってのは通常のアプリではアクセスできないアドレスなので、
初期化し忘れとかを発見しやすいっていう利点がある。
>>183 >>184 ありがとう。なるほどデバッグビルドの場合のmallocね。
まじだめぽなソースだなあ(w
というかこれと同じようなことをやる、mallocファミリをラップするライブラリを作って、
もう10年以上愛用してるよ。overrunの検出とか、mallocされた領域かどうかのチェックとか、
あとmallocされた領域全部のチェックとかいろんな機能を盛り込んでる。
freeしたら、freeしたとわかるような値で埋めたりね。デバッガで領域をダンプすれば一発でわかる。
そうか、今は処理系がそういうことやってくれるのか。いい時代だな。
もしまかり間違ってVCを使うプロジェクトに放り込まれたときのために覚えておくよ。
確かGCCにも似たようなことやってくれる機能があったような気がするけど、
自作ので十分なので調べてないや。
とかいって
>>184の資料をよく読んだらauto変数までやってくれるのか。
いいなあ。GCCの方もそういうことできるかどうか真面目にマニュアルチェックしよ(w
おれのはmallocファミリだけだからだめだな(w
>>183 スタック変数が 0xCC で、malloc() 領域は 0xCD じゃなかった?
>>189 static変数って、規格でバイナリ0に初期化されてることになってるから、
それだとまずいような気がするんだけど。って、もう寝ます。おやすみなさい。
俺は直接触ってないが隣の人がキレていたWebアプリ、
SQLが発行されるとそれをログに残すのだが、
ログインする毎にログファイルが最低3メガ膨れあがってた。
当然ログインするだけで5分位かかる。
原因は1ロウ毎に一回クエリが呼ばれるトンマな設計なんだが、
コンサル推奨設計なんで下っ端PGの俺らが何を言っても上司は聞きやしない。
ちなみにこの前辞めました。
193 :
仕様書無しさん:03/02/24 21:24
>192
それ、
客が切れる
→アフォコンサルが>192の(元)会社に振る
→>192の(元)上司が平然と部下に責任を押しつける
……という結末が見えるようだ
>>190 static変数とスタック変数(autoのことだよね...多分)をごっちゃにしてませんか...
# ってもしかして釣られてるのか???
>>178 以上を踏まえて
>>162をみると・・・。
無条件にmemsetをしない(わざわざifを書く)のはなぜか?
仮説を幾つか立ててみた。(例を一つ。詳細理由は長いので省略)
処理
bufはauto変数。
loopの中に書かれている。
loop内では、前回の内容を利用しつつ繰り返す。
とったであろう行動。
初期化を意識せずにコーディング
デバッグ開始
初期化漏れに気がつくが、内容は0xccccだということを発見。
0xccから始まるときには初期化をすればOK :-)
ってなところだろ。
0xccccで初期化される意味を知っていれば
こんなコードにはならんんだろうから、
デバッグ中に値見てってのが有力だろうとは思うんだが・・・・
ってことで、「何でお前はそれを疑問に思わない?」と
突っ込みたくなったわけだ。
>>194 う。寝る前の寝ぼけまなこで読んだから「スタック」を「スタティック」と読んでた。
指摘ありがとう。おかしいと思ったところで見直せばよかったんだな。
謎は全て解けた、と思う(w
で、漏れの疑問には誰が答えてくれるんだ?
今 VC++ さわれないんだけど。
200 :
仕様書無しさん:03/02/25 19:22
このスレは勉強になるな〜
0xccになるのは、そういう意味があったのね。
201 :
仕様書無しさん:03/02/25 21:19
いやまったく
202 :
仕様書無しさん:03/02/25 21:44
Cで作られたプログラムをC#でリファクタリングする作業をしているのだが、
昔のプログラムの動作がどうもおかしい。
画面に謎の文字列が表示されるのだ。
どうにも動作がおかしいので、プログラムを調べてみた。
‥‥‥この変数、初期化してねえ!
しかも、表示されている文字列から考えて、バッファオーバーランの可能性大。
そもそも、前後の条件を見るに、ここでこれを表示しているのがどうもおかしい。
よく、こんなのを何年も走らせていたな‥‥‥
>>202 /* このprintfを外すとなぜか動かない */
204 :
仕様書無しさん:03/02/25 22:02
>>202 char dummy[4096]; /* 未使用だけど、なくすと動かない */
; /* 空文だけど,なくすと動かない */
なくしたけど動いた.怖いので戻した.
ええい、voodoo programmerどもめ。
207 :
仕様書無しさん:03/02/26 00:01
>>202 そういうのは厳密にはリファクタリングとは言わないと思うが。
動いているものを無闇に変えるなと云われ、
指示通りに渋々既存ソースからコピペしたコード。
納品数日前になって、その中に↓のような記述ハケーン
int foo[5], bar[5];
for( cnt=0; cnt<=5; ++cnt ){
foo[cnt]=cnt;
…確かにこれでも動くが…だからってそのまま納品可かよ!
>>208 製品にするならコメントは必須だろ。
int foo[5], bar[5]; /* barを消すとなぜか動かない */
for( cnt=0; cnt<=5; ++cnt ){
foo[cnt]=cnt;
今日見つけたコード
for(unsigned int i = vec.size()-1 ; i > 0 ; i -= 2){
… … … …
… … … …
if( i == 1 ) break; //何故か必要
}
212氏に209氏のコメントの笑いどころを解説して欲しいかも。
bar[1]でいいんじゃねーのか?
とかゴネてみる。
なー、auto 変数にスタック使うタイプのコンパイラ、
>>209 のコードでは
foo よりも bar の方が前のアドレスに確保されないか?
つまりこう↓か。
int bar[5], foo[5]; /* barを消すとなぜか動かない */
>>216 barは他の部分で使ってるから[1]ではアカン。
しかもbarへのアクセスもオーバーしてたし。(;-д-)ハァ…
>>218 前後で大量の変数が宣言してあったから大丈夫…だと思う。
使った領域も後の処理で正しい値が上書きされてたし。
…将来誰かが順番変えて謎のバグに悩んだりして。
>>220 とりあえずint foo[5]をint foo[6]にしとけば?
って、そんなことしたら動かなくなる可能性大有りだな…
なんか境界を越えて書いた値とかを参照して
動くようになってる臭いぷんぷんするし。
>>221 もう手遅れ。(納品済)
動けば良いというスタンスの上司だから、修正は認められんかった。
コメントの修正も許さんアフォだし、漏れもさっさと忘れる事に。
でもコメント追加は良いみたいだから
>>209の手は使えたかもナ。
動けば良いというか、「動いてるものをいじるな」じゃない?
> 漏れもさっさと忘れる事に。
で正解と思われ。
>>222 で、忘れた頃に改修作業があって、
訳わからん原因不明のバグ調査に
多大な時間を費やすと。
225 :
仕様書無しさん:03/02/26 23:28
// Hoge.h
class Hoge {
...
Fuga untara;
...
}
// Hoge.cpp
Hoge::~Hoge {
// untara.~Fuga();
// ↑なぜか勝手に解放してくれるのでコメントアウト
// (逆に、実行するとエラーになる)
}
あ た り ま え だ ろ う が。
む。
s/~Hoge/~Hoge()/
だった。すまそ。
>210 って動くの?
激しく疑問なのだが
hoge(unsigned int atai, char* kekka)
{
...
if(atai < 10){/*10未満の数値の変換処理 */
...
}else if(10 < atai && atai < 100){/*100未満の数値の変換処理 */
...
}else if(100 <= atai && atai < 1000){/*1000未満の数値の変換処理 */
...
}
...
...
...
...
...
}
intをASCIIコードに変換する処理らしい。
もう、アホか8r
>>228 だれがどう見てもちゃんと動くにきまってるだろ。
ここまで完璧なソースは俺は見たこと無いね。
if( i == 1 ) break;
が無いとなぜか
ループを抜けてこないときもある んだが・・・
231 :
仕様書無しさん:03/02/27 00:16
sprintfのない(どこにも無い)環境のコードかな
232 :
仕様書無しさん:03/02/27 00:22
>>218 > auto 変数にスタック使うタイプのコンパイラ
かどうかは関係なく、アライメントが同じならそのまま並ぶのがふつーでは?
つか、逆順にする意味判らん…
>>229 そういえば桁数を考慮しないint→char(ascii)変換って作ったことないや。
/* unsigned int -> char(ascii) */
hoge(unsigned int val, char* dat)
{
int n = 0;
unsigned int tmp = val;
do { /* valの桁数を求める */
tmp /= 10;
n++;
} while(tmp);
for(; n > 0; --n) { /* 上位桁から埋める */
*dat++ = val / (10^(n-1)) + '0';
val %= 10^(n-1);
}
*dat = '\0';
}
こんな感じか。もっといい方法があるはず。
>>232 バグ。修正は俺がやらされた。
出力桁数指定が無いから「xx以上xx未満」という部分は不要だと思うけど。
スマソ。229=236な。
今回は最小限の修正でやめとけと言われたから、不等号をつけただけ。
ちなみに、全部直していいと言われたら、こう書いただろうな。
スタックはギリギリまで削ってもいいかも。
void hoge(unsigned int atai, char* kekka)
{
char Buffer[256];//スタック領域
int i = 0;;
do{
Buffer[i] = atai % 10 + 0x30; //スタックに変換結果を積む
atai /= 10;//次の桁を求める
i++;
}while(atai != 0);
while(i--){
*kekka++ = Buffer[i];// スタックから取り出し
}
*kekka = 0;
}
>>235 半分擬似コードとして書いてるんだろうとは思うけど 10^(n-1) はヤメれ。
その方法でUINT_MAX / 10 くらいまでだったら
tmp = 1;
while(tmp * 10 < val){
tmp *= 10;
}
while(tmp){
*dat++ = val / tmp + '0';
tmp /= 10;
}
*dat = '\0';
みたいな感じでどうだろう。UINT_MAXぎりぎりまでやるんだったら最初のループで
tmpをUINT_MAXをこえない最大の10の羃から始めてval以下になるまで10で割り
続けるとか。
>>239 >10^(n-1) はヤメれ。
何で?処理速度が遅いから?
10 と (n-1) の XOR?
ていうか、
1) sprintfやitoaが使える環境なら使え
2) それが使えないなら出来損ないのプログラム演習みたいなこと
やってないで適当なlibcのソースをパクれ
3) もっと高速なのが欲しけりゃAssemblerで書け
取りあえずスタック不要版。引数をスタックがわりに使って
最後にstrrev。これが普通だと思うんだけど。
void hoge(unsigned n, char *s)
{
char *p = s;
int tmp;
do {
*p++ = '0' + n % 10;
n /= 10;
} while (n > 0);
*p-- = 0;
do {
tmp = *p;
*p-- = *s;
*s++ = tmp;
} while (s < p);
}
>>244 普通の人が睡眠に入る時刻に「寝ぼけてた」とはどういう了見だ
>>247 なんで?
>>245のコードは0<=n<=UINT_MAXに対して正しく動作すると思うけど?
if( a < (int)NULL ){ //もしaがマイナスなら
b[15] = (char)NULL; //ヌルターミネート
char* foo( unsigned int n, char* buf ) {
if( n == 0 ) {
*buf = '\0';
} else {
*buf = ( n % 10 ) + '0';
foo( n / 10, buf + 1 );
}
return buf;
}
strrev??
正直、何のための処理なのかわかんないんですけど・・・<int->ascii
初心者ですいません
>>253 画面に表示したり、ファイルに落としたりするとき、
テキスト形式のほうが便利なことが多いしね。
最近はネットワークに乗せる信号とかもテキスト形式だし。
つか、まぁ結局
>>243 が正しいんだけど。
255 :
◆ZzlEVb5TFs :03/02/27 10:37
誰か助けて。
#define REP Report::Output
#define REPERR Report::OutputError
#define REPWARN Report::OutputWarning
#define REP_INDENT_TOP() Report::TopIndent()
#define REP_INDENT_BEGIN() Report::BeginIndent()
#define REP_INDENT_END() Report::EndIndent()
使用してるのは、REP だけ。
しかも クラスごとにあって、しかもソースが8ファイルも。
さらにメソッドすべて static 指定。
書き直そうにも さわりたくない…。
256 :
仕様書無しさん:03/02/27 10:44
>251
アドレスが負の値をとるの? unsignedだと判定に
失敗することってない?(コンパイラによるか…)
257 :
uniuni:03/02/27 10:56
>256
何がアドレスなのかしら?
質問が解らないわ。
>>255 「class」を「namespace」に置換すると、
頭痛が少し和らぎますよ。
>>251 はヌル文字や0を使うべきところにヌルポインタを使ってることを非難しているのでは?
たぶんaはintの変数で,bはcharの配列なんだよ。ポインタじゃなくて。
>>255 ソースが8ファイル...
むしろ、少ないんじゃないか?それ。
(何のソフトウェアか知らんけども...)
>>260 ファイル数が少ない場合、2つの理由が考えられます。
・規模が小さい。
・1ファイルが数万行以上もある。
>>255のケースは後者の可能性が高いです。
ちょっとトリッキーな int->ASCII 変換コード(の一部)。
ch = "0123456789ABCDEF"[n&0xf];
ch = ( n & 0x0F )["0123456789ABCDEF"];
>262
それをぜんぜんトリッキーと思わない俺は誰かを辞めさせているのでしょうか。
休職中の人などいない!
>>264 いや、あんたの感覚は正常だろ。
連続していることが保障できないようなコード
変換はテーブルを使うのは常識。
>262と>263が等価かどうか理解できるかどうか、ってのは
C言語の理解度を測るひとつのポイントだな。
>>268 263 はあんまり要らない知識だと思うの。
#define TABLE "0123456789ABCDEF"
ch = TABLE[n & 0xf]; /* こう書くと誰も気にしないだろう */
ch = TABLE + ( n & 0xf ); /* こんなのはまだマシ */
ch = ( n & 0xf )[TABLE]; /* 会社を辞めさせられたいときに書くコード */
>>270 char table[]="0123456789ABCDEF";
だろ・・・
何でマクロなんだよ。
staticも付けない?
>>273 static と const は同時に使えたっけ?
>>274 大丈夫じゃない?私はこの状況だったらいつも static const で宣言してるし。
276 :
仕様書無しさん:03/03/01 22:29
char* sbuf;
int i;
...
sbuf = (char*)i;
このコードで、「sbufに、ちゃんと値が入らないよ〜、なんで〜?」と相談された。
入社年度2年上の先輩に。
>>269 知識としてはいらなくても、なぜ等価なのかを理解できるかってことじゃないかな?
>>277 知ってて当たり前だとは思うが、いらん知識だろ。
それよりも
ch = ( (n&0xf) <= 9 ? '0' : 'A' ) + (n&0xf) ;
と「等価でない」ことが理解できるほうが重要。
スマソ 'A'-10 な。
スマソワカンネ・・・
唯一の心当たりは
・ANSI Cの文字コードはASCIIコードである必要は無いの?
ってことか(この場合'\0'はどうなるんだろ。'\0'だけヌル文字って定義があるとか?)
あ・・・そういえば日本語環境だと文字コードはASCIIじゃないしなぁ。
教えてください。お願いします。
結果は同じだが
プロセスが「等価でない」
ってことだろ
気になったんでK&Rを調べてみた
これに近いことがK&Rの53ページの下のほうに書いてあったよ。
やっぱりASCIIである必要は無いのね。
/* lower: cを小文字に変換する; ASCIIのみ */
int lower(int c)
{
if (c>= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
「これはEBCDIC文字セットには当てはまらない」とか書いてあるし。
そういえばそんな文字セットを大昔学校で習ったなぁ(藁
勉強になりました。ありがとう。
>>278 (n&0xf)が2回出現するのがやだな。
化石レスでスマソ
>>230 って何故だか分からない人って多いのか…?
Cでは'0'から'9'は連続していることが仕様上決まってるけど、アルファベットはそうとは
限らないということになってたと思います。EBCDICはその一例…って他に知らんけど(^^;
>>285 > Cでは'0'から'9'は連続していることが仕様上決まってる
え? え?
あ、しまった。大小関係がひっくりかえらないことだけが保証されてるんだったか。
軽く逝っとくわ。
K&Rの54ページにそれらしきことがかかれているのを発見
しかし236ページではどうも逆にも読み取れるような記述がある
結局どっちなの?
K&R54ページ
c >= '0' && c <= '9' という検査は isdigit(c) と置き換えが出来る
(ただし、前述の「ASCIIのみ」との注意書きのある節と同一の節に記載のため、
その注意書きの有効範囲がここにも及ぶとすれば逆の意味となる)
K&R256ページ
単一の文字からなる文字定数の値は実行時のマシンの文字セット中の文字の数値となる。
多くの文字からなる定数の値は処理系ごとに異なる。
>>287 以下のコードを試してみなされ。
int nVal;
nVal = '9' - '0';
printf("%d\n", nVal);
>>284 *うまく行く事もある* っていうのも含めて笑いドコロだと思ってたんだけど。
C の規格に、文字定数がどんな値になるかの規定なんて無かったはずだが。
>>284 sizeがゼロの時、iってunsigned int の最大値になるから、
それが問題なんじゃないの。
>>284 何でもかんでもprintfでチェックする癖があると永遠に分からないかもな。
int main(int argc, char* argv[])
{
unsigned int x=1;
x-=2;
printf("%d\n",x);
return 0;
}
↓こうすりゃ分かるだろうが…。
int main(int argc, char* argv[])
{
unsigned int x=1;
x-=2;
printf("%u\n",x);
return 0;
}
勝手なまとめ(間違いがあればご指摘ください)
・Cには文字定数がどんな値になるかの規定は無く、処理系によって異なる
つまり、アルファベットや数字が連続していたり順番になっている保証は無い
・'\0'は'\n'等と同じエスケープシーケンスであって、文字定数0を表すものではない
ちなみに八進表記の0は'\00'であり、十六進表記の0は'\x0'である。また十進表記は存在しない
・文字コードから離れた形で文字定数を扱うには<ctype.h>に定義される
「isdigit」「toupper」等の各々の関数を使うか、
>>262のようなテーブルを用いる
かなりのスレ違いスマソ
>>271 ツッコミどころはそこでは無い。270の例ではどっちでもいい。
ところで、
char *table = "0123456789ABCDEF"; /* これと */
char table[] = "0123456789ABCDEF"; /* これの */
違いは判るか?
ちと心配になるぞ。
>>295 はぁ、違いも何も・・・・
ところで、
char *table = "0123456789ABCDEF";
は、かなりいけてないと思うんだが大丈夫か?
table[0] = '0' ;
/* 訂正 */
ch = *( TABLE + ( n & 0xf ) ); /* こんなのはまだマシ */
300 :
仕様書無しさん:03/03/02 08:54
おはずかC。
memset(buf, sizeof buf, '\n');
301 :
仕様書無しさん:03/03/02 09:03
図らずも271が馬鹿であることがばれました。
>>301 お、おれっすか?
少なくとも 301よりましなことは確かだが・・・(w
>>300 何も恥ずかしがることはない
(だって例外処理をテストするためのコードなんしょ?それ。)
>>300 char buf['\n'];
とか?
>>305 わからんかっただけかい(w
自分で考えろ。
プププププ
やっぱり271はバカでした。
ソースは
>>296
だってsizeof(char *)の分だけ余計にメモリを消費するもん!
310 :
仕様書無しさん:03/03/02 10:27
だから
>>298 が答えなんだろ。こんな下らんことでスレ違いな話すな。
>>300 それは buf が配列じゃなかったってオチ?
313 :
仕様書無しさん:03/03/02 13:53
もういやだ、こんな議論の繰り返される会社には、もういたくない
ボク、itoa()使うコトにしましたんで、
定時退社でお先に失礼しまーーーーす。
298のtable[0] = '0' ;っていうのは何をいいたいんだ?
駄目なコードってこと?
'0'==0x00と勘違いしてるってオチ???
'0'は0x40だったっけ?
300は引数がおかしい
memset(buf, sizeof buf, '\n'); ×
memset(buf, '\n, sizeof buf'); ○
ちなみに私はsizeof括弧つけてるけど。。。
あ、微妙にコピペ失敗してる
ちなみに文字列用の配列に終端文字入れるときどれつかいます?
0, NULL, 0x00, \0などいろいろあるけど(しかしこれは宗教論争になりかねない(?)
char c[3];
c[0] = 0;
c[0] = NULL;
c[0] = 0x00;
c[0] = \0; // ←私はこれ
あ、また間違えてる、'\0'ね
NULL 使うヤツはアホです。
>>321 それはどうも
それじゃアホな俺に分かりやすく教えてくれ
298どこに突っ込みがあるんだ?
316-319の言っている事は何も間違っていないと思うが…。
漏れも
>>296の真意が知りたい。 まったく分からん。
296 :271 :03/03/02 03:10
>>295 はぁ、違いも何も・・・・
ところで、
char *table = "0123456789ABCDEF";
は、かなりいけてないと思うんだが大丈夫か?
298 :仕様書無しさん :03/03/02 03:16
table[0] = '0' ;
分からん…。 271がアホなのか漏れがアホなのか…。
終端文字に使用できるのは '?0' だけだ。
「0x00でも0でもNULLでもいい」って訳じゃない。
しかし、 おれも
>>298 は意味不明だとおもう。
>>296 文字列定数をポイントするのに、constがついてない、ってこと?
>>298 で、その文字列定数を変更しちゃいそうになるから、いけてない、って説明なの?それ。
あ、待って!
'?0'の0って、「8進数の0」って意味なの?もしかして。
あ、なるほどね。
ちょっと今やってみたけど
char *table = "0123456789ABCDEF";
char table2[] = "0123456789ABCDEF";
table2[0] = '0'; // ←OK
table[0] = '0'; // ←エラー発生
つまり
tableにその後代入したりするなら
* ではなくて []を使う
代入できないchar *table = "0123456789ABCDEF";は
const char *table = "0123456789ABCDEF";
にしろってことでファイナルアンサー? まだ間違ってる?
const char* const table = "0123456789ABCDEF";
これで完璧?
しかし*と[]の違いなんてすっかり忘れてたよ、基礎だけど
ありがd、やっと分かったよ
int n = 1;
char ch = ( n & 0x0F )["0123456789ABCDEF"];
しかしこれが通るとはねぇ・・・知らん買った
まぁ使うことはないだろうけど。。。
>>329 わかりきった事をわざわざやってみたのねゴクロウサン。
だから、そーゆー事分かってる上で
>>296の言いたい事が理解できないんだって。
table[0] = '0'; でエラーがでるからいけてないの?
むしろエラーが出た方がいいでしょこの場合。
(・∀・)
>>329 >>330 char* const table = "0123456789ABCDEF";
だと思ふ。
>>333 実行時にエラーが出るより、
コンパイル時にエラーが検出された方が・・・
>>333 336以外私も考えられんのだが。
にしてもなんでCは
char *table = "..."; // ここでなぜ”constがないですよ”と警告しないのか?
table[0] = '0'; // なぜこのコードを書いてエラー、または警告を出さないのか?
出そうと思えば出せたはずなのに。
この理由はわからないな。
激しくスレ違いだが。
char *p;
...
char *table = "...";
table = p;
が可能だからかな?
>>338 その操作( p = table )を抑止するためには
char* const table = "....";
と書きます。
よって、的外れ。
「変更不能なオブジェクト」へのポインタは、
文字列定数を指す場合を除き、
const 宣言する必要があるのです。
何で文字列定数だけ特別扱いなんだ!
>>339 const が無かった時代の伝統を引きずっているから。
どんどん元ねたとはズレていくが、、、
271はポインタの配列は使えているか? かなり心配になるぞ。
ポインタの初期化・配列の初期化・配列演算子のことで混乱しているのは結構いるみたいだな。
気持ちはわかるが同情しないからな。
もしかして271は俺のコードのせいで会社を辞めた人だったのかも。
>329
table[0] に書き込めるコードを吐くコンパイラ(もしくはコンパイラオプション)もある。
そんなコンパイラの中でも、
#define TBL "0157"
char *tbl0 = TBL;
char *tbl1 = TBL;
tbl0[0] = 'o'; /* よい子はまねしないようにね */
printf( tbl1 ); /* これはこれで行儀悪いかな */
とやったとき、0157と表示されるのもあれば、o157と表示されるのもある。
こんなコードがたくさんあったら俺も辞めたくなる。
>>339 そ..そうか、const は、C++から逆輸入したものでしたねぇ。そういえば。
つーか、char* s = "..."; みたいな初期化は ANSI で禁止してもらいたかったなぁ。
>>341 「『変更してはならない文字列』へのポインタ」へのポインタ
「変更してはならない『文字列へのポインタ』」へのポインタ
は?
344 :
仕様書無しさん:03/03/02 19:04
僕はBASICしかやったことが無いので、ポインタなんて見たことがありません。
メモリの様子を逐一記憶し、どきどきしながら実行するのはやめましょう。
あなた方の使っている言語は地獄への片道切符に他なりません。
>>338 >>339 char* const p;
...
char* const table = "...";
table = p;
346 :
仕様書無しさん:03/03/02 19:08
>>344 BASIC で PEEK, POKE を使ってドキドキした経験があるのでつが・・・
347 :
仕様書無しさん:03/03/02 19:10
348 :
仕様書無しさん:03/03/02 19:13
>>346 それはメモリを直接読み書きする命令で、
ポインタとは意味がちがうじゃろ。扱うブツは同じだが。
349 :
仕様書無しさん:03/03/02 19:32
varptr だっけ? 懐かしい!
>>344 そうか!ポインタを使っているのが不幸のはじまりなんですね!先輩!
ボク、明日からポインタは使わないことにします!
代わりに、全部配列を使うようにします!
これなら安全ですよね? BASICの先輩!!
会社の人のコードを見ても、 const が全然出てこない理由がやっと解った気がする。
つか、constの振る舞いを知らない人って、結構いるんだね。
352 :
仕様書無しさん:03/03/02 21:06
構造体を卒業できないヤツはC++プログラマにはなれない。断言。むはっ。
>>351 1) 正しくconstを使わないとcastを強制されがちなので避けてしまう。
# 特に正しくconstを使っていないプログラム断片やライブラリと
# 協調する必要が或る場合には。
2) 古いCプログラマほど「Cは高級アセンブラである」「Cプログラマは
自分のやろうとしていることが分かっている」という信念に従って
おり、機械語レベルでは意味がない構造物を必要と感じない。
# ただしデータをROMに配置する必要が有ったりする場合などには使う
3) 実際にTEXTに書き込んだらすぐ落ちて分かるからまあいいや。
4) タイプ量が増えるのがいやん。
5) 単によく分かっていない。
などが想像される。
>>343 あらたまって聞かれると混乱する。
// 「『変更してはならない文字列』へのポインタ」へのポインタ
char const str0[] = "abc";
char const str1[] = "cde";
char const str2[] = "ghijklmn";
char const *arr[] = { str0, str1, str2 };
char const **ptrptr;
ptrptr = arr;
ptrptr[0][0] = '0'; /* ng */
ptrptr[0] = str1; /* ok */
// 「変更してはならない『文字列へのポインタ』」へのポインタ
char str0[] = "abc";
char str1[] = "cde";
char str2[] = "ghijklmn";
char * const arr[] = { str0, str1, str2 };
char * const * ptrptr;
ptrptr = arr;
ptrptr[0][0] = '0'; /* ok */
ptrptr[0] = str1; /* ng */
/* これでいいんだっけ? */
>>354 他人のことを馬鹿にしている暇があったら
ポインタのこと、もうちょっと勉強しろよ(w
356 :
仕様書無しさん:03/03/02 22:36
なぁなぁ。
未だに良くわからないんだが、どうしてポインタが必要なの?
変数がどこに格納されていようとOSの勝手じゃん。
素直に変数を参照しろよ。メモリの中を勝手に覗いたり、書き換えたりするなよ。
おまえらのやってることは
「覗かないでください」
っていって隣の部屋に入った汚通(鶴の化身)の行為を踏みにじるようなもんだ。
汚通は隣の部屋でオマエの財布から金を抜き取っているだけなんだから勘弁してやれよ。
どーでもいいけど「汚通」とか書くんじゃない!ぷんぷん
359 :
仕様書無しさん:03/03/02 23:03
>>356 「素直に変数を参照しろよ」
素直な変数の参照って何だ?
つか、お前は
「どんなでかいオブジェクトでも、コピーによって受け渡すべきだ」とか主張してるのか?
「C++に置けるあらゆるポインタは、参照によって書き直すことが可能だ」と主張してるのか?
「C言語のような、インクリメント可能な参照のある言語は使うな」と主張してるのか?
361 :
仕様書無しさん:03/03/02 23:05
>>360 その、インクリトリスメント可能とやらはなんですか?
>>359 不正な書き込みは、だいたいの場合検出できないと思われ、
だよね。
>356
ネタだろ?そうだよな?
364 :
仕様書無しさん:03/03/02 23:30
Javaではポインタなんて使わないよ。
>>364 参照先を変更できる参照型がプリミティブに組み込まれてるからな。
俺もその言語使って仕事したいよ。
>>365 最近のPGってJavaやC++が多いから
あと10年くらいしたら
「C言語」で開発できるPGって天然記念物存在になるのだろうか…
*注:ここでいう「C言語」≠「C++」(、もちろん≠「C#」)
>>366 既にN88-BASICでプログラム作れる奴は天然記念物だしなぁ(^^;
(いま考えると大戦略とか、ある意味すごいよな)
確かに、オブジェクト指向ではない言語で
まともな開発ができるのは珍しくなってくるかも・・・
そしてCOBOLERと同じ運命に・・・
>>368 そうなるかなあ…。
おれも今はほとんどCではプログラム書くことないけど。
Cの存在意義は高級アセンブラとしてだから、残ると思うよ。
C99になってから変な機能がちょっとついたけど、
それでもCは機械語レベルでどういう命令に落ちるか
だいたい透けて見えるのが利点だからね。
C++で代替できるかというと、どうだろ。多態とか使い始めると、
どういう命令に落ちるかわからなくなってきそうだ。性能も落ちるし。
>>369 それはそうなんだけど、実際に(良く書かれた)Cのソースなんか見てると、
マクロとか使って、OOっぽく作られてるよね。パッと見はそう見えなくても
設計がOOっぽいとか。
何か技術革新が起きれば(コンパイラの性能アップ/ハードのスペックの底上げ etc.)
、OOな「高級アセンブラ」ができてもおかしくないんじゃないかと思う。
C++がそうなるとは限らないけども。
>>370 うん、そうね。確かに構造体とマクロを駆使してOOっぽく書いてあることが多いね。
つか、おれもやってたよそういうこと(w
これやると機械語にどう落ちるか見通しが悪くなるんだよなあ。
でもソースレベルのコードは明快になるし。
>OOな「高級アセンブラ」ができてもおかしくないんじゃないかと思う。
現状で一番近い位置にいるのはC++で間違いないと思う。
>>369 難しいところだけど、高級アセンブラの役目はもうないかと。
最近の性能向上のおかげで、処理速度はあまり問題にならないし、
コンパイラの性能が上がったので速度低下も目立たないし。
組み込み機器などの特殊用途にはマクロアセンブラなどが出てきているし、
専用チップなどになってそもそもCでは組めなかったり・・・
373 :
仕様書無しさん:03/03/03 02:21
素人判断ですが、
インタープリタ言語のほうがニーモニックにどう落ちていくかわかりやすくありませんか?
インタープリタはコンパイラが事前に最適化を施す余地がほとんどありませんから。
実は手元にCコンパイラ無いので確認しないで書き込みしてしまいました。
>355
すんません。調子こきすぎました。勉強します。
>359
どこなんでしょう。教えてください。
375 :
仕様書無しさん:03/03/03 05:46
>373
インタープリタは解釈・実行部が裏(?)で動いているため、
そのコードから直接ニーモニックが想像できるなんて事はないかと。
>>369 Cで見えていたのがC++で見えなくなる道理は無い。
コンパイラにアセンブリソースを吐かせることはできるし、
トレースしてればすぐ目に付くし。
もしいつか高級アセンブラとしてCを置き換えるものができるとしたら、
C++はちょっと嫌だなぁ。もっとシンプルなモノがいい。
378 :
仕様書無しさん:03/03/03 10:10
fp=fopen(name,"r");
if(!fp)
{
for(;3;){/* error */}
}
379 :
仕様書無しさん:03/03/03 14:19
if文の条件節が3行くらいに渡っているのを見たとき。
行番号をふっていたとき。
フラッシュとロールバックはおろか、レコードのロックも知らなかったとき。
_, ._
( ゚ Д゚)
( つ旦O
と_)_)
_, ._
( ゚ Д゚) ガシャ
( つ O. __
と_)_) (__()、;.o:。
゚*・:.。
GIF89って最初に書いたけど、
これはテキストファイルだよね?
っていう内容のファイル「test.txt」をWebサーバ上に置いてInternet Explorerで
アクセスするとどうなると思いますか?
383 :
仕様書無しさん:03/03/03 14:48
_, ._
Σ( ゚ Д゚) ガシャ
( つ O. __
と_)_) (__()、;.o:。
゚*・:.。
_,.. ---- .._
,. '" `丶、
/ ` 、
,..-‐/ ...: ,ィ ,.i .∧ , ヽ.
. ,:' .l .::;',. :::;/..://:: /,':/ ', l、 .i ヽ
. ,' ..::| .::;',' :;:','フ'7フ''7/ ',.ト',_|, , ',.',
,' .::::::!'''l/!:;'/ /'゙ / '! ゙;:|:、.|、| 'l
. ,'. .:::::::{ l'.l/ 、_ _,. 'l/',|.';|
l :::::::::::';、ヾ  ̄ `‐-‐'/! ';. '
. ! :::::::::::/ `‐、 ゝ |'゙ |
| ::::::::/ \ 、_, _.,.,_ ノ::: !
>>381の病気が軽くなりますように・・・
|::::/. _rl`': 、_ ///;ト,゙;:::::./
.. `´ /\\ `i;┬:////゙l゙l ヾ/
,.:く::::::::`:、\ 〉l゙:l / !.|
. /:.:.:.:\:.:.:.:.`:、ソ/:.:| | |
/.:.:.:.:.:.:.:.:.:\:.:.:.:У:.:;l /./
. /:.:.:.:.:.:.:.r'´`‐,`、:/.,.:‐{ | !`:、
,'.:.:.:.:.:.:.:.:.';_,゚.,ノ.:./,:':.:.:.:', | |`、:|
!:.:.:.:.:.:.:.:.:.:.゙、:.::/:.:.:.:.:.:.ヽ, / ,!:.:`、
>381の現象って有名なの?ちょっとビックリした。
IEって確か、Content-Typeも無視して
ファイルの中味で何のファイルか決めようとするんだったよね。
拡張子がjpgのブラクラっぽいhtmlファイルを踏んで慌てたことがある。
大量のimgタグで、src属性にmailtoを付けてただけだったけど。
387 :
仕様書無しさん:03/03/03 17:34
>>379 > if文の条件節が3行くらいに渡っているのを見たとき。
俺はif文を
if (foo.bar() == FOO_BAR
&& (! hoge.isFuga())) {
.....
}
みたいに書くんだけど、ダメでつか?
389 :
仕様書無しさん:03/03/03 18:44
>>388 俺はifやforの条件節が複数行に渡るのは醜いと思うのだが、1行80字以内には
納めたいと思っているので、長くなるときは複数行に分ける。
ただ、普段は{}をK&Rスタイルで配置するのだが、そういう場合に限って
if (very_long_and_winding_expr1
&& very_long_and_winding_expr2)
{
....
}
みたいな感じにしてしまう。この場合、ブロックが不要な場合にも
ブロックを付ける。
一貫性は無いんだが、この方が見やすい気がするので。
>>338 早抜けできるときは早抜けにして判断文が長くならないようにするのはどう?
if(foge.isFuga()){
return false;
}
if(foo.bar()!=FOO_BAR){
return false;
}
//ここまでこれたら処理をする
return true;
// 俺式。
boolean r = true;
r &= foge.isFuga();
r &= foo.bar() != FOO_BAR;
if( r ) {
// なんか処理
}
return r;
なんか違う…
394 :
仕様書無しさん:03/03/03 20:47
bool値に論理演算しとる香具師が居る・・・
なるほど、この会社辞めようよおもったソースコードか。
bool値の中の値も大変だな
Cにはbool値などいない!
トリップ変更
400 :
仕様書無しさん:03/03/03 20:57
なんだ乗っ取られたのか。マヌケだな(w
>>398 あ、とりっぷカブタネ。すまん。
つか &&= なんて演算子ないし...
しまった。新しいトリップも単純だ
405 :
仕様書無しさん:03/03/03 21:29
>>390 && を上に持ってくるとインデントがそろって綺麗だと思うけどいかが?
>>392 ネタなら無視してね。
true は普通、非0値だと思うけどこれで良いの?
なんか常にrは真な様な気が...
なんか宗教論争に発展しそうだ
荒れないといいけど・・・
といいつつ
@if(...
&& ...)
と
Aif(... &&
...)
だけど私はAはかな
そっちのほうがなんかすっきりする、感覚の問題だろうけど
test
>>406 おれの場合はどっちかというと(1)だなあ。
論理式が継続してる感じがする、って程度の根拠なんだけど。
仕事で(2)でやれ、といわれたらあんまり抵抗なく「わかりました」っていうな。
とりあえず私は複数行書く場合は↓ですね
if(
foge.isFuga() ||
foo.bar()!=FOO_BAR
){
return false;
}
//ここまでこれたら処理をする
return true;
411 :
仕様書無しさん:03/03/03 22:38
>>406 昔は1.だったけど、「コードコンプリート」を読んでから2.にしました。
演算子が最後に書いてあると次行以降に続くことが明確になる、という
説明を読んでなるほどと思ったものです。
>>412 コッカが無い時点で次行以降に続くことは明白である。
次行の先頭に演算子が無いと、その行が実行文かどうか一目見てわからん。
毛唐の戯言如きでスタイルを変えてしまうのは自分の頭で考えていない証左。
そうですか…私はこれでずっと書いてて慣れてしまったから見やすいんですけど
あ、それと
@if(...){
}
Aif(...)
{
}
ですが、Aは全く使わないですね
どうもこう…Aで書かれたものを読んでいると、なんかしっくりこないというか…
感覚的なものでしょうけど避けてしまっている
415 :
仕様書無しさん:03/03/03 22:46
この宗教論争はコーディング規約とゆう名がつくよな。
漏れ適にはどうでも良いんだけど、どっかで決めてくれねぇかなぁ。
最近どこの現場行っても、無いから決めさせられるんだよね。
で、原案提示してからそれについてなんだかんだの会議が有ってさ。
どーでも良いといいつつ409は嫌だが...
416 :
仕様書無しさん:03/03/03 22:49
417 :
仕様書無しさん:03/03/03 22:51
>>414 漏れもそうだったけど、規約で決まって半年やったらAに慣れて
@が馴染めなくなってもうた。(漏れ415ね、会議で押し切られた)
その程度のもんだよん。
418 :
仕様書無しさん:03/03/03 22:52
混在してるのでどうでもいい。
>>419 混在してるのはよくない
多分どっちの派閥からもこうつっこまれるぞ(w
>>420 でも他人のソースを勝手に整形するのもねぇ。
一応コーディング規約もあるにはあるが、色んな業者が入り乱れてるわ、
ライセンス買ってソース持ってくるわで、厳密に守る事が出来なくて、
整形作業(indent通すとか)自体が無駄な時間になってしまうんだわ。
422 :
仕様書無しさん:03/03/03 23:11
>>421 規約守んない害虫は許せんな。
漏れも害虫だけどさ、ルールは守るぞ。
伝達系統に問題有りと見た。
カッコ <-> コッカ
ケース <-> スーケ
コンマ
↑
|
|
|
↓
カンマ
case ⇔ esac
if ⇔ fi
>>425 マン○にしなかったとこがお前の良心か?
428 :
仕様書無しさん:03/03/04 00:41
マンコ>>>>>>(越えられない壁)>>>>>カンマ>>>>コンマ
#define continue_to_next_line_at_AND 1
#define continue_to_next_line_at_OR 0
if( foo.IsHoge() && continue_to_next_line_at_and
&& bar.IsHoggeee() ) {
>>430 突込みどころはここじゃないだろうけど
大文字小文字間違ってるね>AND, and
#ifdef continue_to_next_line_at_USEXXX // ANDならUSEXXXを定義、ORなら定義せず
#define continue_to_next_line_at_XXX 1
#else
#define continue_to_next_line_at_XXX 0
#endif
if( foo.IsHoge() && continue_to_next_line_at_XXX
&& bar.IsHoggeee() ) {
どうせやるならこんな感じでやれよといいたいんだよね?
ん・・・ちょっと違うかな?
このコードが良いか悪いか別にして
if( continue_to_next_line_at_XXX && foo.IsHoge()
&& bar.IsHoggeee() ) {
こうする方がいいね・・・
そんなことするぐらいなら、
if( foo.IsHoge() /* 次の行に続く */
&& bar.IsHoggeee() ) {
のほうがまし。
>>434 いまごろ、そんなことが出来るんだと感心してまつ。
436 :
仕様書無しさん:03/03/04 19:58
>>436 いやコメントのほうがcontinue_to_next_line_at_ANDマクロよりマシ、ってことだろ。
>>434 ・・・いや、それだと
430のいいたいのと違うような気がする
>>if( foo.IsHoge() && continue_to_next_line_at_and
>>&& bar.IsHoggeee() ) {
これがいいたいのはcontinue_to_next_line_at_andが場合によっては
continue_to_next_line_at_orになりますよと
いいたいんじゃないかな
例えばデバッグビルドの場合はcontinue_to_next_line_at_and、
リリースビルドの場合はcontinue_to_next_line_at_orになるとか
変える時は一括して置換するとかで
それともやはり単に条件判定を続けるかどうかなのかな?
それなら434のでいいわけだが
× それともやはり単に条件判定を続けるかどうかなのかな?
○ それともやはり単に条件判定がさらに続きますよという意味なのかな?
と思ったらcontinue_to_next_line_at_andって意味書いてあるな
俺もだめぽ。。。
441 :
仕様書無しさん:03/03/04 22:53
おまいら、難しく考え過ぎでつ。
コードは明快であるべき。
行頭揃える方が手間が少ないので(1)に1票。
>>406 if ( hoge==0 &&
foooooooooooooooooooooo==0 &&
bar==0 )
こんなん見づらいし、タブ等で揃えるのも手間がかかる。
(PGたるもの手間を惜しむべし)
>>442 > こんなん見づらいし、タブ等で揃えるのも手間がかかる。
IDEかまともなエディタ使えよ。
444 :
仕様書無しさん:03/03/04 23:03
>>443 そーゆー問題じゃ無ぇだろ。アフォですか?
>>444 手間を気にしてるだろ。日本語読めませんか?
446 :
仕様書無しさん:03/03/04 23:08
能も無いのにケンカすんな
449 :
仕様書無しさん:03/03/04 23:19
>>447 >>448 IDEやエディタに整形させるなら、行頭でも行末でも変わん無ぇだろ。
まともな意見も書けないならクンナヨ。
>>449 整形後の話だろ。整形後行頭や行末はダメに決まってる。
あんた最初っから混乱していたみたいだね。
451 :
仕様書無しさん:03/03/04 23:41
449だが、整形の為にIDEやエディタを持ち出してきたのは
>>443 なので、一生懸命突っ込んでいるわけだが。
>>451 まともなエディタなら整形するまでもなく揃うじゃん。
そんなことも知りませんでしたか?
453 :
仕様書無しさん:03/03/04 23:47
>>452 その揃える動作を整形と言うのですが・・・
454 :
仕様書無しさん:03/03/04 23:48
たかだかインデントのあるなしくらいの問題で
何時間も上司に説教されたとき。
458 :
仕様書無しさん:03/03/04 23:56
460 :
仕様書無しさん:03/03/05 00:12
お願いだ、strtok()をライブラリの中で勝手に使わないでくれ…!
>>460 strtokとstrtok_rが分かれているようなシステムですか?
463 :
仕様書無しさん:03/03/05 00:19
startrek()なら...
>>443 行末の演算子を揃えてくれるエディタやIDEを知ってるなら教えてくれ。
できれば編集して位置がずれても、自動で修正してくれる奴。
465 :
仕様書無しさん:03/03/05 00:19
466 :
仕様書無しさん:03/03/05 00:21
JavaScriptで
onKeyDownとonKeyPressの違いを理解してくれなかったとき。
>>461-462 え?
for (p = strtok(str, ","); p !=; p = strtok(NULL, ",")) {
foo(p);
}
で、foo()の中でstrtok()使われていたら困らない?
>>460 なるほどそれはこまるね。
ここんとこstrtok()はぜんぜんつかわんから、かんがえもしなかった。
// すまん 、訂正。
for (p = strtok(str, ","); p != NULL; p = strtok(NULL, ",")) {
foo(p);
}
つまりstrtok_r()があれば問題無いってことだろ。
別にstrtok()に限った話でもないし。
>>434 foo.IsHoge() が true だった場合、continue_to_next_line_at_AND の値によって
bar.IsHoggeee() が呼ばれたり呼ばれなかったりする。
bar.IsHoggeee() が副作用を起こすメソッドだった場合に(゚Д゚)マズ-。
普通、関数名からして副作用が起こることはまずないが、こんな素敵なコードを書く奴を
信用してはいかん。
472 :
仕様書無しさん:03/03/05 14:20
>>471 if( f1() ) {
if( f2() ) {
f3()
のような処理が、
f1() && f2 && f3();
と等価であることは、Cプログラマの常識だと思うんですけど。
また、普通のCプログラマは、後者を好むと思うんですけど。
473 :
仕様書無しさん:03/03/05 14:43
>>472 「副作用」について勉強し直してくダサイ。
まぁ、稼動しているなら触れない方がベストだな。
>>472 ()が抜けてるよ。
>>473 「短絡評価」について勉強し直してくダサイ。
476 :
仕様書無しさん:03/03/05 15:17
>>475 いや、
>>472 の内容と「短絡評価」については正しいんだけどさ。
>>471 は「f3() が副作用を起こす場合」という条件付なんだから、
突込みどころがズレてるんじゃないんかい、と・・・。
477 :
仕様書無しさん:03/03/05 15:45
>>476 そうだね。
>>471 への突っ込みは
「Cが短絡評価なのは極アタリマエ。普通の、信頼のおける
Cプログラマは、論理演算が短絡評価であることに依存してコードを書く。
何?おまえ最近まで知らなかったの?」
くらいでいいよね。
副作用ですか・・・よく分からなかったのでちょっと検索してみたけど結構あるんですね
ここで言われてる副作用っていうのは
@---------------
if(A){
if(B){
if(C){
...
}}}
-----------------
A---------------
if(A && B && C)
...
-----------------
@はA→B→Cと確実に判定が行われていくけれど
AはA→B→CではなくA→C→B、C→B→Aになったりする場合があるということでしょうか?
↓のサイトによるとコンパイラに依存するみたいなこと書かれていますが
ttp://www.st.rim.or.jp/~phinloda/cqa/cqa7.html 私は@は避けてAの条件文を多用していますが今のところ問題はないです
当方VisualC++6.0Pro(SP5)使ってますが
近々VC.net Proの方にしようと考えてるけれどちょっと不安になってきた
ちなみにC++も論理演算って短絡評価ですよね?
481 :
仕様書無しさん:03/03/05 16:17
>480
そだよ。 あと、Javaもperlもbashも。
>>480 C++だと、operator&&を定義してやると短絡評価じゃなくなってしまう罠。
逆に短絡評価でない言語は何でしょう?
VB以外にありまつか?
Delphiはオプションで決められます
書き方じゃなくてオプションでかよ。やな言語だな。
短絡評価に依存したコードは書きません
487 :
仕様書無しさん:03/03/05 18:57
>>484 >>485 オプションで決められるという事は、
言語仕様として評価方法が決まって無いと言う事で、
嫌な言語だと思う。
でも、書き方で評価方法が変わる言語というのも、
嫌な言語だと思う。
488 :
仕様書無しさん:03/03/05 19:21
新入社員の質が落ちていることに気が付いたとき。
新卒にA4用紙1枚に頭でプログラミングしてもらおうとオモタ。
■下記余白を利用して創造性あるプログラムコードを記述してください。
(言語は問わないものとする)
$
$ #include <iostream>
$ int main {
$ cout << "Hello C++ world !";
$ return 0;
$ }
$
とか、
$
$ 頭で考えてプログラムを組めません。
$
これが、現実だから少し困った。
これからの教育方法を見直す前にこの会社を辞めてみたい。
(;´д`)トホホ
>>488 面白い問題ではあるけど、業務の一環でやらせるなら
まず仕様を決めろよ。
この遅さならテスト出来る。
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
>>489,489,489,489,489,489,489,489,489,489,489,489,489,489,489
どうなるだろう。ワク(=´ー`=)ワク
再チャレンジ。
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
>>491,491,491,491,491,491,491,491,491,491,491,491,491,491,491
みなさん。ご迷惑おかけします。((*_ _)ペコリ
492 :
仕様書無しさん:03/03/05 19:36
>>488 >$
>$ #include <iostream>
>$ int main {
>$ cout << "Hello C++ world !";
>$ return 0;
>$ }
>$
何気に、間違ってるところが凄い。(;´д`)
493 :
仕様書無しさん:03/03/05 19:43
ノイマン型コンピュータに創造性のあるプログラムなんて組みこめるわけないだろ。
>>489 おっしゃる通りです。仕様は決めておくべきでした。
もしかして、うちを受けられた際の不満とか?
それはないですよね。チッチャイ会社ですから。
>>490-491 >>491を自分で確認すると無限にメッセージ枠が
発生している事に気が付いた。"/(;-_-) イテテ・・・
カガミにカガミを映したとき
テレビカメラで撮影確認モニタを映したとき
のように、なっている。
なお、公開しているプログラムではないのでご安心を。(´▽`)
>>492 チラミ程度?で気がつくあなたはモットすごいです。(・∀・)ニヤ
$
$ #include <iostream>
$ using namespace std;
$
$ int main() // ←
$ {
$ cout << "Hello, C++ \n";
$
$ return 0;
$ }
$
と、私ならします。
>>493 そこを、あなたの力で何とか…。
無理ですかね?(ニッコリ
Get工学系大学新卒
Set中途経験者
End漏れ(´・ω・`)ショボーン
cout << "Hello, C++ \n";
と
cout << "Hello, C++ " << endl;
ってどっちが一般的なんだ?
>>497 cout << "Hello, C++ \n";
で(゚з゚)イインデネーノ?
>>488 は採用試験なら面白い(やる気、経験などを判断するよい材料になる)と思うんだが、
新人教育用のネタとしては全然駄目だろう。
単発でそういう「テスト」をすることにいったいどんな教育効果があるのか
考えてみてちょ。新人のレベルに応じた適切な入力・導きを与えられて
いないだけに見える。
何かすげー死にたくなった。
501 :
仕様書無しさん:03/03/05 22:01
>>494 > $ int main() // ←
やれやれ…
呼んだ?
別に・・・
>497
そりゃ状況次第だろ。
……一応聞くが、 cout << "hoge\n"; と cout << "hoge" << endl; が
どう違うのか、は分かってるよな?
ワカリマセン
結果ハ一緒ダヨネ
endlは"\n"を出力した後にバッファをフラッシュするから、
この場合は関係ないけど、プロセスを直ぐに終了しない場合は違ってくることがある。
>>487 いちおPascalは短絡評価しないことになってます。
DelphiをPascalの一種として取り扱っていいのかどうか疑問ですが。
497は一般的の意味を明らかにすれば?
バッファをいちいちフラッシュさせるのが一般的なのか、
ためにためて効率を上げるのが一般的なのか、によって変わるし。
そういえば俺フラッシュって全然使ってないや>fflushやらgdiflushやら
やっぱやらな駄目かな?
その内暴走するかな、俺のプログラム。。。
>>510 うごいてるなら問題ないかと思われ。
動かなくなった時、原因がわかりにくいが。
引っ張って、アレだが、
>>488 の模範解答が見たい。
>502
(・∀・)ニヤニヤ
>496
Endと言うより、Cutかと・・・。
いずれにしても、お疲れ様でした。
>>488の模範解答
#include <stdio.h>
void main(void)
{
fopen("con\lpt\sayonara.com","r");
printf("\n\b\b");
}
#include "/dev/tty"
だろう。
#include "con/con"
$ #include <iostream>
$ int main {
$ cout << "Hello C++ world !";
$ return 0;
$ }
おしい!! 3行目は std::cout << "Hello C++ world !"; だ
って、そういう問題ではないの?
だからお前ら創造性をだなぁ...
まぁ、新入社員用に配られたCのテキストみたら、いきなり
void main()
とか堂々と書いてあるよりはましかと
いや、int main { よりは void main() { の方がまだマシだと思うが。
一応コンパイルできるから。
int main (int argc, char *argv[])
{
system ("make world");
return 1;
}
#define TRUE 0
#define FALSE (!TRUE)
デスマの悪寒
525 :
仕様書無しさん:03/03/06 23:22
>>524 #define True 1
#define False 0
で対抗するんだ!命を守るにはそれしかない!!!!
>>525 >>524に対抗するなら、
#undef TRUE
#define TRUE 1
#undef FALSE
#define FALSE 0
だろ?何が問題になってるのか、はっきり認識しろよ。
//#define TRUE 0
#define TRUE 1
#define FALSE (!TRUE)
これじゃダメですか。そうですか。
#define TRUE 1 //0
#define FALSE (!TRUE)
529 :
仕様書無しさん:03/03/06 23:56
何ループしてるんだい。
面白そうだから俺も混ぜてくれよ。
で何を書けばいいんだい。
(この会社辞めようと思った)創造性あるプログラムコードを記述してください。(言語は問わないものとする)
#if TRUE == 0
#error 氏ねヴォケ
#endif
VBなんだけど。
御願いだからコントロールには名前をつけて下さい。
Command1とか、Text1とか、フォームに貼り付けたままで放置はやめて下さい。おながいします。
ソースコードではないが、同名で全く内容の違うソースファイルが
複数発見されたときは深い悲しみに襲われたものだ・・・。
535 :
仕様書無しさん:03/03/07 02:50
>>534 これは、この取引先とは手を切ったソース管理なんだけど聞いてくだされ。
取引先の開発途中(PG失踪)のプログラム数本を引継いでくれと依頼される。
あっちこっちのディレクトリに、同名で内容が微妙(ここポイント)に違う
ソースファイルが入り乱れて多数発見される。更新日時も入り乱れ(ん?)
一番新しいソースがあるディレクトリが、最終的なものとも言いきれないロジック。
深い憎しみに襲われたものだ・・・。
>>535 「取引先の PG 失踪」ってだけで、すでに士気萎え萎えだわな (*´▽`)ハァーー
#define TRUE 0
#define FALSE (!TRUE)
#undef TRUE
#define TRUE
int IsZero( int a ) {
return a == 0 ? TRUE : FALSE;
}
>>535 ごめん。漏れ、それで今、苦しんでいる。
ちょっとしたライブラリ(つか、関数群)を作った。を、便利便利
この仕事で使った。仕事は終了〜。
次の仕事が始まった。あ、あのライブラリ使おう。ちょっと機能を追加しておこう。
この仕事も終わり〜
新たな仕事が始まった。お、あのライブラリが使えるな。ごそごそ。げ、バグ見つけちゃった。
前の仕事には影響しないバグだけど、一応直しとかないとな。
この仕事もおわり〜
んなことを繰り返しているうちに、種々雑多なバージョンが入り乱れてしまい、今では、「あの
ライブラリを使おう」と思っても、「はて、どのディレクトリにあるのが最新版なのだろう」と
お仕事フォルダを全検索して、ファイルの更新日付で確認しなければならない始末。
全部一本化すれば良いじゃないかと思うだろうが、最新版のソースは、機能追加、プログラム
修正を繰り返したせいで、一番最初の仕事で作ったプログラムでは動作しないという体たらく……。
ごめんな、引き継ぐときは、何とか整理してから引き継ぐからな。(無理だと思うけど)
CVSツカエ。
>>539 う〜ん、そうでしか。だけど、ありがちだよね。
こういうのは、割り切るしかないよね。
プロジェクトが違ったら、ましてや、リリース後なら諦めて
それぞれ育てていくのが正解かな。
よっぽど低レベルなライブラリなら統一する考慮必要だと思うけど。
「この程度の修正ならBプロジェクトやC、D・・・プロジェクトに影響しないだろう。」
な〜んて、総合テストの時間なんか確保できないのに
全部綺麗に統一してしまいたい衝動にかられるけど我慢しる。
他のプロジェクトもリリース前で総合テストまで時間がとれるなら別だけどね。
コード管理ツールにも限界はある。使う側がしっかりしないとね。
Subversionってどう?
>>539 漏れも昔DQNプロジェクトで似たような経験をしてるから分かる。
CVSを使うにしても、どういう戦略でbranch管理をして、幹にマージしていくか
という点をきっちりしていないと同じ目にあうと思う。
1) Henry SpencerのオリジナルのRegexパッケージがありました
2) Tcl/Tkでは1)に一部Tcl/Tk用改変を加え、利用しました
これは1)とは互換性がありません
3) apacheでは2)のTcl/Tkに特化した部分を削除し、ebcdicパッチを
加えました。これは2)とは互換性がありません
4) *BSDでは1)を改変したものをlibcのregex(3)として利用しています。
これは2)3)とは互換性がありません
5) nvi-m17nでは4)に対してマルチバイトパッチを当てて利用しています。
これはnvi-m17nの内部コードを対象としているので一般的に利用できる
ものではありません。もちろん2)3)4)とは互換性がありません
とか。
>>539 あはは。あるある。
最後にやった仕事のソースから掘り出してきたのが最新!
>534
あー、その。各プログラムの主処理モジュールを全部
main.cpp
にしたのはやっぱマズーでしたか(ぉぃ
>547
無茶しやがって(AA略
>>547 普通は絶対にしない。
ただ、外注から上がってきたソースってそんなのが多いんだよ。
( とっとと取引やめてくれ > うちの会社 )
何考えてプログラマやってんだろうね。
>>550 多分それ、その外注企業の規約なんだと思うよ。
>>551 「解読しづらいコードを書いて、権利を相手に渡すな」とか
規約で決まってるのかと疑いたくなるソースばかりで
>>551が冗談には聞こえないんだが・・・
534だが、俺が見たのも外注からのソースでした。ああ・・・
思うだけじゃなくハッキリ言ってやってくれ。
下っ端の漏れがいくら言っても、上司は耳をかさねぇ。
あまりの酷さに漏れが直そうとすると、DQN上司は
「動いてるモノに余計な修正加えるな。品質が下がる」とか言うし。
んで作る前に防止しようと色々提言しても、
「仕様にないことまでやる必要はない」と断言。
>>554 だよね。
ほんとは、やるべきことをやった方が、
「仕様ににあるものを作る」ことが効率化されるのにね。
てゆーか、まず仕様の変更をしないかな。そーゆーときは。
部下がいっつも思いつきで「これがいい」って思ったものを
実装するから困っちゃうよ。ちゃんと検討して最終的に必要
と決まったものだけを実装してくれよ。
どんなにいいものでも予算の都合上できないことはあるん
だよ。わかってくれよ。
557 :
仕様書無しさん:03/03/09 13:55
>554
上司の言い分も間違っていないとおもうよ。
余分なことをする時の義務と責任を考えてみてくれ。
上司に言うんじゃなくて、クライアントに言うべきだと思うんだが。
//csv fileにてアドレス帳DATAを作成する。//
#include <iostream>
using namespace std;
int main(){
FILE *fp;
fp = fopen("docomo.csv","w");
fprintf(fp,"電子メール アドレス\n");
int b;
for (b = 0 ; b <= 99999999 ; b++){
if (b >= 0 && b < 10){fprintf(fp,"0900000000%
[email protected]\n",b);}
if (b >= 10 && b < 100){fprintf(fp,"090000000%
[email protected]\n",b);}
if (b >= 100 && b < 1000){fprintf(fp,"09000000%
[email protected]\n",b);}
if (b >= 1000 && b < 10000){fprintf(fp,"0900000%
[email protected]\n",b);}
if (b >= 10000 && b < 100000){fprintf(fp,"090000%
[email protected]\n",b);}
if (b >= 100000 && b < 1000000){fprintf(fp,"09000%
[email protected]\n",b);}
if (b >= 1000000 && b < 10000000){fprintf(fp,"0900%
[email protected]\n",b);}
if (b >= 10000000 && b < 100000000){fprintf(fp,"090%
[email protected]\n",b);}
}
return 0;
}
//csv fileにてアドレス帳DATAを作成する。//
#include <iostream>
using namespace std;
int main(){
FILE *fp;
fp = fopen("docomo.csv","w");
fprintf(fp,"電子メール アドレス\n");
int b;
for (b = 9000000000 ; b <= 9099999999 ; b++){
fprintf(fp,"0%
[email protected]\n",b);
//if (b >= 0 && b < 10){fprintf(fp,"0900000000%
[email protected]\n",b);}
//if (b >= 10 && b < 100){fprintf(fp,"090000000%
[email protected]\n",b);}
//if (b >= 100 && b < 1000){fprintf(fp,"09000000%
[email protected]\n",b);}
//if (b >= 1000 && b < 10000){fprintf(fp,"0900000%
[email protected]\n",b);}
//if (b >= 10000 && b < 100000){fprintf(fp,"090000%
[email protected]\n",b);}
//if (b >= 100000 && b < 1000000){fprintf(fp,"09000%
[email protected]\n",b);}
//if (b >= 1000000 && b < 10000000){fprintf(fp,"0900%
[email protected]\n",b);}
//if (b >= 10000000 && b < 100000000){fprintf(fp,"090%
[email protected]\n",b);}
}
return 0;
}
>>559-560 ワラタ
しかしコメントアウトした方は流れるような感じがしていいなあ(w
SPAM業者のプログラムか?
しかし、古いね…。(゜m゜*)プッ
>>556 仕様変更も、仕様変更のための検討もせーへん。
つーかそのDQN上司、独断多すぎなんだよナ。
レビューもほとんどやらんし。
>>557 コーディング前の修正より、テスト後の修正の方が面倒な事くらいわかるだろ。
それともDQN上司を納得させるためだけに、コーディング前に発見できた
バグをテスト時まで放置しろというのか!
テストファーストするようになってからバグが格段に減りますた。
もっともテストコードの方にバグがあってハマることもあるけど(w
変なコードを書く前にまずテストコード書け。
とかやってると上司に睨まれたりするんだよなあ。
無駄なコードを書いているとかいって。
いや、大丈夫か。一所懸命コードを書いているようにしか見えんか。
よくわかんないや。おれは上司のいないフリーランス(w
569 :
仕様書無しさん:03/03/09 23:07
>566
よく読んでなかったんだが、バグを直すというのかい?
ただ単に気に入らない、見づらいコードを修正するんではなく。
それならその作業(リファクタリング)を実装要件として、ユーザーに認めさせることが先決だな。
そうすれば上司も文句ないだろうし。
570 :
仕様書無しさん:03/03/09 23:41
>>566 似てるわ。漏れのところと・・・。
ウチもDQNのPLがいるんだが、
一緒に仕事することが、既に障害になってる。
>つーかそのDQN上司、独断多すぎなんだよナ。
>レビューもほとんどやらんし。
似てるよ。それ。報告無しでしょ
対処の仕方は、PLをハブンチョして、
直接、顧客から別案件を引っ張ってきちゃった。
で、現在まったりと、別プロジェクトでお仕事してるよ。
ん?すまん。
スレ間違えたかも・・・。
まぁ。みんなアッチも見てるでしょ。(ご勘弁を)
自分の担当の部分の中で明らかに間違ってると思うところがあったので
それを直したら怒られますた
まさか他の部分がその間違いを利用してプログラミングされてるなんて
思いもつかなかったよ(´・ω・`)
ん?今までのプロジェクト、主となるソースは全部mainって名前だったけど・・・
まずいのか?
....(((゚Д゚;)))ガクガクブルブル
> int b;
> for (b = 9000000000 ; b <= 9099999999 ; b++){
このコードが期待通りに動作するコンパイラって、まだ触ったこと無い。
> #include <iostream>
> FILE *fp;
> fp = fopen("docomo.csv","w");
・・・はて?
>>559 //csv fileにてアドレス帳DATAを作成する。//
#include <iostream>
using namespace std;
int main(){
FILE *fp;
fp = fopen("docomo.csv","w");
fprintf(fp,"電子メール アドレス\n");
int b;
for (b = 0 ; b <= 99999999 ; b++){
fprintf(fp,"090%
[email protected]\n",b);
// if (b >= 0 && b < 10){fprintf(fp,"0900000000%
[email protected]\n",b);}
// if (b >= 10 && b < 100){fprintf(fp,"090000000%
[email protected]\n",b);}
// if (b >= 100 && b < 1000){fprintf(fp,"09000000%
[email protected]\n",b);}
// if (b >= 1000 && b < 10000){fprintf(fp,"0900000%
[email protected]\n",b);}
// if (b >= 10000 && b < 100000){fprintf(fp,"090000%
[email protected]\n",b);}
// if (b >= 100000 && b < 1000000){fprintf(fp,"09000%
[email protected]\n",b);}
// if (b >= 1000000 && b < 10000000){fprintf(fp,"0900%
[email protected]\n",b);}
// if (b >= 10000000 && b < 100000000){fprintf(fp,"090%
[email protected]\n",b);}
}
return 0;
}
>>559 //csv fileにてアドレス帳DATAを作成する。//
#include <iostream>
using namespace std;
int main(){
cout << "通報しますた。" << endl;
//FILE *fp;
//fp = fopen("docomo.csv","w");
//fprintf(fp,"電子メール アドレス\n");
//int b;
//for (b = 0 ; b <= 99999999 ; b++){
//if (b >= 0 && b < 10){fprintf(fp,"0900000000%
[email protected]\n",b);}
//if (b >= 10 && b < 100){fprintf(fp,"090000000%
[email protected]\n",b);}
//if (b >= 100 && b < 1000){fprintf(fp,"09000000%
[email protected]\n",b);}
//if (b >= 1000 && b < 10000){fprintf(fp,"0900000%
[email protected]\n",b);}
//if (b >= 10000 && b < 100000){fprintf(fp,"090000%
[email protected]\n",b);}
//if (b >= 100000 && b < 1000000){fprintf(fp,"09000%
[email protected]\n",b);}
//if (b >= 1000000 && b < 10000000){fprintf(fp,"0900%
[email protected]\n",b);}
//if (b >= 10000000 && b < 100000000){fprintf(fp,"090%
[email protected]\n",b);}
//}
return 0;
}
>>559 //csv fileにてアドレス帳DATAを作成する。//
#include <iostream>
using namespace std;
int main(){
FILE *fp;
fp = fopen("docomo.csv","w");
fprintf(fp,"電子メール アドレス\n");
int b;
for (b = 0 ; b <= 99999999 ; b++){
if (b >= 0 && b < 10){fprintf(fp,"ぬるぽ\n");}
if (b >= 10 && b < 100){fprintf(fp,"ぬるぽ\n");}
if (b >= 100 && b < 1000){fprintf(fp,"ぬるぽ\n");}
if (b >= 1000 && b < 10000){fprintf(fp,"ぬるぽ\n");}
if (b >= 10000 && b < 100000){fprintf(fp,"ぬるぽ\n");}
if (b >= 100000 && b < 1000000){fprintf(fp,"ぬるぽ\n");}
if (b >= 1000000 && b < 10000000){fprintf(fp,"ぬるぽ\n");}
if (b >= 10000000 && b < 100000000){fprintf(fp,"ぬるぽ\n");}
}
return 0;
}
いい加減つまんないってことに気が付けっ
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/
(_フ彡 / ←
>>578
このプログラムの出力は何に入力されるんだろう…
ファイルサイズ、どのくらいになるんだろ...
>>582 それくらい計算しろよ。単純なかけ算じゃねーか。
void foo1( int i ) {
// assert( 0 <= i );
なんか処理;
}
void foo2( struct xxx* ps ) {
// assert( ps != 0 );
なんか処理;
}
ずっと、こんな感じでコメントアウト済みの assert() 達。
update SYAIN set KIHONKYU_OLD = KIHONKYU
, KIHONKYU = KIHONKYU + floor(((40 - GAKUREI) * (2 + rand())) * 100
>>586 そのパラメタを何処に書き入れるか教えるのは
大変なことだろうなぁ。 ( ´-`).。oO( だろう… )
// #define NDEBUG
トロン、プロジェクトXでやるね。
ちとチビッター
#include <iostream>
using namespace std;
int main(){ for(;;){ cout << "\a"; } return 0; }
失敗したプロジェクトは扱わんだろ。
>>591 どうも本体の方から聞こえてくるんですよ〜。変な音が…。
595 :
仕様書無しさん:03/03/12 11:22
>>540 |1.4 CVS では出来ないこと
|・CVSは管理者の替わりにはならない
| ソースがどのような状態になっているか、を意味的に把握できるのはあくまで人間である。全体の管理は人間が明示的に指示しなければならない。CVSはソースコードの変更は記録するが、その変更内容を決めるのは人間である。
ま、使ったほうがいいのは同意。
でも多分解決しない。
Σ、成功したらどうなったのかと
妄想で放送してみてほすぃ
名称が最終的に
Σ(°Д°;)
になる。
∧_∧
( ´Σ`)< ぬるぽ
第一段階:
if(hoge)
{
hoge;
}
else
{
hoge;
}
第二段階:
if(hoge){
hoge;
}else{
hoge;
}
第三段階:
if(hoge){hoge;}else{hoge;}
第四段階:
if(hoge)hoge; else hoge;
第五段階:
hoge?hoge:hoge;
>>601 たぶんこのコードを削除するとなぜか動かなくなるんだよ
コンパイラがgccで、全体を({})で囲っているとか。
607 :
仕様書無しさん:03/03/16 17:28
下がり過ぎage
javaで全部static
hoge;
や
;
じゃ駄目だろ。
hoge; hoge;
じゃないとな。
610 :
仕様書無しさん:03/03/16 19:21
いま共産党関連のシステムを作ってるのですが、
ソースコードを全部左に寄せるように指定されてるので、インデントが使えずにコードが見にくいです
産經新聞のシステムのソースコードはどうなってるのでしょうか?
アラビア語BASICで書くことになってます。
612 :
仕様書無しさん:03/03/16 19:40
>>610 右よりだよ
〜〜〜〜〜〜〜〜改行省略〜〜〜〜〜〜〜〜〜〜〜〜
って書いてほしかったんだよね
614 :
仕様書無しさん:03/03/16 22:37
int compute( int num1, char exp, int num2 )
{
switch( exp )
{
case '+':
return ( num1 + num2 );
case '-':
return ( num1 - num2 );
case '*':
return ( num1 * num2 );
case '/':
return ( num1 / num2 );
default:
return -1;
}
return -1;
}
615 :
仕様書無しさん:03/03/16 22:43
>>614 すでに辞めてしまった会社で
同じようにCOMPUTE関数を書いていた奴がいたよ。
コボラーが大多数を占めていた会社だったんでね。
よく検収パスできたなと思うようなコードでしたよ。
>>614 ans1 = compute(1, '+' ,-2);
ans2 = compute(1, '-', 2);
ans3 = compute(1, '*', -1);
ans4 = compute(1, '/', -1);
>614は……研修課題で電卓作れと言ったら出てきたコード(の一部)か?
新人がそういう条件で書いたんなら、まだましな方じゃねぇ?
(それでも異常ケースの処理はなんとかしてほしいところだが)
>>617 いいえ、Cに転向したベテランCOBOLerが書いたコードです。
使用法は
>>616の通り
COBOLerってマジでキモイね
>614
自分は来月で2年目になるんですけど、新人研修で電卓アプリ書くのに
そんなコードを書いた記憶があります。戻り値はさすがにintじゃ
なかったのとエラー処理はもう少しましにした記憶がありますが。。。
すみません。これってどのように書くのが一般的なんですか?
もしかして構文木で式解析みたいな感じで書くのが一般的?
ですと、確かに>614じゃ駄目ですね。当時はそんなの考えもしなかった。泣
>>620 evalつかえばそうなに難しいこと考えなくても済むよ。
電卓だろ? 式解析なんているのか?
>>622 evalはC標準ライブラリになさげで。泣
>>623 課題の電卓の仕様を思い出すと・・・確かにいらなかったです。
ちなみに自分は今でも式解析は本見ないと書けないっぽい。泣
624は自分の書き込みです。名前入れ忘れました。
どうせやるにしても、こっちの方がずっといいと思うけど・・・。
#define COMPUTE
COMPUTE ANS1 = 1 + -2;
COMPUTE ANS2 = 1 - 2;
COMPUTE ANS3 = 1 * -1;
COMPUTE ANS4 = 1 / -1;
>>626 電卓なんで、数値や演算子は入力から取得するのでそれでは無理かと。
>614が電卓目的で書かれたものかは分からないですが・・・。
>>620 マジレスしとくかな。
614のコードは知らない演算子が出てきたときに-1を返すようになってる。
だけど、四則演算やる関数なんで-1を返す可能性もある。
その辺を616は指摘してる。
大体614のように普通は書くだろうが、エラーのときに-1を返すのは
どうしようもない仕様だってことだ。
>>628 >617で異常ケースの処理は主題じゃないような感じに書かれていたので、
もっと別なところで問題があるのかと思ってました。
ありがとうございます。すっきりしました。
今度の4月入社の人も研修で電卓作るのかな。。。
ソースだけだしてみんながCOBOLerのコードだと思うと思った
>>614=
>>618がマヌケだということだ。
たぶん電卓とか式解析なんて考えたこともないんだろう。
COBOL と COMPUTE でググって見たら理由が分かりました。
コードのエラー処理とcompute関数を記述すること自体の複数の問題が
あったんですね。知ってから>626を見ると、なるほど納得します。
ブール値の取り扱いについて。
・bool型は使用禁止。BOOL型を使用する事。
・条件文は、 if ( flag ) や if ( !flag ) のように省略せず、
if ( flag == TRUE ) や if ( flag == FALSE ) のように
明示的に記述すること。
…それで本当に良いのかと小一時間
flag == TRUEって……。
それは凄い。
>>632 俺も以前bool使わずBOOL使ってたなぁ
今は原則的にboolだなぁ
typedef double (*compute_t)(double,double);
double compute_add(double a1, double a2 ) { return a1+a2; }
double compute_sub(double a1, double a2 ) { return a1-a2; }
double compute_mul(double a1, double a2 ) { return a1*a2; }
double compute_div(double a1, double a2 ) { return a1/a2; }
compute_t operators[127];
operators['+'] = compute_add;
operators['-'] = compute_sub;
operators['*'] = compute_mul;
operators['/'] = compute_div;
double compute( double a1, char op, double a2 ) {
return operators[op](a1,a2);
}
// きっと、こんなのが定義されていたのさ。
class BOOL {
int value;
int operator=( int v ) {
value = v;
}
int operator==( int v ) {
return ( !v == !value );
}
};
>>636 残念ながらWinAPIのBOOL。
それはさておき第2弾。
命名規則について (
>>632とは別の会社)
・基本単語をアルファベット大文字3文字で表したものと、
その組み合わせで付ける。
・変換方法は英語とローマ字混在
・名前が被る場合は、末尾に2桁の数字を付ける。
・変数名もファイル名も全てほぼ同じルールを適用(詳細忘れた)
・が、変換の仕方が変数とその他で微妙に違ったりする
(例)
東京 → TKY00
等級 → TKY02 (←連番じゃなかったり…)
東京特許許可局 → 東京・特許・許可局 → TKYTKKKYK
そこでの主な業務はソース修正だったが、たった数行の修正の為に
半日かけてソースを解読せねばならんかったりして、非常に鬱だった。
上司の指示でディレクトリ名・ファイル名に全部作成日を付けるとかあったな。
毎日ファイル名が変わるんだよ(;´Д`)。
hoge_2000_09_12/fuga_2000-10-31.c
hoge_2000_09_12/fuga_2000-11-01.c
hoehoe_2000_09_30/
.......
こんな感じで。ソースはお決まりの COBOLic C (ワラ。
俺 「CVS使いましょうよ。前のバージョンに戻したりもすぐにできますよ」
上司「俺そういうの良く分かんないから使いたくない。今の方法でも問題ないだろ?」
俺 「問題ありまくりなんですけど。○○とか××とか…(略)…というわけなんです」
上司「ふーん。それで?」
俺 「そ、それでって…(汗)。CVS を使えば解決できるんですよ」
上司「まー俺が良く分かんないものは使いたくないから。それじゃ(会議という名の雑談会へ)」
俺 「……(ていうか、あんた大してソース書いてへんやん)」
俺はそのプロジェクトが終わった後でソッコーで転職したんだが、去年潰れたらしい…(笑)。
639 :
仕様書無しさん:03/03/22 01:33
漏れの出向先では、逆に命名規則が全然無かった。
とあるコードの扱いが変わるということで現行プログラムの
調査をしたところ、変数名が100種類以上出てきて収拾が
つかなくなった。
最悪だったのは意味が異なる2つの項目に対して
・名称a 名称b
・名称b 名称a
・名称a 名称a
・名称b 名称b
と言った具合に、名称が逆転してつけられていたり、同一
の名称がつけられていたこと。プロパーの連中も人によって
まちまちな名称で呼んでいたため、仕様書を読んだり、直接
説明を受けても、どの項目を指し示しているのかが全く分か
らなかったこと。
640 :
仕様書無しさん:03/03/22 01:38
>>632 しつもーん。
等号の演算結果はboolなんですが、それは TRUEと比べなくていいんですか?
if( (a == FALSE) == TRUE ) )
で、その比べた結果はやっぱりboolなので(ry
BOOLの話で思い出した。先日見た、プロジェクト内ライブラリのヘッダ。
ちなみに某UNIX系OS用。
typedef int BOOL;
typedef unsigned long DWORD;
typedef unsigned long HANDLE;
……哀れM$に洗脳された香具師の末路がこれか、とオモタよ……
>>640 a != FALSE ならともかく、a == TRUE はマズイよなぁ…。
あと NULL == hoge() とか書く奴うぜぇ。辞めようとまでは思わんが、
辞めさせたくなる(ワラ。
a == TRUEはまずいが、(a != FALSE) == TRUE はまずくない罠。
>>642 たしかにうぜえ(w
個人的には、trueとか falseとかと比較しているのを見るだけで・・・
何のためのboolなんだと小一時間(ry
∧_∧
( ´;゚;ё;゚;)<これからも僕を殺して下さいね( ´;゚;ё;゚;)。
=〔~∪ ̄ ̄〕
= ◎――◎ デブおた山崎渉
とあるソースのコメント
・例外キタ━━━━━(゚∀゚)━━━━━!!!!!!
・exitしる!
・レコードがなかったら( ゚Д゚)マズー
これを書いたのは中国人(w
>>640 漏れに聞くな漏れに。
>>643 >何のためのboolなんだと小一時間(ry
漏れもそう思ったが、VB出身者に言わせると等号・不等号が
付いてないと分かり辛いらしい。
ここにも魔の手が…と思タYO。
C言語の魔の手だな。
bool型が無かったために
数値型を真偽値型として
扱うことに慣れてしまった。
慣れてしまった奴がいる一方、
TRUEと比較するまともな奴が
いるから禁止したのだろうな。
bool型があってifでbool型しか
使えない言語では激しく無意味。
>>643 VB流れのヤシとかに
#define TRUE -1
されるとやばくないか?
そもそもBOOLとかTRUEとかFALSEとか定義しなくちゃいけない言語がやばい
そもそもifでbool以外が使える言語がヤバイ
そもそもnullと0とfalseが同じ言語が(ry
呼んだ?
・・・つか、論理値が理解できない奴が(ry
∧_∧
( ´∀`)< ぬるぽ
そもそもモレがヤバイ
660 :
仕様書無しさん:03/03/22 04:28
わかったわかった。俺のために喧嘩するな
662 :
仕様書無しさん:03/03/22 05:39
!!a == TRUE …って屁理屈を通してみる。
なんかむりぽ。やっぱり却下。
664 :
仕様書無しさん:03/03/22 06:05
!!a == !!TRUE
!!!!a == !!!!TRUE
なにがなんだか。
TRUE が何かによるので
>>664 のほうがいいような。
いずれにせよ TRUE/FALSE の一方が 0 と非0 である必要があるけど。
>646
basic でも、if a then とか、a = ( c < b ) とか書いてたな、俺。
もうかれこれ15年以上も前のことなんだが。
>>667 小学生の頃,雑誌か何かに if a<>0 を if a と書いた方がメモリ食わないとか速いとか
書いてあるのを見て,すげー,頭いー,と思ったことを思いだしました。昭和50年代前半だか
らだいたい同じ頃ですね。
未だに古いコンパイラに人間があわせている奴がいるのか?
C言語の場合ifって名前おかしいよね。
if_TRUE_or_not_ZERO_or_not_NULLってすべき。
if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
呼び出されないなんて、もうアフォかと。
>>669 いまだに、「こっちの方がちょっと早くなるから」と言って
平気で可読性を落とす奴多いよな。
(少しは5年後、10年後にソース読む第3者のことも
考えてホシー)
昭和50年代前半なら25年ぐらい前だろ
修正
× if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
○ aが0の場合、if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
もしくは
× if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
× 呼び出されないなんて、もうアフォかと。
○ if(a)foo() は日本語にすると もしaならばfooを呼び出す になるのに
○ aが0の場合、呼び出されないなんて、もうアフォかと。
なんか自分勝手な解釈をして勝手に文句つけてる奴がいるな。
古い人間はさっさと消えてね。
ifはJavaやC#のような実装が良いよ。
まぁ、後発が優れているのは当たり前だけどね。
>>673 > ○ aが0の場合、if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
するとaがboolean型で値がfalseの場合は、チミの解釈ではどうなるべきなのかね?
>>676 はぁ? 不等号省略するなって言ってるだろ。
とか言うと不等号沢山書いちゃうお馬鹿さんがいるんだよな。
ANDやORで区切られた範囲内で一つだけね。
まぁifでboolしか使えない言語なら、ifをもし〜が真ならと訳して、
もしaが真ならと言っても良いが、bool以外も使えちゃう言語だと
もし1が真ならとか、もし非nullが真なら、とかになっちゃって
1は1で非nullは非nullに決まってるだろ、同一視するなゴラァ。となるな。
相当な電波だな。
>>678 ゴミレス、煽り、負け惜しみ、捨て台詞。
どれがあなたのレスにふさわしいだろうか?
>>673 > ○ aが0の場合、if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
これはどう解釈してもif(a)foo()はif(a==a)foo()と解釈すべきだという主張だろ?
>>677は日本語にすらなっていない
そうか、春休みだったな
>>680 > これはどう解釈してもif(a)foo()はif(a==a)foo()と解釈すべきだという主張だろ?
どうしてそうなるのですか? それだと常に真になりますね。アフォですか?
>>683 >>673をよーく読んでみな?
aが0の場合、if(a)foo()はif(a==0)foo()になると主張してるわけだろ?
>>685 > これはどう解釈してもif(a)foo()はif(a==a)foo()と解釈すべきだという主張だろ?
> aが0の場合、if(a)foo()はif(a==0)foo()になると主張してるわけだろ?
もう文章が破綻してますよ。起きてますか?
熾烈な電波だな。
おいみんな、勘違いしてないか?
>aが0の場合、if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
この文章で間違ってるのは"日本語にすると"の部分だけだろ。
>>670用の特殊な言語で書かれてるからお前らのような低能には理解できません。
最初のやつ↓が言いたかったのだろ。aなんて変数があるから勘違いするやつが出てくる
if(0)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
Z80 しかやってない上で語るが、CPU命令(マシン語)には元々
0 (又は非0) かどうかを判断してジャンプする命令しか無いわけだから、
設計上は C の if の方が素直であるね。
BASICがどんな処理してるかは知らんが、余計な事してる感が否めない。
フラグレジスタの話など持ち出すのは筋違い。
>690
> if(0)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
何が0なのかねえ。日本語は主語を省略できるんだけど何を省略したのかな?
>691
z, cフラグは1bitだからね。そりゃ当たり前っつえば当たり前。
basicだって余計なことも何もしていないでしょ。真の時、変数の全部のビットが1になるだけで。
お前ら間のレスが読めないのか?
> if(0)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
は
>>673で修正されてるだろ。
まあ673の訳が間違っているわけだが。
あぁ、修正されてる文引用してしまった。
> if(a)foo() は日本語にすると もし0ならばfooを呼び出す になるのに
の間違い。
>>693 > 何が0なのかねえ。日本語は主語を省略できるんだけど何を省略したのかな?
主語は0だろ。抜けてるのは動詞か?
ほら見ろ不等号を省略するからそういうことになる。
>>692 > フラグレジスタの話など持ち出すのは筋違い。
禿げ同。実装レベルの話だな。
Javaのboolはintで実装されていても
言語上は1bitであるかのように扱われる。
>>697 不等号を省略せずに書くと、どうなるんですか?
>>699 (○○が) もしnumberならば(プ
>>697 主語は '式' だと思うけど。
式には不等号や等号が含まれていないと“ほらみろ”なのか?
>>700 当然 0!=0 か !(0==0) でしょ。
こういう場合、普通は FALSE って書くけどね。
数値を直接、単体で書くのはおかしすぎ。
>>703 > 数値を直接、単体で書くのはおかしすぎ。
この発想が変だな
C言語に毒されたジジイが根拠も言わずに反論しています(w
>>704 「おかしすぎ」の根拠は多分ないんだろうね。
歩行器がないと歩けない赤ちゃんの論理だな。
>>707 >歩行器がないと歩けない赤ちゃんの論理だな。
はじめてきいたです。それはどういうたとえですか?
教えてくらはい。
712 :
仕様書無しさん:03/03/22 17:25
694が上司だったら会社辞めたくなる。
部下だったら島流しにしたくなる。
713 :
仕様書無しさん:03/03/22 17:27
このスレには
>>697 はもういないのか?
燃料提供者として適任だと思うんだが。
>>707 くだらねぇ。例えってのは、常々無意味なものだよ。
例え方次第で180度感覚が変わってしまう。
所詮、例え=別物なんだから感覚が一致することは無い。
> 歩行器がないと歩けない赤ちゃんの論理だな。
命綱が無いと綱渡りも出来ない素人
安全装置が無いと宇宙にもいけない宇宙飛行士
715 :
仕様書無しさん:03/03/22 17:35
よくもまぁ、特定の言語の書式だけについてだらだらと
話が続けられるなぁ、、、 COBOLしかやろうとしない
奴らはCOBOLerと蔑まれるが、こういう連中もCOBOLerと
さほど変わらないな。
なんでこんなに荒れてるの?
717 :
仕様書無しさん:03/03/22 18:00
なるほど春になると
>>717のような奴が出てくるわけだ。
>>637 こんなもん、エディタで適当に置換すればよろしい。
当然、その作業時間も工数に含める。」
winなら、文字置き換えのツールはいろいろ在る。
まあ、オレなら無視して作業。「めいめい規則が複雑で分かりません」と馬鹿のフリしてさようなら。だな。
>>699 > (○○が) もし0ならば
日本語分かってないだろ。おまえ。
もし0ならば〜を実行する・・・わけないだろ。
>>722 春だからな。
こういった馬鹿は放置するに限るぞ。
「春だから」とうるさい厨はどうにかならんものか。
>>725 おまえも同類。ったく、こういう奴は一年中、
春だから、夏だから、秋だから、冬だから、って
言ってるし、その間には、まだ春じゃないだろとか
まだ春のがのこってるのかとか言ってるからな。ウゼー
>>726 >
>>725 > おまえも同類。ったく、こういう奴は一年中、
> 春だから、夏だから、秋だから、冬だから、って
> 言ってるし、その間には、まだ春じゃないだろとか
> まだ春のがのこってるのかとか言ってるからな。ウゼー
うわあ・・・可哀相に・・・
728 :
仕様書無しさん:03/03/22 20:45
>>727 つまらん煽りだなぁ。低レベルと言えば良いのか?(苦笑
はい!
みなさん、深呼吸してくださぁ〜い。
なんかネチネチしてますね。
春だからな・・・・
納豆はやりの今日この頃、
ここはネバネバなインターネットですね。
>>736 今、流行りの集団自○ですか?
ここは殺伐としたインターネットですね。
738 :
仕様書無しさん:03/03/22 23:37
集団自慰か・・・
たしかに殺伐としてるな・・・
流行ってるのかよ(w >集団自慰
SEって、集団自慰だよね。”オレって最先端”みたいな。
バーカ。自慰は”ZE”だろ。
うほ、めずらしくスレが伸びてると思ったら
アホのせいで荒れてるだけだぜ…
>>741 荒れてるんじゃなくて盛り上がってるんですよ
おいお前らが2chなんかで油を売ってるうちに
>>670はビジネスジャンプを読破し終えてますよ?
745 :
仕様書無しさん:03/03/23 11:40
>745
>>639は説明が下手か、急いでいたんだな。
つまらん・・・
こんなに荒れてる会社、辞めたい。
−−悲しいとき−−
・5000行のソースファイルに
グローバル変数が20個も使われているのに気がついたとき
・forループの終わりが、
いくらスクロールしても
わからないとき
・Switch Caseが孫入れ子されているとき
・forやwhileループ中のbreak文のところに
/* 次の処理へ抜ける */
というコメントがあるのを見たとき
>>750 −−悲しいとき−−
行間空けすぎじゃハケェ
752 :
仕様書無しさん:03/03/23 16:09
−−悲しき時−−
if文の果てなき入れ子を発見せし時。
我脳内スタックオーバーフローせり。
−−悲しい時−−
アプリケーションエラーとともにエディタが終了したとき。
今日は定時に帰りたかったのにー
>>750 20個か‥‥‥‥‥‥
わりと少ないな。
>>754 だけどforループのカウンタに使うのがグローバルで、その値を
他の関数でも参照しながら処理してたりすると割と悲しくなると思うけど。。。
― ― 悲しき時 ― ―
ソースコードに Programed by Takeshi
と書かれてたのを見つけた瞬間
757 :
仕様書無しさん:03/03/23 18:56
>>750 そんなのCOBOLだったらふつうだよ。
20年くらい前のソースなんかとても見れたもんじゃないよ。
l万行以上のソースでgotoしまくりで、グローバル変数
を複数の目的で共用してたりする。
変数名も意味のある名前が付いていればいいけど、
先頭から○○1、○○2、ってな具合に連番がついているだけ
ってのもあるぞ。これを解析して新しいプログラムに移植しろと
言われた日には・・・
758 :
仕様書無しさん:03/03/23 19:34
#define NULL ぬるぽ
#define ぬるぽ NULL
だろ?
とネタにマジレ(略
>>757 COBOLじゃないから普通じゃないんだろ。
COBOLだったら糞コードしかできないのは当たり前。不幸自慢はやめたまへ。
761 :
仕様書無しさん:03/03/23 22:22
>>760 >COBOLだったら糞コードしかできないのは当たり前。
(゚Д゚)ハァ?
>757
まず仕様書を要求してみれ。
無ければ堂々と断れるなー。
仕様書があったら現状と合っているか確認してみれ。
たいてい合ってないので断れる。
断れないときは解析期間をどかーんと取っとかないと怖いぞ。
えーっとぉ、
グローバル変数が20個使われてぇ
型は全部Variantでぇ
同一プロシージャの中だけでも途中で使用目的が変わっててぇ
別プロシージャでは当然全然違う意味で使われててぇ
それからそれから・・・
aaa.basにて
Dim i as Variant
Variant型・・・いやな予感・・・Dimで宣言しとるし。
bbb.frmのSub CCC前半にて
For i = 0 To
おいおいループカウンタにグローバル変数使用かよおめでてーな
中盤にて
i = rc.Eof
ん?
後半にて
i = rc("社員コード")
待てやゴルァー!!
VB は触ったことないのでサッパリだが、
何やらスゴイことになってるのだけは理解できるな。
>>766 バリアントの型って、なんでもありの変数なのさ
数値でも文字列でもその場の思いつきで代入してもエラーにならない
メモリ余計に食うわ、遅くなるわ、他人が見たら意図がわかりずらくなりやすいわで
これを無意味に使用してる人は動けばいい程度の考えて組んでいるんでしょう
漏れも、今担当してるものを引き継いでもらった時にバリアント多様でかなり面くらいますた
1年以上かかって全て用途に応じた型に直したよ
ところで.NETにもこの型あるの?
引き継いでもらった当時のソース残してあるから、ネタ探しついでに今度見てみるかな
ちとスレ違いになるかと思うんだけど、
バリアントはどういうときに使うとよろしいのでせう?
存在する意味がわからんのだが。
C の void* みたいなモンかなぁ?
>>764 >グローバル変数が20個使われてぇ
VBでグローバル変数20個が何故辞めたくなる原因になるのか
グローバル変数300個とか普通だぞ。
おっと、DQNなPGなら、が抜けていた。
>771
グローバルが全部Variantっつーことがきびしーと思う。
>>771 ×: DQNなPGなら
○: 普通のVBスライムなら
dim a,b,c,d,e,f as integer
とかも、落とし穴だわな
VB6からは、その記述は全部Integerになったのでわ
再び VB 知らずの
>>766 です。
>>775 は
int a, b, c, d, e, f;
と意味が違う……みたいだな(;´Д`)いったいどうなってんだよ
778 :
仕様書無しさん:03/03/26 00:33
a, b, c, d, eはVariant型
fのみInteger型
でもランタイムに対しては意思表示になってないが,
人間にはある程度意思表示になってるのでちょいましという罠
彡 <ならないのでわ
780 :
仕様書無しさん:03/03/26 00:47
押菌>unko!
達悪>unko!
押菌>FAQ U
達悪>U 大!
押菌>∫Ηinё!
達悪>κΙ┗┗ U!
押菌>μηκο!
達悪>μηκο!
>>778 そうなのか…。全部 integer にしたい時は
dim a as integer;
dim b as integer;
....
になるのかな。dim と as があるせいか、ケッタイに感じるな。
dim a as integer, b as integer, ...
でよかったんでは? しばらくVB触ってないんでうろおぼえ。
ひょっとしてこの位は序の口でつか?
void func(boolean b){
if( b == true || b == false ){
...
}else{
...
}
}
常駐先で見た内のプログラムのひとつ、ってか
ほんとーにあなたプロですかと。
つーかただのバグのような。
バグがあるのはそのコードを書いた香具師の脳だが。
つーか、3値論理じゃねーの?
boolean が 3 値を取るとはつつつみだが・・・
>>786 boolean 型が 3 値を取ってるんじゃねーの、このプログラムでは。
void function(boolean b){
if(b == true || b == false){
...
}else{
puts("優柔不断なbさんは嫌い。");
}
}
ってことか。
すまん、
>>775 dim a as integer, b, c, d, e, f
で全部Integerになるんだつた
( ゚д゚)
そういうセコい(?)書き方しなけりゃいいんだよな?
VC++なら、こんなのがありうる。
BOOL b;
// :
// :
if( b == TRUE || b == FALSE ) {
// :
} else {
throw logic_err();
}
>>783 きっと、そのコード書く前日までVC++やってたんだよ。
>>794 VCじゃなくても、Windowsプログラマなら、かな。
改造依頼受けて関連ソース見てたらfreeしてるめもりに
こんなシステムがすでに都道府県の役所で動いてんだから不思議だ
次にソースコンパイルしたら運がよければアプリエラーw
ptbl=NULL;
ptbl=calloc(1,sizeof(TBL));
:
:
if(ptbl_g_ymd!=NULL)
{
free(ptbl_g_ymd);
}
if(g_flg==0)
{
if(ptbl->m_iFlg == 1)
{
strcpy(ptbl->szKai,"改");
}
:
:
日本語しゃべれ
>>783 有名なジョーク。
#define QUESTION(bb) ((bb)||!(bb)) /* hamlet, shakespeare */
そっか、bbはtwo bなのか。
よそから移管されてきたシステムのソース (抜粋)
if( con == null ){
send( "
[email protected]" , "Error" , "xxさん!出社です。xxxxのDBに接続できません。"+m );
}
アフォ
もうだめぽ
>>801 PHP なら $con === null だろう…。
いずれにしても嫌なコードだ…(;´Д`)
PHPにもいろいろあるからな。
804 :
仕様書無しさん:03/03/27 06:33
>>803 産みの母と育ての母が違うとか、実家の父が倒れて家業の温泉宿継がなきゃならなくなったり?
xxさんにもいろいろあるんだな。
>803
PHSは昔、PHPだったな。Personal Handy Phon。
Phon
イーじゃないか
今日の出来事、
ifとforのネストが20ぐらいの関数を見つけ、卒倒しそうになった。
最後の方なんて}}}}}}}}}}}}}}}}}}}が1行に記述されてた。
初めてこんな悲惨なソースみたよ・・・
このスレに書いてあることって皆マジなのか?
((((((;゚Д゚))))))
VBやCにもスーパーカッコがホスイと思ったことはある。
>>809 抜粋したけど、抜粋してない部分は同じような感じですた
サスガに閉じカッコは1行じゃなかったけど。
場当たり的 if の嵐で漏れも卒倒しかけたよ
>>806 Presonal Handyphone System.
816 :
仕様書無しさん:03/03/28 23:20
if文のthenとelseでは短い方を先に来るようにするほうが
elseを長々と探さずにすむ。たとえthenが空文になろうとも
818 :
仕様書無しさん:03/03/28 23:38
俺は例外っぽい処理を先にやる派。<816
819 :
仕様書無しさん:03/03/28 23:45
俺は、入る可能性の高い方を先にやる派。<816
おれは逆アセして効率の良い方にする派。
>>820 ( ´д)ヒソ(´д`)ヒソ(д` )
気分で決める派
神によって決定される派
elseを使わない派
if (expression) {
/****/
}
if (!expression) {
/****/
}
ifも使わない派
void (*func[2])() = { &no, &yes };
func[expression && 1](args...);
expression || hoge();
expression && lala();
仕事放棄する派
正論理(true)を先に持ってくる派
そういえば小渕さん今頃どうしてるだろう派
むしろ村山氏とかまだ生きてるんだろうか派
印象派の俺が最強。
運任せ派。
if (rand() % 2) {
....;
} else {
....;
}
ぬるぽ派
switch派
goto派
if (!expr) goto done;
〜〜
done:
if使ってんじゃねーか!
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >__Λ∩
_/し' //. V`Д´)/ ←
>>836 (_フ彡 /
新思潮派
うんこしない派
美人だけはうんこしない派
美人のうんこを覗いてみたい派
美人のうんこなら食えるんじゃないかなと思ってる派
かめはめ派
工房時代、こういうことする香具師がいました。
if(a == b){
if(a == b && c == d){
〜〜;
}
}
思っていたより良く燃える燃料の 816
実はaもbもグローバルで、他のスレッドから
書き換えられたりしたりなんかして
同期オブジェクト使うし第一アトミックじゃないし
>>846 こんなに萌^H燃えるとは思わなかったyo
852 :
仕様書無しさん:03/03/30 15:44
こんな順次処理見たよ。泣きそう
rtn = 関数_Begintransaction()
rtn = 関数_Execute()
rtn = 関数_Commit()
だからrtnは何なのか?と小一時間。
rtnをツカエヨー!!
>>852 きっとoperator=でものすごい働きを・・・
そういえばどっか(2ch)で、こんなソース観たな
class Exp {
int v,o;
public:
Exp( a ) { o = a; }
operator=( int a ) {
if( ( v = a ) != o )
throw exception();
}
};
void foo() {
Exp rtn(0);
rtn = func1();
rtn = func2();
}
とりあえず、雰囲気こんな感じ。
ファンタジー派
856 :
仕様書無しさん:03/03/30 17:20
FF派
857 :
仕様書無しさん:03/03/30 17:30
>856
タケーシ ハケーン!!
FF と聞くたびにタケーシを思い出してしまうのだが・・・
860 :
仕様書無しさん:03/03/30 21:50
>>852 VBからきた香具師じゃないの?
VBだと関数のように()をつけて呼び出すときは返り値を代入するか
Callを使うかのどちらかにしなければならないから、
そういうコード見たことあるよ。
>>860 こういうことね。
rtn = 関数_Execute() ... ok
Call 関数_Execute() ... ok
関数_Execute ... ok
関数_Execute() ... エラー
>>852 デバッグ用とか?
ステップ実行で結果だけを見るのに便利だとか・・・・
オブジェクト返す関数なら、気持ちはわからんでもない。
>>862 禿堂
デバッグ用に組み込んである処理を後から見て
「カッコワルイ」とか「ダメコード」という奴多いよなあ
>>864 あぁ、ごめん。
可読性云々の前に、何がやりたいのかわからんかった。
>>865 >>852に置ける、rtnってのは、
「コンストラクタで設定した以外の値を代入すると、例外を投げるクラス」
の、インスタンスなんじゃなかろうか。
ってことでつ。
分かりにくい発言でした。
ちゅらさんが終わり次第逝ってきます。
867 :
仕様書無しさん:03/03/30 23:39
えりぃカワイイ
えりぃの尻ちっちゃくてキュッとなっててえぇ形やなぁ
>864
可読性をスルーしますた。
870 :
仕様書無しさん:03/03/31 22:31
>>852 失敗しても
次に逝っちゃうのはマズイ(処理は全部オッケーみたいな)
ってことかと・・・
>>870 意味がさっぱりわからん。
860 が正解だろ。
>>871 意味判るよ。
860は間違いじゃないけど、852が嘆いているのはトランザクションするならしっかりやれ..と言う事じゃないの?
lint対策じゃないかと思ってみた。
(void)printf ("The world!");
みたいに。
ならもとから void 返すようにすればいいじゃん。
どっかから購入したlibという可能性も。
関数_??? などという名前を使った lib など要らん。
877 :
仕様書無しさん:03/04/02 23:33
>>877 いや、たぶんそうだろう。
VBとかだと日本語が使えるしな。
>>876 お客様!
手続_??? などという名前を使った lib はいかがでしょう。
提供されたライブラリ内の関数名が
A001_FUNC2_001
A001_FUNC2_002
A002_FUNC28_001
などのIDだったことがあるよ。
一緒に、IDごとの機能を書いたリストをもらった。
C++なはずなのに
・goto文使いまくり
・例外処理無し
・ほとんどの変数が1文字
・コメント文&ドキュメント限りなくゼロ
>881
んむう。<stdexcept>連中は投げるとき必ず文字列が要るから面倒だし重そうだし、
関数内でけりが付く程度のエラー処理はgotoでやっつけちまったりもしますが……
まぁ、漏れがtry-catchをまだ巧く使えてないってのも理由ではありまつ。
例外処理どころか、ほとんどエラー処理がなかった。鬱だ
ようやく、goto文を追い出した。
てか、普通にwhileとかbreakとかcontinueとかでできるじゃん!
>>881 ・gotoはまったく使わん
・例外処理もまったく使わん(独自のエラー処理の方が明快だから
・変数名(関数名)は長いものだと32byte超える(w
>>884 ぜ ん ぶ デ ス マ が わ る い ん で す 。
>885
良ければ後学のため、「独自のエラー処理」の詳細キボンヌ。
885 = M$社員
独自のエラー処理 = 構造化例外処理
>>887 私独自のものだから他の人には抵抗があると思う
まぁ一応晒す・・・エラー発生しそうな箇所(例外でいえばthrowするところ)に
独自のエラー関数入れてるだけ
if(ptr == NULL)
ErrorM(); // ErrorはErrorFnc(__FILE__, __LINE__, m_hWnd)のマクロで
// ErrorFunc関数でエラー発生したファイルと行をMessageBoxで表示する
みたいな感じに・・・
素直に例外使えと言われそうだけど・・・これでずっとやってきたしね
それと try{} でながながとコードをくくるのに抵抗があるのよ
でもよく考えたらここ個人ではなく会社でのプログラムコードの話だった
鬱だし脳・・・
>>889 > try{} でながながとコードをくくるのに抵抗があるのよ
俺も例外処理自体はif文でエラーチェックよりはましだとおもうのだが、
try{}で1インデントを消費してしまうのはいかがなものかと思う。
だがVBみたいなのもいやだ。
こんな俺ってワガママですか?
>>889 ・・・・・C++歴どれぐらい?
いや、それよりももしかして派遣系であちこちを渡り歩くタイプではなくて
自社にこもったまま外に出ないで何年も、ってタイプ?
めちゃくちゃ”どこにでもある”タイプなんでつが。
それを「独自の」と言っているのって、結構痛いよ
#include <cassert> して ::assert(ptr != NULL) しようよ。
それかログ吐くか。
>891
独自のって、そういう意味じゃないだろ・・・
>>893 「独自」の意味を「オリジナル」ではなく「標準に用意されていない」って解釈したんだよね?
一瞬納得したが、やっぱり違うと思うぞ。
>>889 を見ろ。
>私独自のものだから『他の人には抵抗があると思う』
ただ単に世間を知らないだけかと思われ。
どくじ 1 0 【独自】
(名・形動)[文]ナリ
(1)自分ひとり。単独。
「―に発見する」
(2)他と異なり、そのものだけに見られる・こと(さま)。
「―な考えを展開する」「―な立場」
(3)独りよがりな様(さま)。自分だけの世界での語る事。
「―の意見を言う」「―な思想」
ホントだ。
でもまあ、同レス内で個人のプログラムって書いてあるし。
趣味の日曜プログラマならそんな世間なんて知らなくてもおかしくない・・・かな?
むしろ、その方が書籍やネット、オープンソース等で勉強するだろうし、
社内の馬鹿げた通例がない分一般的なコードになりそうな気もするんだけどなあ。
>>895 一体どこの辞書で調べたのか。
漏れが調べた限りでは、3は存在しないぞ
(4)ぬるぽ。NullPointerException。
「―ぬるぽ」「―ガッ」
>>890 > だがVBみたいなのもいやだ。
Try
〜
Throw New HogeHogeException
〜
Catch ex As FooException
エラー処理
Catch ex As BarException
エラー処理
Catch ex As HogeHogeException
エラー処理
Finally
〜
End Try
こんなの?
>>899 On Error GoTo ... の話だと思うぞ。
VBの定番は関数・サブルーチンの先頭には必ず
ON ERROR RESUME NEXT
を入れる、という凶悪なコード。
903 :
仕様書無しさん:03/04/05 01:23
(σ・∀・)σ gets(buf);
904 :
仕様書無しさん:03/04/05 01:24
//*G
//*L PROGRAM-ID PROG01
//*L PROGRAMMER XXXXX
//*G***********************
//*G int main
//*G 用途: エントリポイント
//*G***********************
//*G エントリポイントの開始
int main( int RRC, char *SYSIN[] )
{
//*L 開始メッセージの表示
printf( "PROG01 STARTED\n" );
・・・・・・
コメントは「//*」
プログラムの先頭に「PROGRAM-ID」と「PROGRAMMER 」
大見出しには「//*G」(グループの事らしい)
小見出しには「//*L」(ラインのことらしい)
main関数の引数は必ず「 int RRC, char *SYSIN[] 」
これ守らないと怒られる
(σ・∀・)σ gets(buf);
>>905 ツッコミどころ違うけど
予約語以外は全て大文字ですか?
>>906 YES!
大文字にしないと「変数と関数の区別が付かない」とかで怒られる。
でもユーザの関数は
int KEISAN_PROC(int ARG)みたいに大文字で宣言しなきゃいけない
凄く理不尽
>>905 うわぁ…この規約考えた香具師、絶対コボラーだな(w
>905
とりあえず手持ちの本から抜粋
>実際には、これら(引用注:mainの引数)の名前は何でもよいのです。しかし、
>プログラムの99.9%で、argcとargvが使用されています。残りの0.1%の
>場合、これらの引数を目にしたプログラマは、悪態をつき、名前を
>argcとargvに書き換えます。
(「C実践プログラミング」オライリー・ジャパン P205 注2 より)
0.1%だそうだが……どうするよ?(w
# あと、javaだったらやっぱりpublic void main(String SYSIN[])なんだろーか
# で、まずとっぱじめに「int RRC = SYSIN.length;」
書き変わってない…
912 :
仕様書無しさん:03/04/05 04:25
>905
あれじゃないか、JavaDocみたいな、コメントからドキュメントを自動生成するみたいなのがあるんじゃないかな。
>905 * から ぷーん とコボルの匂いがしますな
>>914 PROGRAM-IDとかはそうかもだけど、
int main( int RRC, char *SYSIN[] )
はそういう話では説明できないでしょ
RRCはわからんが
SYSINは汎用機でのstdinみたいな意味合いがあるから
やっぱCOBOLerの作った規約だろうな。
>>905 って何だか論理的でスタイリッシュで
かっこいいですよね。
んで、言語は何? これ。
もしかしてこれが伝説言語のコボルですか?
920 :
仕様書無しさん:03/04/05 23:58
>>919 ∩_∩
(*゚ー゚)
ノ |
〜(_,,UU
>大文字にしないと「変数と関数の区別が付かない」
これマジで言ってんの?ギャグかと思ったよ。
ふつー(がついていれば関数で、なければ変数って
暗黙のうちにわかるよな。
>論理的でスタイリッシュ
うっそーん。1960年代の香りがぷんぷん。
ひょっとしてキミはオースティンパワーズ
を見てもスタイリッシュだと思う人?
>921
きっとまだ配列添字参照が[ ]だってこと覚えてないんだよ……
BASICもCOBOLも添字参照は( )だし (COBOLは配列とは言わんか)
最近ネタをネタで返すのが流行ってるの?良く見かけるんだが。
あ、「ネタニマジレス(・∀・)カコワルイ」を釣るためなのか。。
こないだ後輩が焦げ付かせたプロジェクトのフォローに入ったときのこと。
DB仕様を見てびっくり。数値も日付も全部 varchar。
こんなDB設計をした後輩がDQNなのか、
こんな後輩に 1プロジェクト任せる会社がDQNなのか。
>>925 寒すぎるな・・・
要約する時は全てプログラム側で処理するのだろうか?((( ;゚Д゚)))ガクガクブルブル
あ、毎度varchar=>別の型の変換すればDB側で要約できるな。(でもそんなことやってなさそう)
CSVから取り込むユーティリティがvarcharにしか対応してなかったとか
#include <studio.h>
#include <monosugoku.h>
#incldue <ctypo.h>
#insert <tinco.h>
#ifdef TINCO_INSERTED
>>931 ちゃんとincludeがtypoになってる
>>931 /*
∧_∧
( ´∀`)< cたいぽ
*/
タイポがしたいポ。
タイーポ
タイポしちゃうゾ
タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ホ!!
タイ━━━━||Φ|(|´|Д|`|)|Φ||━━━━ポ!!
ヌル━━━━||Φ|(|´|Д|`|)|Φ||━━━━ポ!!
// 混浴露天風呂を見てびっくり。右も左も全部varchan。
ファサァ
∧_∧
( ・∀・) ))
/つ( ̄`ヽO_ノ⌒ヽ
ノ ) \ ))
(__丿\ヽ :: ノ:::: )
丿 ,:' ))
(( (___,,.;:-−''"´``'‐' ←943
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_ノ⌒⌒⌒`〜、_
_/し' //. V//⌒ ノ ヽ) ←943
(_フ彡 ニニニニニニニニ
>>901 On Error Gotoが書いてあって
エラー処理でOn Error Resume NextとかOn Error Gotoが書いてあったなんてコードを食らったことがあるなぁ。
ついでにOn Error Gotoの行き先のラベルの前にExit (Sub|Function)が無いし。
しかも、エラー処理で盛大にエラーを発生させて落ちてるし。
>947
そもそも稼動してたのか?
>>948 当然してない。
まだデスマーチが続いていると思われる…
On Error Gotoの行き先のラベルの真下にEnd Subがあるなんてのもあったしなぁ…
とりあえず、950を踏んでみる。
次スレは16進で行くべきかね?
いっそ256進で":"はどうよ、と提案してみる
>951
それは末尾が「!」のスレでやるべきだろう。(半角スペースでも可)
#include "include\include.h"
...ド#9
ド#(嬰ハ)だから次はレ、だな。
956 :
仕様書無しさん:03/04/09 21:50
人生にGotoとかreturn使ったら?
>>956 漏れの人生はcontinueばかりだ。
あがいてあがいて、振り出しに戻る・・・
Fortranだとcontinueは…
next
>>957 スマートに振り出しに戻れるのはいいことだお。
。・゚・(ノД`)・゚・。ウエエェェン
961 :
仕様書無しさん:03/04/10 08:19
もし、contine使えたらどうするかなぁ…
PGなんて、やってないかも…
俺の人生、メンバがPrivateばっかりです。
たまには他のクラスと連携したいです。
僕のメソッドは、実装されてるけど、使われたことがありません。
祝 多重継承ヽ(´ー`)ノ
呪 多重軽傷
デッドロック
漏れの人生、(void*)0;
俺の人生、ぬる・・・・・・・・・・・・・・・・・・・・おっとっと。
ほ
getParent()したらNULLだった。(-_-)ウツダシノウ
#ifdef foo_h
#error 2重インクルード禁止
#endif
#define foo_h
次スレは?
>>971 死にたくなったというほど邪悪なコードじゃない気がする。
黙って
#ifndef foo_h
#define foo_h 1
…
#endif /* foo_h */
になおしておけ。
ファサァ
∧_∧
( ・∀・) ))
/つ( ̄`ヽO_ノ⌒ヽ
ノ ) \ ))
(__丿\ヽ :: ノ:::: )
丿 ,:' ))
(( (___,,.;:-−''"´``'‐' ←969
( ・∀・) | | ガッ
と ) | |
Y /ノ 人
/ ) < >_ノ⌒⌒⌒`〜、_
_/し' //. V//⌒ ノ ヽ) ←969
(_フ彡 ニニニニニニニニ
叩くついでに建ててみるわ。
とりあえず番号はAでいいかな?
自作AAで殴られるこの快感!
Mキターーーー(・∀・)ーーーーー!
(^^)