goto で 2GET!
どんなに頑張ってもグローバル変数を使う奴は奇形。
じゃぁ、オレ貴兄じゃん?
5 :
デフォルトの名無しさん:2006/06/11(日) 11:35:40
>>1 「禁止」じゃなくて、せめて「専用スレを立ててやってください」ぐらいの表現にしようよ
だいたいパッと見下手糞なコードの100%がグローバル変数が使ってあるんだからしょうがないだろ。
ただ煽りたいだけじゃねーの?
グローバル変数言ってるやつは、
ライブラリで使ってるんだから、グローバル変数使ってるだけで、
へたと決め付けるのはいかがなものかと。
>>8 gotoと同じく使わないのが常識だからな。
最近プログラムを始めたばっかりのボーヤはどうやら知らないらしい。
>>10 gotoはたまに使うよ。
以下は例としてイマイチだけど、「共通のエラー処理を一箇所でやりたい」場合には使える。
int WriteLog(char* Message) {
FILE *LogFile;
LogFile = fopen("result.log", "a");
if (NULL == LogFile) {
goto ERROR_BREAK;
}
if (0 > fprintf(LogFile, "%s\n", Message) {
goto ERROR_BREAK;
}
fclose(LogFile);
return 0;
ERROR_BREAK:
printf("Logging FAILED!\n");
fclose(LogFile);
return 1;
}
12 :
デフォルトの名無しさん:2006/06/11(日) 13:34:36
多重break代わりにもなるよね。
>>11 その構成で1000行とかやられると死ぬ。
行数が短い分にはなにやってもかまわない。
と、俺は思ってる。
ループの中でcontinueとかbreakとか
関数の中でif(!条件)ならreturnとか普通にやっちゃうよ。俺も。
でも、これ、行数が長すぎると駄目。
14 :
11:2006/06/11(日) 13:44:36
>>12 その使い方は(漏れは)あんまりしないけど、アリな希ガス。
>>13 ……goto地獄の経験者か。
さすがに1関数はテキストエディタ1画面分に押さえ込むから
上の書き方はカンベソしてくだちい。
yaccとか lexって goto文使ってなかったっけ?
エラー処理を関数内関数で行うようにして(VCだと関数内クラス内関数、みたいにしないと無理だが)
return(ERROR_BREAK(LogFile));
ってすれば良くない?
>>16 それはファイルオープンどこに書けばいいんだよ。
18 :
11:2006/06/11(日) 13:56:46
>return(ERROR_BREAK(LogFile));
入れ子関数ってGCCの拡張機能だった希ガス。
www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_4.html
。・゚・(ノД`)・゚・。 ほかのコンパイラでも行けるんなら漏れもそうしたいYO!
19 :
デフォルトの名無しさん:2006/06/11(日) 13:58:26
>>13 理由も無く1000行とかなってる時点で
その他がどんなにまともでも下手なコードだし。
>>19 だから、短いんならどんなことしたっていいと思うよ。俺は。
21 :
デフォルトの名無しさん:2006/06/11(日) 14:05:49
ループの中でcontinueとかbreakとか
関数の中でif(!条件)ならreturnとか
がダメなんじゃなくて、
関数が長いのが根本的にダメなんじゃないの?
長い関数内でgoto使うなじゃなくて、
長い関数書くなが正解。
>>21 どうだろうね?
例えば、単純なifのみで長くなるんならそれはそれでいいのかもしれないぞ。
ネストもそんなになくて、ただ、初期設定っぽい処理がだらだら長くなるだけとか。
>>22 それはどこのWinMain()ですか?
まああの辺なら多少長くてもいい気はするけど。
>>23 Win32Apiの関数は全部そんな感じだな。
まともに短く切ってると関数1つにつき1つラッパーを作らないと駄目なぐらいだ。
25 :
デフォルトの名無しさん:2006/06/11(日) 15:52:45
>>15 それは人間が読み書きするコードじゃないから、問題ないよ。
27 :
デフォルトの名無しさん:2006/06/11(日) 16:48:12
関数が長くなるのはCなんて低脳言語いつまでも使ってるから
ほかの言語だってひどい。
どうでもいいけど、
>>10のような処理はGoto文を使わないと書けないんだけど。
お前らどうやってまとめて処理するの?
実務経験のない奴はだまっておいてね。
>29
できるだけ、Cを使わないようにする。
Windowsなら、構造化例外を使う。
>>11 は、NULLを左に置いたり、fclose()に渡したり、いかにも半可通って感じだな。
>>29 gotoの全てが悪いとは言わない。が、
>>25の例が明らかに悪いのはおまえにも分かるだろう?
gotoは例外処理と同じで、使いどころが分かってない奴には使わせないのがいい。
>>25 あれでマンセーされたのが
>>750の不幸だった。
昔の時点で矯正されていたら今頃はもう少しまともだったろうに。
初心者のネタとマジを見抜けないと悲惨だ。
>>29 こういうのは長くなるとやっかいな飛び方をするようになる。
短いときはどう書いてもいいけど・・・って話になるからやっぱり
gotoを使うなってより長い関数を作るなってほうが重要だと思う。
初期化も長くなったときはちゃんと終了用(初期化失敗用)の関数を用意したほうがいいと思う。
つまり
>>16みたいな形にする。
21世紀にもなってまだgoto論争やってんの?
お前ら馬鹿だろw
原理主義ってのはそういうもんです。
中東の現状を見ても分かるでしょ。
goto論争に終わりは無い
グローバル変数、TRUE(FALSE)、最適化等も同様
本物のプログラマはgotoを恐れずに使う。
今更、FORTRAN使いたくねー
1つの関数内でgotoを100個以上乱用してるソースがあって、
その関数からgotoを無くすのに凄まじく時間が掛かった経験がある。
まじで殺意を覚えたよ
コードジェネレータでも使ったんじゃないの?
まさにgoto地獄
>>39 gotoより関数の行数が長いことのほうが駄目じゃね?
gotoを100個以上なら普通は100行以下とは考えないw
無くす作業の必要性がよく分からん。
普通放置するか、新しく書き直すだろう。
ディスアセンブル結果をそのままCに書き下したとか?
>>31 こっちよりはまだマシと思われ
if (LogFile = NULL)
47 :
39:2006/06/11(日) 20:56:38
スタックを大量に使ってて、しかも再帰呼び出しだったんで
スタックオーバーフローする危険があったんで
goto無くして再帰をループに変更する方法しか思いつかなかった。
>>48 素でどこら辺が半可通なのかがよくわからん。
その程度書き間違えるのは頭が可哀想な子だよね、とか?
51 :
39:2006/06/11(日) 21:08:26
わからんかな。すまん、漏れ自身もヘタなのかもしれんw
>>11 「ヘタだなぁ」と思うコードの例か?
おまえの環境は知らんけど、俺の環境では fclose() に NULL を渡した
ときの挙動はドキュメントにない。
あと、fprintf() でエラーチェックしてるくせに、fclose() でエラー
チェックしないのはバグと言われてもしょうがないレベルだと思うぞ。
まあ、stdout にエラーメッセージを表示するなんてことは普通やらん
が仕様ならしょうがないかもな。
昔if (0 == x)か if (x == 0)かで大喧嘩してるところあったな
>>50 左に定数を置くスタイルは昔から是非が議論されてるけど、
そのあたりの議論を把握してないで、そのスタイルを採用して
そうだから「半可通」。
……書き方の方も突っ込みあったのな。
とにかく漏れがアホであることは間違いなかったので済まん。
いや
「頭脳明晰な俺が『fclose() に NULL を渡す経路がある』と
読み間違えるからgotoは使っては駄目なんだ」
と言いたいのでは?
int WriteLog(char* Message) {
FILE *LogFile;
LogFile = fopen("result.log", "a");
if (NULL == LogFile) {
goto ERROR_BREAK1;
}
if (0 > fprintf(LogFile, "%s\n", Message) {
goto ERROR_BREAK2;
}
fclose(LogFile);
return 0;
ERROR_BREAK2:
fclose(LogFile);
ERROR_BREAK1:
printf("Logging FAILED!\n");
return 1;
}
ってかおまい、エラー処理でgoto 使ったことないだろ。
> ERROR_BREAK2:
> ERROR_BREAK1:
こんな意味のない名前をつける奴は「ヘタだなぁ」と思う。
意味はあるだろ。お前の一言がヘタだよ
62 :
デフォルトの名無しさん:2006/06/11(日) 23:37:44
>>59 なんか飛び先が2つになった時点で全然綺麗に見えなくなってきた。
そういうコードになるならわざわざgoto使う意味がわからない。
識別子に連番を使うのは総じて下手
コンパイラの仕事はコンパイラに任せればいいと思うよ。
それは
int WriteLog(char* Message) {
FILE *LogFile;
LogFile = fopen("result.log", "a");
if (NULL == LogFile) {
goto ERROR_BREAK;
}
if (0 > fprintf(LogFile, "%s\n", Message) {
fclose(LogFile);
goto ERROR_BREAK;
}
fclose(LogFile);
return 0;
ERROR_BREAK:
printf("Logging FAILED!\n");
return 1;
}
とどう違う?
下手とか上手だとか、コンパイルしてしまえば、みんな同じだと思うよ。
そういう事を話しているのでは無いのだよ
>>59 飛び先が二つあるのと、fclose(...)が二箇所になってしまってるのが、いまいちだな。
基本は
if(LogFile){
fclose(LogFile);
}
でいいんじゃないか。
70 :
デフォルトの名無しさん:2006/06/11(日) 23:53:55
はじめに
FILE *LogFile = NULL;
にして閉じるときに
if(LogFile)fclose(LogFile);
ってやればいいんだろ?
つーか、それにしたってちょっとつまづくだけで
飛び先2つにしたりアホな改変やるやつがいるってことがわかった。
やっぱりgotoは駄目だな。
pascal使えば?
do {
...
if (エラー判定1) break;
...
if (エラー判定1) break;
...
return;
} while(0);
...
エラー処理
return;
これなら、goto使わずに、エラー処理まで飛ばせるけど、
goto使ったほうがましか。。。
>>70 LogFile の初期化は不要
>やっぱりgotoは駄目だな。
「使うのが難しい」という事と「使うのが駄目」は同じでは無いよw
つか、ブロック抜ける時にはデストラクタ走るのが保証されてるわけで。
>>69 俺もそうするか、もしくは fopen() できなかったら
エラーメッセージ吐いてすぐリターンかな。
多くの場合は、fopen() のエラーと fprintf()/fclose() の
エラーでは、対応方法が違うからメッセージ変えたほうが親
切だし。
>>73 いや、でも、一瞬そうするしかないような錯覚に陥らせるのも事実だし、
初期化の方法が複雑になったときに確かに飛び先を分岐させるとかそういう方向へ
いってしまうことが十分考えられる。
最初に出たgotoの初期化失敗時の記述はたしかに綺麗と言えばそうだったが、
なんの拡張性ももたないコードなのかもしれないとちょっと思った。
>>73 fopenする前にエラー処理に飛ばされる可能性も考えると、
初期化しといた方がいいな。
goto文論争もいいけど、C言語で書かれるとちっとも分かりません。
誰にでも分かるVBにしませんか?
マクロで、TRY...CATCH...FINALLYみたいのを作ってるのを
見たことあるけど、あれもイマイチだしなぁ。
finallyはどうやって実装するんだろうか。returnも置き換えるのかな?
>>74 流れ的にCの話をしているんだと思うが。
C++の話なら迷わず例外を投げるはずだ。
>>80 コンパイラがC++0xに準拠するまで待つw
83 :
73:2006/06/12(月) 00:09:30
>>76 関数自体に拡張性を持たせるべきと思うなら
あの関数自体のインターフェースに文句をつけるべきでは?
>>77 一部で防衛的プログラミングと呼ばれている手法ね。
「ローカル変数も全て初期化すべき」とかいう考え方に似ているねw
凝集度という言葉を知っていますか?
>>83 ええ?
インターフェースが変わると変わっちゃうコードかなぁ?
なんかおかしなこといってねぇ?
今こそ、javaのファイナライザを使うとき!
基本0初期化+最後に0かどうかのチェックで構わないと思うが、
int WriteLog(char* Message) {
/* 2006-06-12 引数チェック追加 */
if(Message == 0){
goto ERROR_BREAK;
}
FILE *LogFile = 0;
LogFile = fopen("result.log", "a");
if (NULL == LogFile) {
ERROR_BREAK;
というようなメンテナンスされると無力なんだよな。
88 :
83:2006/06/12(月) 00:22:16
>>84 おかしな事を言っているつもりは無いけど。
>>76 が「拡張性」って錦の御旗のような言葉を使ったから
少しはぐらかしてみただけだよ。
単にYAGNIって言えば良かった?
>>85 ラベル使ってるのか。同じスコープ内で使ったら見つからないバグとして現れそうだな・・・。
俺もsetjmp使った例外機構モドキ作ったことあるけど、
その上でsetjmpやgotoを使う場合を考えると、どうしても実用化には持ち込めなかった。
91 :
88:2006/06/12(月) 00:28:52
>>90 レス貰ったから礼儀として返答しただけだけど。
他の方のレスが無ければ黙っていますよw
>>85 そうだね。端的に言って流れを飛ばすマクロは利点に比べて副作用が大きすぎるように思う。
>>87 ローカル変数って関数のショッパナで宣言&初期化なるんじゃなかったっけ?
一応「言語に依存する」と言っとく。
ただしスレの流れ的には、C言語が対象のようなので、おまえは当分
ROM っとけと思う。
言語によって関数/ブロックの先頭以外にも書けたり書けなかったりする。
Cでも規格によって書けたり書けなかったりする。
>>93 (古い)C言語ではそう。
最近のコンパイラは平気でC99なコード通したりするけどな。
98 :
デフォルトの名無しさん:2006/06/12(月) 01:24:28
で、一連の論議の結果、
穴の相手ないスクール水着は脱げるのか脱げないのか、どっちになったのだね
言語によって脱げたり脱げなかったりする。
グローバルとgotoはNGワードにしようよ
議論がループして面白くないよ
コールバック関数に追加のデータを渡せない、
コールバック関数を受け取る非メンバ関数。
int hoge( int (CALLBACK*)(void) );
こーいうのがあるとグロー○ル変数を使わざるを得なくなる。
102 :
101:2006/06/12(月) 02:24:32
しまった*が逆だ。
int hoge( int (*CALLBACK)(void) );
foo(){
int ret = 0;
if(!init1()) goto fin1;
if(!init2()) goto fin2;
if(!init3()) goto fin3;
if(exec()) ret = 1;
exit3();
fin1: exit2();
fin2: exit1();
fin3; return ret; }
bar(){
int ret = 0;
if(init1()){
if(init2()){
if(init3()){
if(exec())
ret = 1;
exit3();
}
exit2();
}
exit1();
}
return ret; }
baz(){
if(!init1()) return 0;
if(!init2(){ exit1(); return 0; }
if(!init3()){ exit2(); exit1(); return 0; }
if(!exec()){ exit3(); exit2(); exit1(); return 0; }
exit3(); exit2(); exit1();
return 1; }
グローバル変数もgotoも
インデントはタブにすべき、スペースにすべきいってる奴といっしょ。
てか何年前から同じこと話してるの。
でも、馬鹿は自分の方法が絶対に正しいと信じて疑わないんだよな。
タブ使いたきゃタブ使えばいいし、スペースがよかったらスペース使え。
結論も出たところでグローバル変数以外の話題どうぞ↓
あなたはどのタイプ?
if(a==2){
}
if(a == 2){
}
if (a == 2) {
}
if ( a == 2 ) {
}
if ( 2 == a ) {
}
if (a == 2) {
}
理由は もし A が 2 なら という言葉と順序が同じだから意味わかりやすい。
議論の無限ループを避けるため、単純に空白の場所だけの比較(最後のは除く)として、
>>106と同じ。
・制御文の後の"(”との間は空ける
・関数の関数名と"(”との間は詰める
が対になったコーディング規約に慣れてるため。慣れだけなんだが。
あと、"()”の内側の空白は、条件が長めになったときに冗長なだけで、見やすくもなんともないので
省略する習慣。これまた習慣だけ。
>>107 俺は
if(a == 2){
だな。
別にaと==の間とかも空けなくてもいいと思ってるけどなんか空けてる。
この辺はホントなんとなくなのでどうでもいいっちゃどうでもいい。
ただ、ifと(の間を開けてるコードとかはなんかむかつく。
この辺もなんかむかつくだけなのでどうでもいいっちゃどうでもいい。
別に下手だとは思わないけどな。
つーか好みの差だろwwグローバル変数とかgotoとかよりももっとどうでもいい話だwww
110 :
デフォルトの名無しさん:2006/06/12(月) 10:02:13
class T{
int m_hoge;
public:
int get_hoge(){return m_hoge;}
void set_hoge(int v){m_hoge = v;}
};
いちいちgetとsetを使ってるのは下手糞なコードだと思う。
なんかクラスっぽくないし。
これは、
class T{
int m_hoge;
public:
int Hoge(){return m_hoge;}
void Hoge(int v){m_hoge = v;}
};
こうやるのがオブジェクトとゆうクラスっぽくてカッコいいと思うよね。だけどなぜか
少数派っぽいのよね・・
カッコの内側を空けてるやつなんか、いかにもヘタそう。
お里が知れるっていうか。
>>110 確かに後者の方がスマートだが、C++初心者が見たら「邪道だ」と言いかねない様な気がする。
>>110 動作を関数名にするのはCからの流れというか、
たしかに下のほうがクラスっぽくはあるけどね。
>>111 同一プロジェクト内で統一されてれば文句はないなぁ。
お前らは字面の話しかできんのか
値変更する度にコンストラクタ呼ぶのか?
if((a & 0x0400) == 0x0400){
}
こんなコードを見たことがある
なんだ、このスレは『ぱっと見でヘタだなぁと思うコードを晒すスレ』じゃなくて『ヘタなコードを書く人間が集まるスレ』じゃないか。
おまえもその一人ということだ
>>118 = 改行もできない下手な文章を書く人間
漏れには
「ちょっとだけ新しいことを覚えて分かったつもりの半可通が自分よりへたっぽい香具師を見つけて喜ぶスレ」
に見える
115にはワロタ
>>113 > 同一プロジェクト内で統一されてれば
あえてそんなルールにする意味がわからない。
全部
126 :
113:2006/06/12(月) 11:29:55
>>123 それが好きな人もいるかもしれない。
スペースの空け方は好みの問題でしょ。
ちなみに自分のとこは
if (a == 2) {
}
で統一されてる。
var = sqrt( a * a + b * b );
これって、スペース打つの疲れない?
ifの右にスペースはキモイな
>>101 それは・・・誤り。
その引数を「引数としたいデータのポインタをメンバーとする構造体のポインタ」
とすればグロー○ル変数は使わずに済む。
#自分は決してそんな事はしないけど
>>126 でもまともな書籍のコードとか、世間である程度以上の評価を得てる
プロダクトのコードで、カッコの内側を空けてるスタイルなんて見たこと無いもん。
ネットでいかにも素人くさいやつが書いてるのはたまに見るけど。
カッコの内側を空けるのがすきなやつって、普段どんな本やコードを読み書きしてるか
想像付くよな。
>>130 そういえば、ずっと前に見たことあるなぁ。
>カッコの内側を空けてるスタイルなんて見たこと無い
信じがたいな。その経験でよく偉そうに語れたものだ。
Boostでも検索してみろ
>>130 下手なヤシが括弧の内側を空けなかったからと言って、上手くなるわけでもない。
上手いヤシが括弧の内側を空けたからと言って、下手になるわけでもない。
単に見る人の主観の問題なのに、
プログラミングレベルにこじつける神経が理解できない。
>>110 横道にそれるが、これだとm_hogeをプライベートにしてる意味無くね?
>>134 もともとC++の特性を学ぶ為に作られたコードだから、そこまで考えて書いたコードじゃないんじゃね?
メンバ変数は常にプライベート
これ常識
>>136 (25) public variable
インスタンス変数は,極力publicにせず,妥当なアクセスメソッドを設けること.
理由: オブジェクト指向の標準.クラスの内部状態に勝手にアクセスさせるのはよくない.ただし,以下の条件をすべて満たす場合,インスタンス変数をpublicにし,直接アクセスさせてもよい.
l そのインスタンス変数が他のインスタンス変数と独立であり,単独で変更されても内部の整合性をくずさない.
l どちらにしても,getX()/setX() メソッドを書く.
l インスタンス変数の実装が将来に渡って変更されないことが根拠付けられる.
また,上記に当てはまらない場合でも,極度に速度を気にする場合は,この限りではない.(ただし,慎重にコメントすること)
例: Stackクラスにおいて,itemCount属性をpublicにしてはならないが,Pointクラスにおいてx, yをpublicにしてもいいかもしれない(極端に速度を気にする場合, ex. Java3D の Vector/Point クラス).
正直スペースの入れ方は統一できてない。
if( a==0) とか、if( a+b > 1 ) とか、if (a - b >0)
なんてのが俺のコードには混在している。
でもこの程度の判定文で不統一でも何も困らない。
>>117 ?
複数のフラグ(ビット)が全部TRUEか調べたいときそういうふうに書かいたりしないか?
if( a==0) if (a - b >0)
これは酷い。
ぱっとみ「ヒドイなぁ」と思うスレ
>>141 0x0400 が 0x04A5 に変わっても ((a & x) == x) ってしないの?
即値使ってるのがダメってこと?
よくわからんが
if(!(a ^ 0x04A5))
の方がいいのかな?
#define FLAG_IS_AGE(f,flags) ((f)&(flags)==(flags)
>>144 a = 0x14A5 で false になっちゃうよ。
//----- 平方根を返す
double sroot(double x);
・
・
・
double sroot(double x){
return sqrt(x);
}
これは酷い。
さらにインラインになってなかったら鬱死
>>147 後で自前のとっても速いsqrtに置き換えるつもりだったのでは?
と無理を押して擁護してみる
>>147 自社内で共通関数ライブラリを作る時に
チェックや変換系は全て同じライブラリからの呼び出しにしたい、
でも車輪を再発明するのは嫌だ、
なんて時の苦肉の策、て感じかな。
ととても頑張って擁護してみる。
単純にsqrtという名前が意味不明だからだろ。
srootの方がわかりにくいyo
素朴な疑問で、なんでroot(根)なんだろ
フラクタルだろ。
>>153 なんでだよ。square root (平方根)の略だろうが。
>>143 ただでさえ意味がわからねービットフラグを16進なんかで比較していい気になってるところが
確かに気持ち悪いなぁーって思う。
しかも、複数のビットが立ってることを同時に判定してるとかわけわかんね。
これでわかりやすいコード書いてると思ってたらかなり重症。
>>145-146 えらく使いにくいマクロだなぁ、おい。
if(FLAGS_IS_AGE(a, 0x14A5))){
....
}
ってやるのか? (w
>>159 アフォの煽りにいちいち反応しないで、マスクしとけ。(w
俺はちゃんと
#define IS_ENEMY 0x0001 //敵の攻撃か?
#define IS_BLACK 0x0002 //そいつ黒い?
#define IS_THREE 0x0004 //3連続?
#define IS_PIZZA 0x0008 //ドム?
#define IS_JET_STREAM_ATK (IS_ENEMY | IS_BLACK | IS_THREE | IS_PIZZA)
ってやるべきだと思うね。
え、論点はそこだったの?
>>162 できれば
(a & x) == x
なんて判定もわけわからんから関数かマクロにしたい。
#define IsEqualBit(a, x) ((a & x) == x)
こんなバギーなマクロ組むくらいだったら、そのまま直に書いた方がいいと思われ。
まともな関数書く割には、大して汎用性と可読性の向上にならないと思われ。
つまりは好きにしろといったところだ。
てゆうか、ビットフラグなんてもう辞めるべ。
32、次世代でも64しか拡張性ないし。
マクロの引数を使うことで()で括ってないのは下手だと思う
>>163 それはわけわからなきゃダメでしょ。
数値が何を意味するのかは別の問題。
>>161 ドムから3連続の白い敵の攻撃を受けたって言う判定はどうするのさ?
8バイトぽんぽん使う時代だからこそビットフラグ
コメントに日付がはいっているやつ。
こんなの。
/* 2006-06-12 引数チェック追加 */
>>170 コーディング規約がどうなっていようと俺は片っ端からすべて取ることにしているw
だからどうだってんだよな。
日付なんて入れて後でどうしようってのか意図がわからない。
つか、こういう /* 〜略〜 */ コメント、ウザスギ。
俺がちょっとこの範囲をコメントにしとこうってときに邪魔なんじゃボケ。
これも片っ端から//に変えさせてもらう。
173 :
デフォルトの名無しさん:2006/06/12(月) 23:17:30
>>170 コード以前に、開発体制そのものが下手という例だな。
バージョン管理がなされてない。
バージョン管理ツールが使えない状況で入れたりするけどな
バージョン管理の出番なんてそうそうないけどな。
ふつーに物量多すぎて、ふつーに大変なだけでひたすら組みまくって、終わらないってただそれだけだけどなw
俺はそれしか経験したことないけど。
そういう状況ならなおさらバージョン管理はしっかりやれ。
でないと出口が見えないどころか遠のいていくぞ。
と言っても、まともなマネージャがいないとそういうリソー
スが取れないんだよなぁ…。
現状使われていないコードがコメントアウトされて残ってると鬱になるな。
部分的に古いコーディングスタイルを新しいものに変えたときとか。
そういうものが残っているコードは自分では仕様変更の経緯とか追えない状況になってるし。
日付って検索用のメモ代わりだよ。
>>177 正直、残ってたからなんだ。って感じなんだよね。
それでどうにかしろって言われたところですげー困るし。
無いほうがいいよ。
181 :
デフォルトの名無しさん:2006/06/13(火) 00:03:58
cvs annotate とか svn annotate すればいい。
>>182 擁護するわけじゃないが、 annotate じゃ削除された行については何にも出ないよ。
コメントアウトなんかで無効にして残す場合は適切な、特に
復活させる条件についてのコメントを添えてあれば文句は無い。
>129
どうやればコールバック関数の代わりに
構造体のポインタを渡せるのか教えて欲しい…マヂで。
まさか関数のインターフェースを書き換えるとか?
それなら素直に引数を追加しますよ。
129は意味不明だな。
129はVB使いでしょ
>>184 Win32Apiのコールバックだと引数にvoid*ってあるっしょ?
そこに好きなのいれればいいんじゃね?
俺もそこにthisポインタ入れて便利に使ってるよ。
Win32Apiだと
CreateWindowExのpParamにWM_CREATEメッセージのlParamを渡せるからそこにthisポインタ突っ込んで
そのメッセージを受け取ったところでSetWindowLong、で、別のメッセージのときはGetWindowLongで
とりあえずコールバック関数でthisポインタの取得完了。
>>187 物によって、そのユーザが自由に使えるパラメータが渡せない物もある。
コールバック関数へのポインタのみなら、渡しようがあるまい?
>>187 はぁ?お前101嫁ねーの?Win32APIの話なんかしてねーよ。
>>184はそういう事ができない状況で
どうすればいいのかを聞いてるんだろ
Cってクロージャ使えないの?
使えるわけが無いw>クロージャ
環境依存だがスタックをいじれ
Cがいつできた言語だか分かってる?
>195
LISPってCより新しいんだっけ?
スタックを弄れって意味わかんね
いや、意味はわかるけどどうやるの?
C++ならクロージャもどきは使えるんだがな
まてまて、スタックやクロージャの話を勝手に出しちゃいかん。
129は101を読んだ上で、「引数としたいデータのポインタをメンバーとする構造体のポインタ」を
渡せると言っている。きっと、正攻法な素晴らしい方法があるに違いない。
固定長のバッファに長い文字列を・・・
129待ちか。
まぁこれは逃亡するしか無いだろうから、もう答えは期待できないな。
わかった!こうだ!
typedef int (*CB)(void);
typedef struct{
CB f;
void* arg;
}CB_ARG;
CB_ARG cb={foo,arg};
hoge( (int (*)(void))&cb );
引数を渡すまではできたので、
誰かコールバック内で引数を取り出してください
Cでクロージャを使うのは一苦労じゃのう。
環境依存のコードはダメだよ
207 :
デフォルトの名無しさん:2006/06/13(火) 07:08:55
>>188 あるっけ?
いまのところLPVOIDもセットで渡せる奴しかみたことないけど?
コーディングの話ではないが、ソースからの生成物(バイナリ、オブジェクトコード)を
バージョン管理にチェックインする人は「やれやれ」って思う。
Cの場合は関数を生成して渡すしかないな。
処理系依存になる(そもそもセキュアな環境では無理かもしれない)
けどしかたない。
>>196 LISP より古い高級言語って FORTRAN、ALGOL と COBOL ぐらいしかないよ。
>>209 え?俺はするけど?
そうしないとたとえばクライアントからのクレームや問い合わせがあったときに、いちいち
開発環境をセットアップしてビルドしなきゃならないじゃん。
ビルドスクリプト流せばいいじゃん。
>>212 その目的には、クライアントに納品したのと同じパッケージ(メディアなりアーカイブファイルなり)を
保存しておかないのか?
面倒なのはビルドのほうじゃなくてセットアップのほう。
>>215 つまり、OSやコンパイラもチェックインするということか?
そこまでするのなら、HDD丸ごとバックアップ取るけど。
>>214 もちろんするよ。
それとバージョン管理にバイナリ入れるのは、テスト機に同一バイナリを配布するのがらくだから。
また、テスト機で過去のバージョンのバイナリを簡単に取り出せるから。
あーもうまんどくせ。
1〜2週間サイクルで何度もリリースを繰り返したりする場合、バイナリがリポジトリに
入ってたほうが何かと楽なんだよ。
そうじゃない奴にどう説明しても無駄だからもうレスしない。じゃ。
ええっ?ビルド済みのバイナリ入れてないと、パッケージングする奴が困るじゃん。
1〜2週間サイクルで何度もリリースを繰り返すような時に、
いちいち開発環境を作り直すというのがわかんね。
わかんないならレスしなくていいから。
完膚なきまでに屈服させないと気がすまないのか?
つか、多数のチームで開発してるときは、バイナリ入ってないと困るでしょ。
いちいち他のチームのライブラリとかビルドしてるのか?
各社、各チームの開発環境やポリシーが違うんだから、上っ面だけであーだこーだやっても無益だな。
てか、つまんね。
>>209 やれやれと思うんなら、こんなところで愚痴らずにチェックインした人間に文句家。
構成管理の標準化もしてないのに愚痴られてもねぇ。
>>219 でも、もうそんなパッケージは更新しないわけでやっぱりなんかガラクタが残った感があるな。
つーか、デカイ。でかすぎ。
並のでかさじゃない。
何も考えずに丸ごととってきたら俺の会社のPC死亡確定だなw
なにせヤバイ、HDDの容量がヤバイ。
このプロジェクトだけだって30GBは超えてるのに、前のバージョンまでとってくるなんてヤバイw
CVSのようなバイナリ差分をとらないシステムだと丸ごとのコピーが溜まっていくからなー。
バイナリをダウンロードするのに余計に掛かる時間でビルドできるだろ!と思ってしまうが、
チェックアウトするメンバー全員がビルド環境を持ってるわけではない&デイリービルドしてない
ところではもはや常識ではないのだな。
なんか日本語の不自由な方がいらっしゃいますが
C++ならobjファイルとかはいらねぇよな。
exeだけつけときゃいいような希ガス。
libとdllは混乱の具合が半端じゃねぇし、使うべきじゃねぇとは思うけど、
実際あると一番困るのがこれのバージョン管理なんだよな。
日本語って難しいよな。
世界で一番難しい言語らしいぞ。
>>230 普通は、最終的な生成物だけを含めるものだよね。
別にバイナリ入れてもいいじゃん。
何が気に入らないの?反論してる人たち。
成果物を構成管理に含めない人たちがいることがわかりました。
そうじゃなくてさあ、VCでコンパイルするとできるDebugとかのディレクトリの中身を
毎回そのまんまコミットする奴がいるのよ。
>>235 拡張子でrejectしろ。出来ない構成管理ツールなら捨てろ。もうこの話やめろ。
もっと高度な話をしてくれよ。
ぐだぐだホイホイスレですから
俺は不毛な議論が好きなんだよ!
GOTOとかコードの見た目の議論とか!
えっとじゃあ、ハンガリアン記法使ってるだけで「ヘタだなぁ」と思う
ああ、ちゃんと型が管理できる言語使うべきだよな。
242 :
デフォルトの名無しさん:2006/06/14(水) 06:44:03
>>236 なんでそんなにこの話したくないの?
話されるとまずいの?
別に君のしたい話してるわけじゃないし、嫌ならスルーすればいいじゃない。
やめろってどういうことだよ。
スレタイ10000000000万回嫁
244 :
デフォルトの名無しさん:2006/06/14(水) 07:02:13
>>243 スレタイなんてあくまで話のきっかけにテーマがあればいいって程度だろ?
話題があるならそれでいいじゃん。
たかだか2ちゃんのスレで何を形成しようとしてるの?
メタ議論がしたかったら自治スレ逝け
246 :
デフォルトの名無しさん:2006/06/14(水) 07:04:01
>>244 それが2chで唯一のルール。でないと議論が分散するだろ?
おまいとおれらのためのルールなんだよ。わかってくれ。
248 :
デフォルトの名無しさん:2006/06/14(水) 07:30:19
>>247 はぁ?だから勝手にルール作るなよ。
どこに書いてあんだよ。
ソースもってこい。
ついでに死ね。
他人の愚行には厳しいくせに自分の愚行には甘々な困ったチャンの暴れるスレですね
相手にした奴の負け
251 :
デフォルトの名無しさん:2006/06/14(水) 09:18:17
そろそろネタ切れ?
>>242 君の使ってる構成管理ツールは、拡張子ではじくことが出来るの?出来ないの?
ゴミを入れる初心者に文句言えるの?言えないの?
うちはビルドしてテストが完了したモジュールもcvsに入れるよ。もちろん中間生成物は
入れないけど。理由は面倒くさいので説明しないけど。
スレタイ10000000000億万回嫁
開発用のリポジトリで生成物も管理するのはなぁ。
うちじゃ別に管理しているよ。
構成管理がダメ⇔ヘタなコード
だからいいんじゃないのか
たしかにゴミを入れるような開発メンバーがいるようじゃ駄目駄目だな
無駄にコメントが多いソース
リビジョン管理しているのに、ソース内に要らなくなったロジックがコメントとして保存されているソース。
しかも、説明もなしに例えば閉じ括弧だけとか。
削除してコミット
int
main(argc,argv)
int argc;
char **argv:
{
return 255;
}
いまどきK&Rで書くなっつーことじゃね?
そろそろK&R1st記法よりもANSIになってからの歴史の方が長いような
気がするのだが、実のところどっち?
正直K&R1stに固執する連中を理解できん。
K&Rって何?
>>268 K&Rを知らない世代がいるとは・・・
The C programming language(プログラミング言語C)という本のこと。
著者2人の頭文字をとってK&R
まだ初心者なんですが、
例えばSetTimer使うアプリで前回のデータとデータ比較するとき
グローバル変数使わないとできなくないですか?
プロシージャの引数増やせるなら使わないでもいいんですが…。
>>270 スレ違い
ついでにグローバル変数使わなくてもできるよ
こいつらのコード晒したらかなりヘタっぽいだろうな。
目の付け所がおかしいもん。
と、自分のことを棚に上げて物を言う
>>272でしたとさ
>>270 hWndに構造体へのポインタでも仕込んどけば?
えええええ?
return -1;
じゃないかと邪推
return -1とか書く奴は氏んでいいよ
低レベルな煽りをする厨房はVIPにでも行ってろカス
お前もな
return 1にして欲しいところではあるな
return "時よ戻れ!!";
ERRORLEVEL っていつから 255 以上戻せるようになったん?
ERRORLEVELって何?
>>270 そんなことは無い。とだけいっておく。
後は自分で勉強しろ。
>>282 Win32なら普通に32bitで戻せる。
>>270 SetTimerを知らんのだけど引数がintでポインタにキャスト可能な環境なら
構造体のポインタ突っ込めば任意の情報を渡せる。
>>270 変数 static にすればグローバルにせんでもいいんでない?
ぱっと見て「アホだなぁ」と思うレス
SetTimer自体は1回しか呼び出されない。
1度セットするとn_秒に1回プロシージャにタイマーメッセージを投げる。
なんだかなぁ。自分勝手な解釈でナナメ上のコメント付けて、どんどん話をずらしていく奴が最近多いなぁ。
, -‐−-、 ヽ∧∧∧ // |
. /////_ハ ヽ< 釣れた!> ハ
レ//j け ,fjlリ / ∨∨V ヽ h. ゚l;
ハイイト、"ヮノハ // |::: j 。
>>291 /⌒ヽヾ'リ、 // ヾ、≦ '
. { j`ー' ハ // ヽ∧∧∧∧∧∧∨/
k〜'l レヘ. ,r'ス < 初めてなのに >
| ヽ \ ト、 ヽ-kヾソ < 釣れちゃった!>
. l \ `ー‐ゝ-〈/´ / ∨∨∨∨∨∨ヽ
l `ー-、___ノ
ハ ´ ̄` 〈/‐-、
>>292 2ch初心者?そういうのはマ板でやってよ。
ム板でAA使うと見事に浮くな。
>>285 戻せるけど、俺は0〜255を戻すようにしてる。他社製のアプリケーションと連携取ったり
するときに、相手側が0〜255までしか対応してなかったことがあったりしたので。
つ機械語使って関数の動的生成
297 :
296:2006/06/15(木) 01:41:03
ミス
>>295 ERRORLEVELは今でも255までだよ。
main()からは256以上でも戻せるけど。
その流れ読まないレスはわざとなの?
>>286 確かにunsigned intのTimerIDというものが渡せて、
イベント発生毎にTimerIDが渡ってくるので現状はそれで実現はできるが、
64bitCPUに変わったらどうなるか知らん。ってそんなとこまで考えんでもいいか。
そんな引数弄くるなんてめちゃくちゃな方法でいいのかよw
staticに逃げるのも間違ってるだろ。
できる。といいつつ、
でもやり方は自分で調べろ。
〜というのがここまでの流れ〜
やれば、できる。
引数の本来の意味や型が失われて
余計分かりにくいコードになるんじゃないの?
それ自体が不具合だ。
ああ、いいこと思いついた
グローバル変数使えばいいんじゃね?^^;
>>306 そんなもん、入り口ですぐに本来の型にキャストしておけばいいじゃん。
そう言った割り切りは時に必要だぞ。
#それとも、qsort()/bsearch()の比較関数さえ否定する?
スタティックでいいだろ
>>300 SetTimer()に関して言えば、TimerIDにデータを突っ込むのは間違い。
タイマの種類を識別するIDに、ポインタ突っ込んでどうするよ?
柔軟な発想ができんもんかね
WMならともかく固有のコールバック関数呼ぶなら混乱はしないだろ。
やったことねーけど
タイマIDは0以外で他と重複しなければ何でもいい。
つまりポインタでもおk
>まだ初心者なんですが
と断っておけばスレ違いではない、とでも
思ってるか知らんが、何で君らそういう間抜けに
付き合ってんの?
いい加減、脊髄反射的に擬似反論レスする奴の相手やめようぜ。
>>309とか
>>311とかな。こいつぜってーSetTimerなんて知らないぜ。
こんなゴミレスであっても一人の初心者が一つの知識を身につけられたのだとしたらこれに勝る喜びはない。
314 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 17:11:13
>まだ初心者なんですが
と断っておけばスレ違いではない、とでも
思ってるか知らんが、何で君らそういう間抜けに
付き合ってんの?
315 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 18:05:02
いい加減、脊髄反射的に擬似反論レスする奴の相手やめようぜ。
>>309とか
>>311とかな。こいつぜってーSetTimerなんて知らないぜ。
316 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 18:06:12
>>315おまえもな
317 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 18:10:35
>>310>>312こいつらも知らないくせにレスしてるからな。
318 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 18:10:39
こんなゴミレスであっても一人の初心者が一つの知識を身につけられたのだとしたらこれに勝る喜びはない。
319 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 18:13:11
>>315 俺はもともと相手してないけど。
>>317 だな。技術スレ以外のノイズ高すぎだなw
モチケツ
314 名前:デフォルトの名無しさん[sage] 投稿日:2006/06/15(木) 17:11:13
>まだ初心者なんですが
と断っておけばスレ違いではない、とでも
思ってるか知らんが、何で君らそういう間抜けに
付き合ってんの?
といいつつ自分もつられていることにすら気づかない
大間抜けの
>>314であった
325 :
デフォルトの名無しさん:2006/06/15(木) 21:37:01
岩尾がブサイクだ、山田花子がブサイクだって言ってるところに、ビューティーコロシアムの
出場者を連れてこられても困ります。
そこでBCCテクニシャンの登場ですよ
TimerIDにポインタ突っ込むとか、SetPropその他の手段は、
使って良いものか時々悩む。
プロジェクトの初期段階でフレームワーク構築してる時とか。
ちょっと見ない間に随分スレが伸びたな、おい。
public double getValue(int i, int j) {
return i == j ? 1.0 : 0.0;
}
このコードは駄目だとJAVA WORLD様はおっしゃったとさ。
staticのどこが悪いのか解説希望
>>331 Java よく知らんからそれが正しいかどうかは別にして
(i == j) ? 1.0 : 0.0;
i == (j ? 1.0 : 0.0);
のどっちかわかり (* にくい *) から、() つけたほうがいいと思う。
>>332 Recursive, Reentrant
>>332 それだけ聞かれても困るが。
グローバル変数のstatic化は寧ろ歓迎すべきだし、
関数のstatic化もスコープ限定と言う意味で同様だし、
自動変数の場合にのみ状況を弁えて使わなければならないけどね。
この話の流れで、static と聞いて誰も聞いてないスコープの知識を
披露できる君はすごいね。(w
知識? 常識の間違いじゃないのか?
また半角ハテナ君か
常識だよ
getValue(int i, int j) という名前から
return i == j ? 1.0 : 0.0;
を予測するのは難しいということだろ。
はいはい、ワロスワロス
そうだよね。
1バイト文字だよね。
329と330の間がステキ
>>333 三項演算子の優先順位は元々低いからたぶんその意見は違う。
私は()付ける派ですけど、付けない人はごろごろいるはず。
>>340 おそらくそれが正解なのだろうけど、
クラスの設計によってはそれでOKという可能性はある。
仮にもOOなのだから、
ソースの極一部だけ切り取ってこれはだめと言われてもちょっと困るかな。
>>345 > ソースの極一部だけ切り取ってこれはだめと言われてもちょっと困るかな。
やっと正解らしきものが出たな。
完全ないちメソッドであるにもかかわらず、なにをするメソッドなのかさっぱり分からない。
わかりやすいメソッド名、仮引数名をつけましょう、というのがJAVA WORLD様の主張。
さらには「プロなら三項演算子など使わず、if文を使って見やすいコードを書く」という
驚愕の主張もなさっているが。
例えば、
Gui.Control.ToggleButton.State.Set(state ? 1 : 0);
なんてコードもif文使った方が見やすくなると信じているのだろうか。
if (state) {
Gui.Control.ToggleButton.State.Set(1);
} else {
Gui.Control.ToggleButton.State.Set(0);
}
と書いても
int iState;
if (state) {
iState = 1;
} else {
iState = 0;
}
Gui.Control.ToggleButton.State.Set(iState);
と書いても三項演算子より見やすいとは思えないのだが。
だから驚愕しているわけで。
自分にはintにfloat定数を代入しているほうが
下手だなと思ってしまう
ヒント:頭のおかしい人にはかかわらないようにしましょう
>>347 俺は
int iState;
if (state) {
iState = 1;
} else {
iState = 0;
}
Gui.Control.ToggleButton.State.Set(iState);
こっち↑派。(即値やめるかコメント付けるかするけど)
三項演算子はなんか嫌い。
たまに自分でもどっちがどっちだかわからなくなる。
int iState = (state != 0) ? 1 : 0;
Gui.Control.ToggleButton.State.Set(iState);
それはさすがに下手だと思う
>>355 三項演算子を使うという立場なら、
>>347のコードの方がシンプルだしわかりやすい。
また、stateの値をなにか別の概念の値に変換してセットするならともかく、同じ概念のものを経由
しているところが冗長。
三項演算子を使わないというポリシーなら
>>351でいいと思うが?
int iState = state ? 1 : 0;
Gui.Control.ToggleButton.State.Set(iState);
ならいいのかな?
>>357 良し悪しをいってるわけじゃなくて下手だと思うかどうかであって、そのコードは
>>356と
全く同じ理由で下手だと思う。
Gui.Control.ToggleButton.State.Set(state != 0);
それでコンパイルできるんなら、それでいいんじゃね?
三項演算子もgotoも現実問題なくても何とかなるし
嫌いな奴は意味不明なほど毛嫌いしていて
メリットがあっても絶対に使わない。
脳みそがご老体なんだろ。
ほらよくいるじゃん、〜は〜であるべきと他人に説教する石頭の頑固じじいとか。
よくはいねーよ。
どんな環境で生活してんだよw
JAVA WORLD様は糞雑誌に認定されますた
public class MyFooBar extends AbstractFooBar {
public void getInfo(HttpResponse response) {
super.setInfo(response);
}
}
AbstractFooBar#setInfo() は、AbstractFooBar が持ってる情報を
responseに格納する処理。
responseにセットするという意味で、setInfo と名づけたんだろうな。
MyFooBar を書いた人は、AbstractFooBar から情報を得るという意味で
getInfo と名前を変えたんだろうな。
なんか、こう、うーん、設計からして間違ってるような。。。
Javaのデバッガは、行内のどの位置で問題が起きたか分かるの?
漏れはVCしか使った事ない若造だけど、三項演算子は
デバッガでトレースするのがめんどいので避ける。
>>366 素朴な疑問なんだが、>347のような三項演算子の使い方でもデバッガでトレースするの?
>367
しますが何か。
C++だとマクロや演算子オーバーロードとか
見た目じゃ判断つかないものがあるし。
もちろんじっくり読めば、どんな書き方でも分かりますが、
仕事では書く回数より、読まねばならない回数の方が多いわけで…
書く手間を惜しむよりは、読む・追う手間を優先してます。
>347の例だったら、どうしても短くまとめたいなら、
Gui.Control.ToggleButton.State.Set( isNotZero(state) );
みたいにマクロかインライン関数で置換してやれば良いと思ったけど…
Javaには無かったっけ。
あるよ
>>365 なんかこう、下手というものとは違った、また独特な雰囲気が・・・
三項演算子の話が出ているけど、
これは変な書き方をするとひどく汚いソースコードになってしまうので、
そうなってしまうくらいなら利用を全面的に控えさせた方がいいというだけです。
上手い奴はちゃんとうまく書く。
下手な奴は銃殺刑モノ。
低レベルな煽り厨が常駐してる件
自己スレ乙
常駐乙www
rubyのif とか、 Haskellのif とか、 Lispのifなんかも否定するのかなあ?
三項演算子よりも、無意味に一時変数を使う方がよっぽど下手だろう。
特に
>>351とか初期化と代入がわかれてるのとか。
下手なのと自分が普段使わないからって否定してるのとを混同してるヤツがいるな
可視性が悪くとも速度を求めるとこならコードを圧縮するし、
人的エラーを回避するためならあまり見かけない書き方をすることだってある。
部分的なソースだけみて判断することなどできない。
ただ、Microsoftのサンプルは糞だが
>>380 下手なのと自分が普段使わないからって否定してるのとを混同してるヤツだな
Microsoftのサンプルはたまにコンパイル通らなかったりするな
日本人的視点で糞とか言われるMicrosoftカワイソスw
____
__,,/ _, ----`ヽ :.
:. / _ ___ 、\
/ / i \ \\ :.
:. ,'./ i ヽ:. ヽ:.:.. ヽ.ヽ
,'/ / .ハ ヽ ヽ:.:.:.:. ヽ::.. ヽヽ :.
:. |i .i i .i / ヽ ト 、 \、:.:.:. ',:.',:.:.lヽ}
|i .i l :N_, -弋 \弌弋ナ:}:.:}
:. |i∧ ', :{ ,ィjモト \ イjミトイイV :. な…
.| :メヽ.', `ozZ} izN。ハ::{ なんなんですか?
:. | :ヾ_! ゝ "゙゙ ' `゙ ハ.:', :. ここ、どこですか?
| :.:_イ .:.ヽ. (二フ , イ :.:.:!:.ヽ なんであなたたち
:. / rィイ | :.:.ヽ: >r/`<ノ .:.::.}ヽ、\:. 喧嘩してるんですか?
/ ∧l;l ! :.:.:.://{二 ̄ .} ..:..::リ//ハ.:\
:. / .{. ',ヾ、ヽi .:.:.{ /(^` |.:.:.:.//: : :.}: . ヽ.:.
/ / ) ヽ ヾ、ヽ:.ハ ヤ{ ∧/.-‐'": : |:.:. i ',
./ .,イ .:..} : :\ヾレ'ハ ∧__ノノハヾ、 : : : l:.:.: .ハ ',
{ /| .:.:ハ : : :i Y {ヾ`Yヽニン'ノ}: : } : : : :/:.:.:/ }:.}
V | .:.:/:.:|_,ィ' ̄ ヽ三{ `ー-ノ : イ : : :/:.:i.:{ リ
ヽ:.:{、.:.V : : ヘ : : {: : :/:.::∧|
ヽ! )人 : : :人 : : : / \! :.
" ヽ : : : : :/イ{ :.ノ: : : :.\ :.
:. \__///: :\______/: : : : : : : ヽ
/ //: : :|;|: : : : : : i: : : __: : : : ',
:. / 、 {;{ |;| . : i/. : : : : : :|
/ `Y;{. . . .|;|. : : : /i: : : : : : : : :l
>>380 マァマァ
ここって"if (0 == fp)"とかで盛り上がるスレですから。
>>380 >可視性が悪くとも速度を求めるとこならコードを圧縮するし、
icc使い倒してみてから同じ台詞を言ってくれ。
最早、生半可の知識で人間が工夫しても、コンパイラに勝てない時代なのかもしれないよ。
世の中はインテル以外のCPUがあるんだよ
PC向けというか、x86以外だと全然アプローチが違う。
速度を求めるなら、処理手順を見直したり、アルゴリズムを見直したり、インライン展開をしたりする。
390 :
372:2006/06/19(月) 23:23:41
>>373は俺に何を言おうとしているのかね?
全般的に変な奴がこのスレにいるなぁと思う次第。
>>380-
小手先の技術でほんの少しスピードが速くなったからと言って、
それはコンピュータの速度向上の所為であっという間に見えなくなってしまう。
だからこそ、現在のプログラミングは見通しのよい、
誰にでも分かるものが要求されている。
速度向上で大事なのは
>>389のような
>処理手順を見直したり、アルゴリズムを見直したり
という大局観。
プログラマなんだから計算量理論くらい習っているんでしょ?
小手先で何かやったからってそれが意味がないことにそろそろ気づくべき。
化石プログラマと呼ばれちゃいます。
>>391 だがしかし、ふつー、それを「コードを圧縮する」とは表現せんわな。
393 :
390:2006/06/19(月) 23:49:49
>>391 それならいいんだけど、文面からはとてもそう読めない(w
コードを圧縮って言われてもなぁ。
「標準ライブラリで用意されているような物を長々と書くな!ライブラリを使え!」
の意味なら分からなくもない。
396 :
390:2006/06/19(月) 23:55:31
16秒差(w
コードを圧縮して速くなると聞いて、すぐに思い浮かぶのが初期のBASICである俺は、立派なオヤジ
398 :
391:2006/06/20(火) 00:00:20
他人の表現なんだから多少違和感があって当然だし。
ある程度は好意的に受け取ってもいいんじゃまいか?と思った。
まぁここは2chだし、そうもいかないんだろうけど。
だがしかし、ふつー、それを「コードを圧縮する」とは表現せんわな。
>>380 は「可読性が悪くとも」と書いてるから、アルゴリズムなんかより
ある意味小手先のテクを言ってるんだと思う。
どうでもいい事をグダグダと・・・
>>390 昨今の計算機では速度はほとんど問題にならないのはその通り。
だからこそ、速度が必要な個所では徹底的に速度が要求されるわけで、
小手先の技術使ってでも速くする必要があるわけだが。
ふむふむ。
つまり糞重いゲーム3重起動してる中でツール5種類使ってるとか。
そのような場面を想定した場合、6種類目のツールは少しでも速い必要があるな。
プログラマだけど計算量理論習ってないよ…(´・ω・`)
いやだから、昨今のコンパイラの最適化の能力向上で、小手先の最適化は却って遅くなることがあるんだってば。
きちんとプロファイルを取って分析する能力が求められる時代になってきたと思うよ。
#典型的な例
for (int iy = 0; iy < height / 2; ++iy) {
for (int ix = 0; ix < width / 2; ++ix) {
array[ix + iy * width] = array[ix * 2 + iy * 2 * width];
}
}
これを
int xEnd = width / 2;
int yEnd = height / 2;
for (int iy = 0; iy < yEnd; ++iy) {
int oy = iy * width;
for (int ix = 0; ix < xEnd; ++ix) {
int od = ix + oy;
int os = ix * 2 + oy * 2;
array[od] = array[os];
}
}
こう書いたところでコンパイラによっては同程度のコードを吐く。
下手だなぁw
>きちんとプロファイルを取って分析する能力が求められる時代になってきたと思うよ。
これは時代とかじゃなくて当たり前の事です
if文と三項演算子の話から、最適化の話に持ってけるとは
素晴らしいセンスの持ち主がおるな。
>>405 おれも習ってないよ「計算量理論」
それってプログラムに必要なの?
難しく考えるな、O(n)の話だ。
知ってるよな?
>>406 その手のコードならGPU使うのが定石かな。
どの機器にもGPUが搭載されていると思っているヤツがいるスレはココですか?
c = read();
if (c > -1) {
append(c);
c = read();
while (c > -1) {
append(FOO);
append(c);
c = read();
}
}
418 :
デフォルトの名無しさん:2006/06/20(火) 17:28:55
ぶっちゃけ
>>406はどっちがいいの?
俺ならループの外でxEndとyEndを書いてる分
下の方がいいのかなあ、と思う反面、oy,od,osってのは
わざわざ別にしなくてもいんじゃねの?とも思うんだけど。
良いも悪いも出力されるアセンブラコード次第だろ。
ボトルネックにもなってないのに常に後者の書き方してたらアフォ。
文句は言うけど答えが出せない人って
見てて恥ずかしいよねw
>>418 後者のコードもinner loopに不要な式があったりしてどうかと思う。
あれを最適化してもらう目論見なら、前者で十分。
ところで画像処理とか音声処理とかやってると、ちょろちょろっと配列を操作する
コードが結構いろいろなところに出てくるので、最初のうちにアレコレ調べて初めから最適な
コード(SSEとかも使う)を書いたほうが、何も考慮しないで後でプロファイラ使うより結局は楽なことが多いよ。
ボトルネックの解消なんか繰り返してると結局全面的に書き直す羽目になったりする。
>>421 >ボトルネックの〜なったりする。
後からボトルネックの〜なったりする。
ですた。ごめんなさい。
>421
>最初のうちにアレコレ調べて初めから最適なコード(SSEとかも使う)を書いたほうが
それなら、アセンブラ使った方が良いと思うが…
わざわざC/C++とかで書くのは、英語が分かるのに
日本語で書いて機械語翻訳で英文作るのと同じくらい
ナンセンス。
っインラインアセンブラ
脱線だが:
>423
「英語が分かる」の程度によっては長文を早く書けるので便利。
ソース修正して実行させてまた修正してを繰り返すのと同じく、
日本語修正して繰り返し試行できるしね。
自分が知ってて読めるけど作文では思いつかない単語や構文も使ってくれるし。
また、対訳形式になってる翻訳ソフトだと日本語との整合性を保ったまま
英語と日本語の両方の文書が一度に書けてオトク。
>>423 普通アセンブラとC/C++組み合わせるんじゃないの?
全部アセンブラなプロジェクトはほとんど無いだろ。
そりゃ、適材適所だよな。
アセンブラでのコードを書くほど高速化が必要じゃない部分を、
わざわざアセンブラで書く人は趣味でやってる人ぐらいでしょ。
>>427 だけじゃないよ。
例えばCPUのレジスタを直接制御する必要があったらアセンブラが必要になるし。
#逆に寧ろ、趣味でもないのに高速化の目的でアセンブラを使うのもおかしな話だが。
なんの話やら
430 :
423:2006/06/22(木) 00:52:14
>426,527
>423の何処に「全部」アセンブラでと書いてあるのかと個一時間…
そう読めてしまうのは分かるが、ツッコミ入れる前に
自分が誤解していないか、よく考えた方がいいぞ。
お前みたいなのがぱっと見でヘタだと判断して要らん修正し、
デグレを発生させるんだぞ?
そして漏れみたいなのがtypoでバグ生むんだぞ、と…orz
typoがコンパイルエラーではなくバグに発展するような
紛らわしい識別子命名規則でやってるのかね貴方は
宣言不要のスクリプト言語じゃね?
代入式で変数名を間違えたりするとアウト
undefを読んでもエラーにならない処理系ならなお悲惨
いやぁ、定数値を間違えてもコンパイルは通るだろ。
#所詮、427を527と書いただけなんだから。
>>430 むしろ、誤解した結果
> それなら、アセンブラ使った方が良いと思うが…
というレスがなされたと思われる。
だよなぁ。
そもそも
>>421読んでアセンブラ使わないとは思わないだろ。
SSE使うとか書いてるのに。
ネタ無くなったな
えっとじゃあ、定数の意味づけに#defineとstatic constが混在してるソース
enumも忘れちゃ遺憾。
#ifdef HOGE
if(hoge) {
#endif
:
:
#ifdef HOGE
}
#endif
なんか、急に勢いなくなったね。このスレ。
>>440 それだけだと間抜けだけど、ifdefの条件が機種依存かつ複雑化すると、結局そういうコードになりそう。
というか、オープンソースで見たことある。なんのコードだったか忘れたのが申し訳ない。
>>440 なにに突っ込んでるのかよくわからんが、ヘッダファイルなら
#ifdef __cplusplus
extern "C" {
#endif
:
:
#ifdef __cplusplus
}; /* end of extern "C" */
#endif
と言うコードはよくみるけど。
#ifdef HOGE
if(hoge)
#endif
{
:
:
}
こうしろってことじゃないの?
俺は、
if(hoge){
...
}
ってする派だから、
>>443 のように書くぐらいなら
>>440 のように書く。
if(hoge)
{
...
}
って書く奴なら、違和感ないのかもしれないけど…。
>444
#ifndef HOGE
{
#else
if(hoge){
#endif
...
}
>>445 わざわざ論理反転させる意味があるのでなければこっちの方が良くない?
#ifdef HOGE
if(hoge){
#else
{
#endif
...
}
俺も普段は
if(hoge){
形式だけど、#ifを使うときは
#if HOGE
if(hoge)
#endif
{
としてる。その辺は臨機応変に。
関数の一覧を作る機能が貧弱なIDEで
>>445-446の書き方をすると、
純粋に'{'と'}'の対応が取れないと判断されて
作成に失敗したりする。某M社のIDE。
#define Repeat(Cnt,Max) for(int Cnt = 0; Cnt < Max; ++Cnt)
int hoge(){
こんなマクロってやっぱヘタかな。俺的に超重宝しているのだが
#define Repeat(Cnt,Max) for(int Cnt = 0; Cnt < (Max); ++Cnt)
↓使い方
int hoge(){
Repeat(i, 100){
printf("%d",i);
}
return 0;
}
こんなマクロってやっぱヘタかな。俺的に超重宝しているのだが
破門
使うたびに #define、#undef してるなら有効と思ってみる
>>449 それがなぜ好ましくないかを実感・納得してもらうのはなかなか難しい。
コギャル語(まだあるのか?)で書かれた文章を読む方の身にもなってみろといえばわかるか。
チームで開発する時その手の俺用語がいっぱいあるといちいち定義を確認しないといけないし
余計な依存ヘッダが増えて解読が面倒なんだよ。
それにタイプ数減らすことが直接生産性に繋がるわけでもないしからメリットもほとんどない。
Repeatの挙動を一気に変える事なんてないしな。
>>449 スゲーよ!それ!
俺もこれからそれ使うよ!
>>452 納得させるのは無理だw
下手なコードだからスレ違いでは無いけれど
>>449 は今手持ちのコードをすべて修正中です。
しばらくお待ちください。
修正なんかしなくても、プリプロセッサ通せばすむだけでは。
たとえばCOMの参照カウント付オブジェクトを使うときに、
if (pObj) { pObj->Release(); pObj = 0; } なんてのを多用する。
これを SAFE_RELEASE(pObj) なんていうマクロにすることもある。
これを外挿して、
多くのループが必要で、かつカウンタや回数に長い変数名を使う
必要がある特殊なコードならRepeat なんていうマクロもありなのかもしれない・・・
ヘタじゃないと思うけどなぁ
マクロアセンブラとかだとそういうの当たり前だから
そっちの出身者にとっては抵抗感少ないですよ
iは宣言されていません?
>>449は、相手が自分の世界の人間なのか、他国の人間なのかを確かめる
良い例なのかもしれない。
昔はグローバル変数が当たり前だったから
抵抗感少ないと言っているようなものでは?
>>461 >>1 > グローバル変数の話題は禁止。
DQN への餌やりはご遠慮ください。
for (int i = 0; i < cnt; i++) というごく当り前の慣用句があるのに、
Repeat(i, cnt) を使いたいという理由の有無が問題なわけで。
例えば何らかの理由で 8 重ループなんてのがあちらこちらに
出てくるようなケースだと、
Repeat8(i1,i2,i3,i4,i5,.i6,i7,i8, 2, 2, 3, 2, 4, 2, 2, 2) なんてのを
define したくなるかもしれない。
でも1重ならよほどのことが無ければ別に必要ないんでは?
> Repeat8(i1,i2,i3,i4,i5,.i6,i7,i8, 2, 2, 3, 2, 4, 2, 2, 2) なんてのを
.i6 の typo はおいとくとして、こんなマクロ組むと i3 のループ回数はどれ
だったっけ? とかがぱっと見てわからない。
Repeat8 の是非は別にして、少なくとも
Repeat8(i1, 2, i2, 2, i3, 3, i4, 4, i5, 2, i6, 2, i7, 2, i8, 2)
とした方がいい。
それとも、「ヘタだなぁ」と思うマクロ の見本?
ヘタだなぁと思う釣り師達のレス
449の場合重宝しちゃってるらしいからDLLでも作ったほうがいいんじゃね?
ぱっと見て「ヘタだなぁ」と思う嫁さんの料理
嫁「もうお前には作ってやらん」
ぱっと見て「ヘタだなぁ」と思う嫁さんの子供
お前のじゃい
いや…お前のじゃないのか(;´Д`)
ぱっと見て「ヘタだなぁ」と思うおまいらの会話
ぱっと見て「ヘタだなぁ」と思う473の文章
どうして#define多用がヘタな傾向になるのかは何故?
あとtypedefで独自型を勝手に作るのも駄目か?
typedef char Int8;
typedef unsigned char UInt8;
typedef short Int16;
typedef unsigned short UInt16;
typedef int Int32;
typedef unsigned UInt32;
typedef float Float32;
typedef double Float64;
俺はこの方が見やすいからこうしてる。また、俺はなんでもクラス化するのが
好きだから最終的にはCVariantとかCInt(コンストラクタで符号の有無を指定)
とかやってる。もちろんCStringも独自に開発した。とくに俺のCStringはランダム要素n
476 :
475:2006/06/30(金) 21:26:30
↑すまそテンション上がりすぎたから支離滅裂になってしまった。また跡で出直してくる
>>475 何のためにサイズを明記したいのかわからないが、これから64bit環境に
移行していくに当たって、サイズにかかわらないコーディングを心がける
という観点からすれば、下手。
通信パケットのようなバイナリデータや、ハードウェア制御が絡むようなコードだと
サイズ明示したほうがいいな、きっと。
え、通信でバイナリデータそのまま送るの?
ヌルグラマ乙
>>475 sys/types.hでu_charなんかがtypedefされていない処理系の話だと思うんだけど、
u_charとかu_intというtypedefじゃ駄目なの?
ん、構造体などを直接通信で送るということか?
486 :
デフォルトの名無しさん:2006/06/30(金) 22:32:48 BE:59907762-#
直接バイナリでデータを送るほうが特殊だろ、と言ってみる。
488 :
デフォルトの名無しさん:2006/06/30(金) 22:36:50
>>475,478ですんなり終わらないのがこのスレのレベルの低さを表してるな。
まぁどっちかというと、直接バイナリでデータを送るほうがヌルいな。
「通信パケット」だからバイナリデータだというのは変な話だな。
>>487 VoIPやってるとバイナリで規定されているフォーマットというかプロトコルなんかいくらでもあるぞ。
自分の知らないことは存在しないことだし存在しないことは糞というおめでたい思考なのだろう
まぁどっちかというと、自分が知ってることを他人が知らないと見下す奴の方が糞だな。
よくわからんが、ある特定の通信プロトコルで必要になる構造体を定義しなおすということか?
そういうのヘッダファイルがあるんじゃないの?
>>496 寝言は寝て言え。ってーかお前らホントに世界が狭いのナー。
酔っぱらってるんで煽りみたいな文体になっちゃってわるいが、
VoIP 関連ははRTSP始めとしてバリバリにバイナリの世界だし
ライブラリなんぞもほとんど整備されてない。
ファイルフォーマットに関しても静止画や動画のコンテナは殆どが
バイナリで規定されている。
最近のプロトコルはそういうの嫌ってXMLとか使ってるんだろうけど。
>>496 通信で構造体をそのまんま送ることなんてないだろ。
>>497 どうでもいいけどさ、君は
>>475のようなtypedefを推奨するの?
はっきりいって、ヘタでしょ、あれ。
パケットヘッダを生成するときなど、普通にビット演算する必要があるわけで。
>>497 今も昔も、通信のメインストリームはASCIIです。
>>499 stdintとか使え、と言うなら話は分かるが。
>>501 そりゃ、高レベルの話だろ。ASCII(?)だろうがなんだろうが、ビット列なのに代わりはない。
BYTEとかLONGとかにtypedefするんじゃないの?ふつー。
>>499 typedef char int8; はヘタで、typedef signed char int8; としろ、
という話なら合意するけど。
あとさすがに float とかは使わないな。漏れも世界が狭いのかもしれないけど。
段々痛さが増してまいりました。
>>503 いや、テキストで定義されたプロトコルも昔からかなり多いよ。
RPCまでテキストになってきてるのは最近だけど。
といってもASCIIだけでバイナリを意識しないんじゃ dns 一つ引けやしない
わけだけれどもね。
>>505 話がずれてる。
typedef char Int8;
ほれ、これ使うの?
>>507 と、話に参加できない人がつぶやいております。
なんか痛いなぁ。
もうわかったから。
なんでVoIPなんだ?
他にもバイナリでやり取りされるプロトコルはたくさんあるだろ。
読解力無いアホが多いようだけど、どうみても
>>475は通信という文脈じゃありませんから。
>>508 あー、ごめん。仕事柄、どっちかというと低レベルな分野を扱うことが多いので、
つい何の前提もなく、そっちのほうを主眼においていたわ。
TCP/IPなら、IP層の話をしてたつもり。
>>514 つまり、それこそがこの業界のメインストリームであり、
>>475は素晴らしいと
おっしゃるのですな。
うわー、「俺お前らより高級」っつ匂い撒き散らしてますな。
はいはい、えらいえらい。
>>515 >>475は、最終的にはCVariantとかCIntとかを使うと書いてるだろうが。
その過程のtypedefだろ。
たとえ酔っ払っていても、俺様はお前らより読解力があるぞということですね。
はいはい、えらいえらい。
うちでは日常的にfloat, doubleを使うから、それ使わないお前らは糞、
と同じレベルだな。
つ stdint
純粋な疑問なんだけど、そのVoIPのヘッダではエンディアンとかどうなってるの?
あと、
int i;
と
short s1;
short s2;
とかの場合、きめうちで受け取ったほうが変換したりするの?
>純粋な疑問なんだけど、そのVoIPのヘッダではエンディアンとかどうなってるの?
バカ丸出し
>>526 stdintじゃビット幅がわかんないから明示するという話でしょ
>>528 まぁ知らないだけで馬鹿じゃないと自負してるけど、答えたくないってことですね。了解。
知識自慢はもうしないの?
ひんと: 大多数の人には常識でも、特定の人には「知識」と感じられるらしい。
適材適所で使えばtypedefは有効だが、多分
>>475の使い方は糞、でFA。
この程度のスレで知識自慢されてると感じてしまうかわいそうな
>>536
>>541 ハードウェア扱ってる奴なら普通にサイズを意識して typedef するけど、
そういうのは無視と言うことか?
あと、上のほうの議論で言えばプロトコルスタックを作ってる奴とか。
て言うか、どこに使うかもわからんのに「適材適所じゃない」とか言える
なんて、ひょっとしてエスパー君? (w
>>543 だから適材適所ならいいって言ってるだろ。
俺は
>>475は多分適材適所で使ってるとは思わないだけだ。
上手い下手は別に自分とやってること違うってだけで文句言ってるヤツ多いな
546 :
544:2006/07/01(土) 00:57:28
何でって聞かれそうだから先に答えておくと、
>>475は、CIntやCVariantを使うそうだし、
CStringも自作したそうだから。
547 :
544:2006/07/01(土) 01:00:26
さらに俺ならcapitalizeしたtypedefなんか絶対にせん。
これは好みだがな。
CIntとか使ってるC++のソースってすごそう。
あんまり見たくない。
>>548 えー、送るのー?
知識自慢にきこえちゃうわけだ。
CString自作w
>>555 構造体をそのまま送っちゃうとか言ってる人に、教えてあげる義理もないから、
これ以上言わないよ。
>>556 文字列型の代名詞が「CString」ってのも、味わいぶかいですな。
MFCな人なんでしょ。
そういう奴多いよ。
>>561 CStringでもいいよ。お好きなように。
構造体そのまま送るわけないだろ。
バイト列にプロトコルに従ってデータつめて送るなんて想像も
つかない世界なのか?
エンディアンなんてプロトコル定めた時点で決めてあるはず。
もしくはネットワークバイトオーダ。
揚げ足取りにもなってねー。
>>563 分かってないのは一人だけだから、説明してあげることもないよ。
ちょっと目を離したら80レスって、ぽまいら
馬鹿ばっか
適材適所で使えばtypedefは有効だが、多分
>>475の使い方は糞、でFA。
仮にtypedefするにしても、
>>475のようにはしないな。
Windowsの人はあれが普通なのか?
つか、サイズなんて1か2か4か8しかないのに、通信屋さんはサイズもつけた
typedefするのがデフォなのか?
>>544 > 俺は
>>475は多分適材適所で使ってるとは思わないだけだ。
どこで使うかなんてどこにも書いてないと思うけど、俺には見えないものが見えてるの?
それとも、主観で嫌いと言うことで FA ?
>>570 この変数のサイズは、絶対 2 でないと困るって言う時に君ならどうする?
>>571 しつこいな。
CVariantやCIntを使い、CStringを使うような奴が適材適所で使ってるとは思えんと
言ってるわけだが。
ゲームだと
typedef unsigned char u8
typedef signed char s8
typedef float f32
とかは結構やってる(Quake、HL、Irrlicht等)。
ただいくらなんでも
>>475のは汚らしい。
>>572 詳しく聞かれると逆切れ?
世の中、CString とか使ったアプリとそのアプリから呼ばれるドライバとかの両方を
書くプログラマもいるんだけどね。
まあ、最終的には
>>545 ってことかな。
・CVariantやらCStringといった物理構造を意識させない為のクラス
・Int8やらfloat64やらといった物理構造を意識しまくりのtypedef
この両者を、レイヤーが異なることを明示せずに
並べて書くのが良くない気がする。
なんか、ヘタなコードとキャピタライズの好き嫌いの区別がついてない奴がいるな。
>>576 別に切れてないが。
俺はそう思っただけの話だ。そう思わないのならそれでいい。
スレタイ読めるか?「思う」かどうかのスレだぞ。
脈絡もなく
>>475のようなtypedefを使う奴はヘタだと思うぞ。
MFCに限定しない一般論なら、CStringじゃなくて、文字列クラスとか言ったほうがいいよ。
MPEG4の仕事やったけど、アーキテクチャの違いを吸収するマクロでは
>>574のようなtypedefは使いまくりだったけど、データの意味を表す
typedefの方が多かったよ。
>>579 ぱっと見て「切れかかってる」と思うレス
583 :
570:2006/07/01(土) 02:37:42
で、どうなの?
適材適所で使えばいいじゃん。なんで議論になってるのかわからん。
まあ俺は/usr/include/sys/types.hのスタイルを好むが
>>475のようなスタイルを好む奴もいるってことでしょ。
適材適所で使えばいいじゃんと言ってる奴に限ってどこが適所かわかっていない件
方や世界の大舞台でドイツとアルゼンチンが一進一退の死闘を繰り広げ
方や社会の掃き溜めでアホが不毛な雑談で暇潰し。
この差は一体・・・
ははぁ、ただ単に「わかってない奴」を叩きたいだけなんだ。
そういうのマ板でやってよ。
>>585 ビット幅を意識すべきところなんてどこにでも転がってるじゃん。
なんでわかってないことにしたいのかなぁ?
スタイルとか言っちゃってるからだろ。
じゃなんて言うの?
というか、本質的には
>>475のようなtypedefが各処理系には用意されてると
思うんだけど、用意されてるのに、自前のtypedefをするのはどうかと思う。
用意されてないなら問題なし。
↑バカ丸出し
多分痛いのはひとりだけ。
いつもの奴。
空気を読まずに別の話。
大体において文字列クラスを自作する奴は、余計な型変換をサポートしてしまうために、
それを使うコードはなんだかわけわかめ状態になりやすい。
また、そのクラスを使う奴は、いちいち標準ライブラリの使い方と同じか異なるかを
確かめないといけないのでウザい。
STL禁止なプロジェクトに入ってしまうと(もちろん他のライブラリも使用禁止)、
ウザいことこの上ない。富○通とか。
>>591 用意されてても、処理系毎に異なるので結局自前で typedef する時もある。
まあ、さすがに typedef の元は処理系で用意している奴にするけど。
関数の引数に変な値を入れてほしくないので、
typedef enumで型を作りまくったことはある。
でも、使っていたコンパイラでははじいてくれなくて、
あまり意味がなかった。
>>595 富士通にいたことあるけど、STL使ってたよ。
vector、list、stringだけだったけど。
>>600 それは下手というより
>>597がそういう経験をしてその間違いをしないように成長したということを褒めてあげようや
未だにやってんならm9(^д^)
みんな夜寝ないの?
ヘタな時間の使い方だ。
Cの enum は、a = 1, b = 2, ... の略記法みたいなもんだからなぁ。
Pascal からの転属組の俺には、
>>597 の考え方はよく理解できる。
>>601 部署やプロジェクトによって違う。
某大規模プロジェクトはSTL完全禁止。
STL禁止の理由は何?
>>606 さぁ?
STLはbuggyだから禁止だという噂はあった。
「使用言語はC++だが、コードサイズが膨らむからテンプレートは使用禁止な。
同様の理由によりvirtualとRTTIも勿論禁止。
あと、値渡しと区別しにくいから参照禁止。ポインタで渡してね」
「使用言語はC++だが、性能出ないからexception禁止」
うーん、書いてみて、これはこれでありそうだ。
>>607 VC6のSPいくつかまでの話だよな。たしか・・・。
>>608 コードサイズが膨らむからってより、
複雑になるからって理由で禁止にしたいな。
特にテンプレートとRTTIに関しては、テンプレートは用意されてるもん(=デバッグ済み)を使う分にはいいけどね。
無駄に複雑でなにより適切というより悪用のほうが多い。
Boostは「デバッグ済み」と考えるべきか否か
>>612 「標準」じゃないって部分で多くのプロジェクトで使用禁止だろうな。
C++はめんどくさいんだね。
Javaで非標準を禁止していたら仕事にならないよ。
PerlでCPAN禁止とか、PHPでPEAR禁止とか。
c++でSTLとtemplateを禁止にしたら魅力が半減どころではないね。
classを自前で作るリスクに比べればコードサイズなんて・・・・
>>614 java自体がダレダレで超いい加減だからなw
マジで動作あやしいことこの上ない。
>>615 STLを使う分にはいいと思うけど、テンプレートは何かいいことあるか?
なんかテスト項目増えるだけじゃね?
煽り禁止
もうスレ自体終わってるからどうでもいい。
各々の技術レベル知識レベルで勝手にヘタだなぁと「思う」だけのスレに何の意味もない。
>>609 性能に影響出るほどexception使っちゃ駄目だろ。
>>620 自分より技術レベルや知識レベルが下の奴を探し出して煽るため。
じゃあ技術レベルや知識レベルと関係ない観点から。
ほとんど使い捨てに近いプログラムを
エラー処理とかきっちり馬鹿丁寧に作るのは下手なコードだと思う。
近年まれにみるつまらんtopicだな
Cマガジンのバッドノウハウ集の批判とか、Code Completeへの批判とかはどうよ?
>>623 ほとんど使い捨てのつもりのプログラムが以外に使い続けられてしまう件について
>>626 以外に使いつづけられてしまったときに堅く作り直せばいいんじゃないの?
XP的には。
つっこみ禁止
自分が使う場合には、不要なエラー処理は書かない。
他人が使う場合には、使い捨てとわかっていてもエラー処理を書く。
630 :
デフォルトの名無しさん:2006/07/03(月) 00:50:03
昨日までやってたオセアニア選手権
シングルス=2位
ダブルス=優勝
ミックスダブルス=優勝
団体戦=優勝
ミャオミャオタソ頑張ったけど、シングル2位だとワールドカップのオセアニア代表は無理か・・・
Vim3とwebalizerのソースは見ると脂汗が出る。
>>623 多分 使い捨て ≡ なんかをちょっとテストするためのプログラムとか、
ちょっとしたデータ変換のためのスクリプトとかを意識してるんだろう
けど、世の中には銀行とかのデータ移行用のプログラムみたいに一回
しか使わないのにきちんと作る必要があるものもあるよ。
もう少しきちんと考えて書かないと、知識レベルが低く見られるよ。
だが、時として尻尾が2本ある犬が生まれることもある
何とかして難癖つけないと気が済まないゴミスレ。
>>632 妄想 or 下っ端乙。
それ何回も使うよ。
はぁ?
それってどれよ?
お前のプロジェクトは知らんけど、銀行の合併で一回こっきり
しか使わない移行プログラムなんていくらでもあるぞ。
スレタイ関係なく、罵り合えれば何でもいいゴミ人間。
>>636 下っ端に確定。
君の知らないところで使われてるから。
クソスレ
「知識レベル」なんて単語をつかう奴に、ろくな奴がいないという良い見本。
まぁ本番環境でデータの移行を一回しか行わない銀行合併のプロジェクトもあるかも
しれんが、たとえそうであっても、普通それを使い捨てのプログラムとは言わんわな。
でもフツーはそんなデータの移行はしないがな。
なんつー不正確でピントはずれで感覚的な議論なんだ。
もうアホかとバカかと。
小規模DBがらみのプロジェクトとごっちゃになってるんじゃないの?
別にどうでもいいけど。
嵐の予感・・・
嵐というかウンコが降ってきてるというか
1度しか使わないとおもって適当に書いても、
「実績」ができてしまうと何度も使われる。
逆に何度も使うと思って丁寧に書くと、完成した頃には
ニーズが失われて結局使われない。
_、_
( ,_ノ` )y-~ 世の中そんなもんさ。
649 :
デフォルトの名無しさん:2006/07/04(火) 02:34:32
要するに他人様のコードをヘタだのなんだの言うなら
まずは他人の書いたコードを40万行読んでその上自分で20万行書け。
話はそれからだ。
通分して
読む:2行
書く;1行
にまからないでしょうか?
>>649 ほほう、そこまでいかないと
if (0 == p) { ... }
について語る資格が無いということですな。
>>650 ワロタwww
上手いwww
座布団やりたいwww
何万、何十万行書いても、下手なやつはいつまでたっても下手だけどな。
下手なやつはそれでキャリアを積んだと勘違いして困ったり
自分は下手ではないと勘違いしていたり
>650
うまい!
が,それは「約分」だ
>>648 一度しか使わない前提で作ったのなら作りが雑でもかまわないと思うけどね。
そんなコードを使いつづけてるほうが悪いわけで。
問題は「一度しかつかわない」前提で書かれたコードを、十分なチェックもなく
使い回してしまう運用やら別プロジェクトにあるんじゃないか?
「そんな前提聞いてません」と言われたら困ってしまうが。
スレ違い
662 :
デフォルトの名無しさん:2006/07/04(火) 17:22:13
ユーザはアホと鬼の上司に言ってみたい今日この頃
663 :
デフォルトの名無しさん:2006/07/04(火) 18:51:52
「スレが伸びてるときは、大抵は池沼が書き込んでるらしい。」
>625
わりと納得できることしか書いてなかった。
命名について章を割いてたのは
ありそうでなかったことなので評価出来るのでは?
Writing Solid Code で冒頭からハンガリアンマンセーしてたのには辟易したが。
(言語・環境問わずに無条件でマンセーしてた。)
やっぱ立ち読みして買うべきだな、書籍は。
>659
上司は逆に、動いていれば作りが雑でも構わないと思うだろうね。
そもそも運用が始まったら、実装担当は指示の無い限り
コードに干渉しないのが常識なんだから、手出し出来る内に
最大限の努力を払っておくべきだと思うが。
実装と運用がごっちゃのカオス状態が常識だと言うんなら
汚いコード書こうが別に構わんが。
また知将降臨か・・・
脳内社会人乙。
>666,667
現実では無理だからといって理想を拒否するなよ。
できませんで終わるな。
これならできるという道を模索せよ。
もっと簡単に説明してくれとよw
一言で言うとスレ違い
他人のコードをどうこう言う前に自分のコードのへたさに気づけよ
自分を棚に上げるのイクナイ
1 1 △
― − ― = ―
3 □ ○
を満たす、0でない数字 □ △ ○ を挙げてください
重複はしません。約分して下さい。
>>674 2桁有りなら、□が4以上の数全部じゃね?
1桁だけなら、□が4以上の数で○が整数1桁で、且つ、□と被らない数探せばいいんじゃね?
>>674 1桁だけなら
□=2
○=6
△=-1
ぱっと見てスレタイの読めない文盲だなぁと思うレス
char cmojiretu[50] = "AAABCCCCCCCCDDDEFGHHHHJJJ";
char cmojiretu2[50];
int isoeji = 0;
int icnt = 0;
int out = 0;
char ccnt;
printf("\n圧縮前文字列→%s\n", cmojiretu); //圧縮前文字列の表示
printf("圧縮前文字数→%d\n", strlen(cmojiretu)); //圧縮前文字数の表示
do {
if(ccnt == cmojiretu[isoeji])
icnt++; //icntを1つずつずらす
else{
for(; icnt > 9; icnt -= 9)
out += sprintf(cmojiretu2 + out, "@9%c", ccnt);
if(icnt <= 3)
while(icnt--) cmojiretu2[out++] = ccnt;
else
out += sprintf(cmojiretu2 + out, "@%c%d", ccnt, icnt);
icnt = 1;
ccnt = cmojiretu[isoeji];
}
}while(cmojiretu[isoeji++]);
cmojiretu2[out++] = '\0';
printf("\n圧縮後文字列→%s\n", cmojiretu2); //圧縮後文字列の表示
printf("圧縮後文字数→%d\n", strlen(cmojiretu2)); //圧縮後文字数の表示
return 0; //main関数を終了させる
}
このC言語のコメントがわかりません、わかる方コメントをお願いします
>>678 私にはあなたの質問の意味がわかりません。
分かるけどノーコメント
ぱっと見て「コメントの付け方がヘタだなぁ」と思うコード
コメントよりプログラム自体がヘタだろ
>>678 ヘタの見本のようなコードだな。
どこから持ってきたコードだ?
>>679 質問じゃなくて皮肉じゃないの?
確かに書かれているコード通りの
コメントを書く意味がわからないよw
コメントの基本は何をしてるかじゃなくて
何をしたいかだからね…
コメントより変数の命名法の方が気になる
ccntが代入される前に使用されています。
これはひどい
悪いコードの見本として、わざとヘタに書いたコードじゃないのか?
ヘタすぎる。
>>678 char cmojiretu[50] = "AAABCCCCCCCCDDDEFGHHHHJJJ";
char cmojiretu2[50];
int isoeji = 0;
int icnt = 0;
int out = 0; // ←これだけ統一されてないのはヘタだと思う。命名法の是非は別としても。
char ccnt;
初心者の頃はそんなコード書いてたな
このスレは、自称初心者脱出レベルから自称上級者が確信を持って
良いコードだと思って書く下手なコードについてあれこれ言うものだから、
単に稚拙なだけのコードはスレ違いだと思う。
ちなみに
>このC言語のコメントがわかりません、わかる方コメントをお願いします
の意味は、「なんらかの理由でこのコードにコメントをつける必要が
あるのだが、どうコメントを付けていいかわからに。そこでわかる人は
コメントを付けてください」じゃないか?これもスレ違いだが。
692 :
デフォルトの名無しさん:2006/07/07(金) 22:18:46
if(flag || num[j]) {
printf("%1d",num[j]);
flag=1;
}
出所は言わないでおくw
あのーおまいら、もう終わった話だけどあれだ。
SymbianOS上での開発だけど
TInt16 とか普通に使う。
そういうコーディング規約だし、アーキテクチャ的にも
T〜 とか R〜 とか C〜 とかいうプレフィクスは大事。
伽藍とバザールの、まさに「伽藍」の美しさ。
変数にマウスポインタ当てたら
型やらコメントやら表示する素敵IDEがあるなら
ハンガリー記法は邪魔なだけだと感じる。
>>696 IDEにそんな機能なくても、いらないよ。
ハンガリアン論争はしかるべき場所でやりたまえよ
699 :
デフォルトの名無しさん:2006/07/08(土) 12:32:13
俺はハンガリアン(型?)よりも
グローバルかメンバかローカルかスタティックか引数か?
引数なら入力か?出力か?がわかったほうが便利だと思う。
なので
gUnko
mUnko
unko
sUnko
inUnko
outUnko
にしてる。
>>689 俺なら
char chMojiretu[50];
cahar chMojiretu2[50];
int iSoeji;
int iCnt;
int iOut;
char chCnt;
/* 初期化 */
lstrcat(&chMojiretu[0], "AABC・・・・・");
memset(&chMojiretu2[0], 0x00, sizeof(chMojiretu2));
iSoeji = 0;
iCnt = 0;
iOut = 0;
chCnt = '\0';
こう書くな。
好みの問題だけど宣言と同時に初期化は俺にとって見にくい。
>>700 Cならしかたないけど、C++なら宣言と同時に初期化があたりまえ。
703 :
700:2006/07/08(土) 12:49:10
>>702 あー、俺基本的にベタCだからなー。
その影響か少なからず宣言同時に初期化は抵抗があるのかもしれない
なんでCだと宣言と同時に初期化しないのかがよくわからない。
>>703 それって、C++ほとんどやってませんってことだよね。
あるいは、C++の機能をほとんど使わないコードしか書いてないとか。
むしろ初期化と宣言を同時に行わないコードは下手に見える。
>>704 C89だと変数の宣言はブロックの最初だけと決まっているからと思う。
だから自然と宣言と初期化を分離する悪しきスタイルが主流になってしまう。
まだそんなのにこだわってる人がいるんだ。
変数宣言なんてどこにも書けるし、for (int i = 0 ; ... ; ...) みたいな
書き方も普通にできるのにね。
つーか寧ろ、ブロックの先頭で宣言できることを知らない香具師が多いんだがな。
頼むから2000行もある関数(それ自体阿呆だが)の先頭で100行もの変数リストを作らんで欲しい。
#だからと言って、FILE * fpを無理やりキャストしてフラグに使うのはもっと困り者なんだが。
どこで読んだ話であったか、オリジナルのハンガリアンは
もっとアプリケーションロジック寄りの意味を持つプレフィクス
(x座標を表す変数だからx〜、等)だったが、その考案者が論文に
「これは変数の"type"を表す」と書いたのが誤解されて、
ほとんど意味のない型名プレフィクスをダラダラ付ける
現在の悪名高いハンガリアンが生まれてしまったという話。
>>707 当然初期化はするけど、宣言と同時にはしない。
使う直前で、初期化する。
使う直前で宣言と初期化をすればよいのでは。
当面使いもしないのにブロックの先頭にだらだらと宣言が並ぶのは下手に見える。
714 :
700:2006/07/08(土) 13:16:33
>>705 その通りだねー。C++とJavaはかじったぐらいなんだけど
結局俺個人としてCが一番しっくりくるんだよ。
仕事でツール作るときも全部Cなんだけど
MFC使えないから普通に全部コード書くはめになって・・・orz
declarationとdefinitionというネタをふってみたりみなかったり。
いまどきC89を使ってるのは下手に見える。
そもそもブロックがだらだらと長いのは下手に見える。
>好みの問題だけど宣言と同時に初期化は俺にとって見にくい。
という理由で
>>689のコードを
>>700みたいに書き換えるのは下手にみえる。
719 :
700:2006/07/08(土) 13:33:47
>>718 そうなのか。
いや、まあ俺も自分のコード見てPCを窓から投げ捨てたい
衝動に駆られることよくあるから。
お世辞にもうまいとはいえないと思う。
具体的にどういう初期化の指定がスマートかな
あと文字列の初期化にmemset()で、全部0入れてるのも素人くさいな。
(やってるやつにかぎって、それが安全だって固く信じてるけど)
721 :
700:2006/07/08(土) 13:40:22
>>720 memset()での不思議なことがあったんだが
WCHAR test[MAX_PATH];
memset(&test[0], 0x00, MAX_PATH);
にして初期化すると。
添え字の129までが0に初期化されてて
それ以降は初期化されてないっていう現象があったんだが何で何だ
sizeof()での値取得だとちゃんと260まで初期化されてたんだが。
>>721 一度sizeofの値を出力させてみたら?
sizeof(WCHAR)
>>719 変数のスコープが必要以上に広がらないようにするのがいいのでは。
基本的に変数は使う直前で定義(宣言+初期化)する。
あとは使う部分をブロックで囲むとか。
あと、変数宣言がブロックの先頭部分にしか書けないとか、for文で変数宣言
ができないような古いコンパイラは捨てるのも重要。
726 :
700:2006/07/08(土) 13:57:48
#include <windows.h>
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)
{
CHAR MsgBuffer[256];
memset(&MsgBuffer[0], 0x00, sizeof(MsgBuffer));
wsprintf(&MsgBuffer[0], "%d", sizeof(MAX_PATH));
MessageBox(NULL, &MsgBuffer[0], "SIZEOF", MB_OK);
memset(&MsgBuffer[0], 0x00, sizeof(MsgBuffer));
wsprintf(&MsgBuffer[0], "%d", MAX_PATH);
MessageBox(NULL, &MsgBuffer[0], "MAX_PATH", MB_OK);
return 0;
}
でやったら4と260だった
ますますわからねー('A`)
727 :
700:2006/07/08(土) 14:01:18
>>723 確かWCHARはunsigned shortだったろ
2バイトだから2が帰ってくると思うんだが
あれ・・つーかsizeofってバイトがかえってくるんだっけか!?
やべええええだとしたらおれすげー勘違い野郎かもしれない
728 :
700:2006/07/08(土) 14:02:05
つーことはMAX_PATHって4バイトって事?
#defineってLONGだったっけ?
落ち着けw
この場合sizeof(MAX_PATH)には意味はない
memsetすべきサイズはsizeof(WCHAR)*MAX_PATHだろ?
730 :
700:2006/07/08(土) 14:16:00
すまん勘違い何だけど。
#include <windows.h>
int WINAPI WinMain(HINSTANCE hCurInst, HINSTANCE hPrevInst, LPSTR lpsCmdLine, int nCmdShow)
{
WCHAR wBuffer[MAX_PATH];
CHAR MsgBuffer[256];
memset(&wBuffer[0], 0x00, sizeof(wBuffer));
memset(&MsgBuffer[0], 0x00, sizeof(MsgBuffer));
wsprintf(&MsgBuffer[0], "%d", MAX_PATH);
MessageBox(NULL, &MsgBuffer[0], "SIZEOF", MB_OK | MB_TOPMOST);
memset(&MsgBuffer[0], 0x00, sizeof(MsgBuffer));
wsprintf(&MsgBuffer[0], "%d", sizeof(wBuffer));
MessageBox(NULL, &MsgBuffer[0], "MAX_PATH", MB_OK | MB_TOPMOST);
return 0;
}
のsizeof(MAX_PATH)は260でsizeof(wBuffer)は520だった
ヘッダ定義だとMAX_PATHは260なんだけどなんで520になってるのかがよくわからない。
WCHARのバイト数に依存してるんだろうか・・。だとするとLONGの場合は1040って事になるわけ?
c++どころかCも使えないもよう
732 :
700:2006/07/08(土) 14:18:20
そういうことかwwwwwwwwwwww
あれだ配列はバイト分進むんだった。
つーか俺コンピュータの基本的な部分が根本的にダメだorz
733 :
700:2006/07/08(土) 14:18:59
今まで書いたコード全部見直してくださいね。(笑顔で)
俺は
>>720ではないが
>>726=
>>730みたいにいちいち
memset(&MsgBuffer[0], 0x00, sizeof(MsgBuffer));
という文字列領域のクリアを繰り返すのは下手すぎると思う。
まあCをろくに使えない人間みたいだから多少安全がわに倒す
という意味ではましなのかもしれないが。
736 :
700:2006/07/08(土) 14:33:06
>>735 言われてみれば下手かもしれない。
先輩のせいにするのはよくないんだろうけど仕事場で
バッファ再利用するならクリア処理絶対つけろって言われ続けてきて
そういう癖がついちまったんだ('A`)
まあ、下手なコードの見本としてみてくれれば俺はそれでいいw
むしろ今回のsizeof()関連は俺としては非常に勉強になって満足。
「こんな事もわからないのか?」なんて馬鹿にされるだろうけどね
いいかげん700がウザい件について。
>>736 そういう職場なら仕方ないが、きっとしばしばデスマーチなんだろうな。
memset()の害悪の事例は散々書いたから割愛。
memsetでバッファクリアしてるというだけで、デスマーチですか。
memsetしていようがしていまいが、
デスマーチのない職場のが少ないんだから、
しばしばデスマーチだと推測しても、大半が当たるんだろうなと。
確率統計に詳しい俺様は理解したw
流れ嫁。
デスマーチは、能力不足より他の原因の場合が多いだろ
>>741 おまじないばかりやってると、本当にトラブルが起きたときに対処できないよ。
くだらん
>>748 むしろ安全にならないって理由を聞きたい。
strncpyの挙動を理解していないアホグラマが\0ターミネートし忘れても大丈夫という利点(?)と
memsetの書き間違いで更なるバッファ破壊を引き起こすデメリットで差し引き0だな。
まあ後者は任意のコードを走らせられない分まだましと言えなくもないかもしれなくもな(ry
memsetを書き間違う可能性があるから使うなということですか。
>>750 > \0ターミネートし忘れても大丈夫という利点(?)と
だな。
それも利点とは言えないよな。
全部0埋めして誰が得するんだ?
0埋めをしてれば、バグって、文字列の終端の0が無くなっても、
動くぜって思ってるやつは、ちょっと自分のセンスを疑ったほうがいい。
>>753 そんなことを思っている奴を標準にされても困ります。
>>755 0埋めをしていても、バグって、文字列の終端の0が無くなれば、
動かないぜって思ってるやつ。
そのBe持ち、相手にしてもしょうがないよ。時間の無駄。
やっぱ0埋めするやつってこういう考え方なんだ。 > 「バグっても動く」
>>751 memsetを書き忘れても動くようにするべき
>>760 日本語で説明してください。0埋めする理由。
>>761 日本語で説明してください。0埋めして安全にならない理由。
memset使うくらいならこう書いた方がいい。
ANSIにきちんと従ってるCコンパイラなら、
安全確実に全ての要素を零で初期化できる。
char hoge_path[MAX_PATH] = { 0 };
struct Hoge hoge = { 0 };
764 :
763:2006/07/08(土) 18:36:29
補足。
K&R日本語第2版だと付録A8.7(p273)辺りに詳しく書かれてます。
「バグっても動く」ってのが理由なんでしょ?
0埋め派は。
そうならそうだと言えばいいし、ちがうなら、そっちのほうの理由を書けばいい。
なんでそれができないんだろう?
理由が言えないから、またオウム返しなんだろうな。
>>765 そんなこと初めから話してませんが。
あなたが安全にならないと主張するので、その理由を聞いてるだけです。
>>766 memset()で0で埋めるって、わざわざ余計な処理をしてるほうが
理由を説明したほうがいいよ。どうしてそれで安全になるのか。
>>767 そんなことはどうでもいいので、あなたが安全にはならないと考える理由を聞かせてください。
「バグっても動く」訳じゃないから0埋め反対とか言ってる奴。
>753,756,758,765,767
「バグっても動く」から0埋めするといってる奴
どこ?
とりあえず初期化されてないのは気持ち悪いから0埋めする奴
漏れ+α
「memset()しているから大丈夫」
この台詞を何度聞いたことだろう。
そういう香具師に限ってバグを出すのだが……
そういう香具師には>763を勧めてやって下さい。
>>769 コンパイラによってはデバッグのためにわざわざ特定の初期値を埋めてくれるのだけど、
それを無にしてしまうことについて何か意見をどうぞ。
安全になる理由がなさそうだから「安全にならない」と思うわけだけど、
memset()派が、意外な視点で安全になる理由を教えてくれれば、考えを改めるかもしれない。
安全になる理由を説明してください。
774 :
770:2006/07/08(土) 18:51:53
>>771 それだと、上のほうで書いている「再利用するなら初期化しろ」に対応できないのよね。
で、そういう香具師に限ってcalloc()を知らなかったりするし。
確かに無意味な初期化を見ると何じゃコレと思う。ので、無駄な初期化反対。
776 :
769:2006/07/08(土) 18:53:29
>772
その機能、初期化漏れを検知するためにあると思うのですが。
>>773 >安全になる理由がなさそうだから「安全にならない」と思う
それならそうと最初から言ってください。
積極的な「安全にならない」理由があるのかと思いました。
>>772 コンパイラがデバッグ時に、変数を特定の値で埋めるとの、memset()で0埋め派とは、
理由が違うと思われ。
memset()派は、文字列だけでしょ?
780 :
771:2006/07/08(土) 18:55:07
>774
>上のほうで書いている「再利用するなら初期化しろ」に対応できないのよね。
再利用に対処できないからいいんジャマイカ。
>>777 memset()派の安全になる理由をだれか教えてくれませんかね。
ポインタや浮動小数点型を考慮すると memset() や calloc() で
初期化なんてありえないはずなんだがね。 C++ まで考えるともっとありえない。
>>777 バグってるコードを実行してもエラーが発生しない可能性が上がる
という点では危険になるとも言える。
>>781 注意散漫なプログラマが、ヌルターミネートしていない文字列を扱うときに、
ヌルターミネートが必要な何かをするときに、エンバグするのを防げる。
memsetなんかに頼らず、正しいコードを書けというのには完全に同意する。
785 :
763:2006/07/08(土) 19:00:00
ところでこの中に「memsetでの初期化推奨派」なんて居るのか。
漏れは初期化は推奨するが、memsetは勧めないぞ。
>>783 「バグっても動く」説は「だれも言ってない」と言ってるので、
それはあたらないんじゃないんですかね。
memset()する理由をだれか教えて欲しい。
787 :
785:2006/07/08(土) 19:00:55
居たのか…orz
「エンバグしなくてもいい」ではなくて、発見できないのでは
charの配列が戻る関数を使うときに、いちいちヌルターミネートした文字列なのかどうかを
気にしなくていい。
792 :
デフォルトの名無しさん:2006/07/08(土) 19:10:31
俺、あれだ。
文字列処理の関数が最後に\0入れてくれるかどうか
曖昧に覚えててどれがどうなってるかわからないから
単純にmemsetで初期化しちゃう派。
文字列でコピーしたり、文字列のサイズ取得して直接バイト単位でコピーしたりして
その方法ごとに最後に\0付けるかどうか迷ってんのが面倒になった。
なんで、初っ端にmemsetやっておけば、ケツに\0がつくかどうかは無視れて便利。
ってやってたら、memsetで初期化するコストが馬鹿にならないぐらいの処理にブチあたって
正直、気を使ったw
lenとかlen-1とか--lenとかlen+1とかがちりばめられないコードが書ける。
>>792 そのやり方は
文字列に\0が含まれるかどうか
文字列に\0をつけるかどうか
をいちいち気にしないといけないんで面倒じゃないか?
>>790 エンバグはバグを入れることを言うのですか。バグを見つけると勘違い。すみませぬ。
ただ、ヌルターミネートが必要な何かをするときに、入れ忘れても動く(エンバグしない)と言ってると思いますが
それは潜在的なバグという事ではないでしょうか?
最後の\0まで含めたサイズを返してる同僚の関数も混ざってかなり大混乱だなw
このへんは・・・
俺は配列の最後に\0を書き込む派。
>>796 memsetしているから、入れ忘れは発生しないという論法。
>>795 いや、初っ端にmemsetをする場合は\0は一切気にしなくてよくなるでしょ?
領域が全部0だから、ケツに\0がつこうかつくまいが関係ない。
>>799 必ずmemsetしてくれるとは限らないのがポイント。
ほら、あれだ。あれ。
ガベージコレクションの問題と似てるな。
>>799 それは最初の一回だけですよね。
再利用して、次に格納する文字列が前より短ければダメですから。
1.2回目以降は短いか確認
2.毎回ヌルを入れる
の違い?
>>801 memset派はmemsetし忘れることがあるから危険という主張ですか?
>>806 というより、安全側に倒してくれるプログラマばかりとは限らないんで、
安全側に倒したコーディングをするべき。
>>808 memsetしたほうが、多少安全側に倒れるという話なんだが。
>>809 その多少安全というのは、入れ忘れても動くという事でしょうか?
ヌルを
だいたい、プログラマのミスを隠蔽するようなコードが安全だとは思えない。
安全側に振りたいのなら、プログラマがミスを犯さないような仕掛けを
作るべきだろ。
>>815 だから、どのようなコードが「ミス」の例なのか教えて欲しい。
これだけ煽ってもmemset()で安全になる理由が出てこないんだから、
memset()入れてるやつは、なんとなく空気で入れてるだけなんだろ?
>>816 場合(主観)によるから例示は無理。
どんな例を挙げても「memset() すれば動くじゃん」って言うことができる。
>>820 はて?
memsetで正しく動くコードがあったときに、「それはプログラマのミスを
隠蔽しているので悪」という主張じゃないの?
>>816 納得できるかどうかわかんないけど、こんなのはどう?
struct S { char* p; float f; };
S s;
memset(&s, 0, sizeof(s));
assert(s.p == 0);
assert(s.f == 0);
// 以降にこれらの条件に依存したコード
822は大抵のマシンで動くので全然説得的ではないアホ例ですた
?を使うのはいつものキチガイ
700から始まった議論がここまで激論になるとは思わなかった
>>829 前スレでもmemset()で文字列クリアの話題で盛り上がったよ。
文字列の場合は0を入れなくてもいい。って最初に入れてるけど・・・
つまり、文字列の場合は初期化じゃない(どうでもいいけど)
>>830 移植性を考慮する場合
>>822 はミスだが、
動作環境が限定されている場合はミスではないと言える。
うーん。主張を緩くしたほうがいいかな。
memset() で正しく動くコードのうち、ほとんどの場合は
memset() を使わないコードで移植性、効率などを改良することができる。
memsetで0クリアはヘタだし安全でもないって話になるからこじれる。
ヘタだけど安全になる場合もあるから、トータルで見て0クリアしとけってのも理解できなくは無い。
>>833 >memset() で正しく動くコードのうち、ほとんどの場合は
>memset() を使わないコードで移植性、効率などを改良することができる。
いやいや、そんなこと始めっからわかってますがな。
効率悪くてもmemsetで0クリアしとけという場合の話。
ポインタの場合はぬるぽになる
>>835 > 効率悪くてもmemsetで0クリアしとけという場合の話。
それは間違いなく下手だな。
保守性も改良することができると付け加えよう。
>>837 ヘタじゃないとは誰も主張してないのでは?
保守性に関しては多少異論があるがまぁその話はしないでおく、
0クリアしとくことで「未使用状態は0とする。」
と暗黙に主張するという効果はあるのでは?
こうしてmemset派は、今日も生き残ったのだった。
じゃ次は、freeする派の主張をどうぞ。
843 :
デフォルトの名無しさん:2006/07/08(土) 20:43:32
>>817 だから、
>>792みたいな理由があるっていってるじゃん。
どこに目ついてんの?股間のあたり?
Javaの場合は初期化する。Cではしない。
C言語はそういうどーでもいいことを
考えなくちゃいけないから効率が悪い。
セレブ言語カモン
847 :
763:2006/07/08(土) 21:08:25
いい加減0埋め初期化の是非と、memsetの是非は分けて論議してくれよ…
上手いプログラムは無駄がない
組み込み等でもないのに初期化コストを嫌って
それが原因でポカミス起こすとしたら、
それは下手なプログラマー。
身の丈に合わない書き方なんてするもんじゃありません。
それこそ「ヘタだなぁ」と思われる要因となります。
勿論いつまでも「とりあえずmemset」は困りモン。
分かった。
上手いプログラムは、効率第一なので、バグが出やすい。
下手なプログラムは、安全第一なので、バグが出にくい。
コレでどちらも納得!!
か?
851 :
デフォルトの名無しさん:2006/07/08(土) 21:39:44 BE:89861663-#
>>834 > ヘタだけど安全になる場合もあるから、
いやいや、その安全になる場合の説明を求めてるんだけど、だれもできないんだよ。
>>847 そう切り離した問題でもない。
文字列処理で10MBぐらいあるデカイののトークン分割処理やってて、
処理の始めに固定長の作業領域とって文字列処理があるたびに
memsetで初期化してたら遅くて使い物にならなかった。
854 :
デフォルトの名無しさん:2006/07/08(土) 21:42:40
>>851 だから、
>>792だっていってるじゃん。
馬鹿なの?
人の話を聞けよ!
お前使えない奴だな。
使った文字列処理が\0が付いてるか、付いてないか気にしなくていいでしょ?
>>854 そんな文字列を混在させて処理して、どっちか把握できなくなるから、
全部0クリアってこと?
そんなコード書くなよ。
ようするに「バクっても動くから」ってことか > memset()使う理由。
856 :
デフォルトの名無しさん:2006/07/08(土) 21:49:27
>>855 いや、
「memsetでクリアされてるはずだから\0を気にする必要は無い」
は、処理仕様でいいと思ってるんだけど。
そもそも文字列処理って大変じゃん。
標準関数だけの考慮でそんな処理楽とか言って無い?
既存にあるものや同僚が組んだものまでいれると\0の付加は結構大きい問題になる。
ガベージコレクションしてるから、明示的に解放しなくていいと似てる問題だな。
という事でfree議論スタート。
とその前に↓
しばらく主演女優二人による大森電気店CMをお楽しみください。
・・・・・・・。
859 :
デフォルトの名無しさん:2006/07/08(土) 21:58:23
そんな低レベル叩かなくてよくね?
文字列は文字のリストなんだぜ。
860 :
│ ↑ :2006/07/08(土) 21:59:01
└─┘
おらっしゃあぁぁ!!!
∩∧ ∧
ヽ( ゚Д゚)
\⊂\
O-、 )〜
∪
しかし工藤のナイスセーブ
文字列を0クリアするのはデバッグの為ってやってる人が言ってたけど
>>857 p がポインタのときいちいち if (p) free(p); とかやって
NULL チェックしてるのはヘタクソだとおもう。
deleteもdeleteも
>>863 freeやdeleteは内部でNULLチェックすることを
知らない人が結構いるので突っ込んであげるのが吉。
867 :
770:2006/07/08(土) 22:19:45
まぁ確かに、ファイルに落としたときにゴミがなくて安心できるかも知れんね。
で、>856のような主張をする香具師に限って、sprintf()の%*.*sの使い方を知らなかったり
sscanf()の%[a-z]を知らなかったりstrncpy()ではまったり、
挙句は一文字ずつ代入するループを書いたりするんだよね。
「memset()しているから大丈夫」なんて言う前にバグの出にくいコーディングをしましょうってことで。
>>863 大抵の場合はどうせ自前でヌルポインタチェックしないといけないんだから、
どうでもいい。
if( memsetで初期化 )
{
printf( "安全になるよ" );
}
else
{
printf( "安全にならないよ" );
}
こんな思考ルーチン持ってると下手だなぁと思う
それをいっちゃ〜おしまいよ
>865
関係無い話だが、freeやdeleteはチェックしてんのに、
fclose はチェックしてないのは何でだと思った。
873 :
デフォルトの名無しさん:2006/07/08(土) 22:32:01
>>867 じゃ、逆に聞くけど、処理速度が問題にならないときに
memsetで初期化して何か問題あるの?
正直、Cの文字列関数群は糞すぎる
・末尾のNULL文字を付加するのかしないのか統一する
・引数の順番を統一する
・コピー先バッファの長さは必ず指定できるように
これら仕様をキッチリして別名の新ライブラリを作ってくれよと
876 :
デフォルトの名無しさん:2006/07/08(土) 22:41:14
>>875 そのレス意味がわからない。
具体的な説明なんもないじゃん。
>>782は普通に意味不明。日本語できるのかどうかからわけわからんし。
>>783は具体的な例を出してほしい。
バグってるコードって何?具体例求む。
calloc使いたいと思うようなところでmemsetするんじゃね?
それはバグとはちがう
>852
折角コテハン付けているんだから、>763も読んでくれ。
>763やcallocのような方法を知ってなお、
「必ず初期化」という行為まで含めて否定するなら、
コンストラクタ論争が起きるぞ。
memsetが問題なのは、あくまでmemsetだからだ。
return(0)と書く人。
883 :
デフォルトの名無しさん:2006/07/08(土) 22:51:42
>881
ANSI以前のコンパイラとの互換性は気にしないので付けません。
混同してはダメさね。
886 :
880:2006/07/08(土) 22:57:06
漏れの言ってる事はそんなに変か?
主張:memsetで初期化するな。
論拠:正しい初期化のやり方ではないから。
>>886 はぁ?
じゃあ、1回使った領域をもう1回初期化して使うときどうしろって言ってんだよ。
コンストラクタなら普段ならしない初期化をする俺ガイル
890 :
770:2006/07/08(土) 23:01:44
>>873 >memsetで初期化して何か問題あるの?
memset()で安心して、バギーなコードを書く香具師そのものが問題。
例えば、文字列変換関数か何かでこんなコードを書いたとする。
void funcStr(char * dest, const char * src)
{
int strLen = strlen(src);
for (int ic = 0; ic < strLen; ++ic) {
dest[ic] = funcChr(src[ic]);
}
}
書いた本人はmemset()してからこの関数を呼ぶからバグに気づかなかったりするわけだな。
これはあくまでも咄嗟に思いついた例だが、実際にはもっと複雑なコードにこういった断片が紛れ込むから
他人にはコードを見てもバグってるかどうかなかなか判らないわけだ。
#いや、本人は自身満々だから判るわけないし。
途中でリターン押してしまった。
主張:memsetで初期化するな。
論拠:正しい初期化のやり方ではないから。
主張:初期化の是非とmemsetの是非を混同するな
論拠:初期化はmemsetを使わずとも>763の方法等で可能。↓
>>890 ええー、そんな話したいの?
そんなのfuncStrの単体テストレベルの話じゃん。
>889
memsetの是非と初期化の是非を混同している馬鹿や、
正しい初期化の方法を知らん馬鹿が居るから書いてるんジャイ。
>>891 誰も初期化の是非なんかはなしてないよ。
0クリアの是非ならはなしてるが。
ひょっとして
>>763を誰も知らないとでも思ってるのか?
896 :
デフォルトの名無しさん:2006/07/08(土) 23:06:56
>>890 見事に的外れ、且つ、
自分が言い出したことに引っ込みが付かなくなって苦し紛れにしたレスにしか見えない。
いい加減黙っとけ。
>895
>ひょっとして
>>763を誰も知らないとでも思ってるのか?
念を押すと言う言葉を知らんのか。
スレを読み返せば明らかに怪しい奴がちらほら居るぞ。
それとも全部お前だったというのか。
>>897 おめでとうございます。あなた様にぴったりな言葉が見つかりました。
「ひとり相撲」
>>897 専ブラ使ってて、ツリー化機能があるなら
>>763からツリー化してみろ。
誰もお前の相手してないのがわかるから。
>900
お前が色々読み飛ばしてるのは良く分かった。
>>898 MSですらZeroMemoryしてるのに変なこだわりあるんだねw
な ん で こ ん な に 伸 び て ん の ?
>>901 まぁ好きなだけ独り言いってよ。読み飛ばすからw
釣れた釣れたw今日は大漁ww
釣れた釣れたw今日は大漁ww
釣れた釣れたw今日は大漁ww
釣れた釣れたw今日は大漁ww
それで1000まで頑張る気?(笑)
昨日は?
913 :
901:2006/07/08(土) 23:26:51
じゃあチラシの裏。
memset以外の初期化方法を知らん疑惑のある奴は>862,873。
奴らを黙らせるには、正しい方法を教えるのが手っ取り早い。
なのに殆どの奴はパフォーマンスの問題など、的外れなレスばかり。
memsetの是非と初期化(0クリア)の是非を混同してるとしか思えん。
なに言ってんだ、こいつは
流れをぶったぎって。
最近宿題スレ見始めたんだけど、ありゃヘタの宝庫だね。
だが、ただヘタなだけで面白みが無い。
たまに誰かがコードにコメントしたら、逆切れしたりする奴もいて面白い。
宿題スレはスレッドあぼ〜んしてるw読んでると頭痛がしてくるからw
>913
面倒なら763もスルーすりゃいのに。
>>913 別に黙らせる必要なんかないのでは?
どんだけ強迫観念があるんだよ。
>913
面倒とか言いつつ、的外れなレスを返す辺りステキ。
#define exec fork() ? wait() : execl
>919
数年前の夏を思い出せ。
無駄にスレ伸ばして鯖に負担をかけるな。
>>922 黙らせようとして、見当違いことを長文で垂れ流すほうが迷惑なのでは?
チラ裏もそろそろ埋まってきただろう。満足したか?
大体において、馬鹿を黙らせようとするとスレが無闇に伸びるはめになる。
馬鹿は荒らし同様、スルーするのが一番。
これ分かってないやつおおいんだよねー。
チラシの裏
なんか急に伸びる方向が変わったな。
ひとりの馬鹿があらわれると、集中的に叩かれるの法則。
まあなんだ、お前ら早く職につけと。
職についてるなら集中して仕事しろと。
だから、誤ったコードとヘタなコードは違うんだってば
馬鹿ばっか
結局、自分の下手さ加減を再認識して、早々に立ち去った
>>700が一番利口だったとさ。
チラシの裏
必要なくてもゼロで初期化する習慣は良い心がけだが、
memsetでゼロクリアするのは間違い。
という結論で良いんだよな?
チャネラー公言してる上司に、変な知識を植え付けないで下さいよ?
痛い、心が痛い
>>936 >必要なくてもゼロで初期化する習慣は良い心がけだが、
>memsetでゼロクリアするのは間違い。
>という結論で良いんだよな?
良いのではないでしょうか、あなたがそう思うのなら。
>>936 見ず知らずの他人を啓蒙するほどのあなたなのですから、あなたの上司も
啓蒙して差し上げてはいかがでしょうか。
\ /_ / ヽ / } レ,' / ̄ ̄ ̄ ̄\
|`l`ヽ /ヽ/ <´`ヽ u ∨ u i レ' /
└l> ̄ !i´-) |\ `、 ヽ), />/ / 地 ほ こ
!´ヽ、 ヽ ( _ U !、 ヽ。ヽ/,レ,。7´/-┬―┬―┬./ 獄 ん れ
_|_/;:;:;7ヽ-ヽ、 '') ""'''`` ‐'"='-'" / ! ! / だ. と か
| |;:;:;:{ U u ̄|| u u ,..、_ -> /`i ! ! \ :. う ら
| |;:;:;:;i\ iヽ、 i {++-`7, /| i ! ! <_ の が
__i ヽ;:;:;ヽ `、 i ヽ、  ̄ ̄/ =、_i_ ! ! /
ヽ ヽ;:;:;:\ `ヽ、i /,ゝ_/| i  ̄ヽヽ ! ! ,, -'\
ヽ、\;:;:;:;:`ー、`ー'´ ̄/;:;ノ ノ ヽ| / ,、-''´ \/ ̄ ̄ ̄ ̄
 ̄ ̄ ̄ Y´/;:;:;\
>939
見ず知らずの他人を啓蒙するというより、2chを通じて遠隔操作ってのが正しい。
某板の住人らしいので、こっちの方が効果あるかなと。
誰も同意してくれない意味が分からないんだろうか。
>943
この時間帯で、スレも沈静化してるのに、
30分も立たない内にレスがくるのを期待しろと。
945 :
デフォルトの名無しさん:2006/07/09(日) 01:01:28
>>930 ほら、また、的外れなことして、
一連の流れで\0をちゃんと付けるみたいなことで議論してたのに
いきなりクラスをmemsetでクリアするみたいな話に挿げ替えてるよね?
こういう卑怯なことするから君は嫌われるんだよw
てst
>945は>930を誰だと考えてるのか気になった漏れは小心者。
新着450ってw
while(honyarara){
for(i=0;i<12;i++){
if(i*k==44){
ageてる点から推測すると、>945=>896で>930=>770と思ってる、かな?
まて、>945=>883、>930→>880の可能性も捨てがたい。
while(honyarara){
for(i=0;i<12;i++){
if(i*k==44){
loop1:
goto loop2;
}
}
for(i=i*k-12;i<30;i++){
loop2:
if(i*k>36){
goto loop1;
}
}
}
なんでこんなくそコードのメンテしなきゃいけないんだよ。
無限ループの原因が分からないって、お前死ねよ。
そうだよ、川田お前の事だよ。
958 :
947:2006/07/09(日) 01:56:00
>956
だとしたら不安的中。漏れは↓であって>770でも>930でも無い…
>763,769,785,787,847,849,871,880,885,886,891,893,897,901,913,922,926,936,941,944,947
ここはレスアンカーが多いインターネットですね
960 :
947:2006/07/09(日) 02:00:05
重要なのが抜けてた。>771,776,780
助けて、母さん・・・
心が痛いよ・・・
誰も変数定義時の初期化の話なんかしてないのに・・・
・なんでもかんでもmemset(ゼロクリア) で初期化してると、
処理(文字列等)の潜在的なバグを覆い隠す事があるからダメだよ派
・とりあえずmemset(ゼロクリア)しとけば問題ないだろ派
・やっぱID欲しいよな派
>963
少なくとも>840や>873は「初期化」を意図した発言だと思うが。
>881-804(多分お前もその1人)が訳のわからんレスするから
無駄に伸びるんジャイ。
967 :
デフォルトの名無しさん:2006/07/09(日) 02:13:26
>>964 また、なんでもかんでもとか付けちゃってw
君、自分が有利になるように軌道補正するくせ止めたほうがいいよw
>>966 その「無駄に伸びたレス」は君の発言に対するものじゃないんだけどなあ。
完全一人相撲乙。
>>966 アンカー間違えてて何言ってるのかわからないよw
最大の勘違い発言。
>>847 >いい加減0埋め初期化の是非と、memsetの是非は分けて論議してくれよ…
>964
memsetはダメ。ゼロ初期化なら良い。派も追加して下さい。
漏れ一人かもしれんけど…
A型がいるな。
過去の戦跡を掘り返して必死で相手の粗を探してるところがほほえましいな。
生まれついての馬鹿で、どんなに努力しても並がやっとなんだから、
発言なんてしないでおとなしくしてればいいのにw
やっと一人相撲だったことを認識し始めたようだな。
A型必死だなw(by即レス普及委員会)
>970
>792-844そして>847
埋めるか
チョンだの糞だのと批判されがちだが、はまった時のB型はとことんはまる。
そして彼は最終結論を出した。
>>936 >必要なくてもゼロで初期化する習慣は良い心がけだが、
>memsetでゼロクリアするのは間違い。
>という結論で良いんだよな?
eeee?
>970,978
黙って>840,844,847辺りを読み返せ。
それでもまだ言い返す気力があるなら、眼科か精神科逝きやがれ。
どうでもいいハナシなので
このスレで終わりますようにとお空にお願いしました
>>981 そもそも
>>763が頓珍漢なんだから、議論にもならないし。
議論してたつもりになっていたのは君だけだよ。
他の人は他の話をしてたんだよ。
釣れた釣れたw今日は大漁ww
まあ、漏れだの香具師だの言うやつが
>チャネラー公言してる上司に、変な知識を植え付けないで下さいよ?
というのが痛かったな。
心の貧しい人たちのスレ
>986
(リアルで)「チャネラー公言」そして「某板の住人」「遠隔操作の方が…」に注目。
>984
お前が変に読み飛ばしてるのは良く分かったから。w
>>989 君がこのスレで正しく議論できたかどうかなんてどうでもいいことでしょ?
君の判断が正しいと信じるなら、2ch経由で上司を啓蒙するなんてまどろっこしい
ことせずに、直接言いたまえ。
>>989 そもそも、必要ない0クリアなんてなんでするのって話なんですが。
それでも必要なくても変数定義時の初期化は良い心がけと言い張りますか。
>991
やっとノイズが無くなったか。
答えはyes。
何故なら初期化しないと「値が不安定」だから。
テスト・デバッグ時に偶然ゼロとなり、本番での実行時にしか分からない
バグを見逃す可能性がある。
それに比べりゃ潜在的に間違ったコード書くくらい可愛いこった。
>>992 int ret = 0;
ret = foo();
このretの初期化は良い習慣?そうではない?
そうではないとしたら、その理由は?
>993
お前が1人で開発してるならretの初期化は不要。
だが1人じゃ無いなら、誰かが宣言の後に何かを追加する可能性を考慮しろ。
また初期化の有無に気を付ける位なら、その注意力を他に回せ。
このretの初期化は不要なのに、charの配列のときに必要な理由は?
>>992 あのー、それmemsetで0クリアしときゃバグっても大丈夫派と同じ意見なんですが。
>>994 >誰かが宣言の後に何かを追加する可能性
例えばどんなコードを追加されると問題になりますか?
>995
(1)>994を読んでた場合
よく読め。
(2)>994を読んでない場合
先走りすぎ。w
最後まで意味不明な奴だったな。
retの初期値が0である事を前提にしたコードを書くと、
後の仕様変更でretの初期値が非ゼロとなった場合に困る。
1001 :
1001:
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。