■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part12
251 名前:デフォルトの名無しさん :02/10/27 15:57
古いCライブラリを実装してたら外さなければならない状況がありました。

252 名前:デフォルトの名無しさん :02/10/27 15:57
>>241
dobleとintの間の変換をしょっちゅうやるような場所だったら、
Cキャストの方が楽だし、そういう場面では危険も少ないとは
思う。それ以外なら問答無用でC++キャストにするけど。

253 名前:241 :02/10/27 16:00
>>252
明後日の方向にレスなさってますか?
つーか、「C キャストの方が楽」 って・・・タイプ数が少ないって事?

254 名前:デフォルトの名無しさん :02/10/27 16:20
タイプ量云々以外にC風キャストを使う意味ってあるんですか?

255 名前:デフォルトの名無しさん :02/10/27 16:43
不定…
未定義…
(・∀・)イクナイ!

256 名前:デフォルトの名無しさん :02/10/27 17:10
どうでもいいけど、クラスのメンバ変数の名前ってどうしてる?

1, 接頭辞m_をつける
2, 接尾辞_をつける
3, んなもんつけない(で、メンバ関数の引数とかぶるときはthis->をつかう)

俺は2か3で迷ってるんだけど…。(最近は2)
1は使ったことない。

257 名前:デフォルトの名無しさん :02/10/27 17:12
>>256
漏れは、自分だけで書くなら常に 3。
共同の場合は相談に応じて。
仕事の場合はしょうがないから規約に従う。

258 名前:デフォルトの名無しさん :02/10/27 17:18
自分だけで書くコードは最近は3。
人に見せるときは1か3、だなぁ。接尾辞 _ って
目立たないので、あんまり付ける意味が感じられなくて。

259 名前:デフォルトの名無しさん :02/10/27 17:44
仕事のときにはそこの規約にしたがう。

そうでない場合は気分によるな・・・どれでも別に構わないし

260 名前:デフォルトの名無しさん :02/10/27 17:47
そろぞろ「接頭辞をつける奴はアフォ」発言が来るぞ

261 名前:デフォルトの名無しさん :02/10/27 17:50
Say Prefix

262 名前:デフォルトの名無しさん :02/10/27 20:20
最近2の「接尾辞_をつける」パターンをよく見る。
いつごろから使われだしたんだろ。


263 名前:デフォルトの名無しさん :02/10/27 20:29
>>262
漏れの場合は Exceptional C++ を読んでから。

264 名前:デフォルトの名無しさん :02/10/27 20:32
>>263
なんか理由かいてあるの?

265 名前:デフォルトの名無しさん :02/10/27 20:48
「クラス名::メンバ名」って人はさすがにいないのかな。

266 名前:263 :02/10/27 20:51
「接[頭]辞 _ は使ってはいけない」 理由が書いあるけど、
接尾辞_については特に。「個人的なおすすめ」とだけ。
あの本好きなので習ってみただけっす。

>>265
それはstatic変数用にとっておく。

267 名前:デフォルトの名無しさん :02/10/27 21:02
クラスのメンバに接頭・接尾語付けないヤツはアホ

クラスメンバint aがあったとして
Class::GetA() { return a; }
Class::SetA(const int& a) { this->a = a; }
とかやってたら更にアホ

Class::a() { return m_a; }
Class::a(const int& a) { m_a = a; }
にしろ

268 名前:デフォルトの名無しさん :02/10/27 21:06
とりあえず理由を述べないヤツはアホ

269 名前:名無しさん :02/10/27 21:25
クラスメンバにaなんて短い名称をつけるやつがアホ。
クラスにするくらいなんだから、意味づけしろよ。

270 名前:デフォルトの名無しさん :02/10/27 22:39
ただの例文に対してそんなところにしか突っ込めない奴が一番アホ。
終了。

271 名前:デフォルトの名無しさん :02/10/27 22:43
268 を無視して 269 だけ煽り返す奴は宇宙一 DQN
しかも 269 は 「一番アホ」 と表現する程でもない

272 名前:271 :02/10/27 22:45
失礼。
269 は 「一番アホ」 と表現する程でもないどころか、言っている内容は
至極まともだ。
ただの揚げ足取で、269 の本論は全く覆せていない。

つーか例示にしても a じゃなくて Something とかにしとけ。

273 名前:デフォルトの名無しさん :02/10/27 22:46


   2 6 7 必 死 だ な




274 名前:デフォルトの名無しさん :02/10/27 22:52
「関数の型を書かないやつはアホ」とかくだらないことどんどん書いててくださいよ

275 名前:デフォルトの名無しさん :02/10/27 22:59
ってか、267 の示した前者と後者も、大した違いは無い。
と言うより、本当のプロパティのように扱えない以上、Get/Set は
つけるべきとまでは言わんが、そうしても良いと思うがどうよ?

276 名前:デフォルトの名無しさん :02/10/27 23:29
アホキター!!!

277 名前:デフォルトの名無しさん :02/10/27 23:30
>>276
>>276

278 名前:デフォルトの名無しさん :02/10/27 23:49
>>275
正直、コーディング規約が統一されてればどっちでも良い。それより int を
渡すのに、わざわざ参照使ってる方が気になる(w

(まー、今時のコンパイラなら最適化かければ結果的には変わらんだろうが)

279 名前:デフォルトの名無しさん :02/10/28 00:29
>>278
Class::GetA() const、になっていないのも気になって夜も眠れない。


280 名前:デフォルトの名無しさん :02/10/28 00:33
そろそろ「prefixをつける奴はKIMOI」発言が来るぞ

281 名前:デフォルトの名無しさん :02/10/28 00:40
JavaHouse方面で、"m_ "を "余計なもの"と呼称する祭りが以前は定期的に開催されていたと
記憶していますが、その際の叩く理由は何でしたっけ?C++には関係なし?



282 名前:デフォルトの名無しさん :02/10/28 00:44
要約すると、267 が一番アホという事か。

283 名前:デフォルトの名無しさん :02/10/28 00:44
prefixをつける奴はKIMOI

284 名前:デフォルトの名無しさん :02/10/28 00:47
suffixをつける奴はKIMORIN


285 名前:デフォルトの名無しさん :02/10/28 00:48
>>282
自明


286 名前:デフォルトの名無しさん :02/10/28 01:06
なんで >>260 で完璧に予言されてるのに、普通にルーティンワークしてるんだよ(藁

287 名前:デフォルトの名無しさん :02/10/28 01:16
ニチャソダカラ


288 名前:デフォルトの名無しさん :02/10/28 01:35
Cマガジンが毎年C言語入門講座をやるのと同じでは?

289 名前:デフォルトの名無しさん :02/10/28 01:50
>>286
それがルーティンワークというものだ

290 名前:デフォルトの名無しさん :02/10/28 02:01
自己言及的テンプレートのようで(・A・)イイ!


291 名前:デフォルトの名無しさん :02/10/28 02:58
>290 カオガイクナイ

292 名前:256 :02/10/28 07:58
なんか凄いことになってるな…。。。
接尾辞_はタイプ数が減るから好き。
this->はちょっと長い。
m_はそもそもなんか格好悪い。mってマゾですか(藁

293 名前:デフォルトの名無しさん :02/10/28 07:59
>>292
メンバです。アホですか?

294 名前:デフォルトの名無しさん :02/10/28 08:07
「アフォ」「キモイ」「格好悪い」

キター!!!!

295 名前:デフォルトの名無しさん :02/10/28 08:40
class A
{
 int a;
public:
 int GetA() { return a; }
 void SetA(int a) { this->a = a; }
};
とかやってるヤツは低脳

class A { public: int a; };
にしろ

296 名前:デフォルトの名無しさん :02/10/28 08:49
>>295
内部で保存していたいデータと外から見えるようにしたいデータが著しく違う場合は?

たとえば、日付は内部では整数型で管理した方が都合が良いが外には文字列型で見せたいとか。

297 名前:デフォルトの名無しさん :02/10/28 09:30
お互いがお互いをメンバに持ち合うクラスって作れますか?

class A{
B b;
};

class B{
A a;
};

みたいな

298 名前:デフォルトの名無しさん :02/10/28 09:32
>>295
それなら構造体にするのが普通だと思うんだが

299 名前:デフォルトの名無しさん :02/10/28 09:56
>>297
ポインタだったら可能。

class A {
B *b;
}

class B {
A *a;
}

300 名前:256 :02/10/28 10:13
>>293
ネタにマジレスされたよ(T__T)

301 名前:デフォルトの名無しさん :02/10/28 10:15
A *a = new A();
a->b->a->b->a->b->a = a;

わけわかんねえ…


302 名前:デフォルトの名無しさん :02/10/28 10:18
>>301
リンクリストとかツリーとかだとそういう構造になるけど…

303 名前:デフォルトの名無しさん :02/10/28 10:19
メンバ変数がset/get関数でしか参照されない場合、
その設計は100%誤りである。

304 名前:デフォルトの名無しさん :02/10/28 10:25
>>302
ツリーなら2つクラス用意せんでもいいんでないかい?

305 名前:デフォルトの名無しさん :02/10/28 10:26
>>303
定義を述べるだけなら誰でもできる。
根拠もついでに示してくれ。

306 名前:デフォルトの名無しさん :02/10/28 10:27
>>301
途中のでNULLポインタが混ざっててエラーを起こす罠

307 名前:デフォルトの名無しさん :02/10/28 10:32
>>304
> ツリーなら2つクラス用意せんでもいいんでないかい?

「そういう構造になる」というのは、データが再帰的に
連なるって程度のことで、深い意味は無いです…

(ツリーだとノードとリーフで複数のクラスを使うことがよくあるとは思うけど)


308 名前:デフォルトの名無しさん :02/10/28 14:28
C++規格書の日本語版はJISから手に入りますか?

309 名前:デフォルトの名無しさん :02/10/28 16:18
C++をやりたいのですが、Cの知識もないときついでしょうか?

310 名前:デフォルトの名無しさん :02/10/28 16:28
いいえ。

311 名前:デフォルトの名無しさん :02/10/28 16:32

あるクラスを定義して、
それが参照されたときに必ず、
ある関数が先に呼ばれる、って事を実装したいです。

class CLASS_BASE
{
  public: void f_0(){ /* こっちを呼んだ時でも、 */ }
};

class CLASS : public CLASS_BASE
{
  public: void f_1(){ /* こっちを呼んだ時でも、 */ }
  public: void f_2(){ /* これが、いつも先に必ず呼ばれる */ }
};

f_1 は内部で f_2 を呼べばいいのですが、
f_0 は既存の物なので、書き換えるわけにはいきません。
関数が1つ2つならオーバーライドですみますが、
関数はたくさんあるので巧く書けません。

どなたか、エレガントな方法をお教え下さい。




312 名前:デフォルトの名無しさん :02/10/28 16:39
>>309
┌──────────┐
│  Cの知識 ┌────┼───────┐
|       .|. . .   |. . .C++.の知識.|
└─────┼────┘          . |
       .  └────────────┘

かぶる領域はある。


313 名前:309 :02/10/28 16:42
>>310>>312
ありがとうございました

314 名前:デフォルトの名無しさん :02/10/28 16:43
被るというか抱合してやってるというか。

315 名前:311 :02/10/28 16:46
だれか>>311プリーズ。


316 名前:デフォルトの名無しさん :02/10/28 16:53
#DEFINE DECLARE_INHERITE_HOOK(base, func, hook)\
void (func)(){\
(hook)(); \
(base)::func();\
}
とでもしとけ。

317 名前:デフォルトの名無しさん :02/10/28 16:54
CLASSでvirtual void f_0(){ f_2(); p_q(); }は…
だめだな当然(-_-)

318 名前:デフォルトの名無しさん :02/10/28 17:31
fps = 1000.0f / (timeGetTime() - prev_time);
だとちゃんと動くのに

fps = 1000 / (timeGetTime() - prev_time);
がゼロ除算エラーになるのは何故ですか・・・?

319 名前:デフォルトの名無しさん :02/10/28 20:28
class CA{
public:
int ma;
CA():ma(NULL){}
void thread(void){::_beginthread(func,0,(void*)this);}

static void func(void* p){
((CA*)p)->fff();
::_endthread();}

void fff(void){cout<<ma<<endl;}
};
void main(void)
{
CA ca;
ca.thread();
}
を実行すると24と表示される。ナゼ・・・???

320 名前:デフォルトの名無しさん :02/10/28 20:59

画面に0〜99の数字を1秒間隔で表示。1〜9で改行、するプログラムを教えてください
図にするとこんな感じです

1 2 3 4 5 6 7 8 9
10 11 12〜〜〜〜〜〜〜〜〜19
20〜〜〜〜〜〜省略〜〜〜〜〜〜
〜〜〜〜〜〜〜〜〜〜〜〜〜〜99

解らねえ・・・

321 名前:デフォルトの名無しさん :02/10/28 21:08
counter % 10 == 0 の時、'\n' 挿入したら。
コンソールだったらの話だけど。

322 名前:デフォルトの名無しさん :02/10/28 21:08
for(i=1;i<=100;++i) {
if(i%10==0) putchar('\n');
printf("%d ", i);
sleep(1);
}

323 名前:デフォルトの名無しさん :02/10/28 21:09
>>320
マルチ野郎には何も教えてやらねえぞ。

324 名前:デフォルトの名無しさん :02/10/28 21:13
>>320
boost::timer t1
for(i = 0; i < 10; i++) {
 for(j = 1; j < 10; j++) {
  cout << i*10+j;
  while(t1.elapsed() >= 1.0f) Sleep(1);
 }
 cout << endl;
}

325 名前:デフォルトの名無しさん :02/10/28 21:17
>>324
for(i = 0; i < 10; i++) {
 for(j = 1; j < 10; j++) {
  cout << i*10+j;
  boost::timer t1;
  while(t1.elapsed() >= 1.0f) Sleep(1);
 }
 cout << endl;
}

326 名前:デフォルトの名無しさん :02/10/28 21:21
めちゃくちゃだな(藁

>>322
要求全然満たしてないぞ
>>320は1〜99と言っている
しかもsleepの分解能は秒か?

>>325
whileの不等号式が逆だろ

327 名前:デフォルトの名無しさん :02/10/28 21:45
>326
sleepの分解能は秒である、と書いてあるが。
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/sleep.3.html

328 名前:デフォルトの名無しさん :02/10/28 21:46
>>326
> しかもsleepの分解能は秒か?

unix系は秒単位じゃなかったっけ?


329 名前:デフォルトの名無しさん :02/10/28 21:50
>>320
を見ると、最初の行は全角で、後の行は半角だ。
なかなかの引っ掛け問題だな

330 名前:デフォルトの名無しさん :02/10/28 22:04
正解者ゼロか。しょせん2ちゃんねらーはこの程度だな。

331 名前:デフォルトの名無しさん :02/10/28 22:04
>>320
を見ると文章には0〜99と書いているが、
表示例には、
最初の行が1〜9で、その次の行からは10〜19、20〜29・・・
になっている。
これも引っ掛けか?

332 名前:デフォルトの名無しさん :02/10/28 22:13
ソースファイル中にちりばめられた
「FileHandle << "なんたらかんたら" << endl;」(FileHandleはofstreamです)
を、プリプロセッサマクロによって使う使わないの切り替えをする事は可能ですか?

例えば普通は
#if defined(OUTPUT_LOG)
 FileHandle << "なんたらかんたら" << endl;
#endif
みたいにすると思うんですが、その量が膨大なので
#define FileHandleで乗っ取って(?)処理しちゃうような
何か上手い方法はないかと思案中なんですが・・・

333 名前:デフォルトの名無しさん :02/10/28 22:20
FileHandleのクラスを切り替えるようにすればいいのでは。

334 名前:デフォルトの名無しさん :02/10/28 22:21
FileHandle を \dev\nul とか /dev/null とか…

335 名前:デフォルトの名無しさん :02/10/28 22:56
operator <<
の定義を直接、書き換えてしまう。


336 名前:デフォルトの名無しさん :02/10/28 23:22
ウムム・・・
FileHandle(厳密にはofstreamのラッパークラス)はユーザーにも公開していて
ユーザーが明示的に呼び出した場合は通常通りの操作をしたいのです

というのも、あるサブシステムを作っていて
そのエラーログを吐き出すのにFileHandleを使っているのですが
ユーザーから「標準のエラーログは邪魔くさいから有り無し変えられるようにして」と
仕様変更が入りまして・・・今更言うなよ・・・といったようなワケでして・・・
そのために1個グローバルなフラグを増やすのもアレですし

>>333氏の発想でもうちょっと考えてみます

337 名前:デフォルトの名無しさん :02/10/28 23:27
>>319
このままだとコンパイルすら通らないのでは。
fff() は CA::fff()
の間違いだとして…。分からん!


338 名前:デフォルトの名無しさん :02/10/28 23:32
>>337
ヨクヨメ
まぁ良く読んでもわからんがw

339 名前:デフォルトの名無しさん :02/10/28 23:35
すいません、どなたか>>318わかりませんか・・・?

340 名前:デフォルトの名無しさん :02/10/28 23:42
>>339
timeGetTime() - prev_time
がゼロになってるからじゃないの?

341 名前:デフォルトの名無しさん :02/10/28 23:52
>>339
本気でわからんか?

>>339
> fps = 1000.0f / (timeGetTime() - prev_time);
> だとちゃんと動くのに

本当にちゃんと動いてるとお思いか?

> fps = 1000 / (timeGetTime() - prev_time);
> がゼロ除算エラーになるのは何故ですか・・・?

timeGetTime() と prev_time はどっちも多分 DWORD 型なんだろう?
timeGetTime() == prev_time の時、どうなるか考えてみろ。
まんまゼロ除算だろうが。

ちなみに、1000.0f の時に落ちないのは、浮動小数点演算の場合にゼロ除算を行った場合、
整数助産の場合と違って一般保護例外にならず、#INF 値を返すからだ。
#INF 値は整数に代入すると、0 になる。
だから、見かけ上動いてるように見える。
fps の型を double にして、std::cout に投げてみろ。

342 名前:341 :02/10/28 23:57
整数助産だって・・・カコワルイ

追記。
浮動小数点演算のゼロ除算が一般保護例外にならないのは、浮動小数点数は
#INF 値つまり無限大を表現できるからだ。
だから整数の場合と違ってわざわざ一般保護例外にする必要が無い。

343 名前:デフォルトの名無しさん :02/10/29 00:02
余計なツッコミだけんども
win32環境ではゼロ除算と一般保護例外は別だよ。
他もそうだと思うけど。

344 名前:デフォルトの名無しさん :02/10/29 00:04
>>341
1000.0fだとちゃんと動きます
デバッガでwatchしてみると

1000.0fの場合→正しいFPS値
1000の場合→unsigned int 0(0x0)

になります
もちろん初回計算時はprev_time = timeGetTime() - 10;
などとしてゼロ除算にならないように注意しています

更に、FPSを計った後Sleep(1)しているので
OSが仕様を踏襲している限り
(timeGetTime() - prev_time)がゼロになることはありえません

345 名前:デフォルトの名無しさん :02/10/29 00:05
ちなみに環境はWin98SE/BCC5.5.1です

346 名前:デフォルトの名無しさん :02/10/29 00:10
>>344
なら
DWORD tmp;
tmp = timeGetTime() - prev_time;
fps = 1000 / tmp;
とでもしとけ。

347 名前:デフォルトの名無しさん :02/10/29 00:13
>>344
それって・・・
それって・・・
エラーが発生してるんじゃなくて、単に整数演算の丸めで 0 になってるだけじゃ・・・
timeGetTime() - prev_time > 1000 の時どうなるか考えてみろ。

348 名前:デフォルトの名無しさん :02/10/29 00:13
Sleepの精度は結構悪かったような記憶があるが。

349 名前:ちなみにソースの一部 :02/10/29 00:14
メインループで、while { 内部処理; Render(); }としていて、Render()の実装が

void cEngine::Render()
{
 const static DWORD fps_limit = 60;
 static DWORD prev_time = (timeGetTime() - 10);
 fps = 1000.0f / (timeGetTime() - prev_time);
 // 内部処理が間に合っていなければコマ落ちさせる
 if (fps < fps_limit) {
  prev_time = timeGetTime();
  return;
 }
 else {
  // Sleepの誤差が5msとして、余った時間を計算する
  DWORD over_time = (1000.0f / fps_limit) - (timeGetTime() - prev_time) - 5;
  if (over_time > 0) Sleep(over_time);
  while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
 }
 prev_time = timeGetTime();
 lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 0, 0, 0 ), 1.0f, 0);
 lpD3DDevice->BeginScene();
/*いろいろ*/
 lpD3DDevice->EndScene();
 lpD3DDevice->Present (NULL, NULL, NULL, NULL);
 Sleep(1);
}

です

350 名前:デフォルトの名無しさん :02/10/29 00:16
>>347
え・・・?

351 名前:デフォルトの名無しさん :02/10/29 00:18
>>344
>更に、FPSを計った後Sleep(1)しているので
>OSが仕様を踏襲している限り
>(timeGetTime() - prev_time)がゼロになることはありえません

ありえません?
これだから・・・

352 名前:デフォルトの名無しさん :02/10/29 00:19
つーか、根本的に間違ってないか?
FPS って普通 frames per second つまり 1 秒に何フレーム描画したかという
ベーンチマークのことで、実際に 1 秒きっかりを測って実際に何回レンダリング
できたかを測るものだろ。
決して、1 秒を 1 回のレンダリング時間で割った数値ではない。

353 名前:デフォルトの名無しさん :02/10/29 00:21
>>351
あーはい・・・内部処理に49日とちょっとかかるとゼロになりますけど

>>352
それはわかっていますが、内部処理でfpsを見たりしているので
現時点での疑似FPSが必要なんです
/*いろいろ*/の部分で1秒毎に描画済みフレーム数調べる処理はしています

354 名前:デフォルトの名無しさん :02/10/29 00:22
>>349
センスのかけらも感じないな。

timeGetTimeは一回だけ呼び出せ。
こんな関数でstatic使うな。
そんな判定で除算を使うな。

355 名前:デフォルトの名無しさん :02/10/29 00:23
>>353
で、347 の件はどーなったの?


356 名前:デフォルトの名無しさん :02/10/29 00:24
C++じゃなくなってきたけどまあいいか

357 名前:デフォルトの名無しさん :02/10/29 00:33
>>356
除算とかの話なら、C++ でも範疇だろう。
それとも、C++ でも C と重なる機能は C スレへ逝けって?

358 名前:デフォルトの名無しさん :02/10/29 00:41
>>354
>timeGetTimeは一回だけ呼び出せ。
定義することは誰でもできます
明確な理由を教えて下さい

>こんな関数でstatic使うな。
こんな関数でメンバ変数増やしたくありません

>そんな判定で除算を使うな。
どうやっても60FPSと指定したい場合は
どっかで1/60なり除算しないと無理だと思うんですが
プリプロセッサにやらせろって事ですか?
ユーザーが動的にFPSを指定したい場合は?

>>357
ゼロ除算になるのは何故?という質問が
FPSの計り方にズレてきている事を指しているんじゃないでしょうか

>>355
丸め誤差で変数fpsがゼロになったところで、
どこを見ても「任意/fps」の式はありませんが・・・?

359 名前:デフォルトの名無しさん :02/10/29 00:52
>358
問題はここ
if (fps < fps_limit) {
 prev_time = timeGetTime();
 return;
}
ここからreturnした場合、最後のSleep(1)が呼ばれないので
内部処理が1ms以内で終わった場合ゼロ除算になる

360 名前:デフォルトの名無しさん :02/10/29 00:58
>>358
漏れは 354 じゃないけど 「timeGetTime() は一回だけ呼び出せ」 には賛成。
他の場合ならいざしらず、FPS 値が重要になるような局面では。

「こんな関数で static 使うな」 の意味だけど、static にする必要も無い
(当然メンバ変数にする必要も無い) ものが static になってるという事じゃ
ないの?
static DWORD prev_time = (timeGetTime() - 10); の初期化は 1 回しか
行われないけどいいの?
(もしかしてこれが今回の騒ぎの原因じゃあ・・・)
ヒープに確保しなければならないようなでかい領域を使わない限り、auto 変数の
速度上のコストって全くのゼロなんだけどな。

あと、355 にある 「347 の件」 は 349 のソースには全く関係無いんだけど、
「どこを見ても「任意/fps」の式はありませんが・・・?」 ってどう言う意味?

361 名前:360 :02/10/29 01:00
359 見て、

> 「こんな関数で static 使うな」 の意味だけど、static にする必要も無い
> (当然メンバ変数にする必要も無い) ものが static になってるという事じゃ
> ないの?

は取り消し・・・

362 名前:デフォルトの名無しさん :02/10/29 01:02
>>359
解決しました
ありがとう

>>360
最後のヤツですが、ゼロ除算エラーが起きる事が問題だったので
fpsがゼロになることは一向にかまわないのですが、という意味です

363 名前:354 :02/10/29 01:20
>>362
解決すんなよ。そんな腐れコードさっさと捨てろ。

・timeGetTimeは一回だけ呼び出せ。
2回呼び出したときの値が同じだと期待できる根拠はどこにもない。
にもかかわらず、貴様のソースはすべての呼び出しで
同じ値が帰ってこないと意味を成さない。

・こんな関数でstatic使うな。
メンバ変数は要らなくなったらプログラムの都合でメモリ領域を開放できる。
static変数はプログラムの都合では開放できない。
static変数は初期化のタイミングも、プログラムの都合には合わせられない。
cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる?

・そんな判定で除算を使うな。
↓のソース参照のこと。(prev_timeはメンバ変数)

void cEngine::Render()
{
const unsigned fps_limit = 60;
const unsigned time_limit = 1000 / 60;

const DWORD now_time = timeGetTime();
const DWORD time = now_time - prev_time;
 prev_time = now_time;
 if (1000 < time * fps_limit) {
  return;
 }
 else {
以下略

あとは、やろうとしてること自体も根本的に間違ってるっぽ。

364 名前:デフォルトの名無しさん :02/10/29 01:43
>はすべての呼び出しで 同じ値が帰ってこないと意味を成さない。
逆ですよ
over_timeの計算はほとんど無意味でしたけど
while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
これは固定値だと意味をなさないどころか危険なコードになります

>cEngineのインスタンスが一度破棄されて、再び生成されたときどうなる?
されません(させません)し、当然nocopyableです
cEngineはさらに上位のラッパークラスに生成を管理されています
そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが

除算は大幅にはぶけました
が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

>やろうとしてること自体も根本的に間違ってるっぽ。
prev_time = now_time;
これこそ間違ってるっぽいんですが・・・
私のやろうとしている事は
余った時間の算出→その分だけSleep→実際にかかった時間を取得→もろもろの処理
という至極単純なモノです
疑似FPSの算出でちょっとややこしくなってますが

365 名前:354 :02/10/29 02:35
やれやれだぜ、。

> while (fps >= fps_limit) fps = 1000.0f / (timeGetTime() - prev_time);
> これは固定値だと意味をなさないどころか危険なコードになります

もともと無意味で危険な糞コードなんだよ。
そんなループいらねぇだろ。

> されません(させません)し、当然nocopyableです
> cEngineはさらに上位のラッパークラスに生成を管理されています
> そのラッパークラスを1プロセス内で2度生成した場合の動作は保証しませんが

貼り付けられたあのソースを見ただけでそこまで察しろってか。

> 除算は大幅にはぶけました
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

「除算しないと無理」とか言ってた奴のセリフかね。
つまらん負け惜しみしてねぇで、
除算をはぶく方法を頭に刻み込め。

> prev_time = now_time;
> これこそ間違ってるっぽいんですが・・・

んー?どこが?
まぁ貴様のやりたいことはいまいちつかめんから、そうかもしれんな。

> という至極単純なモノです
> 疑似FPSの算出でちょっとややこしくなってますが

負け惜しみはいらねぇから、
単純なことがややこしくなったらなんかおかしいと肝に銘じておけ。

366 名前:デフォルトの名無しさん :02/10/29 02:47
> 余った時間の算出→その分だけSleep→実際にかかった時間を取得

この処理がレンダリング処理のどんな場面で必要なのか想像がつかないよ・・・
364 は天才かも知れぬ

367 名前:ゲーム会社勤務 :02/10/29 02:47
> 除算は大幅にはぶけました
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう
ゴメン、突っ込ませて。
除算なんか多様してたらまともに動くゲームなんて無い。
こちとら、必死こいて最適化してんだ、ふざけんな。


368 名前:デフォルトの名無しさん :02/10/29 03:15
> が、いまどき除算がボトルネックになるようなCPUでゲームはしないでしょう

アフォじゃねーのこいつ

369 名前:デフォルトの名無しさん :02/10/29 05:28
ゲ作板でヤレ

370 名前:デフォルトの名無しさん :02/10/29 11:36
AAと煽りだらけのネタ掲示板で何をやれと?

371 名前:デフォルトの名無しさん :02/10/29 13:26
(メンバ関数ではない)関数テンプレートは、完全な特殊化も禁止ですか?


372 名前:デフォルトの名無しさん :02/10/29 13:28
>>371
template<typename T> void hoge(T& foo) {}
template<> void hoge<char>(char& foo) {}


373 名前:371 :02/10/29 13:31
>>372
template< typename T > void hoge(T& foo, int bar = 0) {}
template<> void hoge<char>(char& foo, int bar = 0) {}
だと駄目でした


374 名前:371 :02/10/29 13:46
デフォルト引数があると駄目なのですね。すみません。


375 名前:デフォルトの名無しさん :02/10/29 13:52
explicit substancialization!

376 名前:デフォルトの名無しさん :02/10/29 13:55
>>375
ナニソレ
ブキ?


377 名前:デフォルトの名無しさん :02/10/29 14:15
後半出鱈目

378 名前:デフォルトの名無しさん :02/10/29 14:38
C++コンパイラ一人で作った人います?

379 名前:デフォルトの名無しさん :02/10/29 14:40
4人で作った人ならEDGにいます



380 名前:デフォルトの名無しさん :02/10/29 15:10
>>373
template<> void hoge<char>(char& foo, int bar) {}
にするとコンパイルできてしかも汎用テンプレートで与えられた
デフォルト引数を引き継ぐんだね。知らんかった。g++ 3.2

381 名前:デフォルトの名無しさん :02/10/29 16:02
>>380
へー、それは猫耳。


382 名前:デフォルトの名無しさん :02/10/29 16:15
>>380
VC6でも逝けた。奇跡だ(わら


383 名前:デフォルトの名無しさん :02/10/29 17:52

すいません、T*& ってどういう動きをするのか教えてもらえますか?

例)
 *どこかに typedef Class* LPCLASS; と設定されているものとする。
 
void func func( LPCLASS& cls ) // <- cls はナニ?

384 名前:383 :02/10/29 17:53
間違えました。
 void func func => void func

385 名前:デフォルトの名無しさん :02/10/29 18:05
reference of pointer

386 名前:デフォルトの名無しさん :02/10/29 18:12
some_t *&p = some_map[some_key];
/* pをいじる */

って私はよくやるけど。

387 名前:386 :02/10/29 18:16
std::map<key_t, some_t*> some_map;
です

388 名前:デフォルトの名無しさん :02/10/29 18:17
typedef struct foo_ { A* a; } foo;
typedef struct bar_ { A*& a; } bar;
A* a = new A();
foo f = { a };
bar b = { a };
delete a;
a = NULL;
f.a // 未定義
b.a // NULL

389 名前:デフォルトの名無しさん :02/10/29 18:20
LPCLASS *p = new LPCLASS();
func(p); //pの中身が変更される可能性がある!
cout<<p->msg()<<endl; //pがぬるぽだったらいやんなエラー

とか

390 名前:デフォルトの名無しさん :02/10/29 18:24
pDC->TextOut(0,0,"( ゚∀゚ )ぬるぽぬるぽるぬぽ〜〜");
AfxMessageBox("さいたまさいたまさいたま〜〜( ゚ ∀゚ )");

391 名前:386 :02/10/29 18:26
>>389
ちょっとおかしくね?

392 名前:デフォルトの名無しさん :02/10/29 18:32
どこらへん?

393 名前:386 :02/10/29 18:39
>>392
LPCLASSはただのぽいんただから(*p)->msg()かな、と。別にいいけど。

394 名前:デフォルトの名無しさん :02/10/29 18:45
ああ。よく見てなかったスマソ

LPCLASS p = new Class();

395 名前:デフォルトの名無しさん :02/10/29 19:17
(´-`).。oO(なんでだろう…)

396 名前:デフォルトの名無しさん :02/10/29 19:18
>>390
スレ違い。


397 名前:デフォルトの名無しさん :02/10/30 00:07
>>343
一般保護例外はメモリ関係でプロテクションに引っかかった場合だよな。
NULL ポインタを参照したとか。

>>342
大抵の環境では、例外を発生するように設定できる。

x87 は両対応で、Win32 ではランタイムライブラリの方で「デフォルトでは
例外を発生せず計算続行」に設定されてる。(今は違うけど) 昔の FreeBSD
では例外が発生するモードに初期化されていて、すぐにシグナルが飛んで
きた。

>>367
わり算も敵だが (VCL のお陰でちょっと楽になったけど)、俺には DMA も
敵のような気がしてる今日この頃。非同期処理なんか嫌いだ…。

398 名前:デフォルトの名無しさん :02/10/30 04:11
ブルートフォースアタック?をやろうと思って、
辞書順の次の文字列を返す(またはすりかえる)
ジェネリック?アルゴリズムを作ろうと思ったのですが、
既にありそうなのでどこかにあるのを知っていたら教えていただけないでしょうか...
それを利用すれば実現可能なクラスとかでもいいです。

例えば

char buf[] = { 'a', 'z', 'z' };
func( buf );
cout << buf; // 出力> baa

みたいな感じです。
実際には[a-zA-Z] とか [あ-お](←これは無しとしても)みたいに範囲指定か
const char dic[] = {'a', 'g', 'e'};//この辞書順
みたいな辞書指定できるようになっていると思うので、
もう少し複雑な使い方になると思いますが...

399 名前:デフォルトの名無しさん :02/10/30 04:14
力技で何を解くの? UNIX のcrypt?


400 名前:383 :02/10/30 14:41
>>385-389
ありがとうございます。
ポインタの安全性が若干ながら向上するわけですね。
勉強になりました。

401 名前:デフォルトの名無しさん :02/10/30 15:23
using namespace についての質問です。
ヘッダーファイルでusing namespace std ; などを宣言して最後にこれを
撤回したいのですがどうすればよいでしょうか?
例えば
#include <string>
using namespace std ;
class myclass {
 string str1 ;
} ;
みたいなのをヘッダーファイルに書いてcppファイルでこれをインクルードしたときに
using namespace std ;の宣言を無効にしておきたいのです。
コンパイラはVC++6です。お願いします。

402 名前:デフォルトの名無しさん :02/10/30 15:41
>>401
そのヘッダファイル内の定義を新たに namespace ns で包んで、その中で
using namespace std すれば見かけ上は OK。
でも、後で using namespace ns とした時点で std も丸見えになるので
あんまし有効でない。
結局、ヘッダ内では面倒臭がらずに std:: 付けよう、というのが一般的
みたい。
いい方法があったら漏れも知りたい。

403 名前:401 :02/10/30 16:03
>>402
どうもです。あまり良い方法はないということですね。

404 名前:デフォルトの名無しさん :02/10/30 19:13
STLスレから移動してきました。
>>Comeauって$50で全部(コンパイラ、標準ライブラリ、リンカ、デバッガ)ついてくるんですか?
>>そうなら買ってみてもイイ!かも
>ついてこない。
>フロントエンドだけ。
デバッガはともかく、標準ライブラリとリンカも別売りなんでしょうか?
英文ちゃんと嫁って言われそうですが(汗

使用しているかたオシエテ

405 名前:デフォルトの名無しさん :02/10/30 23:22
シュリンクトゥーフィット?
キレイキレイしましょ?

406 名前:デフォルトの名無しさん :02/10/31 23:23
以下のようにすると、pが指している文字が"あいうえお"にならないのです。
どうしたらちゃんと指すようにできますか?

ostringstream os;
os << "あいうえお";
const char* p = os.str().c_str();

407 名前:デフォルトの名無しさん :02/10/31 23:29
string s = os.str();
const char* p = s.c_str();

or

ostrstream os;
os << "あいうえお";
const char* p = os.str();

408 名前:デフォルトの名無しさん :02/10/31 23:31
>>407
下のは危険な香りがするのですが...

409 名前:デフォルトの名無しさん :02/10/31 23:33
>>406
c_str()の寿命は一時的だから、ポインタに代入して参照したら、
何を指しているか保証されないよ。

410 名前:デフォルトの名無しさん :02/10/31 23:36
フロッピーディスクをコピープロテクトをかけて、特殊フォーマット
かけるソフトをVC++で作ろうと思っているのですが、FATやらなんらや
で良くわかりません。大まかで良いのでアドバイスをいただきたいです。

環境はWin2000のVC++6.0です。

よろしくお願いします

411 名前:デフォルトの名無しさん :02/10/31 23:38
デバイスドライバ作らないと無理じゃないかなあ

412 名前:デフォルトの名無しさん :02/10/31 23:39
デバイスドライバってどうやって作るのでしょうか?

413 名前:デフォルトの名無しさん :02/10/31 23:42
>>412
WIN32APIスレで聞いたほうがいいカモ。
でもあそこでもデバイスドライバの話は見たことないな・・・

414 名前:デフォルトの名無しさん :02/10/31 23:46
 今 時 フ ロ ッ ピ ー プ ロ テ ク ト か よ

415 名前:デフォルトの名無しさん :02/10/31 23:58
FDはCD-ROMとちがって規格上プロテクトがかけれるようになってるけど書き込むには
専用の機械が必要。

416 名前:デフォルトの名無しさん :02/11/01 00:02
>>412
VC++とDDKを使う。DDKはMicrosoftのサイトのどっかにある。

417 名前:デフォルトの名無しさん :02/11/01 00:12
>>415
プロテクトノッチを上げる専用の機械か?(藁

418 名前:デフォルトの名無しさん :02/11/01 00:29
互換機ってFDCは何使ってたっけなぁ〜?

419 名前:名無しさん :02/11/01 05:04
>>416
VS.NETじゃつくれないのかな>DDRV

420 名前:デフォルトの名無しさん :02/11/01 09:21
低レベルの質問ですいません。
namespaceについてですが、
自作ライブラリが、他のライブラリと重複しないようにnamespaceを使ってみたんですが

STLの名前空間でのcoutは、
std::cout でも、cout
どっちでも使用できるようになっているのですが
自分で宣言した名前空間(例:namespace onigri)の中にある
関数(例: void wassyoi(); )は、
onigiri::wassyoi();
しか受け付けないみたいです(wassyoi();だけでは無理)。
他のライブラリと重複してない場合、wassyoi();だけで、
呼び出すことはできないのでしょうか?

自分なりに考えた方法は、
namespace onigiri
{
void wassyoi();
}
using namespace onigiri;
という風に、
ヘッダ内に、usingを無理やり入れてます。
これだと、あまり よくないような気がして。


421 名前:デフォルトの名無しさん :02/11/01 09:25
>>420
それでいいんだよ。>using
g++の2.xを使ってるのか? std:: なしでエラーにならんのは
単にg++の不具合。

422 名前:420 :02/11/01 09:25

何か、他に方法があったらご教授ください。

423 名前:デフォルトの名無しさん :02/11/01 09:30
はぁ?


424 名前:420 :02/11/01 09:33
ごめんなさい。
#include <iostream>
だと std空間で
#include <iostream.h>
だと グローバル空間みたいでした。
俺がアフォでした。
ごめんちゃい。

425 名前:420 :02/11/01 09:36
421の即レスにびっくり
422は、気にしないでください。
どうも。

426 名前:デフォルトの名無しさん :02/11/01 10:49
>>420
using onigiri::wassyoi;
って感じに、個別にやったほうがいいと思われ。

427 名前:デフォルトの名無しさん :02/11/01 12:56
namespaceってのは、衝突するかもしれないシンボルを回避
するという目的もあるんだから、その名前空間を定義するヘッダ内で
using namespaceするなんて意味ないじゃん。


428 名前:デフォルトの名無しさん :02/11/01 13:03
using namespace std; はC++の初期の学習段階から使わないように
する癖を付けよう。

429 名前:デフォルトの名無しさん :02/11/01 13:36
using namespace std; はデフォだろ。

430 名前:デフォルトの名無しさん :02/11/01 13:49
>>428
main() のあるファイルでも使っちゃ逝けないのか?

431 名前:デフォルトの名無しさん :02/11/01 13:53
>>429
デフォって何?

432 名前:デフォルトの名無しさん :02/11/01 14:14
Don't forget namespace!


433 名前:デフォルトの名無しさん :02/11/01 14:17
債務不履行宣言

434 名前:デフォルトの名無しさん :02/11/01 14:47
>431
怠け者がすること、って意味じゃないかな?

435 名前:デフォルトの名無しさん :02/11/01 16:37
mutable 使ってますか?

436 名前:デフォルトの名無しさん :02/11/01 19:15
こんばんわ。
C++のとても簡単な事を全然思いつかないので、
どなたか教えてください。

int x[n];
int y[n];
があったとすると
sum = (x[0]-y[0])+(x[1]-y[1])+(x[2]-y[2])+…(x[n]-y[n])  ←ここです。

for(int i=0; i<n; i++){
sum ○ x[i]-y[i]
}

○の部分が。。。

437 名前:デフォルトの名無しさん :02/11/01 19:16
>>436
> C++のとても簡単な事

そう思うなら自分で回答してみては。

438 名前:デフォルトの名無しさん :02/11/01 19:20
>>437
簡単だと思うのですけど、
自分で回答できなくて助けを求めています。

439 名前:デフォルトの名無しさん :02/11/01 19:57
どうがんばってもネタにしか見えないが,
○ = +=

440 名前:デフォルトの名無しさん :02/11/01 19:57
あと,
for(int i=0; i<n; i++){
は,
for(int i=0; i<=n; i++){
な。

441 名前:デフォルトの名無しさん :02/11/01 20:01
>>436
std::accumulate(x,x+n,0)-std::accumulate(y,y+n,0)

442 名前:デフォルトの名無しさん :02/11/01 20:06
>>441
頓珍漢

443 名前:デフォルトの名無しさん :02/11/01 20:08
stringのlistをソートしたいんですが、コンパイラに怒られます。

string s1 = "A";
string s2 = "B";
if(s1 < s2)

としただけでだめです。stringのoperator <はちゃんと定義されていると
思うのですが、なぜだめなのでしょうか?

444 名前:デフォルトの名無しさん :02/11/01 20:19
>>443
普通にできるが。

445 名前:デフォルトの名無しさん :02/11/01 20:25
エラーメッセージを書かないのはネタだと何回も何回も・・・

446 名前:デフォルトの名無しさん :02/11/01 21:28
CLine* CDay10Doc::AddLine(CPoint ptFrom, CPoint ptTo)
{
CLine *pLine = new CLine(ptFrom, ptTo);
try
{
m_oalines.Add(pLine);
SetModifiledFlag();
}
//メモリが許容範囲を超えたときの例外処理
catch (CMemoryException* perr)
{
AfxMessageBox("Out of memory",MB_ICONSTOP | MB_OK);
if(pLine)
{
delete pLine;
pLine = NULL;
}
perr->Delete();
}
return pLine;
}
何が間違っているのか分からないので教えてください
error C2143ですがセミコロンはちゃんとあります

447 名前:デフォルトの名無しさん :02/11/01 21:32
>>446
「セミコロンはちゃんとあります」 って言われてもわからん。
そのエラーメッセージは何行目を指してたのよ?
エラーメッセージはプログラムのどこがどうおかしいかを教えてくれるもので、
あなたを困らせるものじゃないんだから、ちゃんと理解しなさい。

448 名前:デフォルトの名無しさん :02/11/01 21:35
ええと
try
{
コレの{の部分でエラーが出るのです

449 名前:448 :02/11/01 21:36
sageミス すいません

450 名前:デフォルトの名無しさん :02/11/01 22:08
>>448
はっきり言ってわからん。
この文脈で考えられる事と言ったら try が変なものに #define されてるくらい
だが、そんな事無いだろうし。

つーか、エラーメッセージはエラーを示す唯一のメッセージなのに、何で全部
書いてくれないの?
エラーメッセージを、そんなにどうでもいい情報だと思ってる?

451 名前:デフォルトの名無しさん :02/11/01 22:18
ぼくに理解できないので あなたにも理解できるとは思えません

452 名前:デフォルトの名無しさん :02/11/01 22:19
ヽ(´ー`)ノ

453 名前:デフォルトの名無しさん :02/11/01 23:44
typedef std::vector<std::string> T; のような型Tを
つくるとして、Tの名前どんなふうに命名しますか?

454 名前:デフォルトの名無しさん :02/11/01 23:45
StringArrayとか

455 名前:デフォルトの名無しさん :02/11/01 23:47
StringArray

456 名前:デフォルトの名無しさん :02/11/01 23:47
Stringsもいいな

457 名前:デフォルトの名無しさん :02/11/01 23:57
ビット演算子って覚えた方がいいんですか?なんかよく理解できないんで…

458 名前:デフォルトの名無しさん :02/11/02 00:01
ビット演算をする羽目になったときに覚えればよい

459 名前:453 :02/11/02 00:03
>>454-456
〜Buf とか 〜s も考えたんですが、前者は感覚的に違う気がしたのと
後者はぱっと見て判断しにくいかなと。。Array がいいです。
ありがとうございます。

460 名前:名無しさん :02/11/02 00:03
>>457
組込用MPUくらいでしか使わないんじゃないのか。ビット演算(操作)

461 名前:デフォルトの名無しさん :02/11/02 00:19
>>460
圧縮とか、固定小数点演算とかいろいろありますがな。

462 名前:デフォルトの名無しさん :02/11/02 00:20
ビットストリームの読み書きには必須ですな

463 名前:デフォルトの名無しさん :02/11/02 00:24
使うかどうかは別としても、ビット演算程度がよく理解できない人間が
まともにプログラム組めるようになるとは思えないね。



464 名前:デフォルトの名無しさん :02/11/02 00:26
intのサイズを理解してないと厳しいんじゃなかろうか。

465 名前:デフォルトの名無しさん :02/11/02 10:49
>>453
vstr_type

466 名前:デフォルトの名無しさん :02/11/02 12:17
ビット演算の真理表を見つめてたら 1010 & 1100 = 1000 ってことはわかりました。けど、

 1010  0000  0010  1000 = a028

ってなるのが全然わかりません。これは覚えなくてもよいですか?

467 名前:デフォルトの名無しさん :02/11/02 12:30
そりゃ2進数と16進数の変換では?

468 名前:デフォルトの名無しさん :02/11/02 12:34
>>467
サンクス

469 名前:デフォルトの名無しさん :02/11/02 12:47
vector<int> v;
int i = v.size();
みたいなことをVC++でやると 「size()の戻り値はint型じゃない」みたいな
ワーニングが出るがこういう場合、どう対処するのが普通なの?

1. intじゃなくてvector::size_typeを使う
2. size()の戻り値をintにキャスト
3. ワーニングを無視

470 名前:デフォルトの名無しさん :02/11/02 12:52
>>469
1. が王道。
2. はどうしても符号付の数値が必要な場合のみ。
3. は絶対にするべきではない。
別解 4. 大抵は size_t で通じる。

471 名前:デフォルトの名無しさん :02/11/02 12:53
size_typeがunsignedだったりするといやだから2.かなあ
3.は重要なwarningを見落としたりすると困るからちょっとイヤかも

472 名前:デフォルトの名無しさん :02/11/02 12:59
>>471
signed な数値を返す size() ってあるの?

473 名前:デフォルトの名無しさん :02/11/02 13:12
数値型はすべてintで扱うべき、1ビットの節約のために
わざわざunsignedを使うのはばかげている

という意見と

正の値しかとらない変数はunsignedを使うべき、間違って負の値が
入ることを防ぐことができる

という意見

あなたならDOUCH !?

474 名前:デフォルトの名無しさん :02/11/02 13:17
全部intでもいいけど、前者に書いてある理由付けはDQNだろう

475 名前:デフォルトの名無しさん :02/11/02 13:19
>>470
「vectorのサイズ分ループをまわす」とかの場合、
1や4だとループのカウンタ用の変数もsize_tを使うことになるんですか?
ループのカウンタ用の変数がintだと結局終了条件でintとsize_tを比較
することになってしまいますよね。

476 名前:デフォルトの名無しさん :02/11/02 13:23
>>475
> 「vectorのサイズ分ループをまわす」とかの場合、
vector<T>::iterator を使うことになります。

indexで回すなら当然size_tだな。

477 名前:デフォルトの名無しさん :02/11/02 13:25
負の値になることがありうる変数を
後からsize_tにしてハマったことならあるよ...

478 名前:デフォルトの名無しさん :02/11/02 13:25
intを使う奴はDQN

479 名前:デフォルトの名無しさん :02/11/02 13:29
>>474
どういう理由付けなら全部intでもいいの?

480 名前:デフォルトの名無しさん :02/11/02 13:37
>>470
size_tを使うとわざわざvectorやlistでsize_typeをtypedef
している意味がないような。
かといってわざわざvector::size_typeと書くのは面倒だし、
コンテナを変更した時修正しないといけないし。
かといってそのためにテンプレート化するのもなんだし。



481 名前:デフォルトの名無しさん :02/11/02 13:39
個数をあらわすインターフェースがsize_tと決まっているのだから
すべてsize_tで統一すべき

intは不要。使う奴はDQN。

482 名前:デフォルトの名無しさん :02/11/02 15:10
>数値型はすべてintで扱うべき、1ビットの節約のために
>わざわざunsignedを使うのはばかげている

ってどういう意味?教えてちょ。


483 名前:デフォルトの名無しさん :02/11/02 15:12
俺、最近符号なしの整数使うときsize_t使ってるんだけどヤバイかな?

484 名前:470 :02/11/02 15:19
>>475
コンテナでループする時は、476 の通り iterator を使うべき。
index の場合は、インデックス値が 0 から始まるとは言い切れないので一概には
言えないが、index は本来ランダムアクセスに使うべき。
その場合は多分コンテナの範囲を超えた値を指定しても大丈夫だから size() は
関係無い。

>>480
サイズを表す数値の型は size_t と決まっている。
だから 「大抵は size_t で通じる」。
size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
素直に Class::size_type を使うべき。
そういう時にコーディングが面倒だと言うのは DQN。
で、あんたは size_t も Class::size_type も否定してるけど、じゃあ
どうしたいの?

>>483
size_t はサイズを表す数値の型と決まっている。
size_t は unsigned int で無い場合がある (もっと大きかったりする事もある)
が、それで問題が出ないなら構わない。
ただし単にタイプ数を減らしたいな uint を typedef で用意すべきで、それを
サボるのは DQN。

485 名前:デフォルトの名無しさん :02/11/02 16:04
size_tで全く問題がないなら Class::size_typeの存在意義はない ですよね。
size_tでは問題になる可能性があるのなら size_tを使ったらいけない
ってことになるんじゃ??


486 名前:デフォルトの名無しさん :02/11/02 16:07
size_tもsize_typeも符号無し整数型と決まっているから
その処理系で最大の符号なし整数型で受ければ何の問題もない

487 名前:デフォルトの名無しさん :02/11/02 16:14
>>485
どうしてそう両極端に考えるんだ?

>>484
> サイズを表す数値の型は size_t と決まっている。
> だから 「大抵は size_t で通じる」。
> size() が size_t 以外を返すのはよっぽどの事情がある場合で、その場合は
> 素直に Class::size_type を使うべき。

結局、その class がどういうものかわからないと何とも言えないと言う事だ。
ただし、普通の Class::size_type が size_t であることはまず無いから、
size_t とみなして良いという事。
(ダメなときはそもそもコンパイラが怒る)

そしてそもそも、

>>469
> 1. intじゃなくてvector::size_typeを使う
> 2. size()の戻り値をintにキャスト
> 3. ワーニングを無視
>>470
> 1. が王道。

どう結論出していいか迷うなら、まず Class::size_type を使え。

488 名前:487 :02/11/02 16:15
訂正。

×: 通の Class::size_type が size_t であることはまず無いから
○: 通の Class::size_type が size_t 以外であることはまず無いから

489 名前:デフォルトの名無しさん :02/11/02 16:40
X3J16/96-0225 WG21/N1043 より

20.1.5 Allocator requirements

expression:
  X::size_type
return type:
  unsigned integral type
assertion/note pre/postcondition:
  a type that can represent the size of the largest object in the allocation

The typedef members pointer, const_pointer, size_type, and difference_type are
required to be T*, T const*, size_t, and ptrdiff_t, respectively.

他の標準クラスは Allocator::size_type をそのまま引き継いでいるようです。
だから標準で済ませる限り size_t と見なしていいみたいですね。

うがった見方をすれば、独自の Allocator で、size_type を整数表現する class に
すり替える事も可能と言えば可能。

490 名前:ふトンカ ◆wX94FutoNg :02/11/02 19:22
Perlで変な掲示板などを作っております。
しかしとてつもなく重いです。

CかC++あたりを勉強してWindowsのGUIプログラムでも作りたい物もあるし、
さらに変なものを作りたいのですが、とりあえず必要なものはなんでしょう?

エデッタ、コンパイラ(BCC32とかでいいのでしょうか?)、入門書みたいな本、自分
以外に必要な物はありますか?
なんとか C++ とか、高い物もいきなり必要なのでしょうか?


天才とかはありません…。

C/C++の違いは、、なんか++が付いていてお得そうなので、こちらに質問します、、
(これでいいのかな自分( ゚_゚ )?)

491 名前:デフォルトの名無しさん :02/11/02 19:25
>>490
perlやってるんなら正規表現が欲しいだろうから、boostのregexとか
触ってみれば。

492 名前:デフォルトの名無しさん :02/11/02 19:33
>>490
何か困った事が発生してから質問してください。
そうでないなら、まずは始めてください。
一番必要なのは、コードを書く事です。

ちなみに、C/C++ から GUI を扱うにはいろいろ覚える事があり、一朝一夕には
できません。
とにかく GUI をやりたいと言うなら、C/C++ は一旦置いといて HSP (無料)
あたりにでも手を出してください。

493 名前:ふトンカ ◆wX94FutoNg :02/11/02 19:34
Perlはある程度できますがC++などは全く素人ですので
正規表現使う必要が出てくるまでにかな時間がかかりそうです。。
Perlですら最初の一応役に立つプログラムまで2ヶ月かかってますし
役に立たないプログラムならもっとすぐに書いていましたが…

494 名前:デフォルトの名無しさん :02/11/02 19:37
>>493
掲示板だけならコンソールアプリケーションで十分だから、GUIはとりあえず
必要ないと思います。

C++のstd::stringを使えばバッファオーバーランの問題も避けられるはずです。

495 名前:ふトンカ ◆wX94FutoNg :02/11/02 19:39
>>492
どちらかというと、GUIは後から、重い言語以外にもう1つ覚えたいといったところでしょうか
とにかく解説書なりページなり見て、
プログラム書いて書いて書きまくれということですね。
ではそうしたいと思います。

Perlの時はソースを改造→分からないから解説書→0から書けるように
なっているので、こういうやり方は初めてですが。

やってみたいと思います。
回答ありがとうございました。

496 名前:デフォルトの名無しさん :02/11/02 20:32
dynamic_cast の計算量について、なにか予測できることってありますか?
クラスの数に比例する?とか、
多重継承すると???とか。

497 名前:デフォルトの名無しさん :02/11/02 21:10
>>496
処理系依存?
単継承と重継承でパフォーマンステストしてみたら?

498 名前:デフォルトの名無しさん :02/11/02 21:20
class Single {
public:
static Single* getInstance() { /* 省略 */}
void func() { /* なにかの処理 */ }
private
Single() {}
static Single* _instance; }
Single* Single::_instance = 0;

とかいうしんぐるとんクラスがあって、このインスタンスを使う場合は、


class UseSingle {
public:
UseSingle() { sin = Single::getinstance(); }
void use() { sin->func(); }
private:
static Single* sin;
}

のような感じでいいの?



499 名前:デフォルトの名無しさん :02/11/02 21:40
使う側は単に
Single::getInstance()->func()
でいいのでは?。

わざわざ呼ぶためのクラスを作る必要はないし、どこからでもアクセス
できるのがSingletonのメリット。

500 名前:496 :02/11/02 21:42
g++-3.1.1 でテストしてみました。

class B { public: virtual ~B(){}; };
class D1 : public B {};
class D2 : public D1 {};
class D3 : public D2 {};
で、dynamic_cast<D1*>をそれぞれの実インスタンスへのポインタでテスト。
B < D1 < D2 < D3 となって、継承の回数に比例してる感じでした。

継承ツリーを順にたどる処理が想定できますが、そのまんまの実装ぽいですねぇ。


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.