19/09/13 17:13:24.60 /ygW08Jq.net
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part144
スレリンク(tech板)
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
スレリンク(tech板)
■長いソースを貼るときはここへ。■
URLリンク(codepad.org)
URLリンク(ideone.com)
[C++ FAQ]
URLリンク(isocpp.org)
URLリンク(www.bohyoh.com) (日本語)
----- テンプレ ここまで -----
2:デフォルトの名無しさん
19/09/13 21:32:39.97 yAkItK0j.net
前スレ1000>
>vtableがあればdynamic_castもできるのに何でダウンキャストなんだ?
dynamic_castはたいていダウンキャストに使うし、逆にvtableとdynamic_castは関係ないだろ。
3:デフォルトの名無しさん
19/09/13 21:40:45.55 /ygW08Jq.net
> vtableとdynamic_castは関係ないだろ。
おまえさん、そもそもdynamic_castとは何か理解しているか?
4:デフォルトの名無しさん
19/09/13 21:41:31.76 /ygW08Jq.net
あ、ID出るんだったな
「スレ主」としての発言ではないんで気にしないでくれ
5:デフォルトの名無しさん
19/09/13 22:48:38.62 ZW8mwhnp.net
整理すると
安全にダウンキャストするにはdynamic_castを使うし
その際vtableが必要
そんだけ
6:デフォルトの名無しさん
19/09/13 22:49:53.22 ZW8mwhnp.net
ちなみにdynamic_castでアップキャストする場合はvtable要らね
どうでもいいが
7:デフォルトの名無しさん
19/09/14 01:51:42.11 2JV3tdJj.net
このvtable言いたいだけ感
8:デフォルトの名無しさん
19/09/14 02:09:30.09 SgsUVSB1.net
vtable言いたいだけちゃうんかと
9:デフォルトの名無しさん
19/09/14 02:29:08.06 plkfGFM5.net
vtable iitai dake.
10:デフォルトの名無しさん
19/09/14 07:29:57.19 keXkMGsc.net
dynamic castでアップキャストする事あるの?
11:デフォルトの名無しさん
19/09/14 09:31:35.63 MJsGg5EL.net
ない
12:デフォルトの名無しさん
19/09/14 11:41:42.14 Hd+E1riT.net
そもそもアップキャストはリスコフの置換原則が成り立つクラスになってんなら何もしなくも勝手にできる
13:デフォルトの名無しさん
19/09/14 11:56:51.87 JExEJ5Ds.net
SOLIDなんて馬鹿が意識してるわけねーだろw
14:デフォルトの名無しさん
19/09/14 14:12:14.01 2JV3tdJj.net
今まで仕事でRTTI有効だったプロジェクトはひとつもないわ
15:デフォルトの名無しさん
19/09/14 16:26:48.85 Hd+E1riT.net
そりゃあサイズ削減しなきゃいけないからじゃね?
16:デフォルトの名無しさん
19/09/14 17:28:56.46 KFCQQ8F2.net
サイズ以前の問題じゃないの
17:デフォルトの名無しさん
19/09/14 17:57:41.80 JExEJ5Ds.net
バッチ処理系統の仕事ならポリモルフィズムなんて糞の役にも立たんどころか
かえって有害だわ。
18:デフォルトの名無しさん
19/09/14 18:14:18.81 MJsGg5EL.net
COBOLでもEVALUATE文なんて普通に出てくるだろ
力技でダッセーけどあれもポリモだぞ
19:デフォルトの名無しさん
19/09/14 18:26:33.88 JExEJ5Ds.net
そういうカスなことやってるからメンテ不能になるんだよ。。
20:デフォルトの名無しさん
19/09/14 19:17:35.55 qjGOgUak.net
rttiに使う必要がでた時点でc++はミスチョイス
もちろん趣味ならご自由に
21:デフォルトの名無しさん
19/09/14 19:52:02.94 iEVwPiY+.net
RTTI嫌ってるけど実際どの程度パフォーマンスに影響するの
22:デフォルトの名無しさん
19/09/14 20:10:10.91 MJsGg5EL.net
正直、初めてポリモの話を聞いたときは
混ぜちまってから後で選別なんてアホだろって思った
23:デフォルトの名無しさん
19/09/14 20:36:36.84 BTqGkHHG.net
まあ結局コールバックだからな
24:デフォルトの名無しさん
19/09/14 20:39:19.28 SgsUVSB1.net
ポリホーモきっしょ
25:デフォルトの名無しさん
19/09/15 01:12:05.95 +QluEOXC.net
C++は型の実行時識別をvtblのアドレスでやるからdynamic_castする以上はアップだろうがダウンだろうが対象クラスに仮想関数が一つは含まれないといけない
さもないとゼロコストの原則からクラスにvtblが作られない
ただし、仮想関数であれば良く、必ずしも仮想デストラクタである必要は無い、、、ハズ、、、
26:デフォルトの名無しさん
19/09/15 01:37:29.11 0kzqJJdX.net
vtableおじさんまたきたよ
27:デフォルトの名無しさん
19/09/15 01:44:54.25 +QluEOXC.net
>>22
ポリモとダウンキャスト(RTTIを使うか否かを問わず)を混同するとは情け
ナサス、
28:デフォルトの名無しさん
19/09/15 01:47:31.12 +QluEOXC.net
コールバック関数ならいちいちポリモとかしなくとも無名関数とかで良いやんジャバじゃあるまいし、
29:デフォルトの名無しさん
19/09/15 01:59:40.68 LMFjfaUx.net
vtableとvtblでNGしたった(´・ω・`)
30:デフォルトの名無しさん
19/09/15 03:24:46.48 2F/PGB+Q.net
>>28
ラムダをどっこかに登録してコールバックしてもらうとき
自分が死ぬとき登録を解除するのが面倒じゃね?
結局thisとpairで登録する羽目に
だったら初めから仮想関数で良くね?
31:デフォルトの名無しさん
19/09/15 04:39:33.80 +QluEOXC.net
コールバック関数を渡す側がコールバックされるより先に死ぬ可能性があるとか
一体何がしたいのかっていうか、
32:デフォルトの名無しさん
19/09/15 04:41:18.12 +QluEOXC.net
仮にそうであるとしても死ぬ際に空のコールバック関数に登録し直せば良い
なお関数オブジェクト自体の破棄は関数オブジェクトをコピー渡しなりすれば何の問題も無い
33:デフォルトの名無しさん
19/09/15 07:15:57.55 o13gcpb2.net
>>25
ゼロコスト? ああゼロオーバーヘッドのことかw
34:デフォルトの名無しさん
19/09/15 09:03:14.13 XPArYK5v.net
C言語がなんとか使えるようになりました。
今度は、生産性の向上とstringとか面白そうなので、
C++を学習しようと思っています。
おすすめの書籍があったら、教えてください。
ちなみにC言語の理解は、独習Cで勉強しました。
なんだか、独習C++は実用的ではない気がしました。
知りたいのは、C++のstringとかvectorとかです。
それとも、こういう書き込みはだめですか。
35:デフォルトの名無しさん
19/09/15 09:10:08.07 XPArYK5v.net
34です。
宣伝みたいになりましたが、
独習C++の新版が出ていました。
書籍は11月、電子ならすぐに手に入るようです。
期待してみます。
ほかにもあれば教えてください。
36:デフォルトの名無しさん
19/09/15 09:16:38.35 8KX++KfV.net
cpprefjp
37:デフォルトの名無しさん
19/09/15 09:45:21.89 oPlgEsHO.net
EzoeRyoのgithubに公開しているcppbook
cpprefjp
38:デフォルトの名無しさん
19/09/15 09:47:48.80 uSEm3H+m.net
ただで読めるし「江添亮のC++入門」とかでいいんじゃない?
どうしても書籍が良ければ9/20発売みたいだし
39:デフォルトの名無しさん
19/09/15 10:08:14.78 j54Ms8Tr.net
どいつもこいつも嵌める気しかねーのか。。
せめてロベールとかビャーネのやつを紹介しろよ。
40:デフォルトの名無しさん
19/09/15 10:14:24.35 uK9KHo8O.net
>>34
もちろんこういう書き込みは駄目だね
まず言語を学ぶ時点で実用性がない
学ぶならフレームワークだね
それにどうせ金にならないんだから、実用性なんて最初ならない
41:デフォルトの名無しさん
19/09/15 10:29:15.30 Fzt4Iz1L.net
ビャーネはまだしもロベール古くない?
42:デフォルトの名無しさん
19/09/15 10:30:20.14 +TjQqAK6.net
いまさら03以前の本を勧めるのはちょっと…
43:デフォルトの名無しさん
19/09/15 10:35:30.95 Pt8t6mL1.net
C++で生産性は向上しない
学習動機の根本が間違ってる
44:
19/09/15 10:37:36.53 gb0f216/.net
>>35
>書籍は11月、電子ならすぐに手に入るようです。
電子キンドル版もやはり11月まで入手できないとのことでした
45:デフォルトの名無しさん
19/09/15 10:47:37.02 j54Ms8Tr.net
cやったばっかの人に江添とか薦めるくらいならc++03のとこから地道に教える方を選択するわ。
あんな糞本でc++なんかいじられると目も当てられん結果になる。
46:デフォルトの名無しさん
19/09/15 10:49:41.53 Fzt4Iz1L.net
もちろんC++11,14,17,20と教えていくんだろうな?
今時C++03なんて使ってられんぞ
47:デフォルトの名無しさん
19/09/15 10:56:43.80 +TjQqAK6.net
今となっては「auto_ptrはコンテナに入れるな」だの「vectorのメモリ領域が連続してると仮定するな」だのを
初心者に教える方が有害だと思う
48:デフォルトの名無しさん
19/09/15 10:57:27.95 I9cvwq9U.net
基礎が全く出来てない単発だらけのこんなとこで聞くのが間違い
49:デフォルトの名無しさん
19/09/15 12:29:28.22 qCqOeXfn.net
ビャーネを勧めるとかw
否定が多いスレ
猫とかやさしいでも、まずは読んどけ。
50:デフォルトの名無しさん
19/09/15 13:03:00.40 o13gcpb2.net
>>34
最も大事なのは本人のやる気だ
モノになるか否かを本のせいにするようではそれがない
俺自身の経験から言うと
変にかみ砕いたバカ用の本や
筆者の思い込みを熱く語っている本よりも
ドライなやつがいい
具体的には禿の本や規格票が俺にとってのそれだった
必要な情報は客観的事実でどっかの馬の骨の主張じゃない
解らんところをどう攻めるかも自分の頭で考えるのが大事だ
51:デフォルトの名無しさん
19/09/15 13:17:14.19 d26DY9ov.net
>>34
stringとかをライトに使いたいのならサンプルコード探して真似るだけでもいいかと
ただ、stringやvectorがどういう仕組みで出来ているのかはいずれ理解する必要出てくるから
独習みたいな本を手元に置いといた方がいい(>>47みたいに古い本だと一部仕様が違ってたりするけど
52:デフォルトの名無しさん
19/09/15 15:21:24.21 2F/PGB+Q.net
言っちゃなんだが、実際使ってみるっつーか
何かソフト書いて覚えるしかないと思うよ
参考書はネットに転がってる文献で十分でしょ
53:デフォルトの名無しさん
19/09/15 15:29:29.02 WnktybSj.net
プログラミング勉強する前にコンピュータアーキテクチャ勉強しろ
54:デフォルトの名無しさん
19/09/15 15:30:29.64 w00J0OPy.net
URLリンク(en.cppreference.com)
の
using namespace ns_name; //(5)
という形式の 「using-directive (using 指令)」の説明に
5) using-directive: From the point of view of unqualified name lookup of
any name after a using-directive and until the end of the scope in which
it appears, every name from ns_name is visible as if it were declared
in the nearest enclosing namespace which contains both the using-directive
and ns_name.
とあるのですが、
as if it were declared in the nearest enclosing namespace which contains
both the using-directive and ns_name.
の部分の正確な意味が分かりません。個人的には (5) の ns_name までを含めた行全体が、
「using-directive」であるという理解なのですが。
as if it were declared in the nearest enclosing namespace which contains the using-directive.
であるなら分かりますが。どなたか分かる人にご教授いただければ幸いです。
55:デフォルトの名無しさん
19/09/15 15:53:13.28 58rKn0L9.net
using directiveにはnamespace以外にも用途があるからと思われ
56:54
19/09/15 15:59:33.27 w00J0OPy.net
>>54
さっき、名前探索の「優先順位」に違いが出てくるからかもしれないと気付きました。
using-directive を書いた namespace よりも、その親や先祖となっている
namespace で名前が宣言されているかのよに振舞うということは、
その分、名前探索では優先順位が少し低くなります。このことによって
同名の名前が内側に宣言されていた場合、振る舞いが変わってきそうです。
57:デフォルトの名無しさん
19/09/15 16:52:00.99 LMFjfaUx.net
>>39
ロヴェールはウンコ
58:デフォルトの名無しさん
19/09/15 18:52:44.08 XPArYK5v.net
34です。
みなさん、ありがとうございました。
詳しい人多いですね。
stringとかを使えば、pythonやC#みたいに
使えるかなと思ったものです。
59:デフォルトの名無しさん
19/09/15 21:18:39.85 zWVpxi69.net
C覚えたんならC++やらずに他の言語やってもいいんじゃね。と思った。
60:デフォルトの名無しさん
19/09/15 22:33:44.86 2F/PGB+Q.net
他の言語なんかやめとけ
C++かそれが嫌ならRustにしとけ
ただRustは難しいからC++でいいだろう
61:デフォルトの名無しさん
19/09/16 11:16:31.34 ViJ7kb/C.net
>>57
残念ながらc++に関してはそのうんこを超える入門書がないだわ。
62:デフォルトの名無しさん
19/09/16 18:51:38.35 JVpNk5dm.net
今時本で勉強しているやつは時代遅れ。
情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。
63:デフォルトの名無しさん
19/09/16 19:14:58.26 GDraKDQQ.net
辞書と教科書は違う
64:デフォルトの名無しさん
19/09/16 19:35:00.11 GUsgf22q.net
辞書がメインだよ
どっかの馬の骨はこう見ているというのは
あまり1つに囚われずに数多く見聞きして
誰もが口を揃えるのは何かを参考にする程度だ
65:デフォルトの名無しさん
19/09/16 19:49:19.85 Bd17ulHe.net
やっぱ言語を作った人が書いた「プログラミング言語(言語名)」を読むのがとっかかりとしては一番良い
言語の設計思想が一番間違いのない形で書かれている(何しろ本人が書いたのだから
最新規格は差分で追えば宜しい
次点はオライリーのやつ「プログラミング(言語名)」
66:デフォルトの名無しさん
19/09/16 20:12:19.52 ViJ7kb/C.net
>今時本で勉強しているやつは時代遅れ。
>情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。
なるほど、こういう浅はかな輩がいることを考えるとまだまだ本の価値は下がらんな。
67:デフォルトの名無しさん
19/09/16 20:17:58.22 Hp9aP4N/.net
でも今、本の値段が上がってるない?
昔はよく買ってたのに、9,800円ではちょっと躊躇してしまう。
68:デフォルトの名無しさん
19/09/16 20:29:19.55 Xl3jboOR.net
間違いがあっても更新出来ないのは本の欠点やと思う
69:デフォルトの名無しさん
19/09/16 21:59:17.57 sIsNtkL6.net
てか導入なら本がいいかもだけど、一度覚えれば更新はネットのコンテンツの方が良いからなぁ
最近仕様更新の頻度が高いから、
最新仕様に追従できている入門書でしかも実績のある奴なんてあるのかね?
70:デフォルトの名無しさん
19/09/16 22:01:20.50 iDbWACrZ.net
やっぱgoogleで検索が最強だからな
71:デフォルトの名無しさん
19/09/16 23:01:30.54 MvRcz04q.net
でもネットだと最新のものが上位に来やすく、しかも、そのサイトを書いている人は
新しいものを推奨しがちだが、本を読んでみると新しく入ったやり方より
古いやり方のほうが多くの場合には推奨される、ということが理由とともに
丁寧に説明されている場合もある。本を書いている人は経験豊富で、能力も
高い場合が多いのに対し、ネットで書いている人は必ずしもそうではないので
仮に結果は正しいことを書いていても、「理由」は間違っている場合などもある。
だから正しい見解を学びたいなら本の方がよいと思う。
例えばの話、本だと学歴や経歴なども分かって、それと本文の内容を
照らし合わせると「立場」「立ち位置」が分かって言外の内容が読み取れることもある。
72:デフォルトの名無しさん
19/09/16 23:10:11.04 iDbWACrZ.net
本だと一人の人の考え方に偏りがち
73:デフォルトの名無しさん
19/09/16 23:19:15.84 XEOx1c9f.net
本も読んでネットも見て自分で判断するんだよ
一つのソースに依存して信じ込むのはプログラミングの勉強に限らずなんでもダメ
74:デフォルトの名無しさん
19/09/16 23:41:43.90 FH41VMpz.net
>>54
>の部分の正確な意味が分かりません。
訳「ボクは馬鹿です」
>全体が、
>「using-directive」であるという理解なのですが。
まあそのページの下の方にもそう書いてあるな
75:デフォルトの名無しさん
19/09/17 00:06:57.73 e0hwvXZA.net
何の助けにもならず何の意味もない全く必要のないレス
76:デフォルトの名無しさん
19/09/17 06:05:19.69 mC1Fem4G.net
cout << sizeof "abc";
これで4と表示されるから
文字列リテラルはポインタだなんて書いてるサイトもあるしな
77:デフォルトの名無しさん
19/09/17 08:44:15.33 TMSCi5y8.net
そんなサイト、あるの?
78:デフォルトの名無しさん
19/09/17 09:03:18.20 kyKgfAv0.net
sejukuの侍エンジニア塾ブログじゃねえの?
あそこC言語の説明でやらかしただろ
もう絶対に信用しないよ
読んじゃいけないサイトのトップにランクインしてる
さっさと検索結果から消えてほしい
79:デフォルトの名無しさん
19/09/17 11:47:19.71 hai8m3HY.net
いい加減だよな
うちは64bitだから8だぞ
cout << sizeof "Hello!!"
80:デフォルトの名無しさん
19/09/17 12:04:06.87 MolJflMP.net
色々ツッコミどころがあるんだよねあれ
・C言語初心者はスクールがオフィシャルで出す解説を書くべきではない
・掲載前にはレビューするべき
・サイレント修正ではなく、お詫びと訂正を実施すべき
81:デフォルトの名無しさん
19/09/17 17:38:47.21 IoM9hprN.net
>>65
82:デフォルトの名無しさん
19/09/17 19:24:38.79 vP5fcRYP.net
実際糞記事読むくらいなら
ビャーネの本とかeffective modern c++読んだ方がよっぽど良い。
83:デフォルトの名無しさん
19/09/17 19:31:26.02 u1m7mz7R.net
effectiveは古い
84:デフォルトの名無しさん
19/09/17 19:34:51.97 u1m7mz7R.net
初心者には難しいし使ってる人には知ってることしか書いてない
85:デフォルトの名無しさん
19/09/17 20:08:04.08 g1BlUkdv.net
>>84
極端だな。初心者が次のステップに進むにはちょうどいいだろう。
86:デフォルトの名無しさん
19/09/17 20:26:03.45 vP5fcRYP.net
そうか?ここの連中なんてほとんど理解してるように思えんが。。
87:デフォルトの名無しさん
19/09/17 22:10:10.83 txYKQrA6.net
あるグローバル変数を変更しているpublicメソッドA、Bがあります。
このグローバル変数の排他制御をするために
CCriticalSection cs;
void A()
{
CSingleLock lock( &cs, TRUE ) ;
...
}
void B()
{
CSingleLock lock( &cs, TRUE ) ;
...
}
このようにしようと思ったのですが、Aの中からBを呼び出しています。
どうしたらよいでしょうか?
88:蟻人間
19/09/17 22:12:04.47 vrvr50SL.net
>>87
ロックカウンター変数
89:デフォルトの名無しさん
19/09/17 22:15:18.09 D0xFlgCf.net
C++に限らないが仕様が膨大だから一冊の本にするのは無理があるのに
色々網羅して中途半端な本多いよな。特には和書は。
90:蟻人間
19/09/17 22:21:08.25 vrvr50SL.net
カウント変数を追加し、ゼロで初期化。ロックがかかるときにカウントを1増やす。増やす直前にゼロだったら実際にロックする。ロックを解除するときにカウントを1減らす。ゼロになったら、実際にロックを解除する。
91:デフォルトの名無しさん
19/09/17 22:23:33.48 cgXPZZnO.net
MZうyちゃーーーん♪こんなとこにいたのかw
92:デフォルトの名無しさん
19/09/17 22:51:59.37 /ZgM52F4.net
>>87
同じスレッドでAの中からBが呼び出せるのは正常な動作です
逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
誰がロックを解除するんですか?
93:デフォルトの名無しさん
19/09/17 22:55:25.93 cgXPZZnO.net
ルンルン腹話術のお時間です(^ワ^)ワハハ!!
94:デフォルトの名無しさん
19/09/17 23:02:25.13 iJB0hxCG.net
>>88
安易にそれ勧めない
まず再帰ロック不要な設計にするのが基本
95:デフォルトの名無しさん
19/09/17 23:05:20.26 cgXPZZnO.net
問題集回しコピペワロタw
96:デフォルトの名無しさん
19/09/17 23:06:00.71 TcK6H4+J.net
マイクロソフトがgithubにSTLの実装を公開してる。
どんどんオープンにしていくのな・・・
URLリンク(github.com)
97:デフォルトの名無しさん
19/09/17 23:08:28.20 cgXPZZnO.net
ガーガーバカw
98:デフォルトの名無しさん
19/09/17 23:15:14.52 aYbHZN9j.net
>>92
それはwindowsのCRITICAL_SECTIONが再帰的ロック取得を認めているというだけで、
普遍的に通用する話じゃない。例えばstd::mutexを使った場合とかな。
>>87みたいなケースでは高階インターフェースのB()とinner_B()を分離するとかが常套手段だな。
99:デフォルトの名無しさん
19/09/17 23:17:56.03 f5N3Fp86.net
サウンド鳴るようになったのか!
100:デフォルトの名無しさん
19/09/17 23:22:32.62 /ZgM52F4.net
>>98
CCriticalSection
って書いてあるからCRITICAL_SECTIONの話では?
101:デフォルトの名無しさん
19/09/17 23:23:20.44 f5N3Fp86.net
はい今日も完成品なしw
102:デフォルトの名無しさん
19/09/17 23:35:00.33 aYbHZN9j.net
>>100
だからwindowsのCRITICAL_SECTIONなら通用する話だけど一般に通用する話じゃないってことだよ。
そういう環境だと
>逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
>誰がロックを解除するんですか?
誰が解除するか心配する以前にBでロックを試みた時点で例外が飛んだりする。
103:デフォルトの名無しさん
19/09/17 23:35:10.09 5UuHJcwd.net
recursive lock
104:デフォルトの名無しさん
19/09/17 23:40:43.31 ZBXs33c7.net
>>87
CCriticalSection cs;
void B_Core() {
/*元々のB()でやろうとしていた処理・lockは抜き*/
}
void A() {
CSingleLock lock( &cs, TRUE ) ;
...
B_Core(); // A()の中からはB()の代わりにこれを呼ぶ
...
}
void B() {
CSingleLock lock( &cs, TRUE );
B_Core();
}
もちろんB_Core()は外部から呼べないようにするべきである。
105:デフォルトの名無しさん
19/09/17 23:46:17.48 /ZgM52F4.net
>>102
それはWindowsのCRITICAL_SECTIONでは再ロック可能にしてある理由の説明なんですが
106:デフォルトの名無しさん
19/09/17 23:47:40.49 ZBXs33c7.net
ジャヴァのsynchronizeとか再帰ロックオールOK
なんでかわ知らん
ていうかwait()をsynchronizeでかこわなけっればならないという
謎仕様
意味わからん…
107:デフォルトの名無しさん
19/09/18 00:06:04.33 ccSwOulV.net
まあこんなクロージャとの組み合わせのときにちょっと意味があるのかもしれんが…
// UIスレッド
Handler handler = new Handler();
...
// バックグラウンドスレッド
synchronize (this) {
final Foo thisObj = this;
handler.post(new Runnable() {
@Override
void run() { /*...*/ thisObj.notify(); /*...*/ } // クロージャ内から仕掛け元のthis.wait()を起こす
});
wait();
}
つかnotify()とwait()の1対1対応とかを言語が暗黙のうちに仮定しているからか、
今わかったわ糞が…!!
108:デフォルトの名無しさん
19/09/18 00:06:06.17 WgADinsd.net
謎じゃない
condをどうやって実装するか調べてみ
109:デフォルトの名無しさん
19/09/18 11:06:38.20 FwmyHFG9.net
BASIC未満のゴミw
110:デフォルトの名無しさん
19/09/18 12:20:05.69 gxRTPgch.net
主語が足りてないぞチミ。
111:デフォルトの名無しさん
19/09/18 12:54:00.14 1Vhu13ZT.net
algorithmだけで5000行あんのか
URLリンク(github.com)
有り難くて目が潰れる
112:デフォルトの名無しさん
19/09/18 15:09:43.97 cX0n8f6q.net
ファイルにテキストを書き込みする際に、
ファイルにどれだけ書き込んだかを取得してプログレスバー的な処理をしたいのですが、
どのようにして書き込んだ量を取得すればいいのでしょうか?
113:蟻人間
19/09/18 15:14:37.40 d3y9L0GY.net
書き込んだバイト数の合計を数えるしかない。fprintfなら戻り値。文字列ならstrlen。
114:蟻人間
19/09/18 15:19:25.37 d3y9L0GY.net
合計バイト数がわからない場合は最初に全部数えるか、バイト数の代わりに行数などを使う手もある。
115:デフォルトの名無しさん
19/09/18 23:17:12.89 UKnFRk4i.net
頑張ってプログレスバーを実装したはいいがいざ実行すると
一瞬で表示が終り実装した意味あったのか・・と嘆く >>112 の未来の姿がみえる・・
116:デフォルトの名無しさん
19/09/19 00:44:38.80 zP6ZrAr3.net
書き込んだ量を取得することより、書き込み総量を計算するほうが難しい
ですよね。特にプログレスバーが必要になるほどトータル時間の掛かる処理の場合
に正確な総量を計算するとなれば莫大な時間が掛かってしまう可能性が高くて。
だから推定量を何らかの方法で求めるしかない事が多いでしょう。
117:デフォルトの名無しさん
19/09/19 01:08:08.89 pXxp02XD.net
いや足していくだけだけど
118:デフォルトの名無しさん
19/09/19 01:11:02.88 b8NtymRi.net
つーかテキストだろ?ギガ単位のサイズじゃないんなら
一回メモリにバコバコ貯めといて一気にブワァーッと書くほうが早いよいろいろと
119:デフォルトの名無しさん
19/09/19 01:23:42.33 wlX+Ifsh.net
だな
今のコンピュータなら数十MBくらいガバっと読み込んでいいのに、いまだに少しずつみたいな解説してる本やウェブサイト大杉
120:デフォルトの名無しさん
19/09/19 06:29:12.29 TNTldw8V.net
プログレスバーとかユーザーの気を静めるためのインテリアみたいなもんなので
過度に精度に凝っても仕方が無い
例えばウィンドーズのファイルシステムで1フォルダに10万個ぐらいファイルがあって
それをリモートのウィンドーズのファイルシステムにコピーするとかな場合は
ファイルのトータル容量とか気にせずに
進捗率(%) = 100 * コピーしたファイル数/10万個ぐらい
でも役に立つ
121:デフォルトの名無しさん
19/09/19 06:32:56.13 1k0/HGmS.net
いやプログレスバーは「きちんと」「しっかり」作らないと
ユーザーのイライラゲージを却って煽ることになるぞ
122:デフォルトの名無しさん
19/09/19 06:34:12.46 TNTldw8V.net
長らくぴくりとも動かなかったプログレスバーが一気に進んだとき
ユーザーに爽快感を与えることができうる
123:デフォルトの名無しさん
19/09/19 07:48:55.38 FVuvug5W.net
>>122
自分でそれを見たらイライラするタイプだろう
124:デフォルトの名無しさん
19/09/19 08:27:53.76 UG8ew1B1.net
99%で止まるやつはイライラするな。
進捗率よりも、書き込んだバイト数とか表示してくれると動いてるのがわかるから好きだな。
125:デフォルトの名無しさん
19/09/19 08:40:01.59 X+5OT7FX.net
>>121
windows update
126:デフォルトの名無しさん
19/09/19 23:28:31.87 TdUlR93V.net
progress_displayたん…どうして死んじゃったの…
127:デフォルトの名無しさん
19/09/20 08:56:12.04 Qo6+tgpY.net
全支店のファイルを集計するツール作った時
九州支店とか遠方の支店に入ると突然90%とかから進まなくなって
イライラおじさんに「なら最初から期待させるな」みたいなお説教された思い出
そこの回線だけやたら細かったというオチなんですけどね
今ならどうやって作るかなあ?
前処理で軽くテスト集計して予想回線速度をチェックしたうえで
拠点ごとに速度の重みづけをして見積もるか?
きちんとやるなら面倒だけどやるしかないよな
それとも運用方法の変更なりで逃げるか
プログレスバーの工数見積り怖い・・・
128:デフォルトの名無しさん
19/09/20 09:04:34.21 Qo6+tgpY.net
処理中のファイル名をリアルタイム表示して
進捗率の方はあくまで参考値という体にする手もあるか
あとは費用対効果を説明してこれで我慢してもらう交渉でって感じで
キャンセルボタンも付けるべきだよな上司はイランて言ってたけど
129:デフォルトの名無しさん
19/09/20 09:12:44.78 hmm5+Tdj.net
プログレスバーの下に店名と店長の名前表示すりゃいいじゃん
130:デフォルトの名無しさん
19/09/20 09:29:35.36 JFYTR1x6.net
その支店に接続するのにかかった時間を計測しておいて
それをベースに表示してみたら
131:デフォルトの名無しさん
19/09/20 10:44:26.44 BhKigXRx.net
接続先と毎秒の処理したバイト数でも表示すればいいんでね。
132:デフォルトの名無しさん
19/09/20 11:11:25.39 Qo6+tgpY.net
>>129
店長の名前は関係ないだろ
うっかり考え込んでしまったわ
133:デフォルトの名無しさん
19/09/20 11:36:45.41 hmm5+Tdj.net
クレーム先だよ
なんなら電話番号も出せばいい
134:デフォルトの名無しさん
19/09/20 12:02:27.62 l/kiVjID.net
ロード中にテトリスで遊べるようにしておけばいいよ
135:デフォルトの名無しさん
19/09/20 14:12:27.16 RTklMOF0.net
>>134
それたしかナムコが特許もってたような
136:デフォルトの名無しさん
19/09/20 14:57:59.95 KQX84Fxf.net
とっくに消滅してる
137:デフォルトの名無しさん
19/09/20 18:37:33.58 xrPkbjYn.net
あるクラスのインスタンスを生成するときに、必ずあるメンバを初期化してほしいとします。
このとき、コンストラクタで初期化することにしたのですが、初期化は必ずやってほしいためデフォルトコンストラクタは禁止したいです。
デフォルトコンストラクタを禁止するのはどうやりますか。
138:デフォルトの名無しさん
19/09/20 18:43:14.50 MFrl2Bhu.net
deleteすりゃいいじゃん。これ以上は言わぬ
139:さまよえる蟻人間
19/09/20 19:02:34.17 sJdfK6qv.net
>>137
モダンなやり方は = delete;だろう。
古臭いやり方はprivateにして定義を書かないようにすれば、アクセスできないようになる。
140:デフォルトの名無しさん
19/09/20 19:30:48.34 HuG+DEnO.net
5年ぐらい前に失効してたのか・・時の流れるのは早いのう
URLリンク(automaton-media.com)
141:デフォルトの名無しさん
19/09/20 19:32:15.62 mfXfj+Qu.net
どうでもいいがC++界隈はハチミツギョーザとか蟻人間とか
なかなかユニークなコテが多い印象
142:デフォルトの名無しさん
19/09/20 19:58:49.42 xrPkbjYn.net
>>138-139
ありがとうございます。
やりたいことそのものです。
143:デフォルトの名無しさん
19/09/20 21:54:40.66 Q9EEZSVd.net
キャンセルボタンなしの進捗ダイアログ表示して安心してたらESCキーで閉じられて不正動作
144:
19/09/21 12:33:44.52 HPdvwX1r.net
>>141
「蟻人間」のコテは最近それに改名されたものですよ…
145:デフォルトの名無しさん
19/09/21 17:28:53.63 hvfc00gO.net
Visual Studio 2019 C++ community editionを使用して
PythonをC++で使いたいのですが、
Pythonライブラリーの Python.h ファイルに
#pragma comment(lib,"Python37.lib")
といった記述があり、それがリンクエラーの原因となっております。
プロジェクトプロパティ>VC++ディレクトリ>ライブラリディレクトリには
「$(Path)libs」と記述して、パスは通したのですが改善されません。
これのリンクを通したいのですが、どのようにして対処すればよいのでしょうか?
お願いします。
146:デフォルトの名無しさん
19/09/21 17:46:36.63 B7P1QhOW.net
$(Path)という定義済みマクロが無いか、あるいは環境変数PATHの内容が
そのまま(つまり複数のパスを「;」を挟んで連接した文字列に)展開されているのかもしれんから、
展開結果を確認するか、それができないのであれば
絶対間違いのない絶対パス指定でうまくリンクできることを確かめてから改めて来なちゃい
147:デフォルトの名無しさん
19/09/21 18:20:26.50 hvfc00gO.net
>>146 さん。ありがとうございます。
絶対パス指定ならリンクは通りました。
ただ、相対パス自体はあるのですが展開結果が連結しているようです。
重ねての質問になるのですが、
#pragma 等で相対パスを使用する際に、
相対パスが連結している場合はどう対処すればいいのでしょうか?
148:デフォルトの名無しさん
19/09/21 18:54:54.04 B7P1QhOW.net
ライブラリをソリューション相対指定可能なフォルダに置いて
Visual Studioの定義済みマクロ($(SolutionDir)なり$(ProjectDir)なり)を正しく使えば良いだけの話なのでは…
あるいは、ライブラリのインストール先が決まっておりライブラリの位置を勝手に動かせないということであれば、
絶対パス指定で何の問題も無いはず…
ソースコードなりプロジェクトファイルなりに絶対パス指定が書かれることによるプロジェクトの可搬性が問題になるなら
適当な環境変数を設けてそれにただ1個のパスだけ定義して$(環境変数名)で展開させるか、
絶対パス部分をVisual Studioの機能でユーザーマクロ定義して最小化することができうる
※ [表示]→[その他のウィンドウ]→[プロパティーマネージャ]、とすればプロパティーマネージャータブが現れるので
そこで継承元の設定を変更でき、その中でマクロのユーザー定義が可能
いじょ 耕運を祈る、
149:デフォルトの名無しさん
19/09/22 06:52:19.04 wJwJ26l5.net
std::variantってテンプレートによる静的ポリモーフィズムを実現しつつ一つのコンテナで管理したいという要求から生まれたんでしょうか
であるとしたら今後継承による動的ポリモーフィズムは下火になっていくのでしょうか
150:デフォルトの名無しさん
19/09/22 10:30:22.84 dVD4vVZj.net
variantは共用体の代わり
151:デフォルトの名無しさん
19/09/22 22:04:08.49 P121omqV.net
> std::variantってテンプレートによる静的ポリモーフィズムを実現
継承もstd::variantも実際に格納されている型が実行時まで分からないのだから、
静的(コンパイル時)ポリモーフィズムにはならないのでは?
152:デフォルトの名無しさん
19/09/23 00:26:21.21 7kwjfJuy.net
gcc, clang, VC++, その他
仕事で使われるのはどれ?
153:デフォルトの名無しさん
19/09/23 00:50:57.87 QJYuDw18.net
>>152
gcc, clang, VC++
154:デフォルトの名無しさん
19/09/23 01:06:32.53 4WIp5ctr.net
intelも使われるし、C++ Builderも使われてる
155:デフォルトの名無しさん
19/09/23 01:21:58.30 7kwjfJuy.net
仕事でC++14より上使っている?
156:デフォルトの名無しさん
19/09/23 03:12:30.92 aMvJGSmY.net
iccって高いだけで性能もgccとほぼ変わらないなら値段に見合う利点あるのか?
157:デフォルトの名無しさん
19/09/23 09:16:12.73 QJYuDw18.net
メニーコアなCPUとSIMDを使ったときのプロファイラが優秀
おそらく <
158:デフォルトの名無しさん
19/09/23 11:42:56.67 rVs/BJT1.net
普通に17使うだろ
filesystemやvariant,optional使わんの?
159:デフォルトの名無しさん
19/09/23 11:57:29.62 f1jovMGd.net
だよな
160:デフォルトの名無しさん
19/09/23 12:02:46.51 P5eYiou7.net
お仕事だとそうぽんぽんバージョンあげられないし
使っていい標準ライブラリのしばりもあったりするんですよ
特にプラットフォーム抽象する系はあんまり使わない
そんなのにべったり頼るぐらいならc++でなくてよくね?ってなる
161:デフォルトの名無しさん
19/09/23 12:08:09.26 rVs/BJT1.net
最近はmsvcがバイナリ互換保ち続けているから安心してあげられる。
gccやclangはもともと対応早いから安心だったし。
162:デフォルトの名無しさん
19/09/23 12:19:16.90 f1jovMGd.net
>>160
filesystem使って見た?
まだ荒削りで所々変なところがあるけど
方向性としてはいい線ついてると思うぜ
163:デフォルトの名無しさん
19/09/23 12:24:31.61 EI75oq0E.net
あ、こいつバギーなライブラリ入れて現場荒らすタイプだわw
164:デフォルトの名無しさん
19/09/23 12:31:48.66 rVs/BJT1.net
勝手にライブラリ追加できる時点で糞みたいな職場じゃね
165:デフォルトの名無しさん
19/09/23 12:47:46.83 f1jovMGd.net
難癖つけるのは構わんが
脇が甘いぞおまえら
166:デフォルトの名無しさん
19/09/23 13:15:30.01 WS0TgAIm.net
まあケースバイケースだろ
ポンポンバージョン上げられないって言うだけで古い環境使い続ける職場もどうかと思うし
167:デフォルトの名無しさん
19/09/23 13:21:49.79 P5eYiou7.net
>>162
ファイルシステムまわりはこてこてにネイティブ依存の内製のものがあるので出番はないでしょうね
パフォーマンス第一の仕事なもので
あと標準ライブラリはデバッガやプロファイラのことがスコープ外なのでそのあたり自分達で整備しないと採用できないってのもある
168:デフォルトの名無しさん
19/09/23 13:33:54.17 f1jovMGd.net
なるほどね
パフォーマンス第一か
どっちかつーと標準なんぞ糞くらえつーか
標準の意味が違ったりするわけか
169:デフォルトの名無しさん
19/09/23 14:04:13.62 JqkYM16h.net
同じじゃん標準ライブラリは一般性重視故に特定の問題領域において必ずしも最高の性能は発揮しない(最高の性能となる保証がない)ことは確定的に明らかよって80-20の法則の80部分からパフォチューしていく
170:デフォルトの名無しさん
19/09/23 14:07:39.82 QJYuDw18.net
頭悪い書き込みしか無くて草
171:デフォルトの名無しさん
19/09/23 14:31:50.86 JqkYM16h.net
天 才 現 る
172:デフォルトの名無しさん
19/09/23 22:59:04.40 EI75oq0E.net
てかc++でやることじゃねーだろどう考えても。
糞の役にも立たんわ。
173:デフォルトの名無しさん
19/09/24 00:22:06.58 iXMkuGmM.net
C++でやる事って何よ?
174:デフォルトの名無しさん
19/09/24 01:05:00.80 blreVUO1.net
templateで遊ぶくらいしかやることないね。
175:デフォルトの名無しさん
19/09/24 06:38:35.03 3E9gAKbz.net
仕事がないって話はマ板でやんな
176:デフォルトの名無しさん
19/09/24 18:32:13.78 9F3bEWFD.net
汎用性・可搬性を重視するかパフォーマンスを重視するかのスタンスの違いだけでしょ
177:デフォルトの名無しさん
19/09/24 19:39:45.71 bRBDEgqh.net
>>173
filesystemみたいなライブラリの実装。
178:デフォルトの名無しさん
19/09/24 20:52:11.47 ZtSwhx8Z.net
visual studio 2019 16.3でついにconceptが使えるように(赤線でるけど。。。
179:デフォルトの名無しさん
19/09/25 00:19:35.27 T/Q1Hzp4.net
conceptはいい
人類は真の抽象化を手にする
180:デフォルトの名無しさん
19/09/25 00:39:03.31 0gY/IvgH.net
C++98の俺には1ミリも関係ない話だな。
181:デフォルトの名無しさん
19/09/25 00:43:58.99 ROl8Z6BD.net
じゃあ出て行け
182:デフォルトの名無しさん
19/09/25 01:15:27.21 zpsuJSx5.net
98とかVB6と同レベルの化石
183:デフォルトの名無しさん
19/09/25 16:32:45.50 5a
184:P+8CuP.net
185:デフォルトの名無しさん
19/09/25 21:10:30.42 065+eRsw.net
じゃあ俺が
186:デフォルトの名無しさん
19/09/25 21:20:37.77 SmUxqnJ3.net
いやおれが
187:デフォルトの名無しさん
19/09/28 01:40:31.76 cIYNjYIc.net
重複スレの方が謎の盛り上がり
188:デフォルトの名無しさん
19/09/28 02:11:00.78 intFUv+k.net
void君はあのスレから出られないからな
189:デフォルトの名無しさん
19/09/28 14:48:43.27 nKwEArCO.net
このスレはwinapiを扱ってますか?
sendmessageとか。
190:デフォルトの名無しさん
19/09/28 16:09:42.06 EwMBvois.net
>>188
Win32API質問箱 Build125 :
スレリンク(tech板)
191:
19/09/28 16:12:26.72 QJtrgyVU.net
>>188
win32api ならやってる人は少なからず居ると思います
192:デフォルトの名無しさん
19/09/28 16:37:07.73 nKwEArCO.net
>>190
サンクス!
193:デフォルトの名無しさん
19/09/29 07:24:31.34 wVCOjSn/.net
文法とか開発思想の初歩的な質問なんだが、例えば最大流問題を解くプログラムと最小費用流問題を解くプログラムで「Edge」という構造体や「dfs」という関数の意味を変えたいときに使うのが名前空間だという理解でOK?
(関数の意味を変えたいだけなら名前空間じゃなくて別のクラスを用意すれば良いだけかな?)
あと、名前空間の中でグローバル変数を使うのは通常のグローバル変数と同じで慎重にやった方が良い(と言われてる)?
例えば最小費用流問題を解くときに経路の情報を記録したりするんだが、この経路を mincostflowという名前空間におけるグローバル変数にするとか
194:デフォルトの名無しさん
19/09/29 09:01:23.18 thkZayt3.net
名前空間は名前をまとめるだけであって隠蔽したり上書きしたりする機能はない
素直にクラス使え
195:デフォルトの名無しさん
19/09/29 10:02:14.52 sih8o/+S.net
>>192
そのくらいのプログラムでは名前空間は使わない方がいい。
使うべきなのはクラス。
196:デフォルトの名無しさん
19/09/29 10:24:44.95 MP9GBJ11.net
いや同じ識別子を違う意味で使いたいのなら名前空間だ
名前をどうかしたいというだけでクラス化するといらん制限がかかって邪魔なだけ
197:デフォルトの名無しさん
19/09/29 10:27:55.39 lvoGL429.net
>>192
その例では明らかにグローバル変数を使う必要はない。
「最小費用流を解くクラス」のメンバに押し込めるのが普通だと思われる。
198:デフォルトの名無しさん
19/09/29 12:21:02.27 xopwPRlT.net
名前空間は一連の処理や機能をライブラリとしてまとめるときに他のライブラリと名前衝突しないようにするためのものだ
minとmaxの違いだけなら名前空間分けずに変数名や関数名に直接反映させればいいのでは
199:デフォルトの名無しさん
19/09/29 15:27:39.30 sih8o/+S.net
>>197
個人的には自分もそう理解しています。
自分が作るプログラムでは namespace は基本的に使う必要はほぼ
有りません。古い時代に既に作ってしまったプログラムで名前が衝突して
困るような場合に使うと便利な機能として登場したのではないかと思っています。
200:デフォルトの名無しさん
19/09/29 15:31:08.94 MP9GBJ11.net
せっかくの回避策をマクロでばっちり透過してくれた素敵なマイクロソフトw
201:デフォルトの名無しさん
19/09/29 16:03:17.31 k4CvVXqN.net
>>198
昔作ったものに対してだけでなく、いま作ったものが将来使うときに名前の衝突を回避するという目的もあるぞ。
202:デフォルトの名無しさん
19/09/29 16:52:41.21 1aVYpaid.net
なぜ日本人c++プログラマの99%はstd::vectorもstd::find_ifも見たことすらないのだろう。
c言語風の生ポインタ、生配列、if文、for文のみを使ったプログラムしか読めない。
外国の人でそういう人は見たことがない。
203:デフォルトの名無しさん
19/09/29 17:03:09.76 bY9zxDl0.net
99%は盛り過ぎでは・・・
204:デフォルトの名無しさん
19/09/29 17:06:09.85 cKDPFQQS.net
>>201
ワイド文字知らん人見たことあるわ
205:デフォルトの名無しさん
19/09/29 17:28:35.45 TRtZnyIq.net
体感で8割ぐらいかな
まず規格があって改訂されてるってことも知らないのもいる
これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな
206:デフォルトの名無しさん
19/09/29 17:37:04.15 MP9GBJ11.net
>>201
おまえ豚小屋にでも住んでるのか?w
207:デフォルトの名無しさん
19/09/29 17:38:36.19 MCSEZmay.net
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?
208:デフォルトの名無しさん
19/09/29 18:02:01.75 xopwPRlT.net
全部ヘッダーファイルに書いてしまえ
209:デフォルトの名無しさん
19/09/29 18:13:05.80 Lkb9fNY1.net
vector知らんのはいたとしても組み込みマンくらいだろ
210:デフォルトの名無しさん
19/09/29 19:02:41.77 bY9zxDl0.net
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない
211:デフォルトの名無しさん
19/09/29 19:46:49.92 qdFsd7WD.net
>>208
組み込みマンはC言語だろ
C++使っててstd::vector知らないのは流石に勉強不足
212:デフォルトの名無しさん
19/09/29 19:56:43.66 MCSEZmay.net
>>209
ありがとう
やっぱだめか
213:デフォルトの名無しさん
19/09/29 21:36:43.15 MP9GBJ11.net
>>210
組み込みマンだからprinf知りませんみたいなもんだなw
214:デフォルトの名無しさん
19/09/29 21:44:06.01 xcXauKC9.net
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし
215:デフォルトの名無しさん
19/09/29 21:51:00.97 lvoGL429.net
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)
216:デフォルトの名無しさん
19/09/29 21:57:52.25 OYiClG3B.net
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな
217:デフォルトの名無しさん
19/09/29 22:09:42.47 7KCLRAec.net
サイズを変えない操作でvectorと生配列の効率に違いなんかないだろ
218:デフォルトの名無しさん
19/09/29 22:16:27.22 C35/CdkS.net
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る
219:デフォルトの名無しさん
19/09/29 22:58:28.58 UVnMNq40.net
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。
220:デフォルトの名無しさん
19/09/29 23:03:53.99 7KCLRAec.net
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな
221:デフォルトの名無しさん
19/09/29 23:06:55.39 C35/CdkS.net
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?
222:デフォルトの名無しさん
19/09/29 23:10:51.16 C35/CdkS.net
>>219
Cはコードはそこまでひどく遅くならないからね
223:デフォルトの名無しさん
19/09/29 23:28:02.53 bY9zxDl0.net
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは
224:デフォルトの名無しさん
19/09/29 23:34:47.03 C35/CdkS.net
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな
225:デフォルトの名無しさん
19/09/29 23:37:19.27 SfsnISLI.net
>>217
良いPC買え
226:デフォルトの名無しさん
19/09/29 23:39:36.92 C35/CdkS.net
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで
227:デフォルトの名無しさん
19/09/29 23:53:13.21 7KCLRAec.net
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない
そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる
228:デフォルトの名無しさん
19/09/29 23:55:18.86 lvoGL429.net
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。
229:デフォルトの名無しさん
19/09/29 23:56:29.88 SfsnISLI.net
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ
230:デフォルトの名無しさん
19/09/30 00:01:41.09 1t7BL5a5.net
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの
231:デフォルトの名無しさん
19/09/30 00:07:48.80 K1luVxXx.net
自分以外は仕事でC++使ってないと思ってるのかねえ
232:デフォルトの名無しさん
19/09/30 00:12:05.55 d3KN1ocd.net
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題
233:デフォルトの名無しさん
19/09/30 00:29:11.50 BjVWgoML.net
debugバージョンでもinline有効にすれば良い
234:デフォルトの名無しさん
19/09/30 00:41:06.86 BjVWgoML.net
gccなら-Ogとか使えば楽
235:デフォルトの名無しさん
19/09/30 08:38:56.00 96lznZkD.net
>>217
問題再現できないのってUB踏んでるんじゃ...
236:デフォルトの名無しさん
19/09/30 20:10:40.43 m19D9tLr.net
c++ほどサンクコストに引っ張られる輩を作り出す言語はないだろうな。
237:デフォルトの名無しさん
19/09/30 20:22:13.77 H9c5jpU6.net
つまり他の言語は底の浅いオモチャ、と
238:デフォルトの名無しさん
19/09/30 20:56:24.52 m19D9tLr.net
そんな掘ってもしょうがないところが深くても邪魔なだけなんだよ。
239:デフォルトの名無しさん
19/09/30 21:49:42.53 A2h+ApYr.net
あっさ
240:デフォルトの名無しさん
19/09/30 21:53:05.92 eLbbGbO7.net
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。
241:デフォルトの名無しさん
19/09/30 22:05:07.81 JjfJ0hCF.net
アルゴリズム的に改善できる話なら言語関係ないじゃん
242:デフォルトの名無しさん
19/09/30 22:28:45.63 29SpHEC8.net
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・
今時ほとんど変わらんよね?
243:デフォルトの名無しさん
19/09/30 22:34:03.50 /hygPyRQ.net
>>241
実際測ってみりゃいいよ
244:デフォルトの名無しさん
19/09/30 22:48:36.98 ypiuCBLp.net
その時のためのtemplateです。
245:デフォルトの名無しさん
19/09/30 23:07:55.69 ypiuCBLp.net
URLリンク(ideone.com)
これなんで通らんのやろう?
コード補完で読み切れないのはいいけど、コンパイラさんは読めても良いのでは?
246:デフォルトの名無しさん
19/09/30 23:15:32.33 d3KN1ocd.net
class A :public T...{
にすりゃ通る
247:デフォルトの名無しさん
19/09/30 23:19:40.15 d3KN1ocd.net
もしくは
struct A :T...{
継承元にアクセスできんのが原因
248:デフォルトの名無しさん
19/09/30 23:29:43.59 ypiuCBLp.net
>>245-246
あ、俺環だったか。
マジで通った。。。@vc
URLリンク(ideone.com)
249:デフォルトの名無しさん
19/09/30 23:42:29.68 ypiuCBLp.net
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。
250:デフォルトの名無しさん
19/09/30 23:50:49.59 ypiuCBLp.net
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。
251:デフォルトの名無しさん
19/10/01 10:39:26.07 SeWV7ZFb.net
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?
252:デフォルトの名無しさん
19/10/01 15:52:31.87 vnyPyC//.net
>>193-194,196
では、Edgeという名前の構造体の定義を問題によって変えたいときはどうすれば良いですか?
253:デフォルトの名無しさん
19/10/01 21:48:01.50 9tGbOXPW.net
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない
254:デフォルトの名無しさん
19/10/01 21:50:51.00 sOAgszt0.net
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2~4倍差が出る
255:デフォルトの名無しさん
19/10/01 23:04:08.95 +hOGjxeQ.net
floatが早い今どきのプロセッサってGPUの話か?
ちゃんと区別しろ
256:デフォルトの名無しさん
19/10/01 23:06:13.36 geI6I9WY.net
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど
257:デフォルトの名無しさん
19/10/01 23:06:54.09 sOAgszt0.net
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである
258:デフォルトの名無しさん
19/10/01 23:26:39.35 5ranOfZi.net
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない
259:デフォルトの名無しさん
19/10/01 23:28:12.34 DRbEIshC.net
今はfloatのが速い
amd64出てからsse基本なので
昔とは状況が違う
260:デフォルトの名無しさん
19/10/01 23:28:49.51 DRbEIshC.net
>>257
やるけど
261:デフォルトの名無しさん
19/10/01 23:30:04.90 5ranOfZi.net
>>259
やるんか?
262:
19/10/01 23:32:20.09 3zNRBOOL.net
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています
263:デフォルトの名無しさん
19/10/01 23:37:45.74 KZgN44vw.net
>>261
それはお前の頭が老害だから
264:デフォルトの名無しさん
19/10/01 23:39:09.19 84uW7JaU.net
速さ計測すればいいじゃん
逆アセンブル見ればいいじゃん
265:
19/10/01 23:40:49.69 3zNRBOOL.net
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
266:デフォルトの名無しさん
19/10/01 23:44:09.36 sOAgszt0.net
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み
267:デフォルトの名無しさん
19/10/01 23:54:05.20 5ranOfZi.net
>1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速く
その条件だとどっちを使っても良い大して変わらん
やっぱループアンローリングできるぐらいループリッチな課題でないと意味が無い
URLリンク(www.isus.jp)
URLリンク(cpplover.blogspot.com)
268:デフォルトの名無しさん
19/10/02 00:10:27.89 eo8nmuYy.net
しかしコンパイラの最適化はイマイチっぽい
URLリンク(www.isus.jp)
269:
19/10/02 07:48:44.41 BafSfR+Q.net
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!
270:デフォルトの名無しさん
19/10/02 07:54:44.99 Y2eIpMbX.net
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから
271:デフォルトの名無しさん
19/10/02 07:59:03.00 Y2eIpMbX.net
あ、もちろんデバッグビルドの話な
最適化ありならspiritは当然速い
272:デフォルトの名無しさん
19/10/02 08:01:33.95 sddCZQNP.net
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?
273:デフォルトの名無しさん
19/10/02 08:22:40.25 QmwKmz4W.net
>>268
でもアセンブラで直接使わないと無かったことにされるだろ
274:デフォルトの名無しさん
19/10/02 08:29:18.29 0zoKeqvU.net
>>261
amd64でfpuコード吐かせるほうが手間じゃwwww
275:デフォルトの名無しさん
19/10/02 08:30:44.39 0zoKeqvU.net
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw
276:デフォルトの名無しさん
19/10/02 11:21:30.36 iITLzrzf.net
>>272
プロジェクトの設定でfpも選べるよ
既定だとsse使われると思うけど
277:デフォルトの名無しさん
19/10/02 22:05:22.14 VK3sSC9+.net
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで
278:デフォルトの名無しさん
19/10/03 04:57:05.82 vAL7lUst.net
質問です
既にクラスHogeとAがあり
クラスAとは別に新たにクラスBを追加することになった
BはA専用の関数が無く呼び出す必要も無いし逆のことは無い
その場合BにA専用の関数と同じ名前の空の関数を用意するか、呼び出されているHoge内で切り分けるかどちらの方が良いですか?
なおAは絶対に継承しなければならないし改変することもできない
class Hoge : A か class Hoge : Bをプリプロセッサかテンプレートで切り分ける
これを
void Hpge::func() {
A_func(); //Bは持っていない
}
プリプロセッサで切り分けるのが良いのか
void Hpge::func() {
#if defined(USE_A)
A_func();
#endif
}
それとも空の関数を書いた方が良いのか
class Hoge : B {
A_func() {}
}
詳しい方がいたら教えていただきたいです
これ以外の賢いやり方があればそれでも大丈夫です
279:デフォルトの名無しさん
19/10/03 07:04:32.42 damPur2/.net
絶対に、の理由が知りたいところだけど、普通はA_funcを仮想関数にしてBは空関数でオーバーライド。
280:デフォルトの名無しさん
19/10/03 07:05:22.94 OJdSM3QH.net
c++17以降ならif constexprとstd::is_sameでできるんじゃない?
template < typename T >
class Hoge : T{
void func() {
if constexpr(std::is_same<T,A>){ //基底クラスTがAであればA_func()を実行する
A_func();
}
}
}
281:デフォルトの名無しさん
19/10/03 07:12:55.92 OJdSM3QH.net
std::is_same<T,A> じゃなくて std::is_same_v<T,A> か
282:デフォルトの名無しさん
19/10/03 07:31:04.45 5EMHpFEj.net
>>278
HogeがAかBを継承するんだからそれじゃだめやろ
ただ設計見直したいところだけどそういうわけにもいかんのかね
283:デフォルトの名無しさん
19/10/03 07:54:23.64 r73Y/293.net
c++17が使えなくて、Bの定義を関係ないAのために汚染したくないなら一層増やせばいい
template<typename T>
class HogeBase;
template<>
class HogeBase<A> : A {}
template<>
class HogeBase<B> : B { A_func(){} }
template<typename T>
class Hoge : HogeBase<T> { /*...*/ }
284:デフォルトの名無しさん
19/10/03 09:13:02.91 r91xqmRv.net
>>2
285:81 なにか問題起きる?
286:デフォルトの名無しさん
19/10/03 11:57:14.92 z1c5xmGq.net
>>277
基底クラスを切替たいってこと?
しかも片方の基底クラスにしかないメソッドを派生クラス側で呼出すとかどんな状況なんだろう…
まあ、やっつけでやるなら素直にB側に空のメソッド追加しとけばいいと思うよ
どう見てもまともな設計じゃなさそうだし、かと言って設計を見直すこともできなさそうだしね
プリプロセッサなんて愚の骨頂にしかならん
287:281
19/10/03 12:22:59.66 GJuckdYX.net
>>283
A_funcを持つものを継承するならオーバーライドが理想的だろうけど、基底がAかBってことだから無理っしょ
しかもAは書き換えられないときてる
すでに言われてるようにテンプレートで基底を指定させるか単純に空のA_funcを書くか、プリプロセッサか
でもそもそも利用者側がAを使うのかBを使うのか決めるのなら、クラス側で対処せずに利用者がプリプロセッサで分けた方がいいと思う(でないとぐちゃぐちゃになりそう)
それだと修正箇所が多すぎるのかもしれんけど
288:デフォルトの名無しさん
19/10/03 13:00:06.78 t4NBMq8s.net
こんなマトモじゃないケースに
ベストな解答なんかないわな
289:デフォルトの名無しさん
19/10/03 13:00:33.56 YSTER/9m.net
>>284
Qtをdisってんの
290:デフォルトの名無しさん
19/10/03 15:51:04.04 z1c5xmGq.net
まさかと思うがQtを盲信してるのか?w
291:デフォルトの名無しさん
19/10/03 16:04:15.58 LjcEi/T6.net
ちょとっ猛進
292:デフォルトの名無しさん
19/10/03 16:37:32.38 vAL7lUst.net
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね
293:デフォルトの名無しさん
19/10/03 18:04:25.67 SL8wP/0a.net
>>288
え、qt便利じゃん
294:デフォルトの名無しさん
19/10/03 19:00:51.01 BEqWQnsI.net
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは
295:デフォルトの名無しさん
19/10/03 19:22:01.27 z1c5xmGq.net
>>291
便利かどうかなんて言ってないのにいきなりどうした?w
296:デフォルトの名無しさん
19/10/03 21:53:13.09 Uq6PP8Ux.net
コンパイル通らないので助けてください。
メンバテンプレートを持つクラスを継承して、派生先からメソッドが呼べません。
一見問題なさそうにはみえるのですが・・・
template<typename _T1>
class A{
public :
template<typename _T2> _T2 get() { return _T2(); };
};
template<typename _T3>
class B : public A<_T3> {
std::string hogehoge() { return A<_T3>::get<std::string>();}
};
297:デフォルトの名無しさん
19/10/03 21:59:37.34 A/fPHEZe.net
>>294 エラーメッセージとか出てないの?
298:デフォルトの名無しさん
19/10/03 22:06:09.67 BrhogHgJ.net
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}
299:デフォルトの名無しさん
19/10/03 22:13:42.78 Uq6PP8Ux.net
ありがとうございました。
通りました。
つか、そんなtemplate文の使い方初めて知った・・
300:デフォルトの名無しさん
19/10/03 22:31:15.90 zkquM/gX.net
この場合Aがテンプレートなので、Aの先のgetが何者かコンパイラは判断つかないので
"<" が比較演算なのかテンプレートのかっこなのか判断つかないから
らしい
clangは教えてくれるんだから判断ついてるわけだが・・・
まったく醜い文法を持った言語だよ
301:デフォルトの名無しさん
19/10/03 22:49:50.59 BrhogHgJ.net
この場合のエラーメッセージ、GCCはほんとに何言ってるのか分からないのを出すのでclang様様
302:デフォルトの名無しさん
19/10/04 01:11:35.70 gSpEwnzq.net
C++テンプレートのプログラミングでのエラーを読み解く訓練をしているうちに
実世界での初心者が投げてくる質問へのエスパー力がやしなわれる
これ豆
303:デフォルトの名無しさん
19/10/04 02:30:32.92 gpJXYiEy.net
そのうちエラーメッセージを見ずにエラーを修正できるようになる
304:デフォルトの名無しさん
19/10/04 02:54:08.89 P4b1n6up.net
ちなVC2015か2017か忘れたけど、一時期までのVCは
その場合のtemplateを書くと逆にエラーにされてた
305:デフォルトの名無しさん
19/10/04 03:18:41.39 I4catYuR.net
goで変数用いて
*******
*****
***
*
***
*****
*******
って出力するにはどうすりゃいいのっと
306:デフォルトの名無しさん
19/10/04 03:19:28.61 I4catYuR.net
あ、↑のは砂時計みたいな形にしたい
307:蟻人間
19/10/04 04:12:53.14 NaWoGk/Z.net
>>303
二重のループか仮想画面
308:デフォルトの名無しさん
19/10/04 04:19:18.14 I4catYuR.net
>>305
申し訳ないが初心者ゆえ、数字の二重ループはできるけどそれを文字列にする仕方がわからず
309:デフォルトの名無しさん
19/10/04 05:45:45.52 jwb6jSs+.net
goスレ行け
310:デフォルトの名無しさん
19/10/04 08:20:48.47 FzFdUbJu.net
>>298
なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
作っていて悩んでいたところなんですが、
多くの言語では、+,-,*,/,<,> などの演算子が混ざったいわゆる「数式」は文脈に依存せずに
上位のコンパイル作業に入る前に、いったん「数式ツリー」に直すことが出来ます。
ここで「文脈に依存せず」というのは、変数名、関数名、型名などの宣言情報を
調べなくても済むという(いわゆる意味解析の結果の情報を必要としないと言う
)ことです。
ところが、template機能が入った後のC++では、A<B と書いたとき、
< がテンプレートの記号なのか比較演算子なのかは A がテンプレート名であるか
どうかによって決まります。
Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。ところが、Bに 1, 456, 3.1415 のような数値や、"Hello" などの文字列
が来ている場合には、(その場では)判断が付きません。
文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
があるかどうかを調べるといける可能性があります。
1. "<"に対応する">"が存在するかどうか調べれば、これまでの宣言情報を使わなくても
トークン・ツリーを作ることが出来る。トークン・ツリーと言ったのは、数式とは
限らないからです。例えば、A<B> x[100]; などとすることがありますが、A<B>
は型名であり、数式では有りません。ただし、他の多くの言語では数式ツリーは
作ることが多いのですが、トークン・ツリーはまず作りません。
2. 1の方法を使わないなら、宣言情報を調べて、Aがtemplate名であるかどうかを調べる
必要がある。ところが、Q::A<B> などのような場合があるので、そんなに
単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
311:デフォルトの名無しさん
19/10/04 08:25:56.64 FzFdUbJu.net
>>308
補足
「Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。」
の部分ですが、B<CPerson(実引数列) などとした場合、CPersonは型名ですが、
CPerson(実引数列) 全体は、型名ではなくCPersonクラスの引数つき
コンストラクタを呼び出した結果の「一時オブジェクト」です。なので、
Bが変数名の場合は、< は比較演算子の可能性があります。
312:デフォルトの名無しさん
19/10/04 08:33:37.62 FzFdUbJu.net
>>308
誤:なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
正:なぜか偶然ですが、このスレを見る前の昨日からその辺に関係するパーサーを
誤:文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
正:文脈に依存せずに判断を付けたいなら、もっと先まで読んで、< に対応する >
誤:単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
正:単純な作業ではなく、Q::A がtemplate名なのか、変数名なのかはちゃんと調べる必要がある。
313:デフォルトの名無しさん
19/10/04 08:37:14.54 P4b1n6up.net
>>225
>>224=228や>>226=219みたいなどうみても初心者なヤツにプロが敬語使う必要ないと思うよ
C++スゲー=俺スゲーみたいな明らかにプログラミングに向いてない精神構造のクソバカが多く居るからねここ
314:デフォルトの名無しさん
19/10/04 08:41:34.48 FzFdUbJu.net
>>306
一般論として、文字列の長さを len として、文字列型の変数を str としたとき、
for ( len 回のループ ) {
str = str + "*"
}
で行けます。
315:デフォルトの名無しさん
19/10/04 09:33:34.23 8yIxxMU3.net
>>311
ようクソバカ
316:デフォルトの名無しさん
19/10/04 09:41:54.97 P4b1n6up.net
>>313
すまんな図星だったか?
邪魔だから出てけよ
317:デフォルトの名無しさん
19/10/04 11:43:51.24 FzFdUbJu.net
>>308
C++言語をパースする方法として、結論的には、2.ではダメで、1.でなくてはならないようです。例として、A<実引数列>::B の場合を考えると、template は実体化する
際の実引数によって展開される内容は大幅に変わりますので、
A<int>::B とした場合には、B は template 名で、
A<string>::B とした場合には、B は変数名であることもありえます。すると、
A<int>::B<C> の場合の B<C> は template 実体化ですが、
A<string>::B < C の場合は、変数B と変数 Cに対しての比較演算となります。
なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
分かっただけでは B が「何なのか」を結論付けるには不十分で、A<実引数列>の
実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
定義を探して template の overload 解決をしてから、A<実引数列> 部分(のclass)を
完全に「特定」する必要があります。ここまでやるとなると、コンパイラの層分けが
上手く出来ないことになります。
318:デフォルトの名無しさん
19/10/04 12:03:58.19 FzFdUbJu.net
>>315
A::B くらいの場合なら、意味解析の情報だけを元に、Bが何なのかを特定をすることは
可能です。ところが、A<1+2,decltype(x*y)>::B の様な場合、x, y の意味論的な型
を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
定義されていれば、その戻り値の型を調べてx*y の型として、A<・・・> の部分が
結局何なのかを特定しなくてはなりません。今述べた x*y の部分の処理は、
トークン解析層(?)より上位のコンパイル層で行う処理です。なのでこのやり方
だと、コンパイラ内部の「層」の切り分けが難しくなります(技術的に不可能な
わけではありませんが。)。
319:デフォルトの名無しさん
19/10/04 12:07:27.45 FzFdUbJu.net
>>315
誤:なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
正:なので、もし、>>308 の 2.のやり方でパースしようとすると、Aがtemplate名であると
誤:実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
正:実引数列をほとんど完全に調べ上げてから、その型名に応じた template A の
>>316
誤:を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
正:を調べた後、x*yに適応可能な operator*() 関数が定義されているかどうかも調べ、
320:デフォルトの名無しさん
19/10/04 12:36:35.66 cK/f4a5x.net
>>312
ありがとうございます!
やってみます
321:デフォルトの名無しさん
19/10/04 12:41:17.15 G1/ISgxb.net
c++って文法に曖昧さがないことどうやって保証してんだろ
形式的なアプローチ無理だと思うんだが
322:デフォルトの名無しさん
19/10/04 13:05:22.64 MVQV/kgg.net
いや、そんな保証は端っから諦めてるだろ
引数なしの関数宣言とデフォコン呼び出しの曖昧さなんか
長年放置してたのをC++11でようやく対応したし
関数ポインタにキャストするoperatorはtypedef使えとか
言語としての完全性なんか重視してない
323:デフォルトの名無しさん
19/10/04 13:28:40.80 FzFdUbJu.net
>>319
曖昧さはあるといわれています。例えば、CPersonというクラスがあったとき、関数内で
CPerson person();
と書いた場合、person という名前で、戻り値の型が CPerson の関数のプロトタイプ宣言なのか、
CPerson クラスの person という変数名(オブジェクト名)の定義なのかの曖昧さがあります。
後�
324:メは、CPerson person("name", 25, MALE); などと同じ系統で、実引数が全く無い場合 に相当します。 また、template class の場合に、 A<B<・・・>> と書くと、>> が右シフト演算子に解釈されてしまうので、回避するために空白を1つ入れて A<B<・・・> > としなければならなかった(過去形)時代も有ります。 しかし、パーサーを作る側からすれば、">>" を ">" 2個 だと解釈するのはかなり大変な 労力が必要でです。 また、x < y を比較演算のつもりで A< x < y > などと書くと、A<・・・> の中に x という template class 名に対しての x<y> が入っていると解釈 されてしまい、> が足りないというエラーになるかもしれません。 回避するには、 A< (x < y) > と書くと良いと思われます。
325:デフォルトの名無しさん
19/10/04 14:48:30.02 D8qarNFk.net
C++というより3Dプログラミングの質問で申し訳ないのだけど、
行列ライブラリglmの以下のコードがbugってる気がするので詳しい人がいたら確認して欲しい。
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER qua<T, Q> rotate(qua<T, Q> const& q, T const& angle, vec<3, T, Q> const& v)
{
vec<3, T, Q> Tmp = v;
// Axis of rotation must be normalised
T len = glm::length(Tmp);
if(abs(len - static_cast<T>(1)) > static_cast<T>(0.001))
{
T oneOverLen = static_cast<T>(1) / len;
Tmp.x *= oneOverLen;
Tmp.y *= oneOverLen;
Tmp.z *= oneOverLen;
}
T const AngleRad(angle);
T const Sin = sin(AngleRad * static_cast<T>(0.5));
return q * qua<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);
}
クオータニオンqをベクタ軸v周りにAngleRad回転させる関数のソースらしいんだが、
最後の行掛け算の順番が逆のような気がする。
qua<T,Q>(...) * qが正解だと思うんだ。
glmはファイル構成がバージョン間で結構派手に変更されてるんで、
最近のバージョンではext/quaternion_transform.inlに上のコードが含まれてる。
古いバージョンではgtx/quaternion.inlにあったような気がする。
326:デフォルトの名無しさん
19/10/04 14:55:11.92 FzFdUbJu.net
>>322
あるライブラリでのq1 * q2 という書き方が、q2 * q1
がどういう意味に解釈されるかは、
327:デフォルトの名無しさん
19/10/04 15:01:05.28 FzFdUbJu.net
>>322
(>>323 は誤投です。)
あるライブラリでの q1 * q2 という書き方が、別のライブラリでは
q2 * q1 と等価なことが有り得て、それはベクトルや行列計算全般に
言える記法の違いなのでこのソースだけではなんとも言えない。
ベクトルの場合、成分表示を1列の縦行列と考えるか1行の横行列
と考えるかによって、賭け全の左右が逆さまになる。
その結果、成分表示で書かない表記も、左右どちらかで書くかは
好みの問題となる。
特に Quaternion の場合も同様。
328:デフォルトの名無しさん
19/10/04 15:02:02.33 FzFdUbJu.net
>>324
誤:と考えるかによって、賭け全の左右が逆さまになる。
正:と考えるかによって、掛け算の左右が逆さまになる。
329:デフォルトの名無しさん
19/10/04 15:45:42.88 P4b1n6up.net
OpenGL系は縦ベクトルだね
D3Dを前提にしたライブラリとは逆になる(行列も転置
330:デフォルトの名無しさん
19/10/04 15:58:00.91 FzFdUbJu.net
>>326
数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
331:デフォルトの名無しさん
19/10/04 16:08:07.51 JXWhYfPM.net
テンプレが糞だと思う瞬間はいくつもあるが
その一つはネストしてるときの閉じ括弧
>> じゃだめで > > ってわざわざ分けないといかんうざい
332:デフォルトの名無しさん
19/10/04 16:08:35.30 P4b1n6up.net
>数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
みたいだね
D3Dからそれ以外に移るとみんなここで引っかかるけど
実は行列周りは(大文字は行列として)
OpenGLに合わせるとA*B*C*xとなるのを
D3Dではx*C*B*Aと書けた方が、左からの計算が全部結果がベクトルなので計算量が減るというメリットはある
MSはC++での書きやすさと効率を考えたのかもしれない
333:デフォルトの名無しさん
19/10/04 16:09:02.58 JXWhYfPM.net
>>326-327
縦横ってより右から掛けるか左から掛けるかだと思ってた
意味は一緒なんだろうけど
334:デフォルトの名無しさん
19/10/04 16:11:58.82 P4b1n6up.net
>>328
C++11からは連続して書けるようになったで
335:デフォルトの名無しさん
19/10/04 16:14:31.61 MVQV/kgg.net
C++03いやC++98?のまま更新止まってるやつ
俺が想像するより遙かに多いのかもしかして
もうC++11でさえ要注意な旧規格になってるんだが
336:デフォルトの名無しさん
19/10/04 16:16:30.52 JXWhYfPM.net
>>329
メモリ上の順序も変わるぞ
SIMDとかで計算されるときの効率にも影響する
必ずしもD3D(横ベクトル方式)が高速化に都合が良いとは言えないんじゃないか
行列の各要素のメモリ上の並びって
glの行列AとD3Dの行列A'はいちいち転置しなくても結局同じになるんだっけ
337:デフォルトの名無しさん
19/10/04 16:22:07.03 P4b1n6up.net
ああ確かにメモリの中身は同じだった
格納方式も違うから結果的に同じになるんだよね
そこが余計ややこしい
338:デフォルトの名無しさん
19/10/04 16:29:39.34 FzFdUbJu.net
>>329
行列計算は、縦ベクトル方式、横ベクトル方式でも、(それぞれで)「結合則」があるので、
A*B*C*x = A*(B*(C*x))
でもあり、
A*B*C*x = ((A*B)*C)*x)
でもあり、どっちで計算しても結果は同じになる。
また、3D計算の場合、点の座標がいくつあっても、行列を一度計算しておくと、
使いまわしできるので、先に行列の方を計算しておいて、最後に座標の変換
を行うと、点が2個以上あるときには効率が高い。
339:デフォルトの名無しさん
19/10/04 16:31:49.50 FzFdUbJu.net
>>332
C++98くらいから、実際問題上使いたくない機能ばかりが追加されるような
傾向があったのに、Upgrade 版は適用外になったりしたりして買う機を逃した。
340:デフォルトの名無しさん
19/10/04 16:38:53.10 FzFdUbJu.net
>>329
>MSはC++での書きやすさと効率を考えたのかもしれない
>>335 に既に書いたけど、OpenGL 形式でも、右結合でも、
左結合でも、好きな方で計算は出来る。だから、行列部分を
先に計算しても良いし、座標部分から計算しても良い。
座標部分から計算していくと一見計算量が減るように思える
かも知れないが、点の個数が多くなると、一度だけ行列部分の
積を予め計算しておいて、その結果を全ての点の変換部分に
遣うと効率が劇的に向上するので、むしろ、効率が良いのは逆。
341:デフォルトの名無しさん
19/10/04 16:40:53.55 P4b1n6up.net
>>335
確かに(OpenGLでも上で書いたような式が使えるライブラリ使うとして)括弧でくくったりして優先順位変えればいいし
言う通り行列はまとめればいいんだけど
どちらにもメリットデメリットあると言いたかった
342:デフォルトの名無しさん
19/10/04 16:51:20.07 FzFdUbJu.net
>>338
実は、アメリカで有名な 3D Graphics の本が、横ベクトル方式を採用していた
事が関係しているかもしれない。要はその本が数学や物理の標準とは何故か
逆の記法を採用していたということ。
343:デフォルトの名無しさん
19/10/04 17:00:49.77 FW+Y/3wm.net
>>337
GL
(A*B*C)*(x0(縦),x1(縦),x2(縦),x3(縦), ... , xN(縦))(横)
D3D
(x0(横),x1(横),x2(横),x3(横), ... , xN(横))(縦)*(C*B*A)
が最速やね
344:
19/10/04 19:54:25.76 5CiM54x6.net
>>335
行列って結合則は約束されてましたっけ?
345:デフォルトの名無しさん
19/10/04 20:17:27.71 gZky9oRw.net
当たり前だろ。
そんなレベルの知識しかないからフォントライブラリ書けないんだよ
346:
19/10/04 20:27:59.81 5CiM54x6.net
>>342
では証明してください(キリッ)
347:デフォルトの名無しさん
19/10/04 21:24:32.75 FzFdUbJu.net
>>343
ベクトル部分はおいておくとして、まず正方行列の部分だけに限定すれば
A(BC)=(AB)C ・・・(1)
が証明できれば どんな場合でも結合側が成り立つことが数学的帰納法で
証明できます。なので、A,B,C が正方行列の時に(1)を証明すれば全体の証明が
ほぼ終わります。
【(1)の証明】
行列の積の定義により
(AB)ij=Σ_{k=1}^n A_{ik} B_{kj} ・・・(2)
です。なので、
{(AB)C}mn = Σ_l(AB)_{ml}C_{ln}
= Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(3)
です。全く同様に、
{A(BC)}mn = Σ_k A_{mk} (BC)_{kn}
= Σ_k A_{mk} Σ_l B_{kl} C_{ln}
= Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(4)
となり、(3), (4) が一致することから、
{A(BC)}mn = {(AB)C}mn
が言えます。これが (1) に他なりません。 (Q.E.D)
次に、このように3つの行列の場合ではなく、一般の個数の行列の場合、
最初に書いたように数学的帰納法を使います。それは、あなた自身で
お考えください。考える力の練習になります。
348:デフォルトの名無しさん
19/10/04 22:10:52.87 cDY60lSZ.net
doubleの値を++aした時にaの値は+1と規定されてる?
349:デフォルトの名無しさん
19/10/04 23:19:26.96 FzFdUbJu.net
>>345
boolen型以外では、++x は正確に x+=1 と等価です。
x+=1 は、正確に x = x + 1 と等価です。x がポインタ型の場合は、
BYTE 単位で見ると object size 単位で増加しますが、double/float/int/short/char
などの「算術型」の場合は、単純に 1 が足されるだけです。
URLリンク(en.cppreference.com)
For non-boolean operands, the expression ++x is exactly equivalent to x += 1, and the expression --x is exactly equivalent to x -= 1, that is, the prefix increment or decrement is an lvalue expression that identifies the modified operand.
350:デフォルトの名無しさん
19/10/04 23:36:52.32 NJj/Utu/.net
>>346
ありがとうございます。
という事はキャストの時におかしくなっているのかな?
aの値は0.0~100.0程度
for(double i = a; i < 1000.0; ++i){
std::cout << (int)i << "," << std::endl;
}
期待している結果: 1,2,3,4,5...と連番になる
たまに起こる結果: 1,2,3,5,6...と歯抜けになる
351:デフォルトの名無しさん
19/10/04 23:42:33.92 8yIxxMU3.net
丸められただけでは
352:デフォルトの名無しさん
19/10/04 23:55:23.10 YWySipM2.net
>>341-344
また5ch名物のしょーもない煽り煽られの流れかとおもったら
ちゃんと勉強になる流れでワロタ
353:デフォルトの名無しさん
19/10/05 00:03:15.79 bnoeYdBm.net
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ
354:デフォルトの名無しさん
19/10/05 00:05:26.41 KADe2ROY.net
>>347
・そのコードは、完全に上記の通りですか?
例えば、ループ回数が1000回より遥かに多くなると、
誤差の都合でそうなることがあるかもしれませんが、1000回くらい
だと、正しい処理系ではその現象は起きないはずです。
355:デフォルトの名無しさん
19/10/05 01:17:38.13 d5aP5JOP.net
キャストする前にlround呼んだらええんちゃうん。
356:デフォルトの名無しさん
19/10/05 01:44:04.24 VkhEKreX.net
(0.2+0.3)+0.4 == 0.2+(0.3+0.4)の結果がfalseになるのは正しいの?
357:デフォルトの名無しさん
19/10/05 01:54:00.97 Lbi5NeET.net
浮動小数点を勉強しておいで
358:デフォルトの名無しさん
19/10/05 02:07:17.64 5hJZ4CgN.net
有効数字1桁の計算で誤差は生じない
359:デフォルトの名無しさん
19/10/05 07:04:22.03 UfPJq4d2.net
10進の0.1を2進表現すると循環小数定期
>>355
バカ乙
360:デフォルトの名無しさん
19/10/05 08:03:13.32 9T2eUTn8.net
>>336
本当、人って色々だな
俺はC++98は未完成感があまりに強くて続きはまだかと待ちかねていた
具体的には例えば右辺値参照だ
一時オブジェクトにいちいちconstがつくのがイヤでイヤで待望のやつがやっと来た
361:デフォルトの名無しさん
19/10/05 08:28:45.86 iS4eZEWC.net
>>337, >>340
ちょっと誤解招くのでやっぱ突っ込んでおくけど、
多数のベクトルを変換するのに行列をまとめておかないと無駄になるのはどっちの方式でも同じだよ
俺が言ったのは(少なくとも同一の行列が)一度限りしか出てこない場合の話
まぁそれを最適化する必要があるのか、またそういう処理を大量にループするなら最適化の方法は他にあるだろうけど
>>333
GL方式でも列優先だから結局d3dと同じ無駄はあるんやで
最近のは知らんけど