[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/23 14:20 / Filesize : 191 KB / Number-of Response : 803
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part94



1 名前:デフォルトの名無しさん mailto:sage [2012/02/18(土) 06:07:36.70 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part93
toro.2ch.net/test/read.cgi/tech/1324922431/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.77【環境依存OK】
toro.2ch.net/test/read.cgi/tech/1323692486/

■長いソースを貼るときはここへ。■
 codepad.org/
 ideone.com/

263 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 12:45:05.47 ]
>>259
( ´,_ゝ`)プッ

264 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 13:18:59.12 ]
>>263
なんだBOTか
相手して損したわ

265 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 14:24:34.52 ]
>>262
そうすか
ちょっと見なおしてみます

266 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 15:35:03.73 ]
Javascript/ECMAscriptスレに飽きてこっちにキたのか?

267 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 21:28:09.73 ]
_beginthreadexで3つのスレッドを作る場合
_endthreadexでここのスレッドを判別するにはどうしたら良いのでしょうか?

268 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 21:45:29.47 ]
_endthreadexはスレッド内から呼ぶものであって
判別もなにもないぞ

269 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:09:55.29 ]
>>267 その話をすると >>257 が湧いてくるぞ
_beginthreadexは方言の話以上に、OS依存の話だからな。

270 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:12:09.75 ]
>>267
スレッドのポインタを使う

271 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:19:41.38 ]
_endthreadexを使うのと、_beginthreadexの戻り値で取得したハンドルをCloseHandleで消す方法ってどう違うの?



272 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:30:04.82 ]
>>271
_endthreadexにはバグがあって100%メモリリークするから
常にCloseHandleを使う方法を利用するほうがいい
_endthreadexは忘れてもいいよ

273 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:33:09.91 ]
>>272
マジですか?
有用な情報ありがとう!

274 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:33:21.03 ]
_endthreadexなんて何に使うの?
普通にreturn 0;で戻ればいいだけじゃね?

275 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 22:36:21.65 ]
>>274
それだとスレッドが永遠に走り続けるからヤバイ

276 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:01:52.31 ]
>>275
うそん
msdn.microsoft.com/ja-jp/library/hw264s73(v=vs.80).aspx

277 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:04:37.17 ]
あれじゃん。メモリーリークするつってんのは、デストラクターが呼ばれないからでしょ。
return;でスレッド関数終了するとちゃんとデストラクター呼ばれるし、そのあと自動で_
endthreadex呼ばれてスレッド自体もちゃんと破棄されるじゃん。

278 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:06:13.69 ]
あと、CloseHandleはスレッドハンドル閉じるもんでしょ、
ハンドルのリソース解放するもんで_endthreadexとは毛色がちがうじゃん。

279 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:26:04.51 ]
_beginthreadexって基本クソだよね
他のが使えるなら他の使うのが良い

280 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 23:42:01.49 ]
exit(int)のスレッド版でしょ。
代替手段を考えるにしても_exitthreadexを使おうと思うに至る事自体が稀だと思うが。

281 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 00:04:45.82 ]
throwしてスレッドエントリでcatchすべき
スレッド内でcatchされない例外があるとプログラムが死ぬ



282 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 02:25:57.18 ]
>>272
_endthreadexとCloseHandleを同列に見るやつ前もいたけどcalleeとcallerの区別もついてないのかよ

283 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 04:20:10.08 ]
マクドナルドでの便利な呪文:
「callerください。あ、calleeは抜きで!」

284 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 05:46:41.76 ]
【審議中】 ( ´・ω) (´・ω・) (・ω・`) (ω・` )

285 名前:デフォルトの名無しさん [2012/03/11(日) 07:57:50.53 ]
最近なるべくconstを付けるように意識してるんですが、constなメンバを持つクラスの
operator =を書くときに困っています。
たとえば内部に持つバッファのサイズなどはコンストラクタで決まり、以後変更されないのでconstにしています。

が、そうするとconst_castでconstをはがさないと代入演算子が書けないわけで・・・
こういうときはどうするべきなのでしょう。

1.constではなくmutableにすべき
2.代入演算子を書くべきでない。使うときはコピーコンストラクタで済ませるべき
3.そもそもその程度の不変性ならconstにするな

アドバイスいただけると嬉しいです。

286 名前:デフォルトの名無しさん [2012/03/11(日) 09:34:11.03 ]
3だね

287 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:02:34.88 ]
メンバでconstってほとんどつかわんよ
コンパイル時定数ぐらい

288 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:06:44.76 ]
俺も定数以外では引数にしか使わないな

289 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:14:39.10 ]
メンバでconst使うとしたら
コピーコストの大きなオブジェクトを
コンストラクタのconst参照で受け取って保持するときくらいだな。
寿命の管理に気をつけないといけないけど。

290 名前:デフォルトの名無しさん [2012/03/11(日) 12:17:04.81 ]
そもそも代入の対象が const って、超初歩的な誤りじゃん

291 名前:285 mailto:sage [2012/03/11(日) 12:25:51.16 ]
なるほど・・・納得しました。
constつけないように変更してみます、ありがとうございました。



292 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 12:30:29.30 ]
構築された後は、そのオブジェクトにどんな操作をしても値が変わらないメンバならconstにすべきだろうけど

293 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 17:16:33.24 ]
ポインター以外にどうしてもconstつけたいなら、
代入演算系をprivateにして制限するのも手よ。
imutableオブジェクトの完成だ。

294 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 21:34:23.89 ]
ハンドルされていない例外が発生しました。
↑が直らないんですが、どうやって対処すれば良いのでしょうか・・・

295 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 21:53:56.51 ]
>>294
例外をハンドルすればいいと思うよ。

296 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:31:10.52 ]
>>295
日本語でおk

297 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:42:45.65 ]
訳すと馬鹿には無理

298 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:47:22.51 ]
>>294
教えてもらおうとしても駄目
このスレには屑しかいないんだから

299 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 22:48:11.87 ]
>>294
例外の中身を調べてみろよ

300 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 23:35:07.57 ]
「例外をハンドルするには」でググったらいい

301 名前:デフォルトの名無しさん mailto:sage [2012/03/11(日) 23:40:03.44 ]
>>300
catchする時、型が解ってなけりゃいつまで経っても
ハンドルできんだろう



302 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 00:01:33.95 ]
try{ throw exception(); }catch(...){}

303 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 01:41:36.01 ]
動的配列の途中に挿入・削除をする方法を教えてください。

listである条件に当てはまるものを削除したいときは
remove_if()を使えばいいらしいのですが、使い方が分かりません。

304 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 01:56:24.45 ]
erase insert使えばいいよ

305 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 09:01:46.79 ]
>>303
此処読んでみな。
marupeke296.com/TIPS_No12_ListElementErase.html

306 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 11:22:45.03 ]
ttp://ideone.com/Z10hJ

307 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:29:50.20 ]
>>305
ありがとうございます
これで大方理解できました。

>>306
[](int val){ return val == 2 || val == 3; }のようにわざわざ他で関数を作らなくてもできるんですね。参考になります。
[](type n){}の書き方の[]の意味は戻り値の型の略称ということでいいんでしょうか。

308 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:36:26.00 ]
よくないです

309 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:38:07.37 ]
「c++ ラムダ式」でググるといい
特に[]の中の指定は結構特殊だから

310 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 18:38:16.12 ]
C++でFortranのようにベクトル計算するにはどうすればいいんですか?


311 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 19:53:31.50 ]
>>309
普通に使う分にはある程度できるようになりました。
ありがとうございます。

あとはクラスがどうのこうのを学ばないとなぁ



312 名前:デフォルトの名無しさん mailto:sage [2012/03/12(月) 20:53:36.74 ]
>>310
uBlus or Blits++

313 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:05:49.64 ]
boost::shared_ptrをvoid*に入れたいのですが、できますでしょうか?

フレームワークに設けられている便利に使っていいvoid*なんですが
&でアドレス取得して入れたら、うまく動作しませんでした。

&でアドレス取得する場合、参照カウントが増えなくて消えちゃうみたいです。

こういう時ってどう実装するものなのでしょう?。。

314 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:21:32.29 ]
struct foo{boost::shared_ptr ptr;};とかやればいいんじゃねーの

315 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 19:55:09.32 ]
>>314
ありがとうございます。試してみます。

316 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 20:21:24.59 ]
boost::shared_ptr を new して void* に渡すとか

317 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:35:58.79 ]
すみません、アルゴリズム的な作曲をやろうとしている文系です…
ソースを貼らせてください

codepad.org/C3hsBjQo

余計な部分は省略しています。
これで、コンパイル時のエラーはないのですが、scanfが実行される前に、
プログラムが止まってしまいます。
本当に稚拙なプログラムで済みません、初心者なもので。
どなたか問題点を教えていただけないでしょうか。

318 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:39:51.79 ]
p = 0 じゃなくて p == 0 だな

319 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:40:09.29 ]
他にも色々な所で同じ間違いがあるね

320 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 22:52:01.51 ]
数字を入力するプログラムで下のように書いたとき
「-1」と入力すると”数が正しくありません〜”とでて次の”数を入力してください->”に戻るけど
「a」と入力すると”数が正しく〜”と”数を入力〜”がずっとでつづけます
なぜなんでしょうか?

while(1) {
cout << "数を入力してください->";
cin >> num;
state =cin.rdstate();
if (num <= 0 || state != std::ios_base::goodbit){
cout << "数が正しくありません。最初に戻ります。\n" << endl;
continue;
}


}


321 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:12:41.47 ]
エラー復帰してないから
エラーを clear() してから a を読み捨てないと、
永遠に先まで読み進められない



322 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:24:47.10 ]
>>318さん
>>319さん

回答有難うございます!さっそく直してみて、scanfが実行されるまではいったのですが、
そこからが進みません。
多分、N1hosei関数が悪いんだと思います。
入力したpが、12以上になってしまたらマイナスし、0以上になってしまったら
+する。
pが、jからj+2、またiからi+4の範囲にあったら、+を続け、また同時に、
p == k または p == h になってしまったら、更に+する、
つまるpが、jからj+2、iからi+4の範囲になく、かつkでもhでもない、数になるまで
演算をループさせたいのですが…

323 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:36:16.35 ]
>>321
エラー復帰とは具体的にどういうことをすればよいのでしょうか?
初心者で申し訳ありません

324 名前:デフォルトの名無しさん mailto:sage [2012/03/13(火) 23:46:00.25 ]
> > エラー復帰とは具体的にどういうことをすればよいのでしょうか?
> エラーを clear() してから a を読み捨てる

325 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:04:08.42 ]
>>322
>p == k または p == h になってしまったら
It means
if (p == k || p == h) {
}
not
if (p != k && p != h) {
}


326 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:21:23.51 ]
>>324
何をclearすればよいのでしょうか?
cin.clear();
をやってみたのですがダメでした・・

327 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:25:04.26 ]
>>326
>a を読み捨てる

328 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 00:28:09.60 ]
初心者でもそれくらい調べろよ

329 名前:326 mailto:sage [2012/03/14(水) 15:19:23.31 ]
cin.clear();
cin.ignore();

をしたら解決しました
>>321の言うとおりclearしてignoreしたら正常に動作しました
ありがとうごさいました

ただ何故こうしたらうまくいくのかよくわかりません
上の2つを逆にしてもダメでした
どなたか解説して頂けると助かります

330 名前:322 mailto:sage [2012/03/14(水) 22:08:26.53 ]
>>325

返信有難うございます。
int N1hosei(int i, int j, int k, int h,int &p){//iやjの範囲内だったら、
         if(p > 12){
do{
  p--;
}while((p == k) || (p == h)); //12以上になってしまったら、h,kでなくなるまで-する。h,kでなくなったら、再び一番最初の条件に戻る
return p;
}else if (p < 0){
do{
p++;
}while((p == k) || (p == h));//0以下になってしまっていたら、i,jの範囲外になるまで+して、//h,kでなくなるまで+。で最初の条件に戻る。
return p;
}else{//0≦p≦12、つまり普通の場合は、これ
if((p == k) || (p == h)){
p ++;}
return p;
}
}

このように書き換えて見たのですが、うまくいきません…何が悪いのでしょうか。。
指摘していただけると、大変助かります。

331 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 23:49:53.69 ]
いや、そのへん以前に
 j <= p <= j+2

 (j <= p) <= j+2
であってpがある範囲内にあるかどうかの判定になっていないから



332 名前:322 mailto:sage [2012/03/14(水) 23:54:51.40 ]
>331さん

なるほど!
ではpがある範囲内にあるかどうかの判定は、
j <= p && p <= j +2
とでもすればいいのでしょうか。

333 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 00:09:21.33 ]
>>329
ちったぁ考えれ

cin >> num; で a が見つかってエラーになって、cin.clear(); しても、
次の読み込みはまた a からなの
正しく読めるまで先には進まないの
だからまたエラーになるの
これがずっと続くってわけ

334 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 00:10:46.51 ]
初心者ってcinを使いたがるけど、これ初心者には必要ないよね。
つーか誰にも必要ないよね。

335 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 01:05:51.31 ]
>>332
それでいい

336 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 09:58:01.30 ]
継承元のoperator=を使用したい時は、継承したoperator=の中でキャストして呼ぶしか無いでしょうか?
CBaseAを継承し、CSpecとします。

CSpec CSpec::operator=(const CSpec &obj ){
CBaseA *p1 = dynamic_cast <CBaseA *> ( this );
CBaseA *p2 = dynamic_cast <const CBaseA *> ( &obj );
if( (p1 != nullptr) && (p2 != nullptr) ) *p1 = *p2;
}

今はこのようにしています。

337 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:04:21.02 ]
>>336 this->CBaseA::operator=(obj)

338 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:05:43.28 ]
別にキャストいらんだろ
てかdynamic_castは間違い

339 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 10:14:28.60 ]
>>337
有難うございます!
こういう書き方も出来たんですね!

>>338
ダウンキャストは承知していましたが、継承元のoperator=を呼ぶ必要があったために
やむ終えず>>336の書き方をしていました。
知識不足で恥ずかしい限りです。

340 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 15:03:40.92 ]
キャスト使うならこうだろ
static_cast<CBaseA &>(*this) = obj;

341 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 21:11:41.42 ]
>>334
Linux関連じゃ、istreamに突っ込んでんのをたまに見る



342 名前:デフォルトの名無しさん mailto:sage [2012/03/15(木) 21:12:46.78 ]
>>337
thisもいらんだろ

343 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 16:43:24.83 ]
初心者です。
ppm形式のバイナリファイルの画像を読み込み,pgm形式に変換して配列に画素値を格納したいと考えています。
そこで画素読み込み部分を以下のように書いたのですが

for(int y = 0; y < m_height; y++){
      for(int x = 0; x < m_width; x++){
double r,g,b;
ifs.read((char*) &r, sizeof(double));
ifs.read((char*) &g, sizeof(double));
ifs.read((char*) &b, sizeof(double));
pixels[x][y] = r * 0.299 + g * 0.587 + b * 0.114;
}
}

pixelsの配列内を確認してもどの位置の画素も同じ値になってしまいます
どこが間違ってるのでしょうか;;


344 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 16:46:01.81 ]
オーバーフローしてんじゃね

345 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:08:10.03 ]
>>343
そりゃ、1画素がchar 1個分だもんな。
1画素をchar 6個分(double)で読み込みゃそりゃずれるで

346 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:15:48.22 ]
doubleは8個分

347 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 17:21:19.83 ]
ppm の形式は知らないけど

char r,g,b;
pixels[x][y] = (double)r * 0.299 + (double)g * 0.587 + (double)b * 0.114;

じゃないの?


348 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 19:14:02.74 ]
テンプレのFAQが英語なんですけど翻訳して読めってことですかコレ

349 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 19:51:44.93 ]
どのプログラミング言語にしても英語が読めたほうが捗るぞ。
なんたって言語作者の9割以上が外国人だしな。

350 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:12:39.10 ]
フランスに渡米するみたいなもんか

351 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:16:47.83 ]
そりゃ人間の9割以上が外国人なんだから当然だろうよ。



352 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:21:36.94 ]
Rubyは貴重だな

353 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 20:26:28.13 ]
英悟は別格で置いとくとしてGoogleで調べると日本語と他の国言語では
Rubyに限らずコンテンツ量が一桁以上違うから
内容の濃淡は知らんけど日本は恵まれてると思うよ

354 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:44:20.01 ]
ちょっと日本語がわからない。
もう少しわかりやすく。

355 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 21:45:35.76 ]
いうても、日本語ほど英語と文法の離れてる言語も多くないよな。
多少ひねれば英語化できる言語圏じゃ、母国語資料の少なさなんて
大した問題じゃないんだろ。リーナスやハゲだってフィンランド人だし。

356 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 22:13:22.65 ]
多いよ
SVOは全言語中でむしろマイナー
日本語と同じSOVが45%を占めている

357 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 23:04:35.70 ]
母国語でここまで頑張っている、というのもある意味驚異的なことでして。

358 名前:デフォルトの名無しさん mailto:sage [2012/03/18(日) 23:42:15.55 ]
プログラムに限らず母国語話者に対する期待の違いだろうね
途上国言語で話題振っても誰も付いてこない来れない悲しみと対極にある

359 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:02:14.89 ]
そういう国は英語で頑張ってるからな

360 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:07:25.08 ]
ボビーオロゴンとかアホそうな振る舞いしてたけど
真面目に話したら、俺らよりはるかに頭いいんだろうな
何せマルチリンガルらしいし

361 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 00:13:38.15 ]
C++に関しては繁体字圏がコンテンツ量で結構頑張ってるな
perlやHaskellなんかだと日本語と比べるべくも無いが



362 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:23:37.24 ]
>>344-347
回答ありがとうございます。
やっぱり全然本質を理解できてないですね^^;参考になりました。

もうひとつ聞きたいことがあるのですが
バイナリで書かれたppm形式は画素値はバイナリで書かれていますが、ヘッダはテキストで書かれています。
このときifstreamを使ってファイルを読み込むときはオープンモードはbinaryを指定したほうがいいのですか?
またヘッダのテキスト部分がコメント等で長さが分からない場合に、ヘッダ部分を読み飛ばすにはどうしたらいいのでしょうか?
環境はVC++2010です。

363 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:35:39.30 ]
>>362
ppmを厳密に解釈するなら、libpnmのソースと同じようにやるしか。
簡易的には、バイナリで開いておいて行単位に読み出して、コメント行か有効行か判断する。
幅、高さ、濃度最大値を取得できたら、その後はバイト単位で読み出す。

364 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:36:02.85 ]
テキストは特別な意味を持ったバイナリなので、やりやすい方を選ぶといいよ。
でも、テキストでオープンすると改行コードをイジっちゃうのでバイナリの意味が変わっちゃうことがあると思う。

365 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 02:56:31.39 ]
今回のケースはバイナリppmの読み込みだから、本体を読むときはテキストモードじゃダメ。

366 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 13:31:21.65 ]
RPGでいういわゆるイベントのクラスを作り起動時にバイナリファイルから読み込ませたいのですが
あるイベントは会話が何ページもあったりと可変長なデータがあるためインスタンスによってサイズはバラバラです

このような大きさがバラバラなデータが詰まったバイナリファイルからデータを読み込むには
普通どのような仕様にしているのでしょうか?全然想像がつきません 環境はVC++2010です

367 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 13:37:28.25 ]
>>366 std::string, std::vector などのコンテナを使う。

368 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:08:38.64 ]
ありがとうございます
vectorコンテナでデータを書きこむ時に
データの長さも同時に書きこんでおくといった方法でいけそうですね


369 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:11:58.88 ]


370 名前:366,368 mailto:sage [2012/03/19(月) 14:27:55.83 ]
>>369
例えば2つの可変長データを含む構造体をバイナリで保存した場合、
それぞれの長さが分からないと、

読み込む時最初の可変長データの次のデータが可変長データの続きなのか、
それとも次の可変長データなのか判断する方法がないと思ったのですがおかしいでしょうか?

371 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:36:19.03 ]
>>366
なんでバイナリなの?
xmlは使えないの?
データ構造とファイル設計は混同しちゃダメだよ。



372 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 14:37:39.25 ]
vector<構造体> msg;
で、必要な数だけpush_backする。

表示する場合は、msg.begin()msg.end()を使えば良いのでは?

373 名前:366 mailto:sage [2012/03/19(月) 15:43:41.33 ]
>>371
xmlが使えるといいなと思うのですが、ファイルの中身が見えてしまうもので
ゲームというジャンルのために暗号をかけたバイナリデータに拘っていました。
本当はバイナリデータなんて使いたくないのですが…。

>>372
きちんとロードできるか試してみます。
表示はそれでいけると思います。

ありがとうございます。

374 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:33:23.80 ]
>>373
XMLだって暗号化できるでしょ?
データの記述方法とデータ構造とファイル構造をごっちゃにしちゃだめだよ。

375 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 17:52:10.63 ]
class R{
shared_ptr<A> a_;
public:
weak_ptr<A> getA() {return weak_ptr<A>(a_);}
【or】
A *getA() {return a_.get();}
};
リソース管理クラスを作りたいのですが外部からAを利用したい場合weak_ptr・生ポ(constでない)どちらで取得するのが良いのでしょうか?
※a_の寿命はR内で管理したいのでshared_ptrは公開したくありません


376 名前:366 mailto:sage [2012/03/19(月) 18:37:22.16 ]
>>374
xmlってそんなこともできるのですね知りませんでした、お恥ずかしい限りです。
xmlについて勉強してみます。

377 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:34:03.99 ]
大学でC言語習ったけど全くこのスレのレベルについていけない半年ROMるとなんか変わるの?

378 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:40:54.84 ]
>>375
weakをlockしたらshared_ptr取れちゃわない?

俺も似たような問題で悩んでweak_ptrのようにオブジェクトの生存確認が
できるけど所有権は主張しない生ポインタとスマートポインタの中間みたいなやつを
実装しようか迷った末やらなかった


379 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 19:45:52.94 ]
>>376
XMLというか、文字列orバイナリについて暗号化かけるだけだから、
別にXMLどうこうじゃないよね
例えば全部の文字についてXORかければ最低でも普通には読めないで高速な暗号化できるわけで。

380 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:15:38.57 ]
>>378
ありがとうございます。取れちゃいますね、、
weak_ptrのlock()が *get()になるようなバージョンがあるといいんですが。
素直にポインタで公開するのが妥当なのでしょうか?

381 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 20:20:29.26 ]
普通に生ぽでいいんじゃね
どうせ呼んでる間は死なないんだろ



382 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:06:28.71 ]
>>377
さすがに半年ROMったらかわるっしょ

383 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 22:07:30.27 ]
>>380
ハンドルを使う方法もあるけど、
実際ポインタで困ることはそんなに無い気がする

384 名前:デフォルトの名無しさん mailto:sage [2012/03/19(月) 23:53:51.31 ]
>>377
とりあえず自分に必要なものを作ってみて、実用しないとニーズの比重がわからないよ。

385 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 13:37:16.64 ]
C++では、Cのように関数の引数の型宣言を)と{の間に
書けないとのことですが、引数が多い場合は、()の中に
改行して書けということでしょうか?

386 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:00:00.62 ]
そうだよ

387 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 14:54:19.71 ]
今時そんな構文使えるCコンパイラあるんけ?

388 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:09:18.14 ]
Ruby開発者がなぜかこれにしがみついてたなあ

389 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:18:26.47 ]
むしろ使えないCコンパイラがどんだけあるんだよって話

390 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 15:20:35.12 ]
CならC99専用でもない限り使えると思うぜ
まあ極めて問題のある構文だから使わない方がいいが

#include <stdio.h>

int foo(a, b)
 int a, b;
{
 return a + b;
}

int main()
{
 printf("%d\n", foo(1.2, 2));
 return 0;
}

実行結果: 1931896422

391 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:20:35.89 ]
Code Pad上ならエラーになるな
まぁGCCの問題だけど
codepad.org/ceAMmTJC

いま動くコンパイラって何が有るの?
16bit時代のコンパイラ?



392 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:23:00.68 ]
>>385
int Function
(
     int arg1,
     int arg2,
     int arg3,
)
{
     return 0;
}

初めて見たときは寒気が走ったがこういう書き方するところも有る。

393 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:26:01.05 ]
全角スペースでエラーになるのがgccの問題とか言っちゃう男の人って・・・

394 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:41:08.16 ]
>>391
あいたたたたた

395 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:46:28.00 ]
>>392
最後のコンマは書けないぞ

俺はこうか

int Function(
 int arg1,
 int arg2,
 int arg3
) {
 return 0;
}

こうだな

int Function(
 int arg1,
 int arg2,
 int arg3)
{
 return 0;
}

エディタとの相性に合わせて使う

396 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:47:47.41 ]
メンゴメンゴやっぱうごいたわ
codepad.org/3TQKnfBZ

397 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:49:06.61 ]
>>395
カッコの揃える派とカッコどうでもいい派に好みは別れるよね

398 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:56:42.52 ]
既存にあわせちゃう

399 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 16:59:09.59 ]
>>396
この書き方だと型チェックが行われないので
1.2 が double 値のままスタックに積まれて、
それを int 値として取り出した結果、無茶苦茶なことになっている
簡単に未定義動作が起きる極めて危険なものなので
今時決して使ってはいけない

400 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 17:05:06.31 ]
>>390
C99でも廃止予定事項なだけで使えるぞ。

401 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 19:49:26.83 ]
385です。先輩方いろいろ教えて下さり有難うございます。
括弧の中に書くのはやっぱり慣れてないというのもあって、
不細工な気がしますね。諦めてpascalに行こうかしら。



402 名前:デフォルトの名無しさん mailto:sage [2012/03/20(火) 23:10:23.09 ]
その方がいいと思う。

そんな危ない書き方を慣れてないという理由だけで継続するとかとんでもない話だし。

403 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 08:42:18.70 ]
>>399
これでOK。
codepad.org/oyP2YgaY

型を省略したらint型ってことだけど、危なくてしゃぁないな。

404 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:07:25.08 ]
以前このスレッドでラムダ関数(ラムダ式)の再帰が出来ると聞いたのですけど。
具体的にはどのようにやるのですか?
例:
ある型 f;
f=[ & f ](int a){if(a==0)return; else f(a-1 )};

ってかんじですか?

405 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:47:34.68 ]
ttp://ideone.com/Vdw5h

406 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:50:18.46 ]
>>405
ありがとうございます。
autoとfunctionの違いは教えてくれませんよね?

407 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 11:55:23.10 ]
>>406
ググれ

408 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:46:09.58 ]
メモリ断片化対策としてメモリプールを使ったメモリ確保を実装したいのですが
STLや標準ライブラリなどはいちいち自前のアロケータを指定する方法しかないんでしょうか?

409 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:18.96 ]
それ以外のどんな方法がほしいんだ?

410 名前:デフォルトの名無しさん mailto:sage [2012/03/21(水) 23:49:43.38 ]
>>408
プールの実装に確保サイズ以外の情報を使わないのであれば ::operator new () を
置き換えるという方法もあるよ。

411 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:01:40.50 ]
>>410
new/delete演算子をグローバルなオーバーロードをすれば
STLや標準ライブラリからも呼ばれるということでしょうか?



412 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:12:39.92 ]
>>411
そういうこと。少なくともアロケータ引数を取るテンプレートはデフォルトで std::allocator を
使うことになってて、デフォルトの std::allocator 実装は ::operator new を使うことになってる。

この場合の ::operator new/delete の定義はオーバーロードじゃないけどね。
あとSTLも標準ライブラリの一部な。

413 名前:デフォルトの名無しさん mailto:sage [2012/03/22(木) 00:20:42.01 ]
>>412
ありがとうございます。
やってみます。

414 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 01:16:08.89 ]
newを自作関数に置き換える手法も容易して欲しいよな。

415 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 03:36:11.12 ]
>>414
それが >>410-413 じゃないのか?

416 名前:デフォルトの名無しさん mailto:sage [2012/03/23(金) 08:52:23.54 ]
>>414
何言ってんだかわかんねーな

417 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:09:01.95 ]
operator new で乗っ取れるんだが、ヘッダにインラインで書けないんだよ

418 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 01:34:29.07 ]
>>417
グローバルに置き換えるんじゃ何か都合が悪いのか?
都合が悪い、指定した対象だけに絞りたいとすれば、それは
アロケータでの指定を行うのが妥当ということにはならないのか?

419 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:34:30.02 ]
高速化のために自作newをインライン展開したいんだけどね。
できる処理系と出来ない処理系がある。

420 名前:デフォルトの名無しさん mailto:sage [2012/03/24(土) 23:38:11.15 ]
クラス内に new 置けばできるでしょ。

421 名前:デフォルトの名無しさん mailto:sage [2012/03/25(日) 01:48:53.74 ]
きょ、局所的・・・。なんでもないよ。



422 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 09:32:26.41 ]
相談室ということで何やらぼんやりとした質問ですが
virtualとはつまるところ、こいつを継承した何かがあるかもしれないから継承先があるかどうかチェックしてね、という目印のようなものでしょうか

423 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 10:18:58.88 ]
>>422
仮想関数、純仮想関数、ポリモーフィズムとかについて調べた?

424 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:00:04.90 ]
答える必要があるのかしら?

425 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:06:27.51 ]
答えなくてもいいが答えてくれるとは思うな的な

426 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 16:08:31.14 ]
エリートでらっしゃったのね

427 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 17:45:48.25 ]
相談室に居ながら答えを出し渋る書き込みをする事に何の意味があるのだろうか
教えないつもりなら素直にスルーしとこうぜ
せっかくこういうスレがあってもわざわざ妨害してたら何にもならんし

428 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 18:56:37.91 ]
セイラさんは黙っててくださいよ!

429 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 19:12:33.48 ]
>>422
基底クラスのポインタや参照を使ってメンバ関数を呼んでも
本来のクラスのメンバ関数が呼ばれるというもの

430 名前:デフォルトの名無しさん mailto:sage [2012/03/27(火) 21:51:38.93 ]
>>422
virtualの有無で、コンパイル結果をアセンブラレベルで比較したことがある。
明らかに違うんだよね。当たり前だが。
で、ポリモーフィズムの仕組みを妙に納得したり。


431 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 21:52:36.51 ]
Smalltalk環境として動作してくれるC++のライブラリってないですかね。
別に、Smalltalkのワールドみたいなウィンドウ表示とかは要らないんで、
Smalltalkのイメージファイルを読み込んで、メソッドを記述した文字列を
送ってやると値を返したり、何らかの振る舞いをするってものでいいんですが。



432 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:33:58.48 ]
テンプレートメタプログラミングが関数型に近い動作というのを聞いたこと有るよ。俺、関数型知らないけど。
プリミティブから作るかBoostにもあったような気がする。

433 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 22:48:08.42 ]
日本語で書いてくれ

434 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:51:36.82 ]
テンプレートメタプログラミングが関数型に近いって!フフフッ
でもね、関数型知らないんだ♪
プリミティブかBoostでいい感じ〜☆
わかんないけど、とりあえずオッケー☆ウフフ☆ タコヤキ!

435 名前:デフォルトの名無しさん mailto:sage [2012/03/28(水) 23:59:41.95 ]
>プリミティブから作るかBoostにもあったような気がする。
ここが何言いたいのかさっぱり解らん
前の文とつながってない

436 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 00:57:09.00 ]
えーっと、プリミティブって書いたのはifとかforとかから構築が必要ってこった。タコヤキ!
・・・どこからタコヤキ出てきたんだろう。

さいきんのわかいもんは!・・・なんでもないよ。

437 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 07:20:55.86 ]
Objective-C++でいいんじゃね

438 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 09:39:55.77 ]
class Base
{
  virtual Base* Duplicate() const { return new Base(*this); }
};

class Derived : public Base
{
  virtual Derived* Duplicate() const { return new Derived(*this); }
};

という複製処理を仮想関数として作成する場合、
Derived::Duplicate()の戻り値がDerived*でよいのは仕様として決まっていますか?
Visual Studioではちゃんと仮想関数として動くのですが。

それとも、どちらもBase*としておくべきですか?


439 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:24:50.56 ]
>>438
共変の返却値。仕様で認められてるのでDerived*でいい。

440 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 10:43:26.27 ]
>>439
ありがとうございます。そういう専門用語があったのですね。
「共変の返却値」でググったら、全く同じような質問が出てきました。
失礼しました。

441 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 16:55:43.84 ]
共変と反変、どっちがどっちか未だに調べないと思い出せない。



442 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:06:22.51 ]
技術用語って時々、英語のまま考えたほうが理解できることがある。

443 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 18:42:38.31 ]
せっかく母国語化しても漢字に含まれる情報が誤誘導するのって
ソース中の無駄に多いコメントみたいなモンだな

444 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/29(木) 20:00:18.82 ]
字面で見ると漢字の方がわかりやすい


445 名前:431 mailto:sage [2012/03/29(木) 20:02:26.55 ]
Panda SmalltalkというScript Engineで解決できそうです。有難うございました。

446 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:14:39.78 ]
右辺値参照について教えて下さい。
VC2010 で、
struct Hoge {
    Hoge(Hoge&& rhs) {
        *this = rhs; // 1
    }

    Hoge& operator=(const Hoge& rhs); // 2
    Hoge& operator=(Hoge&& rhs); //3
}

1 の箇所で、3 が呼ばれるかと思ったら、2 が呼ばれてしまいました。
これは、規格通りの動作なのでしょうか?
もしそうなら、右辺値参照の operator= にもっていくには、
コンストラクタの引数に対して std::move() すればいいのだと思うのですが、
どうして引数の型が && なのに、再度 std::move しなければいけないのか
理由を知っていれば教えて下さい。

447 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/30(金) 22:27:00.73 ]
>>446
右辺値参照は普通の参照も受け取れちゃうから。
完全に転送したいならstd::forwardでも使いな。

448 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 00:06:50.58 ]
>>446
Hoge(Hoge&& rhs) { //ここでrhsという名前をつけているからこれは既に右辺値ではなく左辺値になる。
*this = rhs; // 1
//ここでrhsを使おうとする場合があるかもしれない
}

449 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:08:25.95 ]
www5b.biglobe.ne.jp/~suugaku/vc++kougi/kiso/dai7koudai2wa.html
このページの通りにやったのですがデバックして実行ボタンを押すとフリーズしてしまいます
まだ初めて日が浅いのでどうかおしえてください

450 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:12:23.55 ]
それはC++じゃありません
toro.2ch.net/test/read.cgi/tech/1268613679/
こっちで聞いてね

それにしても初心者がC++/CLIなんて自殺行為だぞ

451 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:31:16.28 ]
>>450
ありがとうござます

それなら別にフォームアプリケーションを作る方法があるのですか?



452 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 10:38:15.05 ]
>>451
C#を使うのが普通
今からでも遅くないからC#勉強しなさい
>>450のスレ流し読みしてそれでも使いたいっていうんなら止めないが…

453 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/03/31(土) 10:42:10.29 ]
>>452
自分は工業高校生で一年間C++でコンソールを作ってきたのでフォームアプリに挑戦したいと思って最近やってみたのですが

C#のほうがいいとは知りませんでした
ありがとうございます

454 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 11:04:53.79 ]
C++/CLIとか、業務で使わざるを得ないんでもなけりゃ見たくもないわ……

455 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 12:33:34.41 ]
C++/CLIを使う意味はないな。
C#を勉強した方が早い。

456 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/03/31(土) 13:28:04.74 ]
>>453
C++でGUIやりたいならQt調べろ。C#より楽だぞ。

457 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 16:46:46.56 ]
/*-----Class.hの中身-----*/
class hoge{
private:
bool x;
public:
void set();
};

/*-----Class.cppの中身-----*/
#include"Class.h"
void hoge::set(){
turn=1;
}

とすると実行時にturn=1ができません。
理由が分からないので教えてください。

458 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:10:47.73 ]
>>457
turnはどこで宣言されてるの?

459 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 18:48:41.50 ]
>>468
すいません
bool x; が bool turn; です
間違えました

460 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:00:24.75 ]
>実行時にturn=1ができません。
何がどうなるのか具体的に書きましょう

bool型の値はtrueかfalseだけど、警告をエラーにするオプションつけてたりする?

461 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 19:13:03.86 ]
>>460
エラーも警告も出ないのですが、ここの動作にとりかかると実行が中断します。
なので、turnの宣言ができてない又はturnを参照できないのだと思うのですが…



462 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:01:12.03 ]
turnがboolなら、trueかfalse代入するば良かろうに。

463 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 20:06:28.41 ]
>>462
変数がbool型云々ではなく、intなどでも同じように問題が起こってるので
変数宣言自体に問題があるかと思います…

464 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 21:58:21.48 ]
hoge* h;
h->set();

とかやってんじゃねーの

465 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 22:02:58.68 ]
>>464
問題はそれでした
普通にインスタンス化したら解決しましたありがとうございます

466 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/02(月) 23:12:56.30 ]
どうでもいいがC++で実体化(インスタンス化)というと
テンプレートの実体化を指す。オブジェクトをインスタンスとは言わない。

467 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:13:20.48 ]
マジか?

468 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 12:19:06.84 ]
>>466 んなこたーない。普通に文脈による。

469 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:16:40.29 ]
ロケール依存の大文字→小文字変換しようと思ってstd::ctypeみてたんだが、
tolowerって大文字/小文字のサイズが同じ前提で設計されてるように見えるんだが、
そうでない場合を考慮しておきたいときってどう書くのが妥当なんだ?
例:locale=tr_TR.UTF-8の時、大文字'I'(0x49)→小文字(0xc4 0xb1)

470 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 16:53:26.18 ]
インスタンスなんて
templateかCOMぐらいでしかいわんだろ
C++は実体が見えてる場合が多い上、
実体の共有もあんまりしないからな

471 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:06:38.85 ]
俺の周りだとクラスのインスタンスとかは言う
それを作ることをインスタンス化とは言わない

テンプレートに関してはインスタンス化と言うこともある



472 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:10:34.28 ]
メモリ上に実体化(instantiation)されたオブジェクト等と表現することは普通にあるが…
むしろインスタンス化って用語テンプレート以前の時代からあったよね?

473 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/03(火) 17:15:50.61 ]
OOに関係なく実体という意味でのインスタンスって言葉は昔からあった
HINSTANCEとかC++すら関係ない範囲だけど

474 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 00:49:13.79 ]
ただの一般名詞だよ。特別な意味付けは無い。
eow.alc.co.jp/instance

475 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 01:57:32.24 ]
>>469 現行規格の立場だと wchar_t 使えってことになるんじゃないの?

476 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 21:43:49.98 ]
数学の本相談スレで
プログラミング板に誘導されたんですけど
もしここもスレチだったら誘導お願いします

C++、Open GL
でユーザーが図形作成できるようなアプリを作りたいです

座標幾何学の勉強をするように言われたんですけど
ぶっちゃけ知識がないので
何か勉強するのにいい本を紹介してほしいです

477 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 22:07:22.33 ]
googleにベクトルと行列について質問した方が早いぞ

478 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/04(水) 23:50:42.74 ]
>>476
数学の話では線形代数になるけど、そこからだと結構回り道になるから、
3Dゲーム作成に必要な数学、みたいな本を読むのが手っ取り早いんじゃない?
タイトル忘れたけど、そんな感じの本を見かけたことあるから

しかしC++やOpenGLの使い方とかは大丈夫?全部初めてだと、なかなか敷居高いよ?

479 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 01:29:00.46 ]
>>476
>>478の言うように全部はじめてだと、それなりに時間かかると思うよ。

勉強の順番としては
まずは、C++の入門書かなんかやって
次にアプリを動かしたいプラットフォームでアプリを作る方法を学ぶ
次にOpenGLを学ぶ(べつにGLに拘らんでもいいと思うけど)。
それで、アプリの機能に必要な知識を勉強して
ようやくアプリが作れる感じ。

がんがれ。

480 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:26:00.23 ]
476です、遅くなりました。
授業で簡単な画像を作ったりアニメーションの練習くらいは
やったんですけど、数学が苦手なもんで…
一応卒論に関係してくるので、何か参考書とかあればなと思って
書き込みしました。
3Dのゲーム用の数学本を探してみます。
レスありがとです。ももーい。


481 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 21:55:57.25 ]
C++で構造体を使うことというのはありますか。
変数も関数も定義できるクラスだけでOkだと思ったのですが



482 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:09:51.21 ]
>>481
C互換のAPIを使うときなどは使わざるを得ない。
そのほかにも私の場合、レガシーな構造体で充分なときはstructを使う。
要は、メンバ変数を公開するかどうかかな。


483 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:37:08.26 ]
構造体でもメンバ関数定義できるでしょ

484 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 22:52:40.05 ]
>>482>>483
勉強になりました。ありがとうございます。

485 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/05(木) 23:47:09.72 ]
>>483
メンバー関数定義したらクラスじゃね?
構造体(POD または データブロック)として使用すると、
仮想関数テーブル破壊するから極めて危険。

ちなみに、俺インターフェース用のクラスとか
メンバーが全部publicならstructにしてる。

486 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/06(金) 00:08:34.25 ]
禿が設計ミスしたから class はヌルー、割り切ってすべて struct
テンプレートテンプレート引数くらいだね class なんか使うのは
private も下痢糞だがしぶしぶ使う
他言語との上っ面だけの横並びなんかウルトラどうでもいい

487 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 13:28:43.82 ]
俺はCでコンパイル可能なのはstructでそれ以外はclassにしてる
使い捨てソースは全部structだけど

488 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 14:29:09.23 ]
構造体は,《クラスキー》structを付けて定義するクラス。
共用体は,《クラスキー》unionを付けて定義するクラス。

489 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/06(金) 15:53:22.18 ]
用語としてのclassか、C++キーワードとしてのclassか
文脈から読み取らないと混乱するよ

490 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 18:29:03.06 ]
簡単な数式を引数でとって結果を返す関数をテンプレートで書こうとしてます。
template<class II, class PD, class CT>
int sansuu(II pos, PD n, CT tr)
{
for (; 0 < n ; --n, ++pos)
{
---> ここの書き方 if( tr.eq(*pos, '0') )
{

}
}
return 0;
}

int main(int argc, char* argv[])
{
const char* p = "1+1";
ここの書き方 sansuu(p, strlen(p), char_traits<char>);
const wchar* wp = L"1+1";
sansuu(wp, strlen(wp), char_traits<wchar>);

インプットイテレータとサイズを引数にして、あとcharとwcharでも
使えるようにしたいんですがどうしたらいいのでしょうか
stringを見たらchar_traitsとかあったんですがよくわかりませんでした。
お願いします。

491 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:03:20.38 ]
>>490
いいたいことはわかるんだけどまずcharだけでいいから動くもの書ける?
forの中身を全部教えろはうんざりだな



492 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:12:10.50 ]
>>491
中身のアルゴリズムの質問ではないんです。書き方が悪くてすいません。
テンプレートの使い方がよくわからないので、そこのところをお願いします。

493 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:17:20.53 ]
>>490
どうでもいいが、IIとかPDとか大文字だけの名前使うと
プリプロセッサと衝突するぞ

494 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:20:44.17 ]
じゃあとりあえず非テンプレートでちゃんと動くwchar_t版書いてみるところからはじめようか

495 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:21:54.66 ]
>>492
困ってるポイントがわからんから、まずテンプレートを使わず
char固定でコード書いてみてくれないか

496 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 19:34:06.85 ]
char_traits 使ってるのに strlen というあたり違和感ありあり

497 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:34:16.31 ]
>>492
とりあえずテンプレートの使い方ってことで
codepad.org/L461ZCtg

498 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:42:13.30 ]
>>497
ありがとうございます。
でもこれだと
if(*it=='+')
のところでwchar_tとcharを比較してしまうとおもってどうにかしたほうが
いいと思ったんです。

499 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:55:13.05 ]
>>498
char*はascii互換文字コード(ASCII,SJIS(MS932),EUC-JP)で入ってる文字はASCIIコード内だけ
wchar_t*はUTF-16 or UTF-32で入ってる文字はASCIIコード内だけ
という前提なら一応大丈夫・・・のはず

ASCII範囲外の文字も使うならwchar_t*だけで実装して
使う側が文字コード変換する方が良いんじゃね?多分

500 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 19:58:19.95 ]
追記、ascii互換文字コード(〜, UTF-8)

501 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:13:07.49 ]
codepad.org/hY36a3Gc
そういう中途半端なことするのやめろよ



502 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 20:32:22.44 ]
>>501
ありがとうございます。
まだ読みきれてないですが勉強します

503 名前:営利利用に関するLR審議中@詳細は自治スレへ [2012/04/07(土) 20:46:08.50 ]
widen

504 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 18:55:48.67 ]
なんで書き込みないんここ

505 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 19:20:38.67 ]
お前が書き込まないからだよ

506 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:20:34.47 ]
C++のことが好きになってしまいました

507 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:21:52.18 ]
>>506
まずはお友達から。

508 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:55:07.85 ]
>>506
まずはCから

509 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 19:15:56.87 ]
time.h以外に興味ありません

510 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 21:27:42.52 ]
int* p = new(0) int;

pが0になる保証ってありますか?

511 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:00:03.12 ]
ヌルポに書き込んでる時点で鼻から悪魔

組み込み系とかで0番地にどうしても書き込みたい場合ならpはヌルポになるだろうけど、
普通はその前にアクセス違反で死ぬ



512 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:04:16.87 ]
と思ったけど g++ だと死なないな
int() じゃないからかと思ったけど、
int() でも死なないし、あまつさえ int(1) でも死なない
一体どう言う事だ

513 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:21:41.97 ]
あ・・・ヌルポだからメモリ確保に失敗したと思って初期化しやがらないのか
なら、0 になる事は保証されてるっぽいな

514 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:09:03.72 ]
>>510
void* をひとつ取る配置用の operator new は引数をそのまま返す。 (18.6.1.3 p2)
そして noexcept で宣言されているので、ヌルを返すことはメモリ確保失敗の意味になる。
その場合、初期化は行われず new 式の結果がヌルになるとされている。 (5.3.4 p13)

というわけで、その p は必ず 0 と等しくなる。
・・・ void* より優先される operator new のオーバーロードが宣言されてなければね。

515 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:57:16.16 ]
>>510
どんな 性癖の人が使うの?

516 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:05:37.41 ]
>>514
うぉぉ、わかりやすい説明だぜぇぇぇぇぇ。
プレースメントnewは殆ど使わないから
すぐ挙動を忘れちゃう(´・ω・`)

517 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 02:48:18.14 ]
ヌルヌルポか

518 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:09:56.25 ]
>>511-
ガガガガガッ

519 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 15:38:19.28 ]
ifstreamとgetlineで外部のファイルを1行ずつ読み込む処理を作りました。
しかしリリースモードで実行すると1行ずつ読み込めません。デバッグモードでは問題なく読み込めました。
原因が分かる人がいたら教えてください。 ちなみにvs2008を使っています。

520 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:16:17.36 ]
読み込むテキストファイルは同じやつか?

521 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:47:48.38 ]
どうせ未初期化の変数の値を使ってるとかの類



522 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:13:41.18 ]
さもなきゃカレントディレクトリのファイルを読もうとしていて、
DebugとReleaseでカレントが違うことを失念しているとか。

523 名前:519 mailto:sage [2012/04/13(金) 17:27:10.86 ]
getlineは通常に動いてました。すみません。
>>521さんの想像通り未初期化の変数が誤動作の原因でした。

>>520-522
アドバイスありがとうございました。


524 名前:デフォルトの名無しさん [2012/04/14(土) 01:20:20.19 ]
1 0.1
2 0.2
3 0.3
...
みたいにintとdoubleが交互にならんだ入力を、
istream_iterator<int> a(cin);
istream_iterator<double> b(cin);
で交互に読み取りたいのだが、(テーブルの列読み込み)
while (a!=istream_iterator<int>()) {
int x = *a++;
double y = *b++;
}
てやっても評価順が制御できなくて困っています。
どうすればいいんでしょうか?

525 名前:524 mailto:sage [2012/04/14(土) 02:00:41.50 ]
なんか、上のサンプルを作ろうとしたけどうまくいってしまう。
問題が別のところにある可能性もあるから、ちょっと待ってくれ。

526 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:12:54.47 ]
うまくいってるならそれでいいんじゃねーの?w

527 名前:524 mailto:sage [2012/04/14(土) 02:32:52.43 ]
どうもfor_eachとのからみでおかしい。
C++0xがはいっちゃうけど、流れでここに出させてもらいます。
入力は
-1 0.3
-1 0.8
...
みたいな、doubleは適当な乱数。
1/1000くらいの割合で評価順が逆になる。

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

int main()
{
auto b = istream_iterator<double>(cin);
for_each(istream_iterator<int>(cin),istream_iterator<int>(),[&b](int n){ if (*b++<0) cout << "fail" << endl; });
}
}

528 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:15:36.16 ]
乱数で0とか浮動少数じゃない数値になってんじゃないの
乱数やめて固定値でやtってみたら

529 名前:524 mailto:sage [2012/04/14(土) 03:44:48.16 ]
そうね。ちょっと適当にやりすぎたわ。
istream_iteratorがバッファリングでもしてるのかと思ってしまった。

530 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 09:56:55.43 ]
>>527
それじゃだめだろ。istream_iteratorの実装によってはインスタンス生成時に値を一回読む。

531 名前:524 mailto:sage [2012/04/14(土) 10:01:34.51 ]
>>530
まじかw
1/1000って書いたけど1/10000でもあったから、
調べてみたらたしかに1行目でドジってるw

この目的を達成するために仕様に沿った形で書けますか?
ちなみに使うときは527みたく
for_each(istream_iteratorA,...,istream_iteratorBを使った関数)
の格好(入力イテレータで読む)で。



532 名前:524 mailto:sage [2012/04/14(土) 10:09:20.74 ]
>>532

a=...
b=...
for_each(...)

別の発想で交互に読み込むことを保証するイテレータの組をつくることはできないか?

533 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:46:08.64 ]
>531 読み込みが決まり切ってるなら型を起こせばいいんでは?

#include <iostream>
#include <algorithm>
#include <iterator>
using namespace std;

struct i_and_d { int i; double d; };
istream& operator>>( istream &is, i_and_d &id ) { return is >> id.i >> id.d; }
ostream& operator<<( ostream &os, i_and_d &id ) { return os << id.i << "," << id.d << endl; }

void testprint( i_and_d x ) { cout << x; }

int main() { for_each( istream_iterator<i_and_d>(cin), istream_iterator<i_and_d>(), testprint ); }

534 名前:524 mailto:sage [2012/04/14(土) 10:56:59.48 ]
ありがとう。return os << endl;ってできるの知らんかった。
ですが、API上、iとdは別のイテレータにしておかないといけないんです・・・


535 名前:524 mailto:sage [2012/04/14(土) 11:15:24.98 ]
いま自分で実装しようとして引っかかったんだけど、
bool operator==(const istream_iterator&, const istream_iterator&)
ってどう定義すればいいんだろ・・・

536 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:05:58.99 ]
API上別にしないといけないってどういう事?
あるタイミングで i を使って、別のタイミングで d を使うって事?
使ったかどうか覚えておけばいいだけのような

537 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:15:17.88 ]
>>534
APIって何?WinAPI? 自作エンジン操作するAPIとか?

538 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:26:28.24 ]
とりあえず、実際に使う部分を見せて欲しいな
関数名が秘密ならそのあたりは変えていいから

539 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:35:58.11 ]
>>535
イテレータ内部でストリームを basic_istream<charT,traits>* in_stream; で保持しておいて
return lhs.in_stream == rhs.in_stream; するのがstdでのやりかた

540 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:45:03.82 ]
>>524
こんな感じ?
ideone.com/n5AKA



541 名前:524 mailto:sage [2012/04/14(土) 14:43:12.69 ]
寝てたんで見るのがおそくなった。すまん。

>>540
が綺麗なんで、APIを変えることにしました。
単体の列をストリームで扱えるようにしたかったんだけど、
行ごとに読み込むストリームのほうがたしかに自然だな。
可変テンプレート引数をとるようにして(my_iter<int,double,double>)
tuple<int,double,double>が値になるようにすればテーブル読み込みできるね。
read()を書くのがちと面倒くさそうだが。



542 名前:デフォルトの名無しさん [2012/04/14(土) 18:04:19.59 ]
template <typename T, typename U>
void f(tuple<T,U>& t) {...}
template <typename T, typename U>
void f(pair<T,U>& t) { f(tuple<T,U>(t)); }
みたいな多重定義を避けられる方法ってないですか?

ただし、なんでも受け付けちゃう
template <class PairType>
void f(PairType& t) {...}
ってのは無しで。

(コンパイルでtuple<int,int,int>をつっこんでたらエラーが出るように)

543 名前:541 mailto:sage [2012/04/14(土) 18:15:50.84 ]
>>542
template <typename T, typename U, template <typename...> pair_type>
void f(pair_type<T,U>& t) {...}
かなぁ・・・他にいい案があったら教えて下さい。

544 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:35:55.99 ]
template<typename T,typename U>struct pair{〜;operator tuple<T,U>&(){return tuple<T,U>(*this);}};

545 名前:541 mailto:sage [2012/04/14(土) 18:42:36.84 ]
std::pairの仕様みてもそんなの無いんですが、暗黙の変換をどっかで定義しろってことですか?

546 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:52:58.80 ]
>>542

template<class T, class U> class tuple
{
  ・・省略・・
  tuple( const std::pair< T, U > value ){省略}
  ・・省略・・
};

もしくは、

template<class T, class U> tuple<T, U> to_tuple( const std::pair &value )
{
  return tuple< T, U >( value );
}



547 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:11:59.04 ]
c++0xにstd::tupleというのがあってだな・・・
スレ違いの話題で混乱させてしまってすみませんでした。

548 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:27:08.97 ]
脳内でネームスペースを勝手に補完したらダメだよね。

549 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:35:16.21 ]
m(__)m

550 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:50:26.85 ]
c++0x ってどんな風に入力したらこうなるんだ?

551 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:02:17.12 ]
俺はSTLマスターだが質問あるか?



552 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 20:05:47.40 ]
ないわー

553 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 21:18:41.74 ]
ないない

554 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 22:30:07.35 ]
>>551
std::messagesってどうやってつかうの?

555 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 23:16:35.57 ]
std::set<T>のインスタンス同士の一致比較(つまり、同一の集合であることの確認)ってどうやるの?
T型の要素はソートされて格納されるそうだから
インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して
全部一致することと同値なのだろうか
それとも、STLの仕様的にはそこまでは保証されておらず、上の方法はたまたまうまくいっているか、処理系依存で、
やはり比較前に自前でaやbに格納されている要素をソート等せねばならないのだろうか


556 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 03:03:52.36 ]
結論だけいうと==でやれ

557 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:29:58.92 ]
> インスタンスをa, bとして、a.begin()〜a.end()までとb.begin()〜b.end()をそれぞれ比較して
> 全部一致することと同値なのだろうか

同値でしょ。

要素値を比較する前に双方の要素数を比較した方が良さそうな気がする。
// 要素数チェック
if(a.size()!=b.size()) return(1);


558 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:38:51.16 ]
mismatchでやれ

559 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 14:56:31.96 ]
比較オブジェクトが同一かも検査したほうがいいんじゃないか?

560 名前:555 mailto:sage [2012/04/15(日) 15:52:01.26 ]
レスdクス
とりあえず要素となる型に<演算子が定義されていれば
(ていうかstd::set<T>のTの用件なのでそもそも定義されている前提)
少なくともVS2010では>556の方法で逝けるみたいです!

STLのマニュアルとして↓ここ見ながらやってたんですが、
www.cplusplus.com/reference/stl/
グローバル関数でset<T>& operator==(set<T>&, set<T>&)が定義されるとか
どこにも書いてなかったから気づかなかったorz


561 名前:555 mailto:sage [2012/04/15(日) 15:54:45.55 ]
訂正
誤: set<T>& operator==(set<T>&, set<T>&)
正: bool operator==(const set<T>&, const set<T>&)



562 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:06:06.28 ]
std::setは赤黒木。
赤黒木は同一要素からなる集合に対してはbegin() 〜 end()までの順序構造も同じ。
だから単にsizeを見た後iteratorを回してoperator ==での直接比較か
operator <(or operator >)x2で同値比較すればよい。

563 名前:555 mailto:sage [2012/04/15(日) 16:22:00.26 ]
スマン>560でボケたことを書いたorz
要素型Tのless than演算子(operator<())だけでは
一致比較できるわけないじゃんorz(多分bool operator==(const T& a, const T& b)が必要)

set<int> a, b;についてはa==bで一致判定できましたが
Tが自作クラスの場合は要検証です検証中なう

564 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:35:32.67 ]
大抵赤黒木で実装されるけど
赤黒木でなければならないと規格で決められているわけでもない

565 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:42:12.29 ]
>563 !(a<b) && !(b<a) だな。562も書いてるけど。

566 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:46:30.43 ]
>>565
a,bの間に全順序の存在しか仮定しないときに、
果たしてそのコードでa==bと同値になるのか
冷静に考え直したほうがいいんジャマイカ、

567 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 16:59:04.51 ]
いやすまん>565でいいのかorz (!(x<y) && !(x>y)) ⇔ (x≧y && x≦y)⇔ (x == y)
結局、Tについてoperator<()が定義されていれば、
set<T> a, b; についてa==bできるっぽい
(実際Tを自作クラスとしても、Tのoperator<()を定義したらVS2010で動いた)

568 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:59:18.77 ]
std::setのoperator==ではstd::equalが使われstd::equalでは>>555のように比較される
というようなことをごちゃごちゃ書きたくなかったから>>556みたいにレスしたけど
ちゃんと解説したほうがよかったな

www.cplusplus.com/reference/stl/set/operators/
ここにも書いてあるぞよく読め

569 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:21:33.47 ]
>std::setのoperator==ではstd::equalが使われstd::equalでは>>555のように比較される
なるほど、、いつどのアルゴリズムを使うのかきちんと決まってるのか
std::equalの定義(というか規格上の等価テンプレート)みたら、
Tについてstd::equalが使われる場合、Tについてoperator==()は必須みたいですね
>567の最後の行は撤回(実はoperator==()が定義されてた)

570 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 00:14:55.06 ]
最近C++を勉強しだしたんだが
とりあえず学んだ範囲で簡単な電卓を作ってみたけど
なんか自信がないw動くけど 無駄な事してないかとか
ツッコミを入れて欲しい
codepad.org/uz46AcHY

571 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:15:07.23 ]
>>570
・グローバル変数の使用は避ける。
・calculatorの中で初期化とされてるのは初期化でなく代入。初期化と代入は別物。
・なぜcalcuratorの中でanswerに代入(初期化)?

・// a:Aの値。
 ソースを先頭から読んだ場合この時点ではAの値といわれてもなんなのか不明。
・// Yと回答されたらループ、それ以外は終了。
 実際の処理との不一致。



572 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 06:28:57.57 ]
このコードに限らずだが広域でのusing namespaceが個人的にヤダな
せめて関数の中でusing namespaceするか、using std::cout;の様に
取り込んどいて欲しい。std系統じゃぶつかりづらいがVectorとか
Listとかありふれた名前は簡単にぶつかる。

573 名前:570 mailto:sage [2012/04/16(月) 16:33:06.78 ]
ツッコミありがとうございます
それをを受けて直してみました
codepad.org/T1qZFJTB

using namespace std;はまだ私にとって「おまじない」でしかないので
std:: を省略できるなら使うか みたいな感じなので・・・

574 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:12:09.41 ]
男ならヘッダファイルでusing namespace std;

575 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:32:28.10 ]
>>574
そんな男気あふれるあなたにC言語

576 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 22:05:18.63 ]
>>574
ダメ! ゼッタイ!!

577 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:39:54.67 ]
>574は漏れもやったが30分で悔い改めた
それはそうと、デカいオブジェクトの実体をSTLのコンテナに格納して
複数個所から参照しつつ必要に応じて追加するということをしたいんだけど
コンテナにinsert()する前後で参照が有効であり続けるようなうまいやり方ってないですかね…
コンテナの要素型を自作クラスでうまく作ればできなくは無いけど標準的なやり方は?

578 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 23:46:58.49 ]
std::listを使う

579 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:18:51.98 ]
using namespace std; がヘッダに書いてあるライブラリを使うことを強制されているんだ!
windows.h が自動的にインクルードされていたり、まさに地獄だぜ。

>>577
listを使うか、間接参照するか

580 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:24:37.62 ]
マクロ展開出力みたいに
ADL展開出力オプション欲しいよな

581 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 02:41:59.29 ]
>>577

なんでもかんでもshared_ptrでくるんじまいなよ! コンテナ用件は自動的に満たされるぜ!



582 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 05:47:00.52 ]
using namespace std; をわざわざincludeするようのヘッダー作ってincludeしまくってるわ
とりあえずusing std::stringとかにかえてみた

583 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 06:57:21.79 ]
お前の using namespace std; のせいで
ライブラリのヘッダでコンパイルエラーが出たわ

584 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 09:46:42.23 ]
しかしこのcodepad、まさかの強制using namespace std;である

codepad.org/wzgxNgw9
codepad.org/PSECxXqW

585 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 10:06:09.92 ]
全部std::付けたり関数毎に書くのは面倒なので自分の名前空間内でusing namespaceしてる
ideone.com/uXfYk
ideone.com/IiwPB

586 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 12:38:41.41 ]
using namespaceはよほどのことがない限り使わないな。
namespace fs = boost::filesystem;
とかはよくやるが。

587 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:24:50.23 ]
そんなこともできるんだったな
すっかり忘れてた

588 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 13:32:52.26 ]
using namespaceを使っといて、完成版では置換すればよい。
手間の問題。

589 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 21:48:04.95 ]
using namespace したものを置換するのは困難だぞ

590 名前:デフォルトの名無しさん [2012/04/17(火) 22:09:49.45 ]
テストコードをそのまま本番に持って行ってるわけね

591 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:26:19.01 ]
class Sample
{
 const bool aaa(const a, const b) const
 const int bbb(const c) const
 const Sample(const d) const
}

最近constに触れる機会があったのですが

TYPEはintとかfloatとか
【const TYPE】 aaa(const x) const

質問なのですが、【const TYPE】の部分がconstだと
実際にはどういう利点があるのでしょうか
他の部分がconstになっていると
色々とパフォーマンスに影響がありそうだと直感的に理解できるのですが

(変数には値とかコピーが入るわけですよね?)
戻り値の型にconstがあったからといって特に意味無いような気がしてしまいまして

じゃあ、頭のconstにはどんな意味があるんじゃ!? ということで疑問が湧いてしまったのですが
どなたか意味というか意義というか、教えてくださいまし



592 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:04.87 ]
const TYPE&じゃなくてconst TYPEなの?

593 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:29:55.14 ]
>>581
>なんでもかんでもshared_ptrでくるんじまいなよ!
何を言いたいのかわからんが、
確かに「型Tのset」のかわりに「型Tのshared_ptrのset」にでもして
shared_ptr<T>のoperator<()とoperator==()を(適当なスコープで)定義するとしたら逝けそうですな
※ とにかくデカいオブジェクトなので同じものを複数持ちたくない。
  当然insert時は重複チェックをやる。これをも極力高速、極力コンテナに任せにしたいからlistというのもちょっと、、、

>577における「コンテナの要素型を自作クラスでうまく作」るのより良さげな回答だけど
しかしshared_ptrはSTL標準ではないのではないか

594 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:37:54.44 ]
>>591
const病の伝染をやり過ごせる利点がある

class Sample {
  int* p;
  // (適当な構築子)
  const int* GetPtrA() { return p; }
  const int* GetPtrB() const { return p; }
};
であるとして、
  const Sample foo(...);   // constオブジェクトとして構成
  int* p1 = foo.GetPtrA();  // コンパイル時エラー
  int* p2 = foo.GetPtrB();  // おk
  

595 名前:594 mailto:sage [2012/04/17(火) 22:41:43.73 ]
ああスマン頭のconstか
わからんメリットなど無いのではないか
(でもテンプレート絡みでちょっとあるのかも?テンプレートについて人類は何一つ断言できない)

596 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 22:57:13.88 ]
戻り値はconstにする派ってのもいたと思う
Effective C++に書いてあるけど、正直やりすぎだと思う

597 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:04:48.95 ]
レスありがとう
…やっぱり、頭が const TYPE の場合はあまり意味なさそうな感じですか?
恐らくコスト面でも無視できるような違いしかないってことですよね。
実際にもあまり使わないという認識でいいのかな

そういえば、 const TYPE&の存在がありましたね…。
const TYPE& はパラメーター(参照)のstd::vectorのアイテム参照とかグローバル変数の配列の参照を返す時とかに有効な気がしますが
intとかfloatみたいな値を返す時とかに積極的に使う理由ってありますか?

598 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 23:44:43.08 ]
戻り値 const Effective C++ でググれ

>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる

>例2)
>const Rational operator* (const Ratioanl& lhs, const Rationa& rhs);

>(a * b) = c のようなコードは不正だが、const 指定すればコンパイル時エラーとなる。
>(a * b) = c; これを展開すると、const Rational (a * b) = Rational c となりエラー。

正直こんなのどうでもいいと思うが

599 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:02:43.13 ]
戻り値const派は右辺値参照の登場で窮地に立たされたな

600 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:18:49.01 ]
右辺値参照で何か不都合とかあったっけ?

601 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:21:29.89 ]
右辺値参照とconst絡みで問題なんてないと思うが
教義を貫けない的な話?



602 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 00:29:13.38 ]
折角右辺値参照を使ってるのに
無駄に複製が発生するようになるからじゃない

603 名前:デフォルトの名無しさん [2012/04/18(水) 00:40:30.17 ]
禿の自刃に殉じた使徒の数知れず (;ω;)

604 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:01:44.61 ]
>>598
>・ 戻り値にconstを使うと、問題のある関数の安全性や効率を改善できる
>・ 戻り値にconstを使うと、問題のある関数
>問題のある関数
メイヤーズ氏もついに演算子の多重定義をdisる境地に達したのか

605 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:23:01.73 ]
「定数式が必要です」と言われてしまいました……教えてください。
「sound_effect.h」に次のように書きました。簡略化しています。

#ifndef SOUND_EFFECT_H
#define SOUND_EFFECT_H
extern const int SOUND_EFFECT_MAX;
class CSoundEffect{
public:
CSoundEffect();
~CSoundEffect();
void RaiseFlag(int Num);
void LoadSet(int SoundSet_Num);
void Play();
private:
int File[SOUND_EFFECT_MAX];
int Flag[SOUND_EFFECT_MAX];
};

そして、「sound_effect.cpp」には次のように書きました。各関数の定義ははぶきます。

#include "sound_effect.h"
const int SOUND_EFFECT_MAX = 45;
CSoundEffect SE_Object;

すると、SOUND_EFFECT_MAXが代入済みの整数定数とみなされていないのか、
「構造体または共用体中にサイズが 0 の配列があります」ということになってしまいます。
なお、extern const intではなく#defineを用いるようにすれば、エラーは出なくなります。
ですが、整数定数の定義には#defineではなくconstを使うようにしろと言われてきたので……

606 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:25:49.79 ]
すみません、簡略化時に#endifを削ってしまいました。
「sound_effect.h」の末尾に#endifがあるものとしてお答えください。

607 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:28:02.72 ]
enum { SOUND_EFFECT_MAX = 45 };でいいだろ

608 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:41:50.09 ]
俺ならメンバ変数にstatic const int SOUND_EFFECT_MAX = 45; ってやっちゃうな
externだとリンクの時に初めて値が入るとかでコンパイル時にそういう風に使っちゃいけないんだろう

609 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 01:57:38.08 ]
どうしてもexternでやりたいなら
sound_effect.h
extern const int SOUND_EFFECT_MAX= 45;

sound_effect.cpp
const int SOUND_EFFECT_MAX;

だな

610 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 02:20:37.69 ]
クラス定義はマクロじゃないからな。

611 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 04:44:22.33 ]
const定数のリンケージがC++だと、Cと違ってそのモジュール内だけになるからだったか?
そのルールって、C++は定数式で配列が初期化できるからあるってことかな?



612 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 05:03:50.99 ]
黙して共用ヘッダの無名空間に収めとけよ

613 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 07:34:46.83 ]
外部リンケージの const 定数は配列の要素数などには使えない仕様

内部リンケージ(const が付く場合はデフォルト)であっても、
実体定義より前には配列の要素数などには使えない
宣言だけでは無理で、コンパイラは 0 であると仮定してエラー復帰してコンパイルを続けるので
連鎖的に配列が 0 要素だとか変なエラーが出る

class CSoundEffect{
public:
static const int Max = 45;
private:
int File[Max];
int Flag[Max];
};

これでFA
VC6のような化石コンパイラを使わない限りは大丈夫
VC6使うなら enum { MAX = 45 }; で

614 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 17:50:12.27 ]
皆さんありがとうございます。
おかげさまで解決いたしました。

615 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 18:50:22.14 ]
こっちにしようかC++11スレにしようか迷ったけどこっちで。
template aliasで下のコードがエラーになる(clangで)のは何故ですか?
barはfooの別名だと思うのですが。

--
template<typename T> struct foo{ /*empty */ };
template<typename T> using bar = foo<T>;
template<template<typename> class T> struct zot { /* empty */ };
void qux( zot<foo> ){ /*empty */ }

void quux( ){
 qux( zot<bar>( )); // ココ
}

616 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:52:51.68 ]
>>586
俺も好き。Java使わさせられるとき
同等の機能が無いから不便で仕方ない。

617 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 19:54:39.53 ]
>>615
未対応だからじゃね

618 名前:デフォルトの名無しさん [2012/04/18(水) 20:32:59.12 ]
zot に bar を渡すときに foo のインスタンス化を要求するからだろ

619 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 21:33:36.47 ]
fooのインスタンス化は出来るんじゃね?
alias使わずqux(zot<foo>());だけならideoneでも通るし

620 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 23:47:55.07 ]
C++規格素人だが>615はコンパイラの常識的挙動に照らしておかしくねえ?
template<typename T> using bar = foo<T>;
でbarを本当にfoo<T>の別名として使ってインスタンス化の片棒を担がせるには
Tの型を明示的に与えるか、型推論できるような書き方であらねばコンパイラ困っちゃう

、希ガス

621 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:15:19.40 ]
すわなち、(省略されている型パラメータUを補完したとして)
 template<typename T> struct foo{ /*empty */ };
のTはfooの自由変数だが、
 template<template<typename U> class T> struct zot { /* empty */ };
において、 U,Tは束縛変数の1, 2であって、テンプレートzotの自由変数は
実は( template<typename U> class T )という全体である

で、void qux( zot<foo> ){ /*empty */ } と書いたなら、この実体化では
zotの自由変数( typename<typename U> class T)のTがfooでUがfooの自由変数T、と解釈できる
(で、Uはzotの定義で使われないからUの定義が無くとも実体化できる。)

一方、qux( zot<bar>() )と書いたなら、barをfoo<T>の別名と解釈するときにTの定義が要るから、
上の話で言うUの定義が必要、という違いがある

、、多分、、



622 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:28:33.86 ]
いま思いついたが>621説を検証するには、>615のコードの3行目を
 template<template<typename U> class T> struct zot { U x; };
に変更したときに4行目の
 void qux( zot<foo> ) { /*empty*/ }
がエラーになるか確かめればある意味一応検証になる
エラーにならなければ>621説は反証される

623 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 00:52:23.75 ]
struct void std::wstring any();
return 3;

624 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 01:32:56.73 ]
エイリアステンプレートはテンプレートとしては元のテンプレートと別物扱いってことなんだろ

template<class X, class Y> class hoge {};
template<class X> using fuga = hoge<X, X>;

みたいなときはhogeは引数2つのテンプレートでfugaは引数1つのテンプレートとしてふるまうから別物扱いするのが自然だし

625 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:36:57.09 ]
WindowsXP以上,VC2003の環境です。
ある特定のウインドウの位置の変更や、サイズの変更があった場合に
通知を受け取るにはどうすればよいでしょうか?
いまは、ループでずっとGetWindowRect()を呼んでいます。

626 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 18:41:08.73 ]
イベントにWM_SIZEってなかったっけ?

627 名前:625 mailto:sage [2012/04/19(木) 18:51:46.80 ]
>>626
監視対象が、自分の作ったウインドウ(アプリ)じゃないんですよね。
DLL作ってフックしないといけないんでしょうかね・・・。

628 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 19:23:52.04 ]
ループ使わないなら基本的にはフックじゃね
vista以降は上位権限のプロセスのメッセージは取れないらしいけど

あと使ったことないけどCreateRemoteThreadっていうので何か出来るかもしれない

629 名前:625 mailto:sage [2012/04/19(木) 22:53:19.86 ]
とりあえず、新しいプロジェクトでDLLを作って
WM_SIZE,WM_MOVE,WM_MOVINGをフックできるようになりました。
それで、更新された新しいRECTをEXE側に渡したいのですが、
DLLからEXE側の関数を呼ぶにはどのようにすればよいでしょうか?

630 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 23:59:45.57 ]
.exeの方にdllexportの関数って用意できないっけ?
exeの方のウィンドウハンドルとってきてメッセージでもいいけど

631 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 00:23:32.12 ]
セキュリティで弾かれるのはハンドルを取得する時だけで合ってた?
違うプロセスのウィンドウハンドルを指定してゴニョゴニョは問題ないっけ?



632 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:16:30.45 ]
ヘンタイ仕様のAPIの話って、ここでして良いの?

633 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 01:22:36.10 ]
Mayaのプラグイン作ってそんなかでFindWindowしてSendMessageしたりしてるけど特にはじかれはしてないなぁ、Windows7ね。
exeが多重起動してたらどれからとってくるかは知らね、目的は果たせたからあんま調べてない。

634 名前:631 mailto:sage [2012/04/20(金) 01:25:31.84 ]
あ、ごめん ここC++スレだった。
でもWin32スレに書いてもまともな返答返ってこなさそうだし困ったもんだね。

635 名前:631じゃなくて633でした mailto:sage [2012/04/20(金) 01:26:30.15 ]
たびたびごめんなさい。

636 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:11:53.23 ]
Windowsは一度公開API群を再設計したほうがいい
仮想化でやってるのは内部的な整合性を保つ為だろうけど
どうせなら今までの粗雑なAPIはレガシー化させて
整合性のあるAPIとして生まれ変わったほうがいい
現状の#defineだらけのヘッダーやら互換性の為に残されたAPIやらは
一度分離してくれたほうがみんな幸せになれる

637 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:12:40.39 ]
>>636
Win64は随分まともになってるじゃないか

638 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:34:17.39 ]
Win64?
DWORD→DWORD_PTRのことかね

639 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:35:23.12 ]
.netのクラスライブラリ群がネイティブになって
winapiは、なくなるのじゃないの?

640 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 02:42:01.50 ]
現状では.NetのGUIはwinapiをラップしたものでしかないぞ…

641 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:04:20.32 ]
メッセージとか継ぎはぎ感が否めないよな



642 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 03:53:34.34 ]
C99対応を前提にして
BOOLもbool型にしとくべきだろうね

643 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 07:01:04.44 ]
>>636
WinAPI使わなきゃいいじゃん
使わない自由はある
MSだって昔は.Net Frameworkで切り捨てるつもりだったんだし

644 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 08:40:17.72 ]
だから WinRT を設計したじゃないか

645 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 10:42:47.33 ]
WPFでGUI APIを一新したかったんだろうけど、普及しなかったな。

646 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:38:25.04 ]
粗雑で素朴なCのAPIでもABI的な意味で需要はあるし手間の点はQtとかのラッパで十分とも言えるし

647 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 12:15:25.67 ]
Windows8でAPIが近代っぽいのに変わるんじゃなかった?
Win32APIとかのレガシーなのをやっととっかえる気になったと聞いたが

648 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:01:31.74 ]
.netとかwinrtなんてvmじゃ、いつまでたってもwinapiは撲滅させられない

649 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:21:37.49 ]
俺もWinRTには期待してた
ふたを開ければ機能限定版のWin32APIラッパだった
Windowsにフタをしてやりたくなった

650 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 16:59:12.08 ]
クラスについて質問です
クラス内にメンバ変数しかなかったら
newする度に変数の分だけメモリを消費するだろうと推測できるのですが
例えば、メンバ変数は2〜3個でも、メンバ関数が100個くらいある場合には
newする度にメモリの消費量が半端ない感じになってしまったりしますか?
クラスのメモリを確保した時の挙動がちょっと気になってしまいまして
詳しい方いらっしゃったら教えてくださいまし

651 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 17:12:53.29 ]
>>650
こうかな??
ttp://ideone.com/8d2zK

クラスのメンバ関数は普通の関数にthisを食わせる暗黙のパラメータがあるもんだと思ってもらえればイイと思うお。
だから、関数のインスタンスは、一個でいいし、最適化すればクラスに内包してる必要はないと思う。
ちなみに、テンプレート関数にするとちょっと事情が変わってくる。



652 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:02:11.61 ]
template<typename T> class boo
{
friend class T;
};

こんな具合にテンプレート引数をフレンドクラスにしたいのですが方法教えて下さい。

653 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:39:22.82 ]
クラスのメンバでistream&をもってるんだけど、デフォルトは何で初期化すればいいの?
class A {
istream& is;
A(): is(???) {}
A(istream& is): is(is) {}
};

654 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:08.84 ]
悪い事は言わないから参照ではなくてポインタを使いなさい。

655 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:41:11.70 ]
初期化できないのでA()は定義しちゃダメ

656 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:42:03.98 ]
>>653
参照だと色々不便な気がするけど大丈夫なの?
んで、デフォルトコンストラクタをProtectedにするとか・・・。

657 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:46:06.02 ]
すまん、もちろんpublic:を忘れている。
ストリームの終端をA()で表現して、
iter!=A()
的な判定をするんだが、654の根拠は何?
iostreamってあぶなっかしい?

658 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:50:04.32 ]
>>657
いや、参照は初期化時以外に実態を束縛できないのでNULL参照になりやすいからアブネーという話だと思うよ。

659 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:53:19.88 ]
istream&じゃなくてistream_iteratorとか持ったら?

660 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:54:35.39 ]
コンストラクタを別の場所から呼び出すのにthisを使う、次のようなコード(拾ってきたもの)
って規格的にはアリでしょうか?

struct sample_class
{
int value;
sample_class(int i): value(i) {}
sample_class() {
*this = sample_class(10);
}
};


661 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:57:04.04 ]
ありだけどそれぐらいならsample_class() : value(10) { }ってしたほうがいいだろ



662 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 21:59:04.72 ]
>>658
ふむふむ、あんまそういうのに遭遇したことがないからよくわからんが、
シングルスレッドでワンショットで終わっちゃう(走り続けない)ようなソフトでもヤバイのかね?

>>659
そういう人もったことないけど、やってみるわ。アイディアありがとう。

663 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:02:31.54 ]
>>662
実態が生きてるうちは大丈夫かな。デストラクタ走ったら死亡コース。

664 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:07:11.12 ]
>>663
なるほど。自分が書くような小さいプログラムだと、
mainの最後だけでデストラクタ呼ばれるパターンが多いから、
いつも気にしてないんだよね。
でもこれからは気をつけてみるわ。ありがとう。

665 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:21:45.54 ]
>>652
11ならこれで通る。(gccだと4.7以降)

template<typename T> class boo
{
friend T;
};

98だと直接は無理でメンバ関数をfriendにするしかないかな
codepad.org/Ako1qKqh

666 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:37:27.70 ]
さっきのistream_iteratorを使えばいいという話ですが、これが通らない・・・
メッセージが邪悪すぎるから、誰か助けてくれ〜
#include <iostream>
#include <utility>
#include <iterator>
using namespace std;

istream& operator>>(istream& is, pair<int,int>& p) {
is >> p.first >> p.second;
return is;
}
int main()
{
istream_iterator<pair<int,int> > is(cin);
}

667 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:16:13.35 ]
グローバルフックするDLLからEXEに通知を受け取るために、
boost::functionをDLL側に渡して、DLLから呼び出したんですが
デスクトップ、スタートボタン、タスクバーが消えましたww
どうしたらよいでしょうか?
(コンソールアプリや他ライブラリでDLLを使いまわしたいので、
ウインドウメッセージでは受け取りたくないんです)

いまこんな感じです↓
>// EXE側
>boost::function<bool(STRUCT&)> func = &CallbackFunction;
>StartHook(func);

>//DLL側
>boost::function<bool(STRUCT&)> callbackFunc;
>EXPORT BOOL StartHook(boost::function<bool(STRUCT&)> &func)
>{
> callbackFunc=func;
> :
> callbackFunc(struct);
>}

668 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:23:33.48 ]
>>667
そんなことできるわけねーだろアホか

669 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:42:36.38 ]
>>666
あんまりいいサンプルじゃないけどこういうのも有るよ的な。
ttp://ideone.com/qaals


正直、std::cinは使ったこと無いからメチャクチャ大変だった。そして、勉強になった。

670 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:47:36.28 ]
>>669
う〜ん、求めているものではないなぁ。
とりあえず、コンパイルエラーの意味がわからんかったんだが、
それに関して何かコメントない?

671 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:51:02.72 ]
>>670
テンプレートを使った実装を使うときにエラー起こすと意味不明な文字の羅列が出て上級者でもイラッと来るらしい。
で、コンセプトっていう機能が入る予定だったけど、ウヤムヤになって空中分解した。
コンセプトがあればエラーメッセージはもっとシンプルになる予定だったそうな。



672 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:58:11.19 ]
別に空中分解したわけじゃないよ
コンセプトマップをユーザーが定義すべきか自動で定義されるべきかが決まらなかったのでC++11に入らなかっただけ

673 名前:650 mailto:sage [2012/04/20(金) 23:59:43.85 ]
>>651さん
virtutal属性とかテンプレート関数の有無が鍵になる感じなのですね!
便利なクラスにする為に大量にメンバ関数を作る分には問題ない事が分かったので
安心してクラスを作り込みたいと思います。
ちょっと返信遅れちゃいましてごめんなさい。
どうもありがとうございました!

674 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:00:12.19 ]
すまん。ちょっと誇張した。

675 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:01:13.04 ]
>>674 -> >>672

676 名前:デフォルトの名無しさん [2012/04/21(土) 00:03:44.63 ]
>>672

677 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:03:57.15 ]
>>671
メタプログラミングとかでエラー出ても、メッセージの雰囲気でけっこうわかるんだが、
stringとiostream関連はいまだに読めないw

678 名前:デフォルトの名無しさん [2012/04/21(土) 00:09:21.77 ]
>>666
は神待ちです。

679 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 00:12:42.02 ]
パンピーで悪かったわね。

680 名前:677 mailto:sage [2012/04/21(土) 01:11:26.04 ]
すいません、色々調べましたがギブアップです。

EXEからDLLにコールバック関数を登録して、DLL側から構造体を受け取るにはどうすればよいでしょうか?
EXE(またはコンパイラ)が変わってもDLLを修正せずにできる方法でお願いします。

681 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:38:32.64 ]
shared_ptr使えばいけるじゃないの?



682 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:48:01.02 ]
exeが適当なウィンドウを作って
dllがFindWindowでexeが作ったウィンドウを見つけて
そのウィンドウハンドルにWM_COPYDATAで構造体を送り付けたらいい

683 名前:677 mailto:sage [2012/04/21(土) 01:54:10.77 ]
コンソールアプリや関数だけのライブラリからも呼びたいので、
メッセージは使いたくないんです><

関数ポインタはDLLとEXEでアドレス空間が違うんですかね><

>// EXE側
>
>bool CALLBACK func(STRUCT struct){
> return true;
>}
>
>int main(){
> StartHook((LPVOID)&func);
> :

>// DLL側
>EXPORT BOOL StartHook(LPVOID func) {
> STRUCT data;
> data.dat = 0;
>
> bool (*callback)(STRUCT);
> callback = (bool (*) (STRUCT))func;
> callback(data); // ←この次の行の関数呼び出しでランタイムエラー
>




684 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:57:11.92 ]
共有メモリとか名前付きパイプとか

685 名前:677 mailto:sage [2012/04/21(土) 03:43:58.56 ]
共有メモリだと、フラグとか値が変わるのを無限ループで監視しないといけないですよね?
それは無駄に重くなるのでやりたくないんですよね。。。
名前付きパイプ調べてみましたが、イベントってのが使えそうな気も・・・。

それと、DLLからEXEの関数呼び出しはなんとなくできました。
EXE側の関数をdllexportして、DLL側からEXE側にGetProcAddress()して関数アドレスを取得して
呼び出せました。これなら新しいEXEを作るときもDLLを変えずに済むかなと思ったのですが、
フックプロシージャからEXE側の関数を呼び出すと、なんかダイアログ出てきてシステムに無理やりDLLをとめられました・・・。
自分のミスなのか、フックプロシージャ内はなにか特別なのか??

686 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:48:34.25 ]
当たり前だろ
フックされたプロセスとフックを仕掛けたプロセスは違うんだから
呼び出せるわけがない

687 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 03:59:22.71 ]
どうでもいいけどC++関係ねぇ

688 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 04:01:23.44 ]
そろそろ
toro.2ch.net/test/read.cgi/tech/1333095907/
こっちに移るべきだな

689 名前:677 mailto:sage [2012/04/21(土) 04:04:56.72 ]
>>686
そうなんですか・・・。
EXEと静的リンクしたDLLは同じプロセス空間、
DLLのフックプロシージャの中は別のプロセス空間ということでしょうか?

690 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 07:05:04.65 ]
>>662
コンストラクターの引数は参照で、
内部ではポインターで保持したら?

691 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:49:36.25 ]
c++ではmallocとfree関数はつかわないんでしょうか?
newとdelete演算子ですか?



692 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:51:40.35 ]
deleteも使わない

693 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:15.77 ]
えっそうなのw
横から便乗で質問だけど、コンストラクタ・デストラクタ呼び出したい時はnew deleteなのはわかったけど
その必要がない場合でもnew deleteすべき?

694 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 09:53:56.00 ]
そんな質問する様なら、1つ良い事を教えてあげる。

混ぜるな危険!

695 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:17:08.33 ]
newは遅いという説が・・・・

696 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:22:17.05 ]
>>695
右辺値参照で改善に期待。

697 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:24:19.29 ]
>>695
placement newでおk

698 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 10:53:22.07 ]
newの中身は普通はただのmallocだよ
他にはコンストラクタも動かすけど、それはplacement newでも同じ

699 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:41:10.25 ]
>>697
placement newを教えるからにはstd::aligned_storageもだな…。

700 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 11:42:27.96 ]
そしてoperator new の闇に嵌まって逝く訳ですね

701 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 13:38:50.23 ]
>>666
istream_iteratorの中からは自分でグローバルに定義したoperator >>が見えない(stdのoperator >>に隠蔽される)からエラーになる。

・解決法の一つ。stdじゃない場所に自分で定義したクラスを介する。

class mypair
{
pair<int, int> p;
public:
mypair() : p() {}
mypair(pair<int, int> const & p1) : p(p1) {}
operator pair<int, int>() const { return p; }

istream & readvalue(istream & is) { return is >> p.first >> p.second; }
};

istream & operator >>(istream & is, mypair & pr)
{
return pr.readvalue(is);
}

int main()
{
istream_iterator< mypair > is(cin);
pair<int, int> p = *is;
}



702 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:01:10.22 ]
>>691
malloc()は使用する必要性がほぼ0になるが
個人的にはrealloc()はしばしばまれに使うべ
std::vector()が使えるならそれに越したことは無いが


703 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:15:42.26 ]
>>702
> しばしばまれ

どっちなんだよ…

704 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 18:19:38.93 ]
reallocはPOD型(C++11では概念変わったけど)にしか使えないのがねえ
まあ、環境依存でいいなら多少危険でも使えるケースはもうちょい多いと思うが

705 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 20:25:59.49 ]
>>701
諦めてたのですが、有り難い限りです!


706 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 23:52:24.21 ]
デフォルトのnewだとサイズsで取った領域をサイズs+1にしたいとき無条件にnewし直ししかないじゃん?
realloc()はヒープ管理のリンクリストに直に触るから、サイズsの既存分を動かさずに済むことがある
std::vector<T>が中で何やってるかは知らんが、案外realloc()を呼んでいるのではないか


707 名前:デフォルトの名無しさん [2012/04/21(土) 23:55:39.79 ]
>>706
reserveで出来なかったっけ?

708 名前:デフォルトの名無しさん [2012/04/22(日) 00:01:56.82 ]
newのデフォルトの実装は、環境やコンパイラに依存だろ。
reallocとかと混ぜる根性がよくあるな、おまえら。

709 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:02:23.30 ]
>>706
実装によるけど一般的には、vector<T>は要求よりも多めに確保して現在の利用状況をリポートする。
領域確保時は、何だったかな、現在の1.5倍だったかの領域をnewしてコピーするんだったかな。
まー、実装依存だわね。

710 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 00:09:22.80 ]
>>706
reallocなんで呼ぶわけないだろw
事前確保の容量超えたら新しくnewしてコピー/ムーブだよ

>>709
GCCとMSVCがそれぞれ1.5倍と2倍(どっちがどっちか忘れた)だったはず

711 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:08:33.21 ]
勝手にコピーや元の領域の開放を行わないreallocがあれば
vectorもどきを作るのに使えるのにね・・・
伸ばせるなら伸ばす、伸ばせなければ失敗、
あるいは、新たな領域を確保して、それを返すだけ、という



712 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:14:34.54 ]
>>711
誰がコンストラクタ走らせるの?
そういう用途はプレイスメントnewという機構があるよ。

713 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:15:34.87 ]
>>712
vectorがどういう風に実装されてるか知ってる?

714 名前:デフォルトの名無しさん [2012/04/22(日) 01:19:53.01 ]
実装を知らないと使えない、とか、
オブジェクト指向と言うかC++の思想に反するよな。

715 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:08.37 ]
>>714
何を言ってるのか意味が分からない

716 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:23:30.27 ]
>>713
詳しくは知らない。
でも、アロケータにメモリ確保を任せて帰ってきたメモリをプレイスメントnewしてるのかねぇ。
オブジェクトをプッシュバックしたら、コピコンかムーブで移譲だよね。
その段階で破棄されるオブジェクトのデストラクタ走るし。

俺はユーザープログラマだからそんな詳しく知らなくても使える。と、言い訳。

717 名前:716 mailto:sage [2012/04/22(日) 01:25:35.85 ]
アロケータの実装がreallocであることもある可能性は捨て切れない。

718 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:29:43.11 ]
reallocは絶対に使えないのよね
領域が移動する場合に、reallocが勝手に内容をmemcpyするから
ちゃんとしたコピーなりムーブなりが行われない

逆に言えば、この領域移動さえなければ使えると言う事

719 名前:716 mailto:sage [2012/04/22(日) 01:32:35.49 ]
ほぇ〜。そうなんだ。
アロケータのことはよく知らんのよ。実装する機会もないし。

720 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:36:35.68 ]
newした内容をmemcpyでコピーできないのと同じ事さ
アロケータの知識は正直あまり関係ない

721 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:37:04.38 ]
※ただしPOD型は除く



722 名前:716 mailto:sage [2012/04/22(日) 01:47:33.69 ]
>>720-721
なるほど。勉強になるよ〜。

723 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:03:06.82 ]
>>722
PODだろうとmalloc、realloc、freeは使うなよ
おいおいnewで確保したか、mallocで確保したか
管理しきれなくなってバグの原因になりかねんから

PODとCの関数で思い出したが、POD型にmemsetでゼロ
初期化するヤツなんなんだろうな。
Type value = {0}; こういう形で十分だろうに。

724 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:04:10.52 ]
Type value = {};
こうだろ

725 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:11:14.53 ]
>>718>>720
それって、要素型Tにコピーコンストラクタが定義されていれば
どうとでもなるんじゃねwwwwwwwwwww

代入と異なりコンストラクタは構築先が何であるかを問わないから
 (そうでない作りにすると普通の構築時に必ずバグって発覚する、)
生のメモリ領域を与えてから構築することができる

、、ハス


726 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:21:38.13 ]
>>723
それ警告出すコンパイラあるから俺は使わない

727 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:23:10.78 ]
>>725
reallocが内部でmemcpyするって言ってんじゃん
コピーコンストラクタもoperator==もガン無視でbitwiseコピーされる

728 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:24:33.50 ]
>>726
Cの仕様で定義されてるんじゃなかったっけ?
俺はそういうふうに習ったけど。

某らんどとかは、変数の初期化処理に警告だしたりするからな。あれは不味いだろうと思う。

729 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:00:04.36 ]
定義はされてるよ
でも、初期化忘れか、意図的な0クリアかを
コンパイラが機械的に判断するのは難しかろう

730 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:01:59.22 ]
>>726
じゃあどうやって初期化してるの?

731 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:19:43.82 ]
>>727
だからプレースメントnewでrealloc()した後にコピーコンストラクタで構築すればいいでしょキイッ
www.geocities.jp/ky_webid/cpp/language/036.html

というわけで、realloc()とプレースメントnewの組み合わせで
領域が増えたときのコピーの回数をしばしばたまに減らせることがある
C++ばパフォーマンス命の言語




732 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:33:04.27 ]
それともいっこ、単純にあらかじめ大きめの容量を確保しておくという戦略は
使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう欠陥がある
コンストラクタというのは初期化しか仕事しないから高速を要する処理中に極力呼びたくないわけよ
この意味でも常にぎりぎりの領域サイズでrealloc()しつつプレースメントnewというのは
高速処理中にちまちまstd::vec<T>のインスタンスを生成するのに比べたらかなり手堅い
(本当に手堅いのは高速を要する処理開始前に必要なサイズを全部確保しておくことだが)

733 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 03:49:59.13 ]
命令型言語のPGで新規の領域を不定値のままにして気持ち悪くない奴はカス
なぜなら、命令型言語を選択したPGはその時点でチューリングマシン教の教徒であり、
チューリングマシンは状態の書き換えによって計算を進めるモデルだからだ
そのためのType a = { }だったり(new Typeではく) new Type() 構文だろうノシ


734 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:03:38.84 ]
>プレースメントnewでrealloc()した後にコピーコンストラクタで構築
とか意味が分からないけどとりあえず

>使わないかもしれないオブジェクトについてデフォルトコンストラクタを呼んでしまう
std::vectorもそんな挙動はしないよ?

735 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 04:39:50.99 ]
>>734
>std::vectorもそんな挙動はしないよ?
ちょっwwwwごめwwwwwwwwっうぇwwwwVS2010のstd::vector<T>で今調べたらそうだったわwwwwwww
(確保した要素数しかデフォルトコンストラクタが呼ばれた)

>意味が分からない
サソプル イズ ベスト:
struct TypeB {
 int x;
 TypeB() : x(-1) { }
 TypeB(const TypeB& other) { x = other.x + 100; } }; // コピーされたら100足される

void test2() { const int n = 100;
  TypeB* sizableArray = (TypeB*)realloc(0, sizeof(TypeB) * n);
  for (int i = 0; i < n; ++i) {
    TypeB a;
    a.x = i;
    new(sizableArray + i) TypeB(a);   // It's new!
  }
  for (int i = 0; i < n; ++i) cout << "sizableArray[" << i << "]=" << sizableArray[i].x << endl;
}
実行結果は、sizeableArray[0] = 100\c\rsizableArray[1]= 101\c\r...

736 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 08:46:29.23 ]
語るね〜

終わったら呼んで。

737 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 13:56:10.85 ]
>>731
bitwiseコピーした後にどうコピコンすんだよ
既にアドレス変わってる上に、初期化元は自分自身だろ

738 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:11:44.62 ]
>>737
>new(sizableArray + i) TypeB(a);   // It's new!


739 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:25:17.62 ]
>>738
a って何だ?

740 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:27:32.56 ]
>>739
アドレスsizableArray + i以外の場所にあるTypeB型のオブジェクト

741 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:29:39.39 ]
元データを論理的に保存しないといけないのに
なんで別のものでコピコンすんの?



742 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:34:26.68 ]
>>741
コピコンで元データが論理的に保存されないとする根拠は?

>735のサンプルにおけるTypeBのコピコンにおいて、仮に100を足すのをやめたら
>738で(スタック上の)aと論理的に同じオブジェクトがアドレスsizableArray + iにできるわけだけど?


743 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:35:49.79 ]
>>742
そもそも、realloc したら元データが元の場所から無くなるんだよ

744 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:41:54.04 ]
というか、>>735 読んでなかったが、今話してる事じゃねえよこれ
vectorの伸張の話してんだぞ?

745 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:46:30.01 ]
>>743
ああスマン、それはそうね
p1がTypeBのコピー元配列srcArrayを指しているとして、
 TypeB* p2 = realloc(p1, sizeof(TypeB) * n)
の実行後、p2 != p1でありなおかつsrcArrayの要素がsrcArray内の他要素のアドレスに依存するならそうね

しかし>702以降の流れはstd::vector<T>との比較という文脈なのを思い出してホスイ、
Tにそのような型が許されるだろうか?

746 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 14:56:54.97 ]
>>711からの流れだと思ってたのだがまあいいや

747 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:51:11.01 ]
>>731
意味が解らん。reallocで1度コピーreplacement newでもう一度初期化。
処理が遅くなるだけだろ何のメリットが有るんだ?

748 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:53:19.14 ]
>>733
命令型ってbashとかzshだろ
メモリ確保は自動で行われるから
確保も開放も意識する必要は無い

749 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 18:54:29.33 ]
あれだけruby厨だったuy( >>735 )がC++に手を出すようになったか


750 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:00:12.55 ]
>>735
その内容ならmallocでいいだろ

751 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:04:47.26 ]
>>730
memset か std::fill に決まってるジャン(std::fill_n は警告出る事あるのでやはり使わない)
= { 0 } は可読性に劣るとも思うしね
初期化忘れか意図的な 0 クリアかが
コメント残さないと確実に伝えられないから
最初の 0 がある意味マジックナンバーじみているのも気持ち悪い



752 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:30:08.71 ]
普通構造体に = { 0 }してたら初期化だと思うがな。
あと組み込み向けのしょぼいコンパイラーだとこっちの方が早いことがある
逆にmemsetの方が早いってのは聞いたことないけどね

753 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 19:43:36.33 ]
>>751
それ初期化じゃないじゃん。
それに
={};
で初期化し忘れと読み取るアホはおらんよ。

754 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:04:39.00 ]
= { }; は C で使えないよね

755 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:09:06.33 ]
使えないけど、それがどうかしたの?

756 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:13:57.52 ]
知らない人が結構いそうだから使いたくないわ

757 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:24:10.37 ]
>>747
>reallocで1度コピー
領域拡大時であってもrealloc()だとコピーが起きないことがある
縮小時はもちろんほぼ常に起きないことが期待できる

>replacement newでもう一度初期化。
誰も2回も初期化しないわけだが
つかデフォルトのnewは使えば必ずメモリ確保してから初期化するのに対し、
プレースメントnewはそれ自体はメモリ確保しないから、
メモリがすでに確保されている場合はより早いの
ワカル?


758 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:05.66 ]
>>757
理解出来てないなら黙ってろ

759 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:38:21.85 ]
>>748
ソウジャナイ
破壊的代入が本質的(それ無しには何事も進まない)のが命令型言語、
非破壊的代入で全て済ますのが関数型言語
前者はチューリングマシン、後者はλ式をそれぞれ数学的基礎とする

一方で書けるアルゴリズムは他方でも書けるという意味で両者の計算能力は等価
ただし得手不得手はもちろん違う


760 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:41:11.32 ]
>>758
どこらへんがおかしいのかkwsk

つかrealloc()が勝手にコピーするとオブジェクト必ず壊れるとか思ってる?
std::vector<T>の要素型として使える型Tについてはそれは心配せんでええ


761 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:50:37.51 ]
>領域拡大時であってもrealloc()だとコピーが起きないことがある
>縮小時はもちろんほぼ常に起きないことが期待できる

どういう理屈なんだ?



762 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:51:25.25 ]
>>759
お前が言ってるのは手続き型だろ

763 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 20:54:06.90 ]
>>759
関数型は、演算式と制御文を全て関数で記述する事を目的とした言語
破壊的代入が無いというだけだと宣言型とダブるので、
破壊的代入が無い = 関数型というのはおかしい

764 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:03:04.70 ]
>>761
K&Rの終わりぐらいに書いてあるmalloc()の実装例でも読めばおk
サイズs1、s2の領域がこの順で隣接しており、s2が開放されたなら
サイズs1をサイズs1+s2までコピー無しで拡大することができる
(※簡単のため管理用のヘッダサイズは無視)

>>762
関数型言語であってもリストで手続き(順序的な処理)を表わせるから
手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
手続き型というのはそれの対義語


765 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:41.32 ]
>>763
宣言型というのは、ようわからんが非手続き型っていうのとほぼ同義ジャネ?
破壊的代入無しでチューリングマシンの計算能力と等価な言語、
といえば多分λ式ベースの言語(つまり関数型言語)しかないんじゃないかなあ、、
なお、関数型は、(関数で)新しい関数を作り出すことしかしない故に関数型


766 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:12:47.96 ]
>>764
mallocじゃなくreallocの内部の話なんだけど
実際コピーしない処理系が存在するのか?
gccのreallocはソース公開されてるがコピーしてる
実際どの処理系がしてるんだ?
普通に考えてもmalloc内部の実装に依存するreallocなんてクソだろ

767 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:15:18.80 ]
>>764
>関数型言語であってもリストで手続き(順序的な処理)を表わせるから
>手続き型/非手続き型の区分は命令型/関数型の切り口とは異なる別概念
>Prologみたいに処理の順序が平に書かれない言語を非手続き型といい、
>手続き型というのはそれの対義語

お前だけの常識で語られてもなぁ

768 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:32:45.54 ]
>>766
realloc()をmalloc()と別階層とすべきですかそうですか、、
コピーを生じない処理系の具体例については、
少なくとも下記コードをVS2010で走らせるとp1 == p2なんだけど?
  void* p1 = malloc(1000);
  void* p3 = malloc(1000);
  free(p3);
  void* p2 = realloc(p1, 2000);
  cout << "p1=" << p1 << ", p2=" << p2 << endl;

glibcのソースをよく読みなおすことをお勧めする

>>767
漏れだけの常識がどうかはようわからんが、そうなの?
>764で妥当だと思うがなあ〜


769 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:35:05.31 ]
で、いつまでちんたらちんたら続くんだ?

770 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:36:14.02 ]
>>760
おいおい、オブジェクト領域でreallocなんか使ったら壊れるだろうがw

ポインタ関係が全部おかしくなるわ。

771 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:38:31.10 ]
>>768
サイズ変更が「可能な場合」はコピーされない。不可能な場合はコピーされる。


コピーされる場合はありえるんだが、たまたま特定環境化で動作するから使っていいとかアホの極み。ドシロウト。

仕事でそれ使ってたらリアルで背任でクビになるようにもっていく。



772 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:39:33.64 ]
>>768
そのコードじゃそりゃそうだろ。
つかそのコードはreallocの問題じゃねぇ。言い方悪かも試練が偶然だ。
解放された領域をもう一度使用してるのは意図して書けばできる事だが、
reallocが同じ領域であることを知っててコピー処理を省略してるかどうかは別問題。


773 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:40:57.09 ]
>>770
>ポインタ関係が全部おかしくなるわ。
ポインタを含まないか、ポインタを含んでも指す先が移動対象でないなら
そういうオブジェクトは勝手にコピーされても無問題でしょ?
で、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、それは成立している、というしくみ


774 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:45:00.34 ]
>>771>>772
まあ冷静に
コピーされる場合がありえるし、コピーされる/されないを
realloc()の呼び出し側で制御できないのは承知していますから
ただ、std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
プレースメントnewをうまく使って安全にrealloc()で領域管理できるという話

775 名前:デフォルトの名無しさん [2012/04/22(日) 21:54:51.43 ]
マジレスしないでニヨニヨ笑ってる人が絶対いる悪寒
あまりにも不自然すぎる

776 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 21:56:42.25 ]
>>774
二重コピーされる分realloc使うのが無駄なのは事実だろ
まだmalloc, free, mallocしてreplacemente new呼んだ方がマシだ

777 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:06:36.44 ]
>>776
ちょっと前のレスから気になってたが、replacement newってなんぞね?
また、realloc()の呼び出し1回で同一オブジェクトのコピーが2回起きるみたいな書き方も気になるが、
それっていつどういうシチュで??

もし>738のようなコピーコンストラクタ呼び出しの回数のことを言ってるのなら、
それはrealloc()一回につき同一オブジェクト当たり1回以下にできる
(realloc()がコピーするかしないかや呼び出し下で制御できないが、
 領域の移動があったかどうかは呼び出し元で判定でき、移動しなかったオブジェクトについて呼ぶ必要はないため。)


778 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:08:51.64 ]
その程度の処理が問題になるなら動的確保自体使わなきゃいいだろ。

まずはEffectiveC++でも嫁やザコ

779 名前:777 mailto:sage [2012/04/22(日) 22:10:35.64 ]
スマン訂正
std::vector<T>の要素型として使えるような型Tのオブジェクトなら、
勝手にコピーされても何もする必要がないから、領域の移動は関係なかったな、、


780 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:14:06.10 ]
>>777
reallocで1回、new( buffer ) Type();で1回、合わせて2回だろ。

781 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:23:58.97 ]
>>773
自分自身をさすポインタをもつ場合、コピーコンストラクタ/operator=を正しく書けばvectorに入れられるが、メモリコピーでは正しく処理できない。



782 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:34:14.86 ]
>>780
普通そうはならないべ

サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)
運が悪ければ、領域の移動を要し、サイズs1の部分のみコピーされる(コピー1回)。
ここには今の想定だと構築済みオブジェクトが入っているが、コピー安全なオブジェクトなのでそれ以外なにもしなくていい。つまり、コピーはオブジェクト毎に高々1回。

で、new(p) Type(); が必要なのは、新規に確保されたサイズs2の領域だけ。よって、2回コピーされるオブジェクトは生じない。

なお、細かいことを言えば、new(p) Type()はアドレスpについてType型のデフォルトコンストラクタを呼び出すだけなのでコピーではない。
また、Typeのデフォルトコンストラクタが全フィールドを確実に初期化する保証があるなら
new(p) Type(); と書くより new(p) Type; の方がよろしい。(0 fillが省略されるから早くなる。いつの規格からかは知らん。)

>>781
ああすまん、それはそうね。

783 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:41:23.02 ]
>>782
>サイズs1の領域が確保済みで、realloc()でそのサイズをs1+s2に拡大する場合、効率的な実装なら、まず>764(の前半)のようなケースでは実質コピー0回。(空き領域リンクリストの繋ぎ替えが起きるだけ。)

この前提が間違ってるって何度も指摘されてるだろ

784 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:14.75 ]
>>782
手間が増えるだけでreallocするメリットねぇじゃねぇか

785 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:45:21.40 ]
>>783
>何度も指摘
kwsk
すくなくとも、(たまたまかどうかはともかくとして)realloc()前後で領域が移動しなかった実例が>768にあるわけだが
これって呼び出し前後でアドレスが変わらない部分についてもrealloc()は律儀にコピーしてるってことなの??
>738おすすめのヒープメモリ管理方式を聞いてみたい気がするカモメ、


786 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 22:49:16.76 ]
>>785
ことなの?じゃなくコールスタック追いかけるか
逆アセしてみろよ。memcpy呼ばれてるだろ

787 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:06:31.08 ]
>>786
VS2010のデバッグモードでmemcpy()にブレークポイントしかけて見て見たが、
>768のコードにおける4行目
void* p2 = realloc(p1, 2000);
の呼び出し中のmemcpy(src, dst, count)の呼び出し回数は3回、ただしcountはどれも2だったべ
これはリンクリストか何かのコピーじゃねーの?
(>783の指摘どおりだとしたら1000バイト級のmemcpy()が起きないとおかしいが)

で、仮に万が一>783の指摘が正しかったとして、2回コピーされる件はどうなったのよさ?
主張を取り下げて>782で納得?


788 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:09:34.08 ]
不毛だ

789 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:27:27.52 ]
>>787
2回コピーは俺だが。新しい領域のみコンストラクターの結果を
コピーするんならたしかにコピーは1回だな。そこは納得するよ。

790 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 23:45:41.19 ]
>>787
codepad.org/tlYgmcrc
そもそも、同じアドレスだからと言って一旦解放された領域に
同じ値が入ってるとも限らんからな
このコードVSにコピペして実行してみ

791 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:13:06.56 ]
>>790
ちょっwwwwwwおまwwwwwwwwww
例示のコードはrealloc()とは話が違うわけだが
そりゃーfree()で本当に解放してしまった領域には誰に何書かれるかわからんでしょうよ
(別スレッドあり、デバッグビルドのfree()だと丁重に0xccccccccで埋めてくれたりすることあり。
 セキュリティー目的で埋めるライブラリもあるかも試練、)

なんつーか>768のコードの意図が伝わってないようだけど、
K&R式なmalloc()およびrealloc()な実装の下で>768をシングルスレッド状況で走らせると
>782で言うコピー0回な挙動になるんすよ
>768は、その挙動を演出するために、使用中の領域(p1)とは関係ない領域(p3)を一旦malloc()後にfree()してるだけ
p1が指す領域は一貫してfree()されない。



792 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:26:27.20 ]
>>779
vector の要素型に realloc() で発生しうる memcpy() への耐性なんて要求されてないんだが

793 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 01:43:35.76 ]
>>791
realloc内部でfreeされるがな

794 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:08:56.95 ]
だから、C++ならnewだけを使えよ。
わざわざ危険を犯そうとする冒険者になることは、ない。

795 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 02:19:24.31 ]
newの使い方よりも
newそのものの速度が問題になる状況って
どんな状況だ?

796 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:05:19.97 ]
もうほっとけよ

797 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 03:19:14.56 ]
class MyClass{
public:
bool hoge();
}

MyClass instance;

があるとして、

「instance.hoge()」

が与えられたときに、

「MyClass::hoge(),&instance」

を返すようなマクロは作れませんでしょうか?

798 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 04:24:58.06 ]
メンバ関数ポインタ

799 名前:797 mailto:sage [2012/04/23(月) 04:25:55.73 ]
なんとか、
「instance.hoge()」
という記述から、メンバ関数ポインタとthisポインタを取得したいんですよね。。。

800 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 06:50:18.40 ]
「&MyClass::hoge,&instance」が欲しい理由じゃないのか?

801 名前:797 mailto:sage [2012/04/23(月) 12:43:53.90 ]
これが欲しい理由は、一度&MyClass::hogeと&instanceを保存しておいて、
あとでそのメンバ関数を呼び出したいんです。
使う箇所が多いので、テンプレートとかでなんとかできないかと思いました。



802 名前:デフォルトの名無しさん mailto:sage [2012/04/23(月) 12:53:08.14 ]
std::bindとstd::functionでおk






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<191KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef