C++相談室 part135

レス数が950を超えています。1000を超えると書き込みができなくなります。
2018/03/31(土) 20:20:06.25ID:o3PNwIlC0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part134
http://mevius.5ch.net/test/read.cgi/tech/1516406742/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.102【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1509780815/

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2018/05/22(火) 17:37:39.23ID:LzyusK+ZM
>>855
普通の知能を持ってたら
> コンパイルして実行可能
に突っ込まれてることぐらいわかるだろうに...
2018/05/23(水) 09:57:56.51ID:NT2O+rqe0
>>856
15.7.2にしたらReleaseでも赤い波線出なくなったぞ
エディタのバグが直ったようだ
2018/05/23(水) 10:14:09.85ID:2zsXYckB0
>>848の3行目は無かったことにすると
2018/05/23(水) 10:39:06.93ID:NT2O+rqe0
だから「エディタの」バグと書き忘れただけなのにお前らしつこいな
DebugモードでもReleaseモードでもコンパイルして実行できてたんだから
2018/05/23(水) 12:24:31.22ID:fJYH1ZEbM
書き忘れとか知らんがな w
そもそもエディタのバグと言うなら三行目は元々不要
余計なことを書いて突っ込まれるとか低能にありがちな行動ってだけ
2018/05/23(水) 12:33:07.54ID:8Hna4W5Ya
>>859
気にするな。俺には>>854の方がよほど的はずれなことを言ってると思うよ。
2018/05/23(水) 12:40:43.11ID:fJYH1ZEbM
>>861
>>856
同じようなレスを書いてループさせるのも低能にありがちな行動
2018/05/23(水) 13:02:27.39ID:nSCJSr52M
エラーの話なのになぜか未定義とか言い出す奴が
2018/05/23(水) 15:37:22.12ID:fJYH1ZEbM
未定義の意味を理解してないなら絡んでこない方がいいぞ
2018/05/23(水) 17:20:05.74ID:CpOh1zRO0
エラー
警告
未定義
不適格

混同するやつが後を絶たないな
866デフォルトの名無しさん (ワッチョイ 89fa-9WOx)
垢版 |
2018/05/23(水) 19:15:29.66ID:Au5e7VGg0
僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』

V9EWM
2018/05/23(水) 21:13:20.83ID:CpOh1zRO0
しょーもね
2018/05/23(水) 21:13:21.12ID:fJYH1ZEbM
この文脈でエラーとか警告とか言い出す時点でアホ丸出しなんだが...w
2018/05/23(水) 22:07:04.14ID:lbYCZF160
VisualStudioはインテリセンスとコンパイルに使うコンパイラが違う
ちょっと設定変えると、とてつもなくエラーが出るのにコンパイルは通るという事態は稀に良くある
2018/05/24(木) 12:25:45.78ID:hqF4m+XgM
>>838
>>771
2018/05/24(木) 23:58:30.63ID:XccjINB00
あるコンテナaとコンテナbを連結?するようなクラス(イテレータ)を作りたいんだが

イメージとしてはa.begin()からa.end()-1までいったら次はb.begin()になるようなやつを思い浮かべてるんだけど

どんな風につくればよいかアドバイスください
2018/05/25(金) 00:18:38.25ID:HgmGhgcw0
>>871
concat_iteratorでググるとそれっぽい実装がチラホラ
873デフォルトの名無しさん (バットンキン MM25-vADk)
垢版 |
2018/05/25(金) 10:18:09.43ID:SC+wi2VoM
C++で2Dのwindowsで動くゲーム作ろうと思っているのだけど、ライブラリって何使えばいいんだ?
2018/05/25(金) 10:18:58.21ID:AT66E0O7M
GDI
2018/05/25(金) 11:33:06.12ID:JXMMrzE70
direct2d
876デフォルトの名無しさん
垢版 |
2018/05/25(金) 12:11:02.95
Unity
2018/05/25(金) 12:19:23.12ID:lIIOH/4a0
Opengl
2018/05/25(金) 12:52:26.94ID:s00mTA6Oa
DirectX Tool Kit
2018/05/25(金) 14:11:55.60ID:7mkguDclM
cairo
880デフォルトの名無しさん (ワッチョイ 39a9-vADk)
垢版 |
2018/05/25(金) 18:33:18.15ID:vSqqKkie0
いっぱいあるなー、一通り試してみようかな
2018/05/25(金) 18:37:43.90ID:mtapFpQed
全部は時間的に無理。
2018/05/25(金) 19:06:13.22ID:O4zlrz7ka
DirectX Tool Kit一択だとおもうが
2018/05/25(金) 19:16:41.38ID:BiCg0uer0
OpenGLなんてのは?
2018/05/25(金) 19:17:34.72ID:el+ngQt20
windowsに限定するならopneGLにする意味は薄い
885デフォルトの名無しさん (ワッチョイ 39a9-vADk)
垢版 |
2018/05/25(金) 23:32:47.23ID:vSqqKkie0
DirectX tool kit なるものは一般的なDirectXの上位互換みたいな捉え方でおk?
2018/05/25(金) 23:41:23.37ID:9e9u/b+G0
>>882
よこからだけど、これ面白そう。
2018/05/26(土) 01:45:05.97ID:r5N0xqhb0
Siv3D とかも楽に使えると思う。 (3D という名前がついてるけど 2D もいける)
2018/05/26(土) 09:49:22.16ID:Gw/MbzDj0
今の時代なら cocos 2d とかモバイルでも使えるライブラリ使った方がいいんじゃないのか
889デフォルトの名無しさん (スプッッ Sd33-PpUk)
垢版 |
2018/05/26(土) 10:01:48.35ID:KfOwUuVld
c++ならアンリアルエンジンで行こうぜ
2018/05/26(土) 15:38:59.11ID:dTnlF+1t0
あれESCキーが消えるから…
2018/05/29(火) 08:17:20.26ID:kgP2LOmLa
string::size_type についてですが、

size_type の前についている

「string::」

というのは何ですか?
2018/05/29(火) 08:20:28.98ID:kgP2LOmLa
名前空間ではないようですし。
2018/05/29(火) 08:28:38.63ID:HMjaHK3IM
静的メンバ関数
でぐぐれ
2018/05/29(火) 09:38:09.06ID:kgP2LOmLa
>>893

ありがとうございます。

string::size_type は companion type というものらしいのですが、
この companion type とは何でしょうか?
2018/05/29(火) 12:33:02.70ID:WLsT9puy0
メンバ関数の引数や戻り値、メンバ変数などで使用するためにクラススコープで定義された型のこと

クラス(この場合はstd::string)を利用する側は、
実際にはその型がなんであるかを知る必要なく
文字列のサイズの型としてstring::size_type を用いることができる

参考
https://stackoverflow.com/questions/41471741/string-companion-types
896デフォルトの名無しさん (アウアウウー Sadd-vxiR)
垢版 |
2018/05/29(火) 13:47:00.51ID:kgP2LOmLa
>>895

ありがとうございました。
2018/05/29(火) 23:46:46.84ID:vO9YU0hS0
std::threadでサブスレッドで処理をしているのですが、処理をキャンセルするためthreadをdetachすると
メモリを破壊しているようで全然別の箇所で色々なエラーが出てきます。system_errorは送出されていません。
サブスレッドではnewでのリソース確保もしていないので理由がわからないです。

detachする際にはjoinableである以外に条件があるのでしょうか。
898デフォルトの名無しさん (ブーイモ MM33-wlFZ)
垢版 |
2018/05/29(火) 23:59:57.19ID:6Y/6D3P7M
>>897
スレッドローカル記憶域とか破棄されたあとにアクセスしてんじゃないの?
2018/05/30(水) 00:33:26.79ID:4+P0NcT60
std::threadのdetachってスレッドを手放すだけでキャンセルはしないのでは
ラムダ式で処理を渡してるなら、ローカル変数の参照キャプチャとかしてるない?
900デフォルトの名無しさん (ワッチョイ c9b3-UDci)
垢版 |
2018/05/30(水) 00:33:44.46ID:D8xt/f/p0
detachしてもスレッドは動き続けますが。
2018/05/30(水) 00:56:37.13ID:OvmXW6ID0
一般にスレッドのキャンセルは難しいので適当に処理を終わらせてjoinするのが良いも思う
2018/05/30(水) 01:10:14.80ID:K2528e3P0
https://ideone.com/3LDXGx
質問です。定期的に同じ関数をスレッドで起動するクラスを作りました。
んでコード中のここ無駄って書いてある行を削除する方法はありませんか。
開発はVCでやってますが、GCCでも通ればいいなーと思っています。
2018/05/30(水) 02:51:38.91ID:gP4Z92jH0
すみません。言葉足らずでした。
メインスレッド:GUI、サブスレッド:既存のライブラリでデータ補間の重い処理
を担当していて、途中でデータ補間パラメータを変更したくなった場合
キャンセルボタンを押してやり直す、という処理を考えています。
CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは
構わないのですがjoinするとそこで処理終了まで待ってしまうのでdetachしたいわけです。重い処理のループの中にキャンセル用フラグでも用意できればキャンセル通知後
ループを抜けて速やかにjoinするところまで到達させる等の方法があるのですが、
既存ライブラリなのでそうはいかず諦めてdetachしようと考えています。
そのまま走り続けるだけだから結果を回収せずほっておけば良いのかと思ってましたが
甘かったみたいです。
>>898
thread_localは使っていないです。
>>899
アドバイスありがとうございます。関数オブジェクト作ってキャプチャは使っていないです。
>>901
スレッドを平和理に終了させる方法はなさそうなのでdetachできなければ諦めてjoinするしかなさそうですね…

とりあえず最小の再現例を作ってみることにします。
2018/05/30(水) 09:53:15.07ID:eD7a+sCF0
重い処理の方を別プログラムのプロセスにしちゃって止めるときはブチ殺すのがシンプルで良さそうに見える
2018/05/30(水) 17:43:48.31ID:K2528e3P0
>>903
async つかえ。
wait_forっていう関数がプロミスにある。
2018/05/30(水) 17:44:50.87ID:K2528e3P0
>>902
たのんますー。
2018/05/30(水) 17:50:39.57ID:K2528e3P0
基本的にstd::threadでキャンセルは不可能。
自分でそういう機構を汲んでやらないといけない。
whileの実行をキャンセルするbool変数つっこむとか。
それでもクリティカルパスの実行は避けられない。
2018/05/30(水) 18:55:49.81ID:DJsvI6z80
強引にスレッドを殺すと、
そのスレッドが確保してたリソースが解放されないかもしれないぞ
メモリであったりセマフォだったりハンドルだったり

ちゃんと終了処理を追加しないとダメだよ
2018/05/30(水) 19:05:49.61ID:EimB82cz0
そのスレッドが使用するメモリ等のリソースを全て
スレッド終了まで保持していても

>>897
>メモリを破壊しているようで全然別の箇所で色々なエラーが出てきます。system_errorは送出されていません。

となるなら、そもそもそのライブラリがスレッドセーフじゃないのかもしれない。

>>904式に別プロセス化するのが一番なのかもね
2018/05/30(水) 22:01:02.21ID:K2528e3P0
ぷぅうううううううううりいいいいいいいぃいいいいいいいいいずへーーーーーーーるぷみーーーーーーーーーー。
2018/05/31(木) 16:11:24.94ID:W0WQ5cWo0
関数の中にif(cancel)return;みたいなのを大量に仕込んで外からフラグを立てて止めろ
2018/05/31(木) 19:02:31.60ID:OT8Sfmwc0
基本的にはフラグで止めるか別プロセスで実行するのが定石だが
質問者は

>CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは
>構わないのですがjoinするとそこで処理終了まで待ってしまうのでdetachしたいわけです。

と言ってるからなぁ
2018/05/31(木) 20:27:20.65ID:4k9lsrlf0
join なんて、カラクリが良く分からないものを、よく使う気になるなぁ
私なら、チャイルドプロセスが自爆するように、陽に記述するなぁ
2018/05/31(木) 20:40:15.15ID:nmebeT/e0
joinが嫌ならdetachすればいいのよ
パンがなければお菓子をたべればいいのよ
2018/05/31(木) 20:53:09.91ID:VgZC2OSf0
世の中には信じられないメンタリティの人がいるもんだなあ
2018/05/31(木) 21:03:58.91ID:3a+XHa0i0
join のカラクリは何も難しいことないと思うが
2018/05/31(木) 21:13:34.61ID:nmebeT/e0
標準ライブラリが嫌ならpthread使えばいいのよ
2018/05/31(木) 21:49:57.28ID:VY6h/Th40
いろいろアドバイスありがとうございます。
どうもdetachした後に局所変数が確保されるとスタックを破壊してしまうようで、
局所変数を確保する前に>>911氏のいうようにif(cancel)return;入れるとLinuxでは落ちなくなりました。
ですが、windowsでは改善せず諦めました。atomicにするのものも面倒ですし。

結局キャンセルするときは結果を回収せず、さらに別スレッド立ち上げてjoinすることで
メインスレッドのGUIに制御が戻るようにしました。長期的には別プロセス化するしかなさそうですね。
ありがとうございました。
2018/05/31(木) 21:53:20.51ID:TwfgGFWOM
> 既存ライブラリなのでそうはいかず
って書いてあるのに>>905,>>907-908,>>911とかバカなら黙っとけよ...
2018/05/31(木) 22:35:57.56ID:EV/maKH/0
913はスレッドを自爆させた後joinしないのであろう…
921デフォルトの名無しさん
垢版 |
2018/05/31(木) 22:51:40.57
子スレッドが一つならjoinで待っててもいいけど、複数個になったら無限ループで待つよね
2018/05/31(木) 22:52:12.55ID:EV/maKH/0
ていうか「重い処理かつ終了に時間が要するスレッド」複数個を所有するサーバみたいなスレッドを一発噛ませて、
パラメータを変えたくなったら「現行スレッド停止」と「新しいパラメータでのスレッド起動」をサーバに対して指令するつくりにすれば
良い
この場合は「重い処理かつ終了に時間が要するスレッド」が終了するまで誰も待つ必要はなく(※サーバ終了時は除く
、サーバみたいなスレッドは、クライアントから「新しいパラメータでのスレッド起動」コマンドを受けたときおもむろに
「死んでる(再利用できる)スレッドはどれかいな〜、」とタイムアウト0秒のjoinでポーリング式にサーチすれば良い

現行スレッドが死ぬまでの間現行スレッドと新たに起動するスレッドが並列に動くことになるが
>CPUは複数コアあるのでサブスレッドが走り続けてリソース開放が遅れるのは 構わない
ということですしおすし、
2018/05/31(木) 22:56:14.51ID:EV/maKH/0
>>921
ウィンドーズならWaitForMultipreObjects()とかその亜種で複数の終了待ちができうる
そうでなくともイベントフラグの同時待ちはだいたいどんなマルチタスクOSでもできるから
それを使って類似のしくみを作れうる、。
2018/05/31(木) 23:21:33.93ID:i2WXWbd70
>>923
できうる、作れうるって日本語的におかしいだろう
925デフォルトの名無しさん (ワッチョイ f58d-InwY)
垢版 |
2018/06/01(金) 04:04:16.74ID:p3jBadVq0
ウインドーズとか何か別物感あるし、multipleのスペルもおかしいし大丈夫か
2018/06/01(金) 04:08:40.92ID:ampOWGNn0
色々なところで糞が露呈している
それがWindows
2018/06/01(金) 04:11:32.11ID:uW2rQW//0
デザインとしては Windows の方が現代的なんだけど、
色んなものが POSIX を基本にしたデザインになってるから噛み合わないんよなぁ。
2018/06/01(金) 04:16:04.83ID:ampOWGNn0
POSIXに準拠できないWindowsがどうかしている
2018/06/01(金) 04:22:16.25ID:uW2rQW//0
>>928
昔は POSIX 準拠にしてたよ。
アメリカの政府が採用するのに POSIX を要求してたみたいで、仕方なくやったって話。
だけど、基本的なモデルが違うものに API だけ接ぎ木してもなぁ。
2018/06/01(金) 04:43:45.31ID:SICoZSIN0
windowsでpthread使うたびにトラブル起こってつら
2018/06/01(金) 08:14:44.74ID:WJ5uQBEIM
>>921
他に条件があるならともかく、普通にjoinで待てばよくね?
2018/06/01(金) 08:27:54.49ID:WJ5uQBEIM
>>922
joinしたら再利用できないだろ
933デフォルトの名無しさん
垢版 |
2018/06/01(金) 08:30:22.24
>>931
別に、joinで済むならjoinでいいんじゃね
2018/06/01(金) 09:15:20.19ID:oHKnNuZr0
キャンセルしたくなるほど長い処理ならスレッドキューイングする利点はない
もちろんしたいならしてもいい
935デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 09:35:53.16ID:uCsHgk1n0
C++を使うなら、Windowsでいいんじゃないの。
Clang、gcc、clと主要なコンパイラが動く貴重な環境だし。
文書を残さないといけないからアプリも必要。
図を描くのにvimでSVG書くって人もいるけど、流石にそれは労力の使い方を間違えてる。
936デフォルトの名無しさん (ブーイモ MMbe-o2EZ)
垢版 |
2018/06/01(金) 10:01:00.93ID:oDn7ey18M
サブスレッドでjoinして結果を使わない、というのとデタッチするのとどう違うんやろな。デタッチってなんのメリットあるんやろか。
2018/06/01(金) 10:15:36.25ID:oHKnNuZr0
自分で書いてる通り結果を使わなくて終了も待ちたくないなら join せずデタッチ。
メリットはリソース(スレッドハンドルなど待ち合わせ用リソース)の自動的な解放くらいか。
938デフォルトの名無しさん (アウアウウー Sa09-msj4)
垢版 |
2018/06/01(金) 11:41:29.12ID:sIQxQP9sa
連結リストのクラス list があります。
addFirst
removeFirst

などのメンバ関数があります。

この list を継承して、 stack クラスを作ります。

stack クラスにはメンバ関数 push と pop があります。

push の中で addFirst を呼んでいます。
pop の中で removeFirst を呼んでいます。

stack クラスのインスタンスからは、 list クラスの addFirst, removeFirst などを
利用不可としたいのですが、どうすればいいのでしょうか?

: public list と継承するともちろんダメです。
: private list と継承すると push の中で呼んでいる addFirst が使えなくなってしまいます。

どうすればいいのでしょうか?
2018/06/01(金) 11:47:52.19ID:1LiDvq+rd
protect
940デフォルトの名無しさん
垢版 |
2018/06/01(金) 11:55:31.26
friend
941デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 11:55:48.39ID:uCsHgk1n0
・stack : protected listとして、必要なメンバをstackで明示的に公開する。
  ・listとstackのポインタに互換性がなくなる。
942デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 11:58:45.22ID:uCsHgk1n0
・assert、throw等で警告するだけのaddFirst、removeFirstをstack側に作りオーバーライドし、規約で使うなと言っておく。
  ・非常にダサい。
943デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 12:00:33.78ID:uCsHgk1n0
・基底クラスbasic_listを設け、そこからlistとstackを別に派生する。
2018/06/01(金) 12:12:54.27ID:SICoZSIN0
>>935
釣りか?
MSYSがあるからなんとか我慢して作業できるが
仕事以外でそんな苦痛を受けながらプログラミングなんかしたくはない
945デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 12:31:43.05ID:uCsHgk1n0
>>944
wslでおk。
946デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 12:33:20.56ID:uCsHgk1n0
wslを有効にしてコルタナにウブンツと言えばすぐ使えます。
2018/06/01(金) 12:41:08.30ID:SICoZSIN0
wslでWindowsネイティブなバイナリ作れんの?
2018/06/01(金) 12:43:01.01ID:Iz+jFShBM
>>944
> 仕事以外でそんな苦痛
でもどんな苦痛なのかは書けない w
949デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 12:44:36.05ID:uCsHgk1n0
さあどうだろ?
Linux側からWindowsのファイルは読めるけど。
環境設定が大変そうだな。
逆にWindows側からLinuxのファイルを直接変更したらだめらしい。
950デフォルトの名無しさん (ワッチョイ 5db3-/C2z)
垢版 |
2018/06/01(金) 12:47:41.68ID:uCsHgk1n0
俺のおすすめの使い方は、Windowsバイナリはcl、Linuxバイナリはwsl上のgccで作る。
開発環境はVisual Studio2017、CMakeプロジェクトを使う。
これだけでWindowsとLinux両方対応できる。
2018/06/01(金) 12:51:07.74ID:SICoZSIN0
>>950
それ良さそうだな
今度試してみる
2018/06/01(金) 13:01:33.50ID:sIQxQP9sa
>>939-943

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

Macを使っている人はいませんか?
コンピュータサイエンティストって大抵Macのノートパソコンを使っているイメージがあります。
2018/06/01(金) 13:11:39.88ID:pUOZzX0iM
>>952
mac使ったところでmacしか使えないだけ
本物になりたいならシェアが高いウインドゥスを使え
もしくはLinux
2018/06/01(金) 13:29:21.95ID:A9MSzynoM
>>944
別に補陀落渡海しても良いのよ
2018/06/01(金) 13:30:34.27ID:STCtC+aF0
>>952
Macの内部はUnixだから
レス数が950を超えています。1000を超えると書き込みができなくなります。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況