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


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

【初心者歓迎】C/C++室 Ver.35【環境依存OK】



1 名前:デフォルトの名無しさん mailto:sage [2007/02/19(月) 21:36:23 ]
エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。
※sageは禁止です。
【前スレ】
【初心者歓迎】C/C++室 Ver.34【環境依存OK】
pc10.2ch.net/test/read.cgi/tech/1169039760/
【アップローダー】(質問が長い時はココ使うと便利)
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm

321 名前:デフォルトの名無しさん [2007/03/07(水) 18:30:53 ]
年月日時分秒を取得するlocaltimeという関数は見つかったのですが
その取得した時間に10時間プラスしたときに
24時間を越えると日付によって年月日は変動すると思います

時間をたしたいのですが
こういう処理のためになにか用意されていないでしょうか?
環境はVC++2002です

322 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:33:17 ]
閏秒は無視して、localtimeに渡す前のtime_tに対して10*3600足せばよくね?

323 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:34:19 ]
time_t
struct tm

324 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:34:25 ]
>>321
time_t型にした上で、10時間(10 * 60 * 60[sec])を足し、localtime()でばらすかstrftime()で文字列にすれば宜しい。
既にlocaltime()でばらしてあるなら、tm_hourに10を足してからmktime()でtime_tにしてもいい。

325 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:39:11 ]
初心者本でこの辺りをまともに解説しているのってあるのかな。
ちなみに、localtime(), gmtime(), asctime(), ctime()はスレッドセーフではないので
マルチスレッドプログラミングのときはご用心。

326 名前:321 [2007/03/07(水) 18:45:56 ]
マルチスレッドプログラミングですがlocaltimeを使うのはまずいでしょうか?

327 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:49:18 ]
処理系のマニュアルを参照セヨ

328 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 18:49:49 ]
簡単なプログラムの途中に見栄えを良くするために
横線を引きたいのですが、何かいい方法はありますでしょうか?

329 名前:321 [2007/03/07(水) 18:50:51 ]
1スレッドでしか試してませんが
time_tに対して10*3600してできました
ありがとうございます



330 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:00:18 ]
localtime()などは内部の静的な領域を使い回しするから、
それを呼び出すスレッドが複数ある場合は衝突が発生する可能性がある。
まぁ、呼び出すスレッドが一つだけなら問題ないけどね。

簡単に図式化するとこうなる。
・単一スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──

・複数スレッドからの呼び出し
スレッドA ──localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
スレッドB ────localtime()呼び出し──内部領域変更──localtime()から復帰──内部領域から結果を回収──
                            ↑                      ↑
                            ここで壊れる。 もし壊れなくても、ここでスレッドBからの呼び出しの結果を読む羽目になる。

331 名前:デフォルトの名無しさん [2007/03/07(水) 19:08:53 ]
localtime()を使うスレッドクラスをひとつ用意すればいいということですね
すごく参考になりました

332 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:43:27 ]
>>320
ふざけたこと抜かすんじゃねー

333 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:44:01 ]
VCのCRTはTLS使ってるから問題ないけどね。

334 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 19:48:49 ]
>>317
数値と文字を一緒にするな。
他の言語だと自動で文字を数値に変換したりするけど
C/C++などは'9'をそのままASCII文字コードだよ。

e-words.jp/p/r-ascii.html

つまり
'9'を数値で言うと57
'$'を数値で言うと36
だ。

'10'はコンパイラによって違うと思う。

335 名前:デフォルトの名無しさん [2007/03/07(水) 21:39:31 ]
メイン関数内でnewしている継承される可能性のあるクラスを
継承された場合、継承後のインスタンスでnewしたいのですが、エレガントな方法が
思いつきません、ご教授お願いします。

336 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:49:53 ]
>>335
複数のクラスがそのクラスを継承してる場合はどうするべき?


337 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:52:44 ]
>>335
もうすでにnewしちゃったんじゃしようがないんじゃない。


338 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 21:54:41 ]
newの代わりにFactoryを用意して(関数ポインタでも可)それ経由で生成するのがC++的には一番楽かな。

339 名前:デフォルトの名無しさん [2007/03/07(水) 22:13:46 ]
>>336
継承後も含めてそのクラスのインスタンスが一つしか存在しないようにします。
>>338
Factoryでインスタンスを取得し、
FactoryをVirtualtou(等)にして継承した場合書き換えるという風にですか?



340 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 22:36:25 ]
継承するクラスをC++より上位のレイヤーで1つだけに制限できるというなら、
グローバルな関数 Base *new_derivered_class(); を実装すればよくね?

それとも、継承先のクラスが存在しない場合Baseをnewする必要があるわけ?

341 名前:デフォルトの名無しさん [2007/03/07(水) 23:07:38 ]
ホームページから任意のデータの取得を行いたいんだが
さっぱりその方法が解りません。
その手のことが書かれたサイトを教えていただけませんか?

342 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:10:18 ]
rubyなどのスクリプトを使う

343 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:14:21 ]
>>342
やはりそうですか。
Cでやりたかったのですが、素直に真珠でやります。
ありがとうございました。

344 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:15:59 ]
真珠…

345 名前:デフォルトの名無しさん [2007/03/07(水) 23:20:04 ]
>>340
継承してメンバー関数を上書きして処理を記述するようにしたいので、
何か処理をする場合には、必ず継承しなければならないです。
継承しない場合は、現実的にはないと思うのですが・・・

346 名前:デフォルトの名無しさん [2007/03/07(水) 23:23:48 ]
>>343
「猫でも分かるネットワークプログラミング」にhtmlを読み込んで表示する方法が書いてあったと思う
今手元にないので分からんが、WinSockをつかってたとおも

347 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:29:17 ]
WinsockでHTTPしゃべるのは結構面倒くさいヨ。

348 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:38:18 ]
どうもです。
分野はネットワーク関係なんですね。
それが解っただけでも十分です。
ありがとうございました。

349 名前:デフォルトの名無しさん mailto:sage [2007/03/07(水) 23:51:03 ]
>>343
WindowsならURLDownloadToCacheFile()が一番お手軽



350 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 01:16:50 ]
>>343
真珠ってPearlって書くのしってんのか?
いやPerlもPearlから来てるんだがな

351 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 11:07:27 ]
C++builder使っております。
unsigned char*とchar*のキャストは、(*型)だけでキャストできるのでしょうか?
出来ないキャストの場合は、エラーや警告などでますか?
以下のようにしてプログラミングしましたが、希望通りの出力でした。
ネットで危険なキャストがどうの、って良く見かけるんですが
よくわかりません。
”桁が大きくなると、小さい型にキャストするときは気をつける。”
これだけ注意すれば大丈夫でしょうか?

unsigned char* un_str="hoge";
char* str;
unsigned char* from_char_to_unsigned_char_str; //char*->unsigned char *の格納する変数

printf("un_str=%s\n",un_str); //unsigned char*は、char*みたいに出力できるか

str=(char*)un_str;
printf("str=%s\n",str);//(char*)だけで、キャストできるのか

from_char_to_unsigned_char_str=(unsigned char *)str;
printf("from_char_to_unsigned_char_str=%s\n",from_char_to_unsigned_char_str);//(unsigned char*)だけで、キャストできるのか

------出力-------------------------------
un_str=hoge
str=hoge
from_char_to_unsigned_char_str=hoge

352 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:03:04 ]
C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。

> printf("un_str=%s\n",un_str);
%s は const char* 型の引数を期待するから、
*((const char*)un_str)という変換が行われることになる。
un_strが指してるのは"hoge"、つまり const char[] だから、問題なく変換できる。
他も同じ。

353 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:26:55 ]
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
現実には大抵そうなっているけど、規格上はそんな規定なんてないはず。

354 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:28:46 ]
そうだっけ?
んじゃvoid*の扱いはどうなるんだ?

355 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:29:45 ]
同じでない場合は、void*が一番でかいポインタのサイズ
そして使うときはキャストされるので問題なし

356 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:32:17 ]
昔懐かしい、farポインタ、nearポインタ、とか?

357 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:40:29 ]
残念ながら void* も void(*)() を保持できる保証はない。

358 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:42:58 ]
375<< インラインアセンブリならできるかも・・・

359 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 14:45:19 ]
>>356
普通に char* と int* のサイズが違うようなアーキテクチャも存在した。



360 名前:デフォルトの名無しさん mailto:sage [2007/03/08(木) 17:23:43 ]
>>352-359
> C言語を仮定するけど、ポインタは全部同じサイズだから相互にキャストできるよ。
いろいろと実験しながら、少しずつわかってきました。
丁寧に説明ありがとうございました。


361 名前:デフォルトの名無しさん [2007/03/09(金) 20:15:24 ]
WinSDKで、
モーダルダイアログボックスを使っているとき、
プロシージャに最後に呼ばれるメッセージは何ですか?
WM_CLOSEメッセージでDestroyWindow(hDlg)して、
WM_DESTROYメッセージが呼ばれた後に、WM_COMMANDがくるのですが…


362 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 20:55:26 ]
WM_DESTROYでウィンドウが消えた後は
たとえそのウィンドウ宛にメッセージが来ても
それは存在しないウィンドウハンドル宛だし
処理するところがないので無視することになるだけだと思うけど。

何か特殊なケース?

363 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:06:17 ]
>>362
WM_COMMANDがくること自体は問題ないのですが、
エディットコントロールにWM_COMMANDがきたときに使うメモリを解放するのに、
WM_DESTROYの後にエディットコントロールに対してWM_COMMANDがきてしまうと、
わざわざWM_DESTROY呼ばれる前後で、場合分けするのが無駄だと思えるので…

364 名前:デフォルトの名無しさん [2007/03/09(金) 21:31:38 ]
VC++6 で CString 使ってるんだけど、
CString な変数に ANSI コードページでもユニコードでもない文字列つっこんで処理したいんですわ。
具体的には、GetLenth とか Replace したい(ANSI コードページでもまともに処理してなさそうだけど)
楽に処理するにはどうしたらいいでしょう?CString 捨てな方法でもいいです。

365 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 21:56:12 ]
vector<BYTE>でよくね?

366 名前:364 [2007/03/09(金) 22:07:24 ]
>>365
俺に言ってる?
CString はたとえばコードページ 932 の場合、
Replace で 1 バイト文字を置換対象にするときに、2 バイト文字の下位バイトが置換対象とバイト的には等しくても、置換しないようにするよね?
そういうのをすべてのコードページでやりたいの。
ではよろしくお願いします。

367 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:08:23 ]
>>364
っ nkf

368 名前:364 [2007/03/09(金) 22:33:56 ]
>>367
nkf のライブラリにコードページを指定出来るようなメソッドを追加したクラスが実装されているということでしょうか?
単なる変換ができるというだけなら却下ですな。
(nkf 使わなくても文字コードの変換はできるし、変換することによってコードをマッピングできなくなる場合とか考えたくない。
ユニコード系のコードに変換すればマップだけはできるんだろうけど。
それといちいち文字コード変換するとよさげなソースコードにならなさそうなんだ。
そもそも nkf って日本語しか対応してないだろ?
個人的には今回の場合 UTF-8,CP51932,CP932 を使えれば問題ないと思ってるんだけど、他の奴が許さないんだぁ。)
注文多すぎてむかつくかもしれないけど、どうかどうかよろしくお願いします。
ぶっちゃけ CString::SetCodepage() とかいうメソッドが実装されていて、あとはよきにはからってくれる実装がほしい。

369 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:44:11 ]
>>368
一々文字コード変換をしたほうがデバッグが楽だと思う

UTF-8 -> Unicode 変換

Unicode で何か処理

Unicode -> UTF-8 変換

よさげなソースコードにならなさそうって言われればそれまでだけど…



370 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:50:22 ]
CStringに自分が今どのコードページのデータを持っているとか
それにあわせてReplaceの動作が変わるなんて出来ないんじゃないのって思うから
vector<BYTE>でよくね?

371 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 22:53:13 ]
>>364
つ MLang

372 名前:364 [2007/03/09(金) 23:14:46 ]
>>369
やりたいことの一つに、「ANSI CP 以外の文字列読み込み->文字置換->そのまま書き込み」ってのがあるんだけど、
ユニコードにいちいち変換してたら絶対にスマートでないよね。
あと、調べたところまずなさそうなんだけど、変換->逆変換で違うコードにマッピングされると困る。
>>370
コードページ指定して UNICODE には変換できるんだから、出来ないはずはないとおもうんだけどなぁ。
クラスに変数 1 つだけ入れておけば使用側がセットして良きにはからうことはできるはず。デフォルトは CP_ACP で。
なんで実装されてないのか理解できないほどだ。
vc8 だと reentrant locale が一部実装されていて、1文字送りは簡単にできそうになってるなぁ。VC6 でつくらないといけないんだけど。。。
>>371
ちょっと調べてみます。ざっとみた感じでは変換しかしてくれなさそうだけど。
あと、これつかわないと CP51932 つかえなさそうですね。
MultibyteToWidechar とかに 51932 とかつっこめば変換だけは出来るとおもってたけど。

373 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:17:13 ]
鬼車がCSIじゃなかったっけ。Cだけど。

374 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:30:14 ]
>>372
> ユニコードにいちいち変換してたら絶対にスマートでないよね。
コードページごとに処理を特殊化させるほうがよほどスマートじゃないと思うがね。

375 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:36:58 ]
というか、そういう、1つの言語に対応するエンコーディングが氾濫していて
UNICODEの変換・復元がもったいない、なんていうことを言うのは
日本人だけなのではないか?(w

376 名前:デフォルトの名無しさん [2007/03/09(金) 23:38:03 ]
ソケットについて質問です。

クライアントからホストを

char* szHost = "www.google.co.jp"
gethostbyname( szHost );

の様に指定してHTMLをサーバから取得できる事は判ったのですが、例えば、

取得したいHTMLが、

www.google.co.jp/search?hl=ja&q=c言語&btnG=Google+検索&lr=

の様にクエリも含む場合はどうすれば良いのでしょうか。
よろしくお願いします。(板違いなら誘導お願いします。)

377 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:40:20 ]
URLエンコードしてそのままGETにぶち込めばいいだろ?
CESも場合によっては変換する必要があるけど。

378 名前:デフォルトの名無しさん [2007/03/09(金) 23:47:15 ]
返信ありがとうございます。
暮れ暮れ君で申し訳ないですが、URLのエンコードってどうやるんでしょうか。

379 名前:364 mailto:sage [2007/03/09(金) 23:52:19 ]
>>373
単純な置換にはかなり大げさなライブラリですな。いざとなったらこれで Replace をオーバーライドするか。
どうもありがとうございます。
もっと単純にできる方法も引き続き募集いたします。
>>374
個人的にはコードページが違うんだから、特殊になるのは当然だとおもうけど。
ユニコードが*本当に万能*なら汎用的に処理できるんでしょうけど。ま、CSI 論争はやめておきましょうか。
>>375
ま、大きな声でいってるのは日本人だけでしょうな。
でも、XFree86 で utf8 関数が投入されたときは一部の外国人もぶーたれてたな。
CSI かどうかはおいといて、reentrant locale がほしい人は外国でも結構いるみたい。



380 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:55:41 ]
なんかこの人気持ち悪い…

381 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:58:26 ]
>>380
おまえもな

382 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:17 ]
俺も俺も

383 名前:デフォルトの名無しさん mailto:sage [2007/03/09(金) 23:59:45 ]
std::basic_string<char, euc_jp_traits<char> >みたいな?
traitsを自作するとかさ。

384 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:05:36 ]
>378
「URLのエンコード」程度なら、検索するべきですわん。
簡単に見つかるから。正確な事もわかるし。

ラフに解説すると、URLとして使ってよい文字ってのは
あらかじめ決まってるから(←ってのは知ってたと思うけど)
使えない文字は %xx みたいな形式に置き換える事。

385 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:42:35 ]
>>379
変換コストがもったいないと思っているのなら
大抵のCSI対応クラスは内部で統一コードに変換してるから意味ないぞ

386 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 00:46:18 ]
>>385
CSIの意味わかってる???

387 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:13:10 ]
キーが倒されている場合は歩くのモーションを、倒されていない場合はウェイトのモーションを再生したいのですが、

whileの中で、

if(キーが倒されている)
アニメーションAを再生
アニメーションBを停止

else if(キーが倒されている)
アニメーションAを停止
アニメーションBを再生

と書くと、()内が真or偽が判定されるたびに、アニメーションが最初から再生されて、0フレーム目しか再生されません。
最初に書いたようなことをするには、どういう風にプログラムを書けば良いでしょうか?
できればヒントでよろしくお願いします。

388 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:19:58 ]
再生時に開始フレーム指定してそっからはじめればいいだけじゃん

389 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:35:22 ]
どっちみちキーが倒されている気がするのは気の所為か?
キーも大変だな、一々倒されて。



390 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 01:36:17 ]
>>380
ヘンなとこで敬語使ってるからじゃね。

391 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:00:27 ]
整数の加算結果がオーバーフローしたかどうかを調べるにはどうすればいいですか?

392 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:03:47 ]
加算前より減ってたらオーバーフロー

393 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 02:30:54 ]
>>391
鼻から悪魔がでたらオーバーフローしていると判断してよろしい。
処理系によっては、オーバーフローした場合を判断する方法があるかもしれない。

394 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 10:26:51 ]
 すいません、初歩的な質問なんですが、どなたかご意見いただければうれしく思います。
 クラスBの中でクラスAのオブジェクトの配列を管理したい。
 でもクラスAは、A2やA3などにも派生させてて、それも配列に入れたい、って場合。

class A {
...
};
class A2 : public A{
...
}
class A3 : public A{
...
}
class B {
vector<A> a1_vector;
}

 ってしたいんだが、これだとa1_vectorにはA2,A3が入らないですよね?
 ってなると・・

class B {
vector<A*> a1_vector;
}

 で、new A, new A2とかでオブジェクト作って、そのポインタをa1_vectorにpushすることになると思うんですが、これだとクラスBのインスタンスが破棄されたときに、a1_vectorで管理されている各オブジェクトって廃棄されないですよね?
 で、google先生とかに聞くと、share_ptr使う人がいるみたいなんですが、それで問題ないですかね?
 なんか注意点とかありますか?もしくは他にいい方法ありますでしょうか?


395 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:11:03 ]
問題ないよ、A のデストラクタを仮想関数にするの忘れないようにね


396 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:19:43 ]
設計を見直せ。

397 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:28:53 ]
>>394
boost::shared_ptrでおk
std:auto_ptrはコピーが破壊的でコンテナにいれらんないから駄目

敢えて他の方法を挙げるとすれば、Boehm GCを使うとか?

398 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:34:10 ]
GC使うと、メモリ解放はいいけど、デストラクタ呼びだしタイミングが
予測不能にならない?

399 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:35:30 ]
>>394ではないが。
>>396
参考までに聞きたいが、どう設計を見直すんだ?

C++でポリモーフィズムを実現したいなら、参照を経由するしかないし
派生クラスを基底型の配列やvectorに突っ込もうとすると
スライシングが発生するから、>>394の言っていることはごく当然の話では?

C++でポリモーフィズムを使うなと言ってる?



400 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 11:39:21 ]
>>398
勿論その辺は他のGC言語となんも変わらない。

401 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 12:31:45 ]
Boost使うならポインタに特化したboost::ptr_vectorなんてものもある。

402 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 13:11:10 ]
>>399
>396ではないが、「他にいい方法」を模索するなら実装方法を検討する前に設計を見直せということでしょ。
>394ではないから、そのクラス構成が最適解なのかは判らないのだから。

403 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:19:41 ]
>>402
それは深読みじゃねえの?
>>394はC++でポリモーフィズムをやりたいときのスマートな方法を問うている
だけに見えるけど。

404 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 14:36:21 ]
>>402
最適解なのか「判らない」んなら、少なくとも「設計見直せ」は言いすぎだろうな。
「その設計では駄目だ」と断定してるのと同じだ。

405 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:08:24 ]
394です。
みなさん、いろいろありがとうございます。
おおむねsharedでよさげな感じですね。

ただ、396さんの「設計みなおせ」も気にはなるところです。
やっぱり、こういう書き方になる設計って良くないんですかね?
他の人のソース見ても、こういう書き方してるの、あまり見たことないし。


406 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 15:28:51 ]
他所に見せるソースはサンプルが多いから
サンプルにboost使う状況を避けた設計してるとかじゃないかなぁ(適当

sharedなら割と直感的になるので悪くないと思うし、
EffectiveSTLの7項にもマンドクセってなったらsharedを検討してみては? ってある

407 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:26:35 ]
boostのsharedは物凄く遅いらしいから場合によっては別案を考えた方がいいと思う

408 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:50:44 ]
「物凄く遅い」と言うには、どの程度遅いのかデータが欲しいところだね。

409 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 16:53:03 ]
ttp://www.boost.org/libs/smart_ptr/smarttests.htm



410 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:01:33 ]
価値観によるところは大きいだろうけど、これが「物凄く遅い」なら
iostreamやソートは「筆舌に尽くしがたいくらい遅い」んだろうね。

411 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 17:45:37 ]
>>392, 393
鼻から悪魔ですか・・・
まあ、Intel系ならちゃんとオーバーフローしてくれますよね^^

どうもありがとうございました。

412 名前:デフォルトの名無しさん [2007/03/10(土) 22:49:42 ]
C++で、Cのstrtok()のような関数はありませんか。

別にstrtok()でも目的は果たせるんですが、
元の文字列を破壊したり、同時に2ヶ所以上で呼びづらかったりと
あまり美しいとは言えないような気がして。


413 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 22:59:03 ]
無いと思う
けどそれくらい自分で作ればいいんじゃ?
std::stringとか、目的の機能を実装するのに使えそうなモノはあるし

414 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:01:17 ]
>>412
istringstreamからデリミタを指定してgetline()


415 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:11:45 ]
istream_iteratorでfor_eachがC++流

416 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:14:21 ]
高機能さを求めるならboost::tokenizerだと思う。

417 名前:デフォルトの名無しさん mailto:sage [2007/03/10(土) 23:17:43 ]
>>415
ただのistream_iteratorだとtokenじゃなくてcharが返らんか?

418 名前:417 mailto:sage [2007/03/10(土) 23:24:39 ]
ごめん。超アホなこと書いた。
でも、これってデリミタ指定できるか?

419 名前:412 mailto:sage [2007/03/11(日) 00:10:10 ]
レス感謝。
いただいたヒントを元に、更に調べてみようと思います。

それにしても、strtok()ってクセ強いですよねぇ……。





420 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:23:25 ]
>>412
ちゃんとしたベンダーならマルチスレッドな環境で同時に使っても
問題が起きないことを保証してくれてるもんだぞ>strtok()
まぁ、同じスレッドから複数の処理をやっちゃうと確実にアウトだけど。

421 名前:デフォルトの名無しさん mailto:sage [2007/03/11(日) 00:30:41 ]
boost::tokenizerでは、デリミタを残す/捨てる、空トークンを残す/捨てる
を選べるのが良いな。

strtok()には色々問題があるが、デリミタも空トークンも捨てる仕様なので、
これでは困ることもある。
シェルのような感じで空白文字を区切りに使うときはこれでよいのだが。

環境によってはBSD由来のstrsep()という関数が使える場合もある。
こっちは予めリエントラントで、デリミタを捨てて空トークンを残す仕様だ。
ただし、コピーを避けるために元のバッファに破壊的に動作するのは同じ。

Cなら単にsscanf()を使うのも悪くない選択肢。






[ 続きを読む ] / [ 携帯版 ]

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

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