1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
151 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:57:31 ] >>144 valtですか。 ありがとうございます。
152 名前:デフォルトの名無しさん [2010/02/17(水) 20:58:22 ] Boost.Coroutine ttp://hamigaki.sourceforge.jp/doc/html/coroutine.html 2009-12-12 - melpon日記 - C++すら(ry Boost][C++]Boost.勉強会の資料 ttp://d.hatena.ne.jp/melpon/20091212 ttp://melt.sytes.net/data/Boost.Coroutine.ppt ・Boost.Fiber という対抗馬も最近出てきた
153 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:59:10 ] 理想的には部品丸出しではないが、 バカが作ると部品を理解していなければならなくなる 仕様だな。
154 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:06:26 ] マルチスレッドキューでロックしないサンプルできた。読み込むに失敗・キューがないときにwaitはいれたが。 #include "include/tbb/concurrent_queue.h" #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; concurrent_queue<int> que; int s[2]={0,0}; unsigned WINAPI fnc(void *n) { int x,num=(int)n; while(1) { if( !que.try_pop(x) ) { Sleep(100); continue; } if(x==-1)return 0; s[num]+=x; } } int main() { HANDLE hd[2]; int n; for(n=0; n<2; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc,NULL, n ,NULL); for(n=0; n<=1000; n++) que.push(n); que.push(-1); que.push(-1); WaitForMultipleObjects(2, hd, TRUE, INFINITE); cout<< s[0]+s[1]<<endl; getchar(); }
155 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:08:51 ] 0から1000まで足すだけ。キューへマルチスレッドでpush、popして 読み取って空いてるスレッドが足し合わせていくサンプル。 答えは合ってたよ。
156 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:10:28 ] キューではロックしているだろうがな。そこを自作せずに済んだという話だ。
157 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:20:49 ] プログラム組んでて returnって打ったつもりだったら tryit, って打ってた なんか感動した
158 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:21:46 ] rをtにずらして打ってみると・・・!?
159 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:22:04 ] ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい
160 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:23:35 ] >>157 夢を感じた
161 名前:デフォルトの名無しさん [2010/02/17(水) 21:33:09 ] HDL ではごく普通というか大前提の話なんだが 直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな
162 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:39:17 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
163 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:40:28 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
164 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:42:11 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
165 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:45:58 ] 任意の整数を返す関数が、失敗も正常フローだった場合に すっきりするエラー通知の仕方はある?
166 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:46:42 ] パラメータになんか持たせるとか
167 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:57:56 ] なにを?
168 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:01:15 ] _beginthreadとCreateThreadは何が違うんですか? というかどっちを使った方がいいんですか?
169 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:13 ] >>167 判断できる情報を >>168 適材適所。常にどちらかがよいということはない
170 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:11:21 ] C++の配列サイズ指定で変数は使えることもあるんでしょうか?それともコンパイラ依存でしょうか? MinGWで下をコンパイルは正常にでき(Warningも出ない)、arrayのsizeofは32byteとなってちゃんと確保されているようです。 #include <iostream> using namespace std; int main() { int num = 3 + 5; int array[num]; for (int i = 0; i < num; i++) { array[i] = i; } cout << sizeof array << endl; }
171 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:12:44 ] 正確にはC++ではなくC99で使える様になったはず
172 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:18:32 ] >>170 gccの独自拡張
173 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:25:20 ] >>168 CreateThreadはWindowsAPI、_beginthreadはCランタイム。 CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、 MSはそのような場合には_beginthreadを使うように推奨している。
174 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:32:21 ] なるほど。 参考になりました。 unix - windows 互換のスレッド関係の関数は無いんですかね・・・
175 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:38:29 ] Cランタイムって何?
176 名前:154 mailto:sage [2010/02/17(水) 22:41:42 ] 修正。引数渡す場所間違えて一スレッドしか動いていない。 #include "include/tbb/concurrent_queue.h" #pragma comment (lib, "tbb.lib") #include <process.h> #include <windows.h> #include <iostream> using namespace std; using namespace tbb; #define N 3 concurrent_queue<int> que; int s[N]; unsigned WINAPI fnc(void *n) { int x,num=(int)n; while(1) { if( !que.try_pop(x) ) { Sleep(100); continue; } if(x==-1){ cout<<"正常終了number:"<<num<<endl; return 0;} s[num]+=x;Sleep(rand()%50); }} int main() { HANDLE hd[N]; int n; for(n=0; n<N; n++) s[n]=0; for(n=0; n<N; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL); for(n=0; n<=50; n++) que.push(n); for(n=0; n<N; n++) que.push(-1); WaitForMultipleObjects(N, hd, TRUE, INFINITE); int sum=0; for(n=0; n<N; n++) {cout<< "スレッド"<<n <<"の合計 "<<s[n]<<endl; sum+=s[n]; } cout<<"総和 "<<sum<<endl; getchar(); }
177 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:40 ] >>174 pスレッド windowsというのがあるが、おすすめしない。 一度にアクセスが起きるとバグった経験有り。同じ物をwindowsの命令に書き換えたら動いた。 スレッドのどれか一つ or全部の終了待ちがない気がする。
178 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:47:23 ] Open Source POSIX Threads for Win32 sourceware.org/pthreads-win32/
179 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:51:55 ] 一時期windowsであっても、linuxの互換コードで書くべきだという考えが起こり 全て統一しようとしたがPthread for winがうまく動作しないので諦めた経験ある。 現在の環境で生産性の良い、短いコードで済ますのが一番という考えになった。 完成品が出来なければ意味ない。完成していれば他OSへも移植しやすい。
180 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:00:42 ] QtやBoostその他 ラッパライブラリじゃできないの?
181 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:02:56 ] Qtもboostも標準にはいってないじゃん サイズもでかいし linuxでどこでも使えるのはPthreadだけでは
182 名前:180 mailto:sage [2010/02/17(水) 23:07:16 ] >>181 その方、Pthreadはいつから標準になったと申すか。
183 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:09:31 ] POSIX Threads, or Pthreadsのライセンスは This implementation is free software, distributed under the GNU Lesser General Public License (LGPL). え?誰も聞いてないって?
184 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:13:49 ] 入ってないlinuxはないんでは。c/c++がコンパイル可能な環境なら。
185 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:16:36 ] 標準っていうか、プリインストールって言いたかったわけか。
186 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:18:22 ] ち、違うよ。
187 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 00:57:43 ] どっちもbccでうごかん。 lock-freeの高速キューを作ってくれよ。 インラインアセンブラ・マクロの特殊構文の多用が原因と思われる。 windows 標準のcas命令のみで頼む。 Thread Safe Template Library sourceforge.jp/projects/freshmeat_tstl/ Intel Threading Building Blocks www.threadingbuildingblocks.org/
188 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:43:02 ] bccなんてポンコツ捨てろよ
189 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:41:14 ] bccは毎年新規で販売してるんだぞ。 コンパイル速度速くて良いんだこれは。
190 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:49:50 ] httpサーバーなどへIf-Modified-Sinceをつける場合statでファイルの更新日付を 取得してどのように変換すればいいのでしょうか? 日本時間に直すサンプルは見かけるのですがGMTのまま文字列化する方法が わかりません
191 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:08:13 ] スレッドセーフキューがマルチスレッドの要なんです マクロやアセンブラ使わずに書いてくれると喜ばれますよ
192 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:22:15 ] STLportがスレッドセーフなSTLだった これつかお
193 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 11:43:35 ] わざわざいうな
194 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:34:49 ] >>190 strftimeじゃできないの?
195 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:14:32 ] プロの方はスマートポインタを使うのが基本とのことですが、例えば引数なんかも hoge( shared_ptr<Test>& sp )といったかんじになるんでしょうか? それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような 使い方ですか?
196 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:44:09 ] 参照渡しだよ
197 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:07:01 ] STLportがbccでコンパイルできん
198 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/18(木) 20:43:01 ] >>195 僕はクラスのメンバ関数が前提なら、 関数を所有するクラスがオブジェクトをメンバ変数に保持するときはスマートポインタを、 一時的に使うだけなら参照で渡します。 >それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような 一番やっちゃいけない気がするんですけど・・・
199 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 21:44:30 ] >>171 >>172 アドバイスありがとうございます。 手元のどの参考書見ても変数は使えないと書いてあってあれ?と思っていたしだいです。 Visual C++で使えないようなのでgccだけなんですね。
200 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:19:13 ] >196 >19 ありがとうございます。 今試してみましたが同一ポインタを複数のshared_ptrに格納すると、 shared_ptrの数だけデストラクタが呼ばれてしまうんですね。 基本は参照で複製を作らないようにするということですね。
201 名前:デフォルトの名無しさん [2010/02/18(木) 22:21:29 ] >>200 そう。 RAIIを徹底しろ。
202 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:21:59 ] 失礼しました。 >>196 >>198 でした。
203 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:22:59 ] g++やVC++などの有名どころのC++コンパイラについてお聞きしたいのですが、 コンパイル時定数を使った ttp://codepad.org/EmT4J9d3 こんなifによる分岐があるとします。 このとき、成果物.exeはちゃんと最適化されて 分岐が消えるのでしょうか? よろしくお願いします。
204 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:25:05 ] codepadで使ってるg++とVC9.0では消失を確認
205 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:36:54 ] ありがとうございます。 const bool ctc = 100; // compile-time constants を bool ctc = 100; // NOT compile-time constants にしても同じでしょうか? (volatileは付けません。) お手数をおかけ致しますが、よろしくお願いします。
206 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:50:06 ] const bool ctc = 100; // compile-time constants に関しても同じ(キャストはちゃんとした方がいい)。 そもそも実行時への互換性を保たないと最適化というのはできないからね。 bool ctc = 100; // NOT compile-time constants でも、単純にctcへの変更が無い事から最適化がなされた(204と同じ環境で)。 ただ、このケースは後のコードに完全に依存しているから考察する価値はあるのかどうか疑問だな。
207 名前:205 mailto:sage [2010/02/18(木) 23:02:24 ] >>206 ご教示ありがとうございます。 そういったことは、どうやって調べればよいのでしょうか? .asmを出力して調べているのでしょうか?
208 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:05:31 ] >>207 そうだよ。
209 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:17 ] YOUバイナリ読んじゃいなYO
210 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:49 ] >>208 ありがとうございます。 asmからは逃げ回ってきているので全然読めそうにありません。 勉強しなければなりませんね。。。
211 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:09:33 ] 別に勉強しなくても片手間にasmの命令リストと見比べてるだけだけどね。
212 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:15:53 ] asmってコンパイラやアセンブラによって 扱いが違うからやだ
213 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:16:19 ] なんかアセンブリって難しそうなイメージある 低級だから追いかけるのが大変なだけで難しい構文とかはむしろ少ないんだろうけど・・・
214 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:21:24 ] アセンブリ自体は簡単だけど、他の言語で出来ることをアセンブリでするとか考え出すと難しい
215 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:23:20 ] アセンブリで全部済むならプログラミング言語なんて必要ないわけで
216 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:27:53 ] そう考えるとC言語とか 移植性もあってすげえ言語だな。 今更だけど。
217 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:45:23 ] >>216 cが優秀じゃなくてcコンパイラ作った人が優秀なだけだな
218 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:11:59 ] 規格作ったやつだ。 Cコンパイラは、上司が監視して下っ端が要求通り作ってるだけ。 初めの設計図が一番。 たとえば、アニメは動画マンという超低賃金のやつらがやっているが 宮崎駿や原作漫画家がいるから開発できるんだ。
219 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:18:03 ] >>218 現存するコンパイラは確かに規格ありきで作り始めてそうだけど、元々は たくさんの環境向けに作られていた C の共通部分を元に規格化されたんだから、 先にコンパイラ作ってた人が下っ端ということはないだろう。
220 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:33:47 ] >>219 まあ初期のC言語確立やコンパイラ作ったような人たちは 上も下もねーだろうな 小さいチームで多少リーダー的存在がいるくらいだろうし そういう中で試行錯誤しながらとかだろうし その後の各環境ごとのコンパイラ開発はC言語そのものがあるんだし それにあわせちゃえばいいので作業だろうな (でもそれなりに知識は要るので下っ端ってわけじゃないだろうけど
221 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:48:53 ] >195 そんな渡し方したら危険じゃない?
222 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 05:22:11 ] ファイルIO( open close load)がかなり時間かかるから 要求を並列で出しておくと時間短縮するね。 細かい多数のファイルで2倍-3倍くらいの向上。
223 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 06:34:44 ] 5倍を目指してくれ
224 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:29:30 ] files=20
225 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 12:47:04 ] dmr にあやまれ。
226 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 14:45:10 ] How many files(0-15)?■
227 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 15:58:57 ] じじい乙
228 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 17:54:32 ] ここの人ってワイルドカード欲しい時に何使ってるの? boost使ってる人なら正規表現なんだろうけど、 使って無い人が気になる。
229 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 18:03:44 ] windows api か 正規表現で代用
230 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 18:21:07 ] 俺は魔法だなあ
231 名前:デフォルトの名無しさん [2010/02/19(金) 21:12:55 ] そもそもワイルドカードと正規表現がどうつながるんだ?
232 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:14:55 ] ワイルドカードでできる事は正規表現でできるだろ
233 名前:デフォルトの名無しさん [2010/02/19(金) 21:31:27 ] C++ でできる事はアセンブラでもできるんだが そういう問題ではあるまい?
234 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:33:36 ] 何を言ってるんだ…
235 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:36:52 ] ポインタが使える人、暇な人に質問です。 下のコードはメモリの確保と解放がきちんとなされてるでしょうか? codepad.org/GUSgjZWM
236 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:39:35 ] 異常なし
237 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:45:42 ] 暇な人とは失礼な 改めていわれなくてもこんなところ見てる段階で暇・・・
238 名前:デフォルトの名無しさん [2010/02/19(金) 22:05:30 ] >>233 正規表現が無い環境だってあるじゃない。 外部ライブラリも不可とか。 その例で言うとC++が使えない環境という事。 「C++使えないなんてあるわけないじゃん」とは言えまい?
239 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:10:36 ] >>238 C++使えないって、組み込み系とかですか? なんかろくなコンパイラがないってことなんでしょうか。
240 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:19:26 ] >>239 例えばの話です。 組み込み系なんてサッパリ^O^
241 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:23:34 ] なんで2つの言葉のつながりから、環境がどうこうの話になるんだ。 話の流れ方に病的なものを感じる。
242 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:24:52 ] 病的っていうか、知ったばかりの単語を中学生が使いたがってるだけな雰囲気
243 名前:デフォルトの名無しさん [2010/02/19(金) 22:26:19 ] >>238 あったねー、OS にワイルドカードがなくてアプリが独自にサポートしてたケース アプリごとに微妙に解釈が違ってて脱力ずっこけが何度もあった >>239 C++ 自体はどのシステムにでも使えるぞ、C++ で HEX や HDL が作れるわけで
244 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:26:46 ] >>235 パッと見だがリークすると思う t = new Test; を解放してない delete t; が必要じゃない?
245 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:28:24 ] 聞く前にop new/deleteでカウントするぐらいはやってみようよ
246 名前:235 mailto:sage [2010/02/19(金) 23:07:57 ] >>244 見落としてました。 >>245 new、deleteをオーバーライドってことでしょうか? やってみます。 どうもありがとです。
247 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 23:49:29 ] Test *New(int index0,int index1,int index2); の途中で失敗した場合のリークも
248 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:39:58 ] worker threadパターンを実装したいので 既存の関数を実効させる部分をテンプレートで 実装したいのですが、どのように書けばいいのか わかりません。 たとえば、f1、f2、f3を同じworke threadクラスで 扱うにはどのようにコーディングするのが正しいのでしょうか
249 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:47:04 ] スレッドを起動させっぱなしにするのがワーカースレッドっていうのか。 >>176 のunsigned WINAPI fnc(void *n);もワーカースレッドだな。参考にしてくれよ。
250 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:48:51 ] >>176 は一つのキューに挿入と取り出しを行い、3スレッド並列で空いたら スレッドからデータを取り出し処理を行う。
251 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:51:15 ] キューが貯まったら各関数に通知したら、ビジーループを防げるけど 面倒なので100ms毎に確認しに行くようになっている。