次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part132
http://mevius.5ch.net/test/read.cgi/tech/1507561894/
このスレもよろしくね。
【初心者歓迎】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
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
探検
C++相談室 part133
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 1fcf-H1rY)
2017/11/24(金) 16:52:50.43ID:WoNXR2ax0195デフォルトの名無しさん (ワッチョイ bfe7-5mWG)
2017/11/29(水) 20:25:15.41ID:U+t8Y71p0 ファイル存在チェック→オープンがアンチパターンなのは常識だろ何言ってんだお前
196デフォルトの名無しさん (ワッチョイ 5f34-y0n2)
2017/11/29(水) 20:31:50.13ID:6NgtQx/F0 相変わらず持論展開ウザ杉るの自覚してないな
アスペウンチ君
アスペウンチ君
197デフォルトの名無しさん (ワッチョイ 5fbd-hcjg)
2017/11/29(水) 21:17:19.68ID:6HlzpX8E0 ハローワールド逝け
198デフォルトの名無しさん (ワッチョイ 079f-5mWG)
2017/11/29(水) 21:43:44.23ID:LrQLLGRZ0 C++スレすらゆとり汚染ひどいのかよ
世も末だな
世も末だな
199デフォルトの名無しさん (ワッチョイ 07eb-5mWG)
2017/11/29(水) 21:47:36.72ID:ZCDC/+v90 実際にスレ汚しとるのはお前だけどな
200デフォルトの名無しさん (ワッチョイ 8746-TjkM)
2017/11/29(水) 22:29:25.62ID:IulhJnoW0 割とタイムリーな話題というか、ここ一週間ぐらい、実行時エラーやら例外やらが発生したとき
どうやったらプログラムを安全に再開するか考えてた
で、至った考えは、ひとまとまりの一連の処理を二つに分割して
まず前半はread onlyセクションで、プログラム本体の状態を書き換えてはならないが
そのかわり例外が発生したら、無かったことに出来る(なのでread onlyにしておく)
後半はwritableセクションで結果をプログラム本体に反映させるが、その代わり例外(失敗)は許さない
bool func(){
hoge_type result;
try{ result = sub1(); sub2(); }catch(...){ /*リカバリ可能*/ return false; }
try{ hoge = result; }catch(...){ /*リカバリ不可*/ abort(); } return true;
}
ただこれでもあまりうまくいかなくて、sub1()とsub2()が上記ルールに従ってたとしても
sub1()は成功してsub2()は失敗した場合に困る
全体としては失敗だけどsub1()は既に成功していて結果も反映されているので
sub1()の実行を無かったことにして巻き戻すのは難しい
sub1()をsub1_read_only()とsub1_writable()に分解するという方法もあるかもしれないが
データの受け渡しで苦労するし、可読性が落ちるうえ、複雑なことはしにくくなる
もう一つの別の要求もあって、重たい処理は別スレッドで実行して即座にGUIスレッドに制御を返したい
ということはユーザーは重い処理のキャンセルが出来るだろうが
処理のキャンセルは例外からのリカバリと本質的には全く同じこと
また、先ほどのread onlyセクションはプログラム本体の状態を書き換えない前提なので
別スレッドで実行したり非同期に同時並行で実行したりが出来る
(ただし、誰かがwritableセクションを実行したら、そいつ以外の処理結果は無効になる
古いデータに基づいて処理した結果ということになるので・・)
どうやったらプログラムを安全に再開するか考えてた
で、至った考えは、ひとまとまりの一連の処理を二つに分割して
まず前半はread onlyセクションで、プログラム本体の状態を書き換えてはならないが
そのかわり例外が発生したら、無かったことに出来る(なのでread onlyにしておく)
後半はwritableセクションで結果をプログラム本体に反映させるが、その代わり例外(失敗)は許さない
bool func(){
hoge_type result;
try{ result = sub1(); sub2(); }catch(...){ /*リカバリ可能*/ return false; }
try{ hoge = result; }catch(...){ /*リカバリ不可*/ abort(); } return true;
}
ただこれでもあまりうまくいかなくて、sub1()とsub2()が上記ルールに従ってたとしても
sub1()は成功してsub2()は失敗した場合に困る
全体としては失敗だけどsub1()は既に成功していて結果も反映されているので
sub1()の実行を無かったことにして巻き戻すのは難しい
sub1()をsub1_read_only()とsub1_writable()に分解するという方法もあるかもしれないが
データの受け渡しで苦労するし、可読性が落ちるうえ、複雑なことはしにくくなる
もう一つの別の要求もあって、重たい処理は別スレッドで実行して即座にGUIスレッドに制御を返したい
ということはユーザーは重い処理のキャンセルが出来るだろうが
処理のキャンセルは例外からのリカバリと本質的には全く同じこと
また、先ほどのread onlyセクションはプログラム本体の状態を書き換えない前提なので
別スレッドで実行したり非同期に同時並行で実行したりが出来る
(ただし、誰かがwritableセクションを実行したら、そいつ以外の処理結果は無効になる
古いデータに基づいて処理した結果ということになるので・・)
201デフォルトの名無しさん (ワッチョイ 8746-TjkM)
2017/11/29(水) 22:30:19.77ID:IulhJnoW0 上記のようなことを総合的にまとめると
void func(){
// read only セクション
barrier();
// writable セクション
}
という結論に至った
ただし、func()はコルーチンから呼び出す
read only セクションでは、必要であれば処理を別スレッドで処理を実行することが出来、自身はyield_returnする
投げた処理が終わるとメインスレッドにて続きから再開してもらう
read only セクションでは、新たなコルーチンを作成することが出来、作成元のコルーチンと親子関係を構築する
親子関係を持つコルーチンの全てがbarrier()に到達するか終了してからでないとbarrier()以降は実行されない
親子関係を持ついずれかのコルーチンがread only セクションにて補足されない例外を発生するか
もしくは外からキャンセルされると、無かったこと扱いになって
全ての親子関係を持つコルーチンにおいてbarrier()以降は実行されない
(親子関係の有る複数のコルーチンの処理が一端barrier()で止まって、全てが成功したのを確認してからbarrier()以降が再開される)
コルーチンにはグループNoを設定することが出来る
違ったグループNoを持つコルーチンを同時に実行することはできない(終わるまで待つ)
同じグループNoを持つコルーチンは同時に実行できるが
いずれかのコルーチンがyield_returnした段階で、それと親子関係のあるコルーチン以外はすべてキャンセル扱いになる
たとえばボタンAを押して処理Aが始まったが処理Aが終わる前にボタンBが押されたら
処理Aはキャンセル扱いになって処理Bが反映される
キャンセルされると困るような処理は別のグループNoにしておく
というような感じでひとまず落ち着いた
グループNo周りはかなり暫定的な感じだが・・・
以上日記
void func(){
// read only セクション
barrier();
// writable セクション
}
という結論に至った
ただし、func()はコルーチンから呼び出す
read only セクションでは、必要であれば処理を別スレッドで処理を実行することが出来、自身はyield_returnする
投げた処理が終わるとメインスレッドにて続きから再開してもらう
read only セクションでは、新たなコルーチンを作成することが出来、作成元のコルーチンと親子関係を構築する
親子関係を持つコルーチンの全てがbarrier()に到達するか終了してからでないとbarrier()以降は実行されない
親子関係を持ついずれかのコルーチンがread only セクションにて補足されない例外を発生するか
もしくは外からキャンセルされると、無かったこと扱いになって
全ての親子関係を持つコルーチンにおいてbarrier()以降は実行されない
(親子関係の有る複数のコルーチンの処理が一端barrier()で止まって、全てが成功したのを確認してからbarrier()以降が再開される)
コルーチンにはグループNoを設定することが出来る
違ったグループNoを持つコルーチンを同時に実行することはできない(終わるまで待つ)
同じグループNoを持つコルーチンは同時に実行できるが
いずれかのコルーチンがyield_returnした段階で、それと親子関係のあるコルーチン以外はすべてキャンセル扱いになる
たとえばボタンAを押して処理Aが始まったが処理Aが終わる前にボタンBが押されたら
処理Aはキャンセル扱いになって処理Bが反映される
キャンセルされると困るような処理は別のグループNoにしておく
というような感じでひとまず落ち着いた
グループNo周りはかなり暫定的な感じだが・・・
以上日記
202デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 00:09:19.12ID:fhhh9IM80 32 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:30:11.12 ID:DaGrByo80 [1/4]
C++入門書でよく勉強したはずなのにautoとかconstexprとか知らんもんが一杯…
35 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:38:44.74 ID:DaGrByo80 [2/4]
>>32
やさしいC++第3版
大体9年前に買ったのを寝かしといて最近になって勉強し始めたが、そんなに仕様変更ないと思ってたが間違いだったようだ
36 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:39:04.93 ID:DaGrByo80 [3/4]
>>33だった
39 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:52:39.37 ID:DaGrByo80 [4/4]
Effective Modern C++17出たら買ってみるわ
95 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 12:49:42.23 ID:vi7VqSly0 [1/2]
遠回しに他の言語の本読めって言っとるようなもんだ
98 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 13:23:45.26 ID:vi7VqSly0 [2/2]
>>97
ああそういうことね
132 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 12:26:15.71 ID:+ODnZXKO0 [1/2]
Java原人がいるようだね
156 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 23:59:58.99 ID:+ODnZXKO0 [2/2]
ワッチョイって神だわ
199 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/29(水) 21:47:36.72 ID:ZCDC/+v90
実際にスレ汚しとるのはお前だけどな
さすがゆとり、これらが役立つ投稿のつもりらしい。
C++入門書でよく勉強したはずなのにautoとかconstexprとか知らんもんが一杯…
35 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:38:44.74 ID:DaGrByo80 [2/4]
>>32
やさしいC++第3版
大体9年前に買ったのを寝かしといて最近になって勉強し始めたが、そんなに仕様変更ないと思ってたが間違いだったようだ
36 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:39:04.93 ID:DaGrByo80 [3/4]
>>33だった
39 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/26(日) 17:52:39.37 ID:DaGrByo80 [4/4]
Effective Modern C++17出たら買ってみるわ
95 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 12:49:42.23 ID:vi7VqSly0 [1/2]
遠回しに他の言語の本読めって言っとるようなもんだ
98 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/27(月) 13:23:45.26 ID:vi7VqSly0 [2/2]
>>97
ああそういうことね
132 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 12:26:15.71 ID:+ODnZXKO0 [1/2]
Java原人がいるようだね
156 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/28(火) 23:59:58.99 ID:+ODnZXKO0 [2/2]
ワッチョイって神だわ
199 名前:デフォルトの名無しさん (ワッチョイ 07eb-5mWG)[sage] 投稿日:2017/11/29(水) 21:47:36.72 ID:ZCDC/+v90
実際にスレ汚しとるのはお前だけどな
さすがゆとり、これらが役立つ投稿のつもりらしい。
203デフォルトの名無しさん (ワッチョイ 5deb-JjO2)
2017/11/30(木) 00:38:22.38ID:trGz4Mxl0 いつの間にかIP信者になったんだ・・・W
204デフォルトの名無しさん (ワッチョイ 6680-9RvO)
2017/11/30(木) 01:15:02.77ID:aDlGM/9P0 バックアップの、3-2-1 ルール
同じデータをコピーして、3つ持つ。
2つの媒体に保存する。
1つは、離れた場所に持つ
同じデータをコピーして、3つ持つ。
2つの媒体に保存する。
1つは、離れた場所に持つ
205デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 02:04:31.87ID:fhhh9IM80 >>200
SQLite3使ってみろ。
>>201
C++はyeildも入れたのか?と思ったがstd::yieldはただのsleep(0)か。
まああまり凝ったことしても、とも思うし、そもそもGUIはC++で無理に組む意味無いぞ。
それも含めて自由にやればいいとも思うが。
>>125
君は何が言いたかったのだ?
分かると思うが俺がゆとり死ねと言っている奴だ。
見る限り、君は話す気はあるようだ。
125は唐突過ぎてスルーしたが、相手してもいいぞ。
ただし125はバラけ過ぎているからテーマを絞れ、と言いたいところだったが、
その日記を読む限り上段落の話は一連のテーマか?
だったらWeb系の連中ならそこは「DBを使う」って事になっている。
C++は自前で何でもできるから、無意味なほど精神論で速度を追求するわけだが、
そこらへんをサクッと割り切るあいつらのやり方にも学ぶ物はあるぞ。
そもそも自前でトランザクションを実装するとか、検証の手間まで含めたらありえんだろ。
精神論でゴリゴリではなく、上手く手抜きするコツも覚えるべきだ。
SQLite3使ってみろ。
>>201
C++はyeildも入れたのか?と思ったがstd::yieldはただのsleep(0)か。
まああまり凝ったことしても、とも思うし、そもそもGUIはC++で無理に組む意味無いぞ。
それも含めて自由にやればいいとも思うが。
>>125
君は何が言いたかったのだ?
分かると思うが俺がゆとり死ねと言っている奴だ。
見る限り、君は話す気はあるようだ。
125は唐突過ぎてスルーしたが、相手してもいいぞ。
ただし125はバラけ過ぎているからテーマを絞れ、と言いたいところだったが、
その日記を読む限り上段落の話は一連のテーマか?
だったらWeb系の連中ならそこは「DBを使う」って事になっている。
C++は自前で何でもできるから、無意味なほど精神論で速度を追求するわけだが、
そこらへんをサクッと割り切るあいつらのやり方にも学ぶ物はあるぞ。
そもそも自前でトランザクションを実装するとか、検証の手間まで含めたらありえんだろ。
精神論でゴリゴリではなく、上手く手抜きするコツも覚えるべきだ。
206デフォルトの名無しさん (ワッチョイ 8d46-5y5x)
2017/11/30(木) 03:11:44.92ID:b5fP6Zaz0 実際問題、メモリやデータだけを復元の対象とするとしたら
DBなど使わなくとも原本を保存しておけば何があっても元に戻せるのだが
そういう話ではないし
どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
ただしそのままでは並行して細切れに処理が走って危険なので
書き込む前にbarrierを設けようというアイデアがまずあって
そうすることでついでに例外安全性も確保できるし
ならばキャンセル処理もできますわなぁという巡り合わさった面白い話
DBなど使わなくとも原本を保存しておけば何があっても元に戻せるのだが
そういう話ではないし
どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
ただしそのままでは並行して細切れに処理が走って危険なので
書き込む前にbarrierを設けようというアイデアがまずあって
そうすることでついでに例外安全性も確保できるし
ならばキャンセル処理もできますわなぁという巡り合わさった面白い話
207デフォルトの名無しさん (スップ Sdea-hmNI)
2017/11/30(木) 06:56:30.13ID:XcXaihxMd208デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 07:37:52.31ID:fhhh9IM80 >>206
> 巡り合わさった面白い話
まあ俺は単に張り切りすぎだと思うけど、
そういうところを含めて無駄に熱いのがC++erのいいところでもあるとは思う。
Web系の奴らは上手くこなすことだけを考えていて、自分で考えることを止めてしまってる。
あれでは上達しないのも分かる。
>>200
一応捕捉しておくと、SQLite3はDBだが鯖形式ではなくCのライブラリ(DLL)だからC++から直接呼べる。(はず)
ソースはパブリックドメインだからDLできるし、もちろんincludeしても使える。
(https://www.sqlite.org/quickstart.html // サンプルが extern "C" ではなく include かよ!)
DBはメモリ上にも置け、当然爆速だ。自前でトランザクション/ロールバックの仕組みを作るよりだいぶ楽。
公式に素晴らしいドキュメントがあるから詳しくはそこを読みまくったほうがいい。
C++erなら問題はSQL位だが、どうせいつかLINQもC++に導入されるだろうし、予習だと思ってやっとけ。
> 巡り合わさった面白い話
まあ俺は単に張り切りすぎだと思うけど、
そういうところを含めて無駄に熱いのがC++erのいいところでもあるとは思う。
Web系の奴らは上手くこなすことだけを考えていて、自分で考えることを止めてしまってる。
あれでは上達しないのも分かる。
>>200
一応捕捉しておくと、SQLite3はDBだが鯖形式ではなくCのライブラリ(DLL)だからC++から直接呼べる。(はず)
ソースはパブリックドメインだからDLできるし、もちろんincludeしても使える。
(https://www.sqlite.org/quickstart.html // サンプルが extern "C" ではなく include かよ!)
DBはメモリ上にも置け、当然爆速だ。自前でトランザクション/ロールバックの仕組みを作るよりだいぶ楽。
公式に素晴らしいドキュメントがあるから詳しくはそこを読みまくったほうがいい。
C++erなら問題はSQL位だが、どうせいつかLINQもC++に導入されるだろうし、予習だと思ってやっとけ。
209デフォルトの名無しさん (ワッチョイ 5db3-JjO2)
2017/11/30(木) 10:44:54.02ID:YoaAbc9R0 例外投げるってのは自分の責任の範囲外の事象が起きたときじゃないのかね
有効無効の意味合いならブール値返したほうがいいと思う
有効無効の意味合いならブール値返したほうがいいと思う
210デフォルトの名無しさん (ワッチョイ a66e-hJGX)
2017/11/30(木) 11:49:07.85ID:/QNJXUpA0 >>209
禿本4thのP.351あたり読んだ?
禿本4thのP.351あたり読んだ?
211デフォルトの名無しさん (ワッチョイ 8d46-5y5x)
2017/11/30(木) 12:26:19.48ID:b5fP6Zaz0 一応いまのところこんな感じで書けるようになってる
やってることが非同期処理なので多少ややこしいのは本質的に仕方がない
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); };
//↑非同期で何か重たい処理
//↑別スレッドに投げたのちyield_return;
int resunt;
a_sync() << [&]{ //コルーチン作成
resunt = func_async( n - 1 ); //再起呼び出し
};
//throw nanika;
//↑仮に誰かが例外を投げれば親子関係のあるすべてのコルーチンの処理が
//↑キャンセルされて、どのコルーチンもbarrier以降は実行しない
//barrier前なのでresultの値は不定
barrier();
//barrier後なのでresultの値が決まる
return n + result;
}
int main(){
a_sync() << [&]{ //コルーチン作成
int result;
a_sync() << [&]{ result = func_async( 10 ); }; //コルーチン作成
barrier();
printf( "%d\n", result );
}
message_loop();
return 0;
}
やってることが非同期処理なので多少ややこしいのは本質的に仕方がない
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); };
//↑非同期で何か重たい処理
//↑別スレッドに投げたのちyield_return;
int resunt;
a_sync() << [&]{ //コルーチン作成
resunt = func_async( n - 1 ); //再起呼び出し
};
//throw nanika;
//↑仮に誰かが例外を投げれば親子関係のあるすべてのコルーチンの処理が
//↑キャンセルされて、どのコルーチンもbarrier以降は実行しない
//barrier前なのでresultの値は不定
barrier();
//barrier後なのでresultの値が決まる
return n + result;
}
int main(){
a_sync() << [&]{ //コルーチン作成
int result;
a_sync() << [&]{ result = func_async( 10 ); }; //コルーチン作成
barrier();
printf( "%d\n", result );
}
message_loop();
return 0;
}
212デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 19:19:19.63ID:fhhh9IM80 >>211
なんか無駄に複雑化してるだけに見えるが、、、
> どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
なおVC++2015からはasync/yieldは使えるらしいぞ。
https://msdn.microsoft.com/ja-jp/magazine/mt573711.aspx
http://espresso3389.hatenablog.com/entry/2015/12/03/015157
なんか無駄に複雑化してるだけに見えるが、、、
> どのみち非同期処理にC#よろしくコルーチンが使いたいわけで
なおVC++2015からはasync/yieldは使えるらしいぞ。
https://msdn.microsoft.com/ja-jp/magazine/mt573711.aspx
http://espresso3389.hatenablog.com/entry/2015/12/03/015157
213デフォルトの名無しさん (ワッチョイ 9e9f-Cyes)
2017/11/30(木) 20:12:10.25ID:OtOqgvDg0 C++の名前空間と呼ばれるのがあまり理解出来ないんだが
Javaでいうパッケージ的なやつ?
それともそれを使うためのパスワード的なやつですか?
Javaでいうパッケージ的なやつ?
それともそれを使うためのパスワード的なやつですか?
214デフォルトの名無しさん (ワッチョイ 8d46-5y5x)
2017/11/30(木) 20:42:22.43ID:b5fP6Zaz0 >>212
複雑っていうけど、元から非同期処理なんか、どう書いたって複雑だろ
>>211はお遊びでワザとコルーチン作りまくってるだけだし
あの程度の事なら本当はこれでいけるわけで
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); }; //非同期処理
return n + func_async( n - 1 );
}
int main(){
a_sync() << [&]{ printf( "%d\n", func_async( 10 ) ); };
message_loop();
return 0;
}
別に複雑と言うほどでもないし
非同期処理を同期処理みたいにかけるというだけ
あとはキャンセルと例外安全のためにbarrierの機能を追加しただけ
複雑っていうけど、元から非同期処理なんか、どう書いたって複雑だろ
>>211はお遊びでワザとコルーチン作りまくってるだけだし
あの程度の事なら本当はこれでいけるわけで
int func_async( int n ){
if( n == 0 ){ return 0; }
a_wait() << [&]{ sleep( 10*1000 ); }; //非同期処理
return n + func_async( n - 1 );
}
int main(){
a_sync() << [&]{ printf( "%d\n", func_async( 10 ) ); };
message_loop();
return 0;
}
別に複雑と言うほどでもないし
非同期処理を同期処理みたいにかけるというだけ
あとはキャンセルと例外安全のためにbarrierの機能を追加しただけ
215デフォルトの名無しさん (ワッチョイ 392d-qkbZ)
2017/11/30(木) 20:59:54.72ID:+psSmwi50 >>214
<future>のasync,futureじゃダメ? C++11で標準になりましたけど
https://wandbox.org/permlink/cACSVRCACSAl92OH
wait_for_allが欲しかったのでBoost使ってます
元は https://gist.github.com/chandraprakash/8666426 で これを少し改造
<future>のasync,futureじゃダメ? C++11で標準になりましたけど
https://wandbox.org/permlink/cACSVRCACSAl92OH
wait_for_allが欲しかったのでBoost使ってます
元は https://gist.github.com/chandraprakash/8666426 で これを少し改造
216デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 21:03:11.80ID:fhhh9IM80 >>214
まず、君が書いているんだから君が好きなようにやるべきだし、
実験的な意味合いも含めて色々やること自体はいいと思うが、、、
非同期にしてるのは何故?GUIからの呼び出しでC#のasync Taskと同じ状況か?
それなら確かにどうしようもないが、しかし今見てみるとC#のasyncもだいぶ筋が悪いとは感じるね。
そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あと、コルーチンからのthrowって、君の意図しているようにドミノ倒し的に回収できるものなのか?
これは俺が仕様を知らないだけではあるが、普通はコルーチンってそういう使い方しないと思うし。
まず、君が書いているんだから君が好きなようにやるべきだし、
実験的な意味合いも含めて色々やること自体はいいと思うが、、、
非同期にしてるのは何故?GUIからの呼び出しでC#のasync Taskと同じ状況か?
それなら確かにどうしようもないが、しかし今見てみるとC#のasyncもだいぶ筋が悪いとは感じるね。
そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あと、コルーチンからのthrowって、君の意図しているようにドミノ倒し的に回収できるものなのか?
これは俺が仕様を知らないだけではあるが、普通はコルーチンってそういう使い方しないと思うし。
217デフォルトの名無しさん (ワッチョイ 8d46-5y5x)
2017/11/30(木) 22:29:42.54ID:b5fP6Zaz0 >>あと、コルーチンからのthrowって、君の意図しているようにドミノ倒し的に回収できるものなのか?
そういう風にコルーチンを実装した
具体的にはコルーチンのメンバにキャンセルフラグを持たせておいて
コルーチンを外部からキャンセルしたいときはそのフラグを立てる・・・だけ
コルーチンがyieldから再開したら真っ先にそのフラグを読みに行って
もし立ってたら自発的に例外を投げてスレッドを巻き戻す
>そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あくまでこれは例だからなぁ
上で書いた内容もそうだけど、ひとつコルーチンがシングルスレッドというのがミソになってて
マルチスレッドだと排他処理が非常に面倒なことになる場面でも
コルーチンはシングルスレッドだから問題にならない
ただ、yieldの前と後ろで時間的につながりが無いことが問題になるので
誰かが何かを書き換える前にbarrier()を設けるルールを作って、他のコルーチンを無効にする
非同期処理なんかまともにやったら頭がおかしくなるに違いないので
横断的に静的に管理したいなぁと
今までコルーチンは全然使わなかったし、完全にマルチスレッド脳だったんだが
コルーチンはかなり脳の負担が少なくてよい
自分が動いているときは必ず他人は止まっているという性質が良い
yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
ただ逆に同期オブジェクトをLockしたままyieldしたら終わるという
>C#のasyncもだいぶ筋が悪いとは感じるね。
正直、あれの使いどころは俺もよくわからないんよなぁ
複数のコルーチンが同時並行で走ったら危ないから結局画面をロックせざるを得ないんじゃないかとか
キャンセルを受け付けられるようにするためには例外安全についても考えないとダメなんじゃないかとか
色々思うところは有るが、実はよく知らん
そういう風にコルーチンを実装した
具体的にはコルーチンのメンバにキャンセルフラグを持たせておいて
コルーチンを外部からキャンセルしたいときはそのフラグを立てる・・・だけ
コルーチンがyieldから再開したら真っ先にそのフラグを読みに行って
もし立ってたら自発的に例外を投げてスレッドを巻き戻す
>そのケースなら、普通にマルチスレッドした方がすっきり書けるはず。
あくまでこれは例だからなぁ
上で書いた内容もそうだけど、ひとつコルーチンがシングルスレッドというのがミソになってて
マルチスレッドだと排他処理が非常に面倒なことになる場面でも
コルーチンはシングルスレッドだから問題にならない
ただ、yieldの前と後ろで時間的につながりが無いことが問題になるので
誰かが何かを書き換える前にbarrier()を設けるルールを作って、他のコルーチンを無効にする
非同期処理なんかまともにやったら頭がおかしくなるに違いないので
横断的に静的に管理したいなぁと
今までコルーチンは全然使わなかったし、完全にマルチスレッド脳だったんだが
コルーチンはかなり脳の負担が少なくてよい
自分が動いているときは必ず他人は止まっているという性質が良い
yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
ただ逆に同期オブジェクトをLockしたままyieldしたら終わるという
>C#のasyncもだいぶ筋が悪いとは感じるね。
正直、あれの使いどころは俺もよくわからないんよなぁ
複数のコルーチンが同時並行で走ったら危ないから結局画面をロックせざるを得ないんじゃないかとか
キャンセルを受け付けられるようにするためには例外安全についても考えないとダメなんじゃないかとか
色々思うところは有るが、実はよく知らん
218デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/11/30(木) 23:00:20.60ID:oM5vIjZA0 >>216
async/awaitのしくみはawaitするタスクの完了時に呼ばれるべきコールバック関数登録の糖衣構文にすぎないとかそんな感じ、
ttps://qiita.com/ryosukes/items/db8b45c8ea42f924f02f
(まんまC#の関数で説明したページもあったはずだがどっかいったのでJavaScriptの例↑
で、ネイティブスレッドX上でasync/await呼び出しをいくつ書いても上記コールバック関数は単一スレッドで実行されるので
Xに対して同期的なデータへのアクセスはロック不要
ウィンドーズホンのGUIをぬるぬる動かすのがほぼ唯一の存在意義
async/awaitのしくみはawaitするタスクの完了時に呼ばれるべきコールバック関数登録の糖衣構文にすぎないとかそんな感じ、
ttps://qiita.com/ryosukes/items/db8b45c8ea42f924f02f
(まんまC#の関数で説明したページもあったはずだがどっかいったのでJavaScriptの例↑
で、ネイティブスレッドX上でasync/await呼び出しをいくつ書いても上記コールバック関数は単一スレッドで実行されるので
Xに対して同期的なデータへのアクセスはロック不要
ウィンドーズホンのGUIをぬるぬる動かすのがほぼ唯一の存在意義
219デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/11/30(木) 23:07:19.56ID:oM5vIjZA0 つまり同一スレッド内であればasync/awaitをいっぱい書いても複数のコルーチンが順不同でresumeされる感じにはなるが真に同時並行で実行されることにはならない
220デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/11/30(木) 23:13:29.49ID:oM5vIjZA0 なお順不同なresumeというシチュは、関数A内でawaitされるasyncタスクB内でタスクCをawaitする…とかいったケースで容易に生じる
この場合A内のawaitに引き続くのコードと、B内のawaitに引き続くコードのは順不同でどっちが先にresumeされるかわからん
しかし真に同時並行ではなく、同期的
この場合A内のawaitに引き続くのコードと、B内のawaitに引き続くコードのは順不同でどっちが先にresumeされるかわからん
しかし真に同時並行ではなく、同期的
221デフォルトの名無しさん (ワッチョイ b5b3-HgL3)
2017/11/30(木) 23:19:09.22ID:AS96YR/U0 ttps://stackoverflow.com/questions/1724036/splitting-templated-c-classes-into-hpp-cpp-files-is-it-possible
Your template classes must represent only data structures not the algorithms.
This enables you to hide more valuable implementation details in separate non-templatized class libraries,
the classes inside which would work on the template classes or just use them to hold data.
この回答の具体的な例を教えて頂けないでしょうか。
std::vector(データ)とstd::algorithm(アルゴリズム)と思ったのですが、
std;;algorithmはnon-templatized classではないですよね。。。
Your template classes must represent only data structures not the algorithms.
This enables you to hide more valuable implementation details in separate non-templatized class libraries,
the classes inside which would work on the template classes or just use them to hold data.
この回答の具体的な例を教えて頂けないでしょうか。
std::vector(データ)とstd::algorithm(アルゴリズム)と思ったのですが、
std;;algorithmはnon-templatized classではないですよね。。。
222デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/11/30(木) 23:40:55.16ID:fhhh9IM80 >>217
> あくまでこれは例だからなぁ
もしかしてコルーチンを自動的にマルチスレッド展開して加速させる為のラッパを用意してるってことか?
それならまあそのコードの感じになるのかもしれん。
ちなみに言っておくと、俺が普通に実装したら>>215と同じようなものになる。
単純に、「ディスパッチして、joinを待って、commitする」としか読めないコードにする。
ただこれは君ももちろん分かっていて、あのコードなのだとは思う。
なお俺はC#のasyncは設計ミス、
・UIコンポーネントがUIスレッドからでしか触れないこと
の対策だと思っている。あれが無いと毎回invokeするとか、ちょっと回りくどい書き方をするしかない。
実際、Thread->backgroundWorker->Task->async Task だったっけ?何度も変更されていて、
こういう場合は通常、
・修正している奴が馬鹿だから修正のたびに新たなバグを仕込んでしまい、収拾がつかない
わけだが、ヘルズバーグとMSがそこまで馬鹿なはずも無く、もう一つのケース、
・根本の問題を修正せずに表面的に対策をしているから、収拾がつかない
のだと思っている。そして、根本の問題は、最初に書いたUIガー、って奴。
これについて「根本のUIスレッドの問題直せやボケエ」ってをずいぶん前にC#スレで議論した覚えはあるが、
UIをマルチスレッドにして悲惨だった歴史が既にあるらしく、
「オメーがラップすりゃいいだけだろボケエ」と返され、あ、確かにそうだな、と思って終わった。
ま、とにかく、UI関係のコードをスッキリさせる為の物だから、気になってないのなら放置でいいと思う。
> yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
コルーチンの方がいいケースについてか。
うーん、どうなんだろうなあ?俺もコルーチンはほぼ使ってきてないが、
マルチスレッドする場合にはほぼ干渉しない場合に限っていたから、
逆に言えば、コルーチンを使えばもっと並列化できるということか?
> あくまでこれは例だからなぁ
もしかしてコルーチンを自動的にマルチスレッド展開して加速させる為のラッパを用意してるってことか?
それならまあそのコードの感じになるのかもしれん。
ちなみに言っておくと、俺が普通に実装したら>>215と同じようなものになる。
単純に、「ディスパッチして、joinを待って、commitする」としか読めないコードにする。
ただこれは君ももちろん分かっていて、あのコードなのだとは思う。
なお俺はC#のasyncは設計ミス、
・UIコンポーネントがUIスレッドからでしか触れないこと
の対策だと思っている。あれが無いと毎回invokeするとか、ちょっと回りくどい書き方をするしかない。
実際、Thread->backgroundWorker->Task->async Task だったっけ?何度も変更されていて、
こういう場合は通常、
・修正している奴が馬鹿だから修正のたびに新たなバグを仕込んでしまい、収拾がつかない
わけだが、ヘルズバーグとMSがそこまで馬鹿なはずも無く、もう一つのケース、
・根本の問題を修正せずに表面的に対策をしているから、収拾がつかない
のだと思っている。そして、根本の問題は、最初に書いたUIガー、って奴。
これについて「根本のUIスレッドの問題直せやボケエ」ってをずいぶん前にC#スレで議論した覚えはあるが、
UIをマルチスレッドにして悲惨だった歴史が既にあるらしく、
「オメーがラップすりゃいいだけだろボケエ」と返され、あ、確かにそうだな、と思って終わった。
ま、とにかく、UI関係のコードをスッキリさせる為の物だから、気になってないのなら放置でいいと思う。
> yieldの前後だけ気を付ければ後は完全にシングルスレッドのノリで排他処理が要らない
コルーチンの方がいいケースについてか。
うーん、どうなんだろうなあ?俺もコルーチンはほぼ使ってきてないが、
マルチスレッドする場合にはほぼ干渉しない場合に限っていたから、
逆に言えば、コルーチンを使えばもっと並列化できるということか?
223デフォルトの名無しさん (ワッチョイ fa96-JU5h)
2017/12/01(金) 09:48:37.54ID:eHCFERDK0 Eigenで透視投影変換行列を作るのは次の書き方でいいんでしょうか?
なんか結果をみても微妙にずれているのですが...
Eigen::Matrix4f perspectiveMatrix(float left, float right,
float bottom, float top,
float near, float far)
{
Eigen::Matrix4f m;
m << 2.0f*nearZ/(right-left), 0.0f, (right+left)/(right-left), 0.0f,
0.0f, 2.0f*near/(top-bottom), (top+bottom)/(top-bottom), 0.0f,
0.0f, 0.0f, -(far+near)/(far-near), -2.0f*far*near/(far-near),
0.0f, 0.0f, -1.0f, 0.0f;
return m;
}
なんか結果をみても微妙にずれているのですが...
Eigen::Matrix4f perspectiveMatrix(float left, float right,
float bottom, float top,
float near, float far)
{
Eigen::Matrix4f m;
m << 2.0f*nearZ/(right-left), 0.0f, (right+left)/(right-left), 0.0f,
0.0f, 2.0f*near/(top-bottom), (top+bottom)/(top-bottom), 0.0f,
0.0f, 0.0f, -(far+near)/(far-near), -2.0f*far*near/(far-near),
0.0f, 0.0f, -1.0f, 0.0f;
return m;
}
224デフォルトの名無しさん (ワッチョイ 8d46-5y5x)
2017/12/01(金) 09:59:25.68ID:DoXCr8LG0 await/asyncのコルーチンは並列化じゃなくて非同期処理を同期処理っぽく書くための物だとおもうよ
「これを実行して、終わったらこれを実行してね」
っていうときに、スタックの内容がそのまま残ってるからデータの受け渡しが楽というだけだろう
ただ>>220が言ってるように順不同のresumeが起こったらアブナイので
何か書き込む前にbarrierを張って自分に関係が無い実行中のコルーチンを全部キャンセルして始末してしまおうという
(実際にはbarrierだけじゃなくawaitのタイミングでも始末するようにしているが)
ただキャンセルするために例外安全性とかも重要になってきて
ここでもbarrierとコルーチンの仕組みがそのまま活躍するのが、なんか不思議な感じなんだが
読み込みオンリーだけどキャンセルできるセクションと、書き込みできるがキャンセルできないセクションに
処理を分けるというアイデアはなかなか汎用性が有るんじゃないかと
で、二つのセクションは別関数にせずにコルーチンでつないで一つの関数に収めbarrier前/後とし
barrier前ならawaitも使える、と、2,3のことが同時にかたづいて気持ちが悪い
「これを実行して、終わったらこれを実行してね」
っていうときに、スタックの内容がそのまま残ってるからデータの受け渡しが楽というだけだろう
ただ>>220が言ってるように順不同のresumeが起こったらアブナイので
何か書き込む前にbarrierを張って自分に関係が無い実行中のコルーチンを全部キャンセルして始末してしまおうという
(実際にはbarrierだけじゃなくawaitのタイミングでも始末するようにしているが)
ただキャンセルするために例外安全性とかも重要になってきて
ここでもbarrierとコルーチンの仕組みがそのまま活躍するのが、なんか不思議な感じなんだが
読み込みオンリーだけどキャンセルできるセクションと、書き込みできるがキャンセルできないセクションに
処理を分けるというアイデアはなかなか汎用性が有るんじゃないかと
で、二つのセクションは別関数にせずにコルーチンでつないで一つの関数に収めbarrier前/後とし
barrier前ならawaitも使える、と、2,3のことが同時にかたづいて気持ちが悪い
225デフォルトの名無しさん (ブーイモ MMc9-ZS+9)
2017/12/01(金) 10:56:33.99ID:HkxgtxKmM >>224
今日もA-10学校に、まで読んだ
今日もA-10学校に、まで読んだ
226デフォルトの名無しさん (スップ Sdea-hmNI)
2017/12/01(金) 11:05:05.82ID:Y7mfb9sId exec execve などいくつかあるけど
こいつらの違いを理解できない
ここの人たちはmanページを読んで理解できるもんなの?
こいつらの違いを理解できない
ここの人たちはmanページを読んで理解できるもんなの?
227デフォルトの名無しさん (ササクッテロラ Spbd-Wo5e)
2017/12/01(金) 11:40:18.96ID:ZhxOnODbp >>223
https://msdn.microsoft.com/ja-jp/library/cc372887.aspx
これを参考にしてみては
右手系の場合はRH、あと行列の扱い方によっては転置が必要だけど
https://msdn.microsoft.com/ja-jp/library/cc372887.aspx
これを参考にしてみては
右手系の場合はRH、あと行列の扱い方によっては転置が必要だけど
228デフォルトの名無しさん (ワッチョイ fa96-JU5h)
2017/12/01(金) 15:52:06.92ID:Xp3BajG00229デフォルトの名無しさん (オッペケ Srbd-MUmZ)
2017/12/01(金) 18:53:54.97ID:1uEPS/Zvr C++17が出たけど既にN4700しか読んでない
230デフォルトの名無しさん (ワッチョイ 3d9f-JjO2)
2017/12/01(金) 19:27:41.27ID:quTLstwT0 >>224
最終的に何をしたいんだ?
俺にはそこが見えない。
一つずつ詰めると、頭三行
> await/asyncのコルーチンは並列化じゃなくて非同期処理を同期処理っぽく書くための物だとおもうよ
> 「これを実行して、終わったらこれを実行してね」
> っていうときに、スタックの内容がそのまま残ってるからデータの受け渡しが楽というだけだろう
については同意する。これは>>218-220含めて3人の共通理解でいい。
(ただし俺には逆に、君自身は「並列化の為に」async/awaitを使おうとしているように見える)
> ただ>>220が言ってるように順不同のresumeが起こったらアブナイので
これについては、一般的には逆だ。順序が逆になったら危ないような物を非同期にしてはいけない。
違う言い方をすると、非同期の結果をbarrierを張ってキャンセルするのではなく、
barrier後に非同期にして、結果は必ずcommit出来る構造にする。
ちなみにJavaScriptの連中はここら辺が分かっていなくて、
(というより連中は制御構造云々を議論できるレベルではないのでこれ以前なのだが)
同期前提の制御構造で非同期を扱おうとするからおかしなことになる。
JavaScriptには非同期しかないんだから、選択の余地もないんだが。
C#のasyncはこれとはちょっと違って、イベントで起動するから必ずUIスレになるんだが、
それにジョブをやらせるとUIがカクつくから他スレッドを起動しろ、
しかしそれだと結果を画面に表示できないからそこだけUIスレッドを呼び戻せ、
ただこれだとソースが汚いから、asyncというキーワードをつけ、あたかも全てUIスレッドが処理しているように見せる、
みたいな、なんだかなあ、という状況になっている。
つまり処理順と処理スレッドを入れ替える為の糖衣構文のようなものであって、
本来のasync/awaitのように、非同期を同期的に書くための物自体ではない。ただしそうとも使えるから流用してるが。
それで話を戻すと、君は非同期部分に一般とは逆の「非同期の結果を普通にキャンセルできる構造」を作ろうとしているようだが、
これは何故?或いは何のメリットがあると考えている?
最終的に何をしたいんだ?
俺にはそこが見えない。
一つずつ詰めると、頭三行
> await/asyncのコルーチンは並列化じゃなくて非同期処理を同期処理っぽく書くための物だとおもうよ
> 「これを実行して、終わったらこれを実行してね」
> っていうときに、スタックの内容がそのまま残ってるからデータの受け渡しが楽というだけだろう
については同意する。これは>>218-220含めて3人の共通理解でいい。
(ただし俺には逆に、君自身は「並列化の為に」async/awaitを使おうとしているように見える)
> ただ>>220が言ってるように順不同のresumeが起こったらアブナイので
これについては、一般的には逆だ。順序が逆になったら危ないような物を非同期にしてはいけない。
違う言い方をすると、非同期の結果をbarrierを張ってキャンセルするのではなく、
barrier後に非同期にして、結果は必ずcommit出来る構造にする。
ちなみにJavaScriptの連中はここら辺が分かっていなくて、
(というより連中は制御構造云々を議論できるレベルではないのでこれ以前なのだが)
同期前提の制御構造で非同期を扱おうとするからおかしなことになる。
JavaScriptには非同期しかないんだから、選択の余地もないんだが。
C#のasyncはこれとはちょっと違って、イベントで起動するから必ずUIスレになるんだが、
それにジョブをやらせるとUIがカクつくから他スレッドを起動しろ、
しかしそれだと結果を画面に表示できないからそこだけUIスレッドを呼び戻せ、
ただこれだとソースが汚いから、asyncというキーワードをつけ、あたかも全てUIスレッドが処理しているように見せる、
みたいな、なんだかなあ、という状況になっている。
つまり処理順と処理スレッドを入れ替える為の糖衣構文のようなものであって、
本来のasync/awaitのように、非同期を同期的に書くための物自体ではない。ただしそうとも使えるから流用してるが。
それで話を戻すと、君は非同期部分に一般とは逆の「非同期の結果を普通にキャンセルできる構造」を作ろうとしているようだが、
これは何故?或いは何のメリットがあると考えている?
231デフォルトの名無しさん (ワッチョイ ea34-YBdU)
2017/12/01(金) 19:37:06.05ID:BNKPu+/90 Java厨はハードの基本がわかってないニワカなんちゃってPGが殆どだからな
232デフォルトの名無しさん (ワッチョイ f1c8-wAwf)
2017/12/02(土) 00:35:41.73ID:i2vG1ua/0 最近長えレスが多くて辛えぞえ
233デフォルトの名無しさん (ワッチョイ 398a-fjL1)
2017/12/02(土) 00:43:05.07ID:fU6v9rJN0 予告犯でホリエモンもどきがシンブンシにそんな事言っていたな
234デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/02(土) 01:17:01.05ID:Ppnhc3/B0 コルーチンをキャンセルとか意味わかんない事言ってるから途中から読んですらない。
235デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/02(土) 02:10:43.54ID:YZ0QjRT20 漏れはもう説得をあきらめたゾ
236デフォルトの名無しさん (ワッチョイ 6680-9RvO)
2017/12/02(土) 03:07:38.26ID:UE7qzU9L0 >>226
引数が違うだけで、内部的には、どれも同じだろ。
つまり、ラッパー関数
OS をすべて知っている奴は、いない
だから皆、神の書と呼ばれる、この本を枕にして寝ている。
著者は、man ページの作者。
この本が翻訳されているのは、日本だけ
Linux プログラミング・インタフェース、2012
引数が違うだけで、内部的には、どれも同じだろ。
つまり、ラッパー関数
OS をすべて知っている奴は、いない
だから皆、神の書と呼ばれる、この本を枕にして寝ている。
著者は、man ページの作者。
この本が翻訳されているのは、日本だけ
Linux プログラミング・インタフェース、2012
237デフォルトの名無しさん (オッペケ Srbd-MUmZ)
2017/12/02(土) 17:32:32.90ID:oDhEkD2+r >この本が翻訳されているのは、日本だけ
もうだめだこの国
もうだめだこの国
238デフォルトの名無しさん (ワッチョイ 6680-9RvO)
2017/12/02(土) 20:34:54.85ID:UE7qzU9L0 Linux 資格の、LPIC 取得者も、半分以上は日本人だろ
日本は、Linux 大国
日本は、Linux 大国
239デフォルトの名無しさん (ワッチョイ ea34-YBdU)
2017/12/02(土) 20:40:02.69ID:hpEyyDG+0 pthreadとかPOSIX系は扱い易い
240デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
2017/12/02(土) 21:04:09.64ID:TmTI6KJY0 Linuxは日本に入ってきたのが早かったし、最初期に一気に広まった。
日本がLinux王国というのは間違いではない。
しかし、それを生かせなかった。
なんでだろ。
日本がLinux王国というのは間違いではない。
しかし、それを生かせなかった。
なんでだろ。
241デフォルトの名無しさん (ワッチョイ 5d78-ToxZ)
2017/12/02(土) 21:06:05.55ID:IxwO1O770 PC98がMSDOSを採用し続けたせい
>>240
PC98 のリソースが freebsd に注がれ、linux への移植が遅れたため
PC98 のリソースが freebsd に注がれ、linux への移植が遅れたため
243デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
2017/12/02(土) 21:25:07.65ID:TmTI6KJY0 当時書店でBoWとか売ってたけど、そのせいで遅れたような感じはしなかったけどなあ。
むしろLinuxでX11動かすのに四苦八苦してた頃、すでにコンソールで日本語が使えてたのは、
UNIXの人たちのおかげのような気がする。
むしろLinuxでX11動かすのに四苦八苦してた頃、すでにコンソールで日本語が使えてたのは、
UNIXの人たちのおかげのような気がする。
244デフォルトの名無しさん (ワッチョイ b5b3-9GJZ)
2017/12/02(土) 21:38:52.02ID:TmTI6KJY0 検索してみるとコンパックショックが1994年なんだな。
DOS/V機自作したのが1993年だからもうちょっと前かと思ってたけど。
正規流通前にショップが輸入して売ってたんだろか。
DOS/V機自作したのが1993年だからもうちょっと前かと思ってたけど。
正規流通前にショップが輸入して売ってたんだろか。
245デフォルトの名無しさん (ワッチョイ 6680-9RvO)
2017/12/02(土) 22:17:42.90ID:UE7qzU9L0 その当時、漏れは、Windows 3.1 で、UNIX プログラミングやってた。
テキストエディタ MIFES を使っていた
Oracle で、銀行とか、新幹線とか
テキストエディタ MIFES を使っていた
Oracle で、銀行とか、新幹線とか
247デフォルトの名無しさん (ワッチョイ 398a-fjL1)
2017/12/02(土) 23:44:03.24ID:fU6v9rJN0 PANIXの遅さはすごかったな
248デフォルトの名無しさん (ワッチョイ ea34-YBdU)
2017/12/03(日) 01:07:06.72ID:ti2y6lW/0 NECは当時経営陣が自社の社員が開発したソフトを押し退けてMSのソフトをごり押ししてたからな
終わっているよな
終わっているよな
249デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/03(日) 01:40:24.23ID:MtUE51Zo0 >>248
そんなに糞だったのか自社製ソフト
そんなに糞だったのか自社製ソフト
250デフォルトの名無しさん (ワッチョイ b5b3-HgL3)
2017/12/03(日) 08:02:49.76ID:YKcJD0pm0 派生クラスのデストラクタでなにもしないなら、
基底クラスのデストラクタを仮想にしなくてもいいですか?
基底クラスのデストラクタを仮想にしなくてもいいですか?
251デフォルトの名無しさん (ワッチョイ 9e9f-GQwd)
2017/12/03(日) 08:56:43.57ID:I8IEjg5G0 >>250
自由にクラスを設計すればいいよ。
デストラクタを仮想クラスを必ず定義しておかなければならないとか、そんな義務はない。
あらかじめ定義しておくと、仕様変更があった時などで、派生クラスで、デストラクタを使いたい時に、基底クラスをいじらずに定義できるだけだよ。
仮に、複数人で、アプリを作ってるなら、基底クラス担当がいたとして、わざわざ基底クラスをいじりますよーとか連絡しないでいいという利点はあるかもな。
もし、基底クラス担当で、他人に基底クラスを触らせたくないなら定義しておいたほうがいい。
基底クラスをいじられて、変なバグとか追加されても困るw
自由にクラスを設計すればいいよ。
デストラクタを仮想クラスを必ず定義しておかなければならないとか、そんな義務はない。
あらかじめ定義しておくと、仕様変更があった時などで、派生クラスで、デストラクタを使いたい時に、基底クラスをいじらずに定義できるだけだよ。
仮に、複数人で、アプリを作ってるなら、基底クラス担当がいたとして、わざわざ基底クラスをいじりますよーとか連絡しないでいいという利点はあるかもな。
もし、基底クラス担当で、他人に基底クラスを触らせたくないなら定義しておいたほうがいい。
基底クラスをいじられて、変なバグとか追加されても困るw
252デフォルトの名無しさん (ワッチョイ eab3-YtI1)
2017/12/03(日) 09:05:51.65ID:pXIsIngK0 >>251
頓珍漢すぎて笑えない...
頓珍漢すぎて笑えない...
253デフォルトの名無しさん (ワッチョイ a66e-hJGX)
2017/12/03(日) 09:26:11.28ID:hz5Rl7cd0 うん、これは頭悪い発言スレでやればウケてた
254デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/03(日) 09:31:06.52ID:MtUE51Zo0 >>250
規格は知らんが問題が発生するコンパイラは存在しないと思う。が、デストラクタで何もしないというのはデータメンバーも含まれるからね。
派生クラスにstd::stringのメンバーが居るだけでアウト
そんな事を気にするより素直にvirtual付けるか基底クラスでdeleteされないようにする方が有意義に時間を使えると思うよ。
規格は知らんが問題が発生するコンパイラは存在しないと思う。が、デストラクタで何もしないというのはデータメンバーも含まれるからね。
派生クラスにstd::stringのメンバーが居るだけでアウト
そんな事を気にするより素直にvirtual付けるか基底クラスでdeleteされないようにする方が有意義に時間を使えると思うよ。
255デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 09:49:40.40ID:lnc2VqP30 >>254
>派生クラスにstd::stringのメンバーが居るだけでアウト
それだけでアウトなのではない
DerivedがBaseの派生だとして、実体はDerivedなのにコンパイラからはBaseにしか見えないケースで問題になるだけ
DerivedをDerivedとして宣言したらスコープを抜けたらちゃんとDerivedのデストラは呼ばる
問題なやつの例:
Derived g_d;
void foo() {
Base* p = (Base*)&g_d;
/*...*/
delete p; // Base::~Base()は呼ばれるがDerived::~Derived()は呼ばれない
}
>派生クラスにstd::stringのメンバーが居るだけでアウト
それだけでアウトなのではない
DerivedがBaseの派生だとして、実体はDerivedなのにコンパイラからはBaseにしか見えないケースで問題になるだけ
DerivedをDerivedとして宣言したらスコープを抜けたらちゃんとDerivedのデストラは呼ばる
問題なやつの例:
Derived g_d;
void foo() {
Base* p = (Base*)&g_d;
/*...*/
delete p; // Base::~Base()は呼ばれるがDerived::~Derived()は呼ばれない
}
256デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 09:53:01.97ID:lnc2VqP30 ごめ、一点抜けた
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
257デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 09:53:10.45ID:lnc2VqP30 ごめ、一点抜けた
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
誤: 実体はDerivedなのにコンパイラからはBaseにしか見えないケース
正: 実体はDerivedなのにコンパイラからはBaseにしか見えない状態で当該オブジェクトが破棄されるケース
なお、(規格でどういう言葉使いをしているかわ知らんが、)
Derivedが多態性をきちんと実装してあるなら、Derivedは「コンパイラからはBaseにしか見えないケース」には該当しない
258デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/03(日) 09:57:14.66ID:MtUE51Zo0259デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 09:58:13.14ID:lnc2VqP30 大事なことなので2回ry
まあ一般論として、>>255の問題なやつがプログラム内に存在しないことの確実で安価で
ウザく無い検出方法というものはこの世に存在しないので、
継承関係を使うならデストラクタを見たらvirtualにするパブロフの犬に徹するべきではある
まあ一般論として、>>255の問題なやつがプログラム内に存在しないことの確実で安価で
ウザく無い検出方法というものはこの世に存在しないので、
継承関係を使うならデストラクタを見たらvirtualにするパブロフの犬に徹するべきではある
260デフォルトの名無しさん (ワッチョイ b5b3-HgL3)
2017/12/03(日) 10:48:30.75ID:YKcJD0pm0 >delete p; // Base::~Base()は呼ばれるがDerived::~Derived()は呼ばれない
~Derived()が呼ばれないけど、
呼ばれたとして何も仕事をしないのであれば、呼ばれなくても不都合ないのでは?
~Derived()が呼ばれないけど、
呼ばれたとして何も仕事をしないのであれば、呼ばれなくても不都合ないのでは?
261デフォルトの名無しさん (ワッチョイ b5b3-HgL3)
2017/12/03(日) 11:01:45.65ID:YKcJD0pm0 なにも仕事をしないデストラクタという前提がおかしいのですか?
262デフォルトの名無しさん (スップ Sdea-t0Iq)
2017/12/03(日) 11:06:05.82ID:OF+rgUqYd メイヤーズが言ってる
ポリモーフィズムを目的とした基底クラスはvirtualデストラクタにする
それ以外はしないってルールでいいだろ
ポリモーフィズムを目的とした基底クラスはvirtualデストラクタにする
それ以外はしないってルールでいいだろ
263デフォルトの名無しさん (オッペケ Srbd-MUmZ)
2017/12/03(日) 11:12:49.55ID:TXqrw7wLr264はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 5e6f-bpph)
2017/12/03(日) 13:16:36.90ID:15ZXM/fw0 >>260
このあたりで話題になったことがある。
https://echo.5ch.net/test/read.cgi/tech/1478440682/651-
結論から言うと不都合は有る。
少なくとも言語仕様上は未定義に踏み込むのでクラッシュしても泣かない強い心を持ち合わせているのでなければやらない方が良い。
このあたりで話題になったことがある。
https://echo.5ch.net/test/read.cgi/tech/1478440682/651-
結論から言うと不都合は有る。
少なくとも言語仕様上は未定義に踏み込むのでクラッシュしても泣かない強い心を持ち合わせているのでなければやらない方が良い。
265デフォルトの名無しさん (スプッッ Sdea-gD61)
2017/12/03(日) 13:39:28.04ID:JZXkgVFzd >>254
暗黙的なメンバー変数の破棄が呼ばれるべきってのはあるけど、何もアウトなことはないぞ?
暗黙的なメンバー変数の破棄が呼ばれるべきってのはあるけど、何もアウトなことはないぞ?
266デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/03(日) 13:42:24.66ID:MtUE51Zo0 >>265
お前質問読んでないだろ
お前質問読んでないだろ
267デフォルトの名無しさん (ササクッテロロ Spbd-Wo5e)
2017/12/03(日) 13:52:29.29ID:nekR+Iu8p268デフォルトの名無しさん (ワッチョイ eab3-YtI1)
2017/12/03(日) 16:06:00.67ID:pXIsIngK0 >>267
> 継承関係を使うなら
> 継承関係を使うなら
269デフォルトの名無しさん (オッペケ Srbd-MUmZ)
2017/12/03(日) 16:29:14.83ID:gYv1de+4r 継承関係を使う=vtbl
と考えてしまうような無知な者には理解するのは難しい
他人の作ったものも構わずナマポをdeleteしておいて「virtualにしておけば安全」というのはマッチポンプと言えよう
と考えてしまうような無知な者には理解するのは難しい
他人の作ったものも構わずナマポをdeleteしておいて「virtualにしておけば安全」というのはマッチポンプと言えよう
270デフォルトの名無しさん (ワッチョイ eab3-YtI1)
2017/12/03(日) 16:39:32.89ID:pXIsIngK0 正直何を言いたいのかはよくわからん w
まあ>>251みたいな頓珍漢野郎なんだろう...
まあ>>251みたいな頓珍漢野郎なんだろう...
271デフォルトの名無しさん (ワッチョイ b5b3-4T5h)
2017/12/03(日) 17:09:40.29ID:bFUfg9md0 >>270
いや、この件に関してはお前の方が無知だぞ
いや、この件に関してはお前の方が無知だぞ
272デフォルトの名無しさん (ワッチョイ b5b3-HgL3)
2017/12/03(日) 17:12:44.51ID:YKcJD0pm0 結局のところ
何も仕事をしないデストラクタはあるが、(空のデストラクタかつメンバ変数なし)
基底クラスのデストラクタだけで派生クラスをdeleteすることが未定義だから
基底クラスのデストラクタは仮想にしないとダメという理解でよろしいでしょうか。
何も仕事をしないデストラクタはあるが、(空のデストラクタかつメンバ変数なし)
基底クラスのデストラクタだけで派生クラスをdeleteすることが未定義だから
基底クラスのデストラクタは仮想にしないとダメという理解でよろしいでしょうか。
273デフォルトの名無しさん (ワッチョイ ea34-YBdU)
2017/12/03(日) 17:28:04.25ID:ti2y6lW/0 デストラクタは仮想にしておくことにより通常の仮想関数と違って継承元辿って全自動ですべて呼び出されるから基底はやることなくても以後継承で実装を変更することがあるのなら空の{}で括っておいたほうが良いよ
274デフォルトの名無しさん (ワッチョイ 66eb-YNoK)
2017/12/03(日) 17:49:35.39ID:PHD8+7P20 =defaultじゃだめなん?
275デフォルトの名無しさん (ワッチョイ eab3-YtI1)
2017/12/03(日) 17:50:12.92ID:pXIsIngK0 >>271
まあそう思ってりゃいいんじゃね? w
まあそう思ってりゃいいんじゃね? w
276デフォルトの名無しさん (ワッチョイ b5b3-4T5h)
2017/12/03(日) 19:52:12.45ID:bFUfg9md0 もしかして本当に継承使ったPOD型に思い至ってないのか
277デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 19:55:36.14ID:lnc2VqP30278デフォルトの名無しさん (ワッチョイ 5deb-JjO2)
2017/12/03(日) 20:15:25.15ID:mwO2JS4O0 もうここ完全に初心者様質問無しにしろよ
上級者様もそれで満足だろ
上級者様もそれで満足だろ
>>278
それは困ります…
それは困ります…
280デフォルトの名無しさん (ワッチョイ 8abd-17nN)
2017/12/03(日) 20:21:06.32ID:lnc2VqP30 >>278
漏れのように語りたい初心者は一体どうすれば…orz
漏れのように語りたい初心者は一体どうすれば…orz
281デフォルトの名無しさん (ワッチョイ a66e-hJGX)
2017/12/03(日) 21:05:16.05ID:hz5Rl7cd0 >>278
自殺乙
自殺乙
282デフォルトの名無しさん (ワッチョイ 3d04-4NBu)
2017/12/04(月) 12:17:24.94ID:gpGY1qga0 祝・C++17発行!
283デフォルトの名無しさん (ブーイモ MM81-ZS+9)
2017/12/04(月) 12:38:47.34ID:vRsxBueGM これまでinlineを関数に適用するとインライン展開されるんじゃなかったでしたっけ?
c++17の説明を読むと翻訳単位で共通のアドレスになるって書いてあるのだけど仕様が変わった?
c++17の説明を読むと翻訳単位で共通のアドレスになるって書いてあるのだけど仕様が変わった?
284デフォルトの名無しさん (オッペケ Srbd-MUmZ)
2017/12/04(月) 12:45:21.76ID:i0vOJ/Wzr 何を言っているんだお前は
ISO/IEC 14882:1998 7.1.2/p4
An inline function with external linkage shall have the same address in all translation units
ISO/IEC 14882:1998 7.1.2/p4
An inline function with external linkage shall have the same address in all translation units
285デフォルトの名無しさん (ブーイモ MM81-ZS+9)
2017/12/04(月) 12:56:42.17ID:vRsxBueGM >>284
ナンダッテー
ナンダッテー
286デフォルトの名無しさん (ドコグロ MM12-3/o9)
2017/12/04(月) 13:08:03.78ID:VjK2Ds3GM 以前void f(A &a, int num)をa.f(num)みたいに呼べる機能が追加されるとかされないとかを見た気がするんだけど知ってる人いたらURLか機能名を教えてほしい
287デフォルトの名無しさん (ワッチョイ b5c8-Syir)
2017/12/04(月) 13:10:08.18ID:zqEI2rJ60 unified call syntax
288デフォルトの名無しさん (ドコグロ MM12-3/o9)
2017/12/04(月) 13:22:55.68ID:VjK2Ds3GM >>287
ありがとう
ありがとう
289デフォルトの名無しさん (ワッチョイ 3d04-4NBu)
2017/12/04(月) 14:58:45.86ID:gpGY1qga0 ウニファイドコールシンタックスは死んだのだ。
よみがえれ!
よみがえれ!
290デフォルトの名無しさん (ワッチョイ ea34-YBdU)
2017/12/04(月) 15:48:40.92ID:hZXt5yd00 残念だったな
291デフォルトの名無しさん (ワッチョイ 3d04-4NBu)
2017/12/04(月) 16:16:56.14ID:gpGY1qga0 はう。
accelerated c++ をやっている人いませんか?
今やりなおしているけれども、5年ほど前の自分の回答をなくしてしまった…
4章章末練習問題4-6の回答を、よろしければお見せいただけませんか?
この章、EOLine と EOFile を std::cin の eof フラグ 1 個でなんとかしようとしているのが非常にまずいと分かりましたが
逆に教科書掲載のプログラムでうまくいっているのが不思議です…取り組まれた方のコメントをお待ちしています…
普通 getline() をつかうんだろうけれども、なんでこんなに変てこな実装になっているのだろう?
教科書の内容 https://ideone.com/rdtZWG
>>44-45 悪書を薦めてしまいました、ごめんなさい
今やりなおしているけれども、5年ほど前の自分の回答をなくしてしまった…
4章章末練習問題4-6の回答を、よろしければお見せいただけませんか?
この章、EOLine と EOFile を std::cin の eof フラグ 1 個でなんとかしようとしているのが非常にまずいと分かりましたが
逆に教科書掲載のプログラムでうまくいっているのが不思議です…取り組まれた方のコメントをお待ちしています…
普通 getline() をつかうんだろうけれども、なんでこんなに変てこな実装になっているのだろう?
教科書の内容 https://ideone.com/rdtZWG
>>44-45 悪書を薦めてしまいました、ごめんなさい
293デフォルトの名無しさん (ワッチョイ a580-o8PC)
2017/12/04(月) 19:13:30.50ID:gGPHcFu90 >>289
メソッドチェインしたいだけなら拡張メソッドの方が筋がいいだろ。そっち応援してやれよ
メソッドチェインしたいだけなら拡張メソッドの方が筋がいいだろ。そっち応援してやれよ
294デフォルトの名無しさん (ワントンキン MM7a-Syir)
2017/12/04(月) 19:27:49.25ID:I5+tBH1vM 拡張メソッドってデコレータパターンで充分なのに、なんで最近の言語には結構ついてんだろ。
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- アメリカ、入国時に「日本人を含む外国人観光客の最大5年分のSNS履歴の提出」義務化へ 過去10年間に使用のメールアドレスや電話番号等も★2 [Hitzeschleier★]
- 【中国外務省】日本への渡航自粛を再度呼びかけ 今度は「地震発生」を理由に [ぐれ★]
- 立憲・小宮山議員、「牛乳=白い水」投稿を削除 批判殺到で「大変失礼申し上げました」 [少考さん★]
- 内閣支持、微減59.9% 5割超が補正予算評価 時事通信世論調査 [どどん★]
- 日本語が話せない「外国籍」の子が急増中、授業がストップ、教室から脱走も…先生にも大きな負担「日本語支援」追いつかず★3 [七波羅探題★]
- 【芸能】デパートで見つけたランドセルが衝撃価格! つまみ枝豆「どこかで規制しないと」に共感の声殺到 「全て同感」「高すぎます」★2 [冬月記者★]
- 【悲報】日中戦争5割が賛成、高市キッズたち徴兵へ [834922174]
- 【悲報】日本人のTikTok収益、ガチで剥奪中wwwwwwwwwwwwwwwwwwwwwwwww [279254606]
- 日清オイリオ「オリーブオイルの高騰が落ち着いたのにお前らが買わない!」 [592058334]
- 【高市遺産】 ユネスコさん。日本の「匠の技」「屋台」「和紙」などを無形文化遺産に登録 🎉🎊 [485983549]
- 「あっ、これってなくても困らないな…」って確信したもの 米以外でなんかある? [434776867]
- 【画像】整形カリカリ女が「この画像」にブチギレる理由、謎… [732289945]
