X



C++相談室 part139

レス数が1000を超えています。これ以上書き込みはできません。
2018/10/06(土) 00:59:48.54ID:CdYUXXMG0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/

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

■長いソースを貼るときはここへ。■
 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/10/06(土) 01:18:47.18ID:evMRo/Iv0


_sって何
2018/10/06(土) 01:29:10.07ID:JjdhAE/r0
>>2
あれは複数形のsのつもりだった。

個人的には、コードにおいては、aaa に対する複数形の s は、aaas と書かずに
aaa_s と書いた方が分かりやすいと感じることがあるので。

ただ、配列の場合は、複数形の _s を付けて、リンクリストの場合は、
list または、List を付けるようにしている。

今回の場合も、リストなら List と書いたほうがいいかもしれない。
2018/10/06(土) 01:31:32.02ID:JjdhAE/r0
システム・ハンガリアンは、コーディング時の思考の節約になる事がある:

https://mevius.5ch.net/test/read.cgi/tech/1494147712/376
2018/10/06(土) 01:52:36.08ID:OsNJaukk0
意味で考えたら自動的に型は合うでしょ。
意味だけ考えりゃ済むことを二重にするのが思考の節約ってのがわからん。
一重で済めばそれに越したことは無い。

グダグダの設計をなんとかするのにはシステムハンガリアンも有用と思うけど、
まともな設計が出来てれば要らんだろ。

「英雄のいない時代は不幸だが、英雄を必要とする時代はもっと不幸だ」
2018/10/06(土) 02:00:06.62ID:JjdhAE/r0
>>5
ところで、あなたは巨大なプログラムを作った経験ある?
2018/10/06(土) 02:07:35.21ID:OsNJaukk0
>>6
巨大なプログラムの一部を作ったことはあるので、
設計がまともなことなんてまずないことは知ってるよ。
2018/10/06(土) 02:10:13.19ID:JjdhAE/r0
>>5
たとえば、ポインタの場合の先頭に「p」が付いているだけでも、立派な「意味」になっている。

このような一般法則を用いないで、ポインタであるとう意味まで含めた変数名を
付けることは、基本的に不可能。

また、たとえば、名前の入った0終端文字列へのポインタを「pszName」という変数名を
付けているのは、かなり適切に意味を表していると思う。

「name」だけだと CString 型と 0終端文字列なのかの区別も付かない。
また、長いテキストの中の一部だけに着目した文字列の場合は、そのどちらでもないから
「psz」の接頭辞はつけない。

これにより、発見しにくいバグも減る。
2018/10/06(土) 02:17:56.90ID:JjdhAE/r0
>>5
決められたフォーマットでファイルにデータを書き込むような場合、コード中、
メモリ中のデータのポインタと、これから書き込む fseek するためのファイルポインタ、
サイズなどが「対」または「コンビ」のようになって存在することがある。

そのとき、接頭の、fpos、p、size、len などでそれらが区別できることはとても有りがたい。

その場合、

fposData1 = pData1 - pTop;

のようなパターンが現れるだろう。

それに加えて、同じではない微妙に違った関数化が難しいようなパターンが現れくることがある。

そういうような場合に、ハンガリアン記法は、とても重宝する。

正しいコードが、記法からだけでほとんど機械的に分かってしまう事も多い。
10デフォルトの名無しさん (ワッチョイ df7f-vBoO)
垢版 |
2018/10/06(土) 02:20:37.42ID:mx6yHsyJ0
テンプレートじゃ使えないしもはやC時代の遺物でしかないわな
現代じゃ害悪
2018/10/06(土) 02:26:47.17ID:OsNJaukk0
>>8
思考のレイヤが違うな。
やりたいことの意味をプログラムに落とし込んだ結果としてなんらかの型に収まるという考えでやってるので、
型が意味だと言われたら本末転倒な感じがする。

まあ型中心の方がわかりやすいってのならそれはそれでいいよ。
2018/10/06(土) 02:27:05.24ID:JjdhAE/r0
>>10
自分の場合は、自作テンプレートの中でも使ってる。たとえば、

TYPE m_data;
TYPE *m_pPrev;
TYPE *m_pNext;

xxx( TYPE *pPos ) {
・・・
}

などのように。
2018/10/06(土) 02:31:46.61ID:JjdhAE/r0
>>11
たとえば、floatをdoubleに変更したことはあるが、
BYTE 型を int 型に変えたりすることはまず無い。

16BIT時代から32BIT時代へ移行するような場合は、
変更したことはあるが、機械的に置換すればいいというわけではなかった。
32BIT時代から64BIT時代への以降においても、機械的に置換して
済むものではないと思う。
2018/10/06(土) 03:24:51.76
目で追っただけでカメラが視線を検知してどの変数を見てるか特定して型を表示してくれ
できれば脳に直接語りかけてくれ
2018/10/06(土) 07:00:37.46ID:Oq2kvGiO0
ワード幅が変わってもWORDの意味を変えることはできなかったね
2018/10/06(土) 07:10:10.75ID:Oq2kvGiO0
> 「name」だけだと CString 型と 0終端文字列なのかの区別も付かない。

型が知りたいときに宣言を見ないアホを救う必要あるか?
F12を押せば一発だろうが
2018/10/06(土) 07:26:40.45ID:hM5EPMW3a
どのエディタを想定してる?
2018/10/06(土) 07:56:58.40ID:Gg92+MKo0
>>8
> 「name」だけだと CString 型と 0終端文字列なのかの区別も付かない。
今どき0終端文字列なんてAPIに渡したりする時など以外には使わんだろ
ほとんどない例外事項に対処するためによく使うケースの効率落とすのはダメプログラマーにありがち
2018/10/06(土) 08:20:03.66ID:u69e3u+l0
>>18
2018/10/06(土) 08:22:41.80ID:hgnllvmvM
>>18
2018/10/06(土) 08:36:03.28ID:d9G2ZJ030
>>19 >>20
2018/10/06(土) 08:37:57.90ID:CrcQtIJ/M
まともに育つIDEを用意してくれや
とりあえず
2018/10/06(土) 08:46:02.31ID:d9G2ZJ030
すぐ環境のせいにする…(´・ω・`)
2018/10/06(土) 08:48:27.61ID:ixe97h7gH
だから spacemacs だって
2018/10/06(土) 08:49:31.50ID:CdYUXXMG0
>>13
std::string、
Company等の自作クラス、
std::unordered_set<Company>みたいなテンプレ使ったクラス、
スマポなんかはどう命名してるの?
2018/10/06(土) 08:50:42.89ID:CrcQtIJ/M
数十万行の他人が書いたソース・コードに一度でも溺れてみたらいいよ…
2018/10/06(土) 09:40:20.41ID:d9G2ZJ030
Cの頃はIDEに検索機能さえあれば、検索した結果をメモ帳にでも書きつけて行って簡単にコールグラフを作れた
なぜなら関数名はプログラムの中でほぼ一意とみなせたので、walk aroundの強力な指針となった

C++になったらそうでもなくなった
なぜなら関数名がオーバーロードされるようになった上に異なるクラスが同名のメソッドを持っているというケースが頻出する上に、
テンプレートやnamespaceまであるので
Cの頃から比べたら、解析の困難さは異次元のレベルすぎて草
現実的に解析を行えるかは、ソースコードの字面がどうかかれているかよりもクラスの意味が整理されているかに大きく依存する

もし仮に万が一、#if〜#endifで切りまくられたソースコードで正しくメソッドの定義元や呼び出し元一覧がクラスがテンプレートの
仮引数として渡されているケースについても正しく信用に足る一覧が出るIDEならちょっと欲しいかも
2018/10/06(土) 10:32:45.07ID:hM5EPMW3a
そんなあなたにdoxygen+graphviz
2018/10/06(土) 10:37:41.35ID:Gg92+MKo0
>>27
それできないとコンパイルすらできないんだけど…
2018/10/06(土) 10:59:24.19ID:GNSvvE670
コンパイラ(とそのコードを書いた本人)以外の人が把握するのが難しくなったということだろ。
ADLやらSFINAEやらで実際にどこの何が呼ばれるのか、プログラム全体をひっくり返してみないと
わからなかったりするしな。
2018/10/06(土) 11:00:25.81ID:d9G2ZJ030
>>28
doxigenは、なんかブラウザで閲覧できるようにするまでの設定がめんどくさかった思い出
およびコールグラフは出たが本当にグラフの画像しか出ない(シンボルをコピペできない)のでショボーン、
だったのでそんなにやりこんで使っていないスマンorz
それよかDOT言語が面白すぎたので遊び倒した

>>29
コンパイラのビルドとIDEのインテリセンス能力は関係ない(ハズ。LLVMは知らん
もし定義元を書き換えてエラーを起こせばエラーメッセージから呼び出し元がワカル、
という考えならテンプレートが絡んだ瞬間に目が眩んで死ぬ
2018/10/06(土) 11:48:26.03ID:Gg92+MKo0
>>31
> コンパイラのビルドとIDEのインテリセンス能力は関係ない(ハズ。LLVMは知らん
技術的には可能だって話

> もし定義元を書き換えてエラーを起こせばエラーメッセージから呼び出し元がワカル、
> という考えならテンプレートが絡んだ瞬間に目が眩んで死ぬ
そんなアホな発想するやつがいるとは思わなかったよ w
2018/10/06(土) 12:28:56.41ID:hM5EPMW3a
>>31
無知ですまない。
シンボルをコピー出来ると何が便利になるの?
2018/10/06(土) 14:07:27.04ID:9hP5TFYu0
>>10みたいなことをドヤ顔で言ってるド素人が多いけど
TMPにはTMPの一般的なルールがあるんだがな
ハンガリアンではないけど
2018/10/06(土) 14:36:17.51ID:hM5EPMW3a
templateの一般的なルールってtemplate引数で汎用的に使えるのはTとかそんな感じ?
2018/10/06(土) 14:44:51.23ID:skeZ9l4z0
標準にあるis_integral_vとかdecay_tとかのvやtもハンガリアンの亜種といえば亜種なのか?
2018/10/06(土) 14:51:10.85ID:9hP5TFYu0
それそれ
型と値は区別しやすいようにしてんだから考え方は似たようなもんだ

あと前スレ>>986
エアプログラマが調子に乗るな
ドカタだろうが何も生み出さない素人よりよっぽど偉いわ
2018/10/06(土) 14:53:54.19ID:Gg92+MKo0
>>34
ドヤってるところ申し訳ないけどテンプレートにルールはないって言ってるやつはいないと思うぞ
2018/10/06(土) 14:55:36.96ID:9hP5TFYu0
お前>>10を読んでそう思うのか
2018/10/06(土) 15:37:33.52ID:Gg92+MKo0
頭大丈夫?
>>10>>9のハンガリアンの話でしかない
いつから一般的なルールだと思ってた?
41デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/06(土) 15:45:25.65ID:8LWAn6RCd
ハンガリアンなんてなんの役にも立たないどころか邪魔にしかならないルールでコーディングしてたら周りから叩かれるだろ
ジジイしかいないところでやってるのかな
42デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 16:10:25.13ID:FAIH8E2E0
この板には底辺ドカタしかいないのがよくわかるわ
C++スレで底辺ドカタのコーディング規約だけでもりあがってる
底辺ドカタがオレんとこではこうだといいはりあってる

コーディング規約を守ってもらうのも当然だが
ちゃんといわれたとおりに適切に動くもん作りなさい

そっちのほうが重要だからな
底辺ドカタはこの部分がおもいっきり欠如している
2018/10/06(土) 16:27:40.58ID:9hP5TFYu0
>>40
こっちのセリフだよw
>>10>>9へのツッコミや反論に見えるのか?w
一連のハンガリアンの話でハンガリアンをくさしたいだけだろ(多分C++ coding standardsか何かの受け売り

ついでに>>18でほとんどない例外事項とか言ってるが、
C++11からstd::stringがゼロ終端になったのは何でだろうね?w
2018/10/06(土) 16:29:29.27ID:9hP5TFYu0
エアプログラマと言われてカチンと来たのか知らんけど
お前に言ったんじゃねーから
どんだけナイーブなんだよ
45デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 16:34:55.04ID:FAIH8E2E0
むしろプログラマーとか日本では最底辺のドカタだからな
なにいきがってんの
2018/10/06(土) 16:38:08.78ID:9hP5TFYu0
>>44>>40宛な
2018/10/06(土) 17:27:06.43ID:LgHbCU3jM
>>41
アプリハンガリアンならまだ役に立つよ
まあ適切な命名すりゃ事足りるんだけどね
ただ命名のスキルは将に知性に直結するんでね、玉石混淆なプロジェクトだと余計混乱したりする
2018/10/06(土) 17:28:08.46ID:LgHbCU3jM
>>45
土方だの何だのと罵っても、その土方が世の中を動かしてるんだよなあ
2018/10/06(土) 17:36:52.70ID:M3PJP+oD0
>>48
BOSSのCMっぽいね。
俺もそういう現場の人たちには敬意を表するわ。
2018/10/06(土) 17:40:24.23ID:d9G2ZJ030
△:土方が世の中を動かしてる
○:仕様どおりのブツをきちんと作る土方が世の中を動かしてる
2018/10/06(土) 17:59:22.81ID:LgHbCU3jM
>>50
今どき設計とコーディングが別だと思ってるエア()の人かな?
2018/10/06(土) 18:01:49.07ID:JjdhAE/r0
>>25
自分がやってるやり方だと、システム・ハンガリアンについては、
文字列(CStringでstrXxxx、0終端文字列で、szXxxxなど) と BOOL 型 (bXxxx)、
ポインタ(pXxxx)、についてだけ接頭辞を必ず使っている。

整数型、浮動小数点型については原則的には接頭辞を付けてない。
ただし、浮動小数点と整数を明確に区別したいときには、特に浮動小数点変数
についてだけは、「f」を付ける事があるが、float と double は区別してない。
int 整数についは、どうしても必要な場合は「i」を付ける場合があるが、普段は付けない。

今のところ、リストについては、接頭辞ではなく、接尾語のように、
XxxxList と付けているが、メンバ変数としては、

class CYyyyy {
  ・・・
  CMyList<Aaaa> m_listXxxx;
  ・・・
};
と書くことはある。

配列の添え字は、idxXxxx、個数は、numXxxx、id 番号は、idXxxx。
最大値については命名に迷うことが多い。maxXxxx とすることもあるが、
numXxxx とは、「1」しか値が違わないことも多いので迷う。


新しく作ったクラスのオブジェクトについては、基本的には接頭辞としては
付けないが、どこか、変数名の一部でクラスが分かるようにすることはある。

たとえばの話、CPerson クラスのオブジェクトなら、person1、person2
などとすることが多い。
2018/10/06(土) 18:02:16.20ID:JjdhAE/r0
>>52
[続き]

自分で作った Tree クラスの template なら、それを使った Tree クラスの
オブジェクトは、XxxxTree という名前にすると思う。
2018/10/06(土) 18:05:29.36ID:JjdhAE/r0
>>25
それから、今のところ、std::string は使わずに、CString ばかり使っているので、
std::string と CString の文字列を区別する命名法は普段は考えたことが無い。

多分、std::string を、sstrXxxx、CString を strXxxx にするか、逆に、
strXxxx と、cstrXxxx にするかだと思う。

それは、どちらか好んで使いたい方を短くするように命名法を決める。
2018/10/06(土) 18:10:29.82ID:Gg92+MKo0
>>43-44
何をグダグダ言ってるのか知らんけどテンプレートにルールがないとか言ってるやつがいないのに>>34なアホがドヤろうとして自爆しただけ w
2018/10/06(土) 18:13:01.41ID:JjdhAE/r0
>>25
>std::unordered_set<Company>みたいなテンプレ使ったクラス、

これは使ったこと無いけど、list の命名に習うなら、グローバル変数の場合は、

g_setXxx
g_usetXxxx

みたいな事になるかと思う。長すぎるのは困るので迷いどころ。
2018/10/06(土) 18:13:54.52ID:d9G2ZJ030
>>51
上の話の流れからすると単に「土方」と書かれると
「ちゃんといわれたとおりに適切に動くもん作」らない「底辺ドカタ」(>>42)と区別が付かないから
補足の必要が認められた

あと下位の設計が((特段の事態が生じない限り)上位の設計に従うのは
今日日であっても変わらないので、>>51が設計とコーディングが完全に合一だとする主張だとするといいすぎ
2018/10/06(土) 18:17:31.24ID:TQR3/dVH0
>>55
図星ですって素直に言えばいいのに
メタプログラミングやったことも無いのにテンプレート云々を理由にして
>>10と同じように「今どき変数の命名法なんか要らん」と、ハンガリアンだけでなく
あらゆる命名法を全否定してたアホだろ?w
受け売りばっかしてないで少しは自分のアタマ使えやボケが
あ、使うアタマも無いから受け売りしてんのか
2018/10/06(土) 18:39:05.87ID:iIkYOa/KM
>>58
だからお前以外は誰も一般的なルールの話なんてしてない
恥の上塗り乙 w
60デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/06(土) 18:47:51.32ID:8LWAn6RCd
今週は一般的な命名法って何のこと?
ハンガリアンの話をしてるのにな
61デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/06(土) 18:48:44.44ID:8LWAn6RCd
今週はは勝手についてしまった
62デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 18:49:16.40ID:FAIH8E2E0
低学歴知恵遅れには
計算機のアトミックな型という概念がないからな
63デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 18:51:00.59ID:FAIH8E2E0
ともかく低学歴が書いたコードは読みにくい
64デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/06(土) 18:51:48.57ID:3GKrUe5y0
C++は低脳でも使える言語だが、C++使ってるから低脳ってわけでもない。
2018/10/06(土) 18:52:08.17ID:TQR3/dVH0
>>59
同じ事しか言えんのか?
お前>>5を擁護してたろ?
あと型が知りたきゃF12押せって話もあった
(俺は別に型がわかるような命名を常にすべきとは思わんが)
彼らは型がわかるような命名法全否定してるだろうが

>誰も一般的なルールの話なんてしてない
一般的なルールって何?TMPの話ならTMPでデファクトスタンダードになってる命名法がある、って話なんだけど
お前話について来れてもないだろ?
2018/10/06(土) 18:55:18.77ID:M3PJP+oD0
>>50
まさに問題の本質を逆説的に示している。
仕様どおり、仕様書の解釈に誤解の余地がないほどにちゃんと仕様書が書ける人が少なすぎる。
行間を読めない現業の人がいる限り、行間を読めという免罪符は通用しない。
それを何だかんだ言っても実現してくれる(一部の)エンジニアはすごいと思う。
67デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 18:56:13.41ID:FAIH8E2E0
やはり低学歴知恵遅れにはjavascriptが限界
もしくはさらに最底辺のウンコスプリプトが限界
2018/10/06(土) 19:02:35.18ID:TQR3/dVH0
>>ドコグロ MM36-GL8C=ワッチョイ aab3-GL8C
みたいなアホにはわからんだろうから補足すると、
メタプログラミングにおける”型”とは
・定数
・型
・テンプレート
これらのことだ
それらのうちどれであるかを示すような書き方は標準ライブラリでも普通にされてる(テンプレート・テンプレートパラメータの命名規則は見たことないが)
ハンガリアンの考え方と同じだろうが
(もう一度言うけど個人的には常に守るべきとまでは思わない、所詮可読性や一貫性・利便性のためのもの
2018/10/06(土) 19:06:54.45ID:Gg92+MKo0
>>65
> 一般的なルールって何?
自分の書いたことも理解してないのか…

> TMPにはTMPの一般的なルールがあるんだがな
そんな話してるのは オ マ エ だけ w
70デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/06(土) 19:10:00.82ID:8LWAn6RCd
いや、そのテンプレートの話とハンガリアンを結びつけるのは無理ありますわ…
2018/10/06(土) 19:10:06.22ID:TQR3/dVH0
>>69
一部だけ抜き出すから意味わかってないんだろうなと思ってな
あと、反論になってない
>>65を100回読み直せ低能
2018/10/06(土) 19:10:40.70ID:TQR3/dVH0
>>70
>>65
73デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/06(土) 19:12:29.62ID:FAIH8E2E0
なんにも分かってない低学歴知恵遅れの元ウンコスクリプターが
分かった気になってC++さわると
必然的にこうなる
74デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/06(土) 19:15:13.83ID:8LWAn6RCd
だめだこいつ話が通じてねえw
2018/10/06(土) 19:17:33.32ID:TQR3/dVH0
こっちのセリフだよ
>>41
>ハンガリアンなんてなんの役にも立たないどころか邪魔にしかならないルールでコーディングしてたら周りから叩かれるだろ
お前もどうせ受け売りだろ
2018/10/06(土) 19:26:32.20ID:Gg92+MKo0
>>65
> TMPの話ならTMPでデファクトスタンダードになってる命名法がある、って話なんだけど
そんな話をしてるのも オ マ エ だけ
他のみんながしてるのは ハ ン ガ リ ア ン な w
2018/10/06(土) 19:29:21.39ID:TQR3/dVH0
>>65の前半には反論できないの?
恥の上塗り乙 w
2018/10/06(土) 19:30:15.36ID:Gg92+MKo0
前半の話なんてしてないし w
2018/10/06(土) 22:43:12.86ID:OsNJaukk0
>>65
俺は >>5 で命名法を全否定したつもりはないけどな。
システムハンガリアンというか、 >>4 の「型と意味の二重の思考」を批判した。
部分的にはアプリケーションハンガリアン的なものは有りだと思ってるよ。

型は当然に意味を表すために付けられる (べきである) し、
名前は (なんらかの命名規則によって) 意味を表すようにする、
結果的に名前が型を表すこともあるけれども、
一貫して「意味」で考えればよいだけというつもりだった。

意味 → 型、名前

で、>>8 で「型は意味だ」ということが述べられていたので、

意味 → 型 → 名前

というつもりなら、中心に据えるレイヤが違うんだろうな (でもやってることはそんなにかわらん) ってことで、
な〜んか腑に落ちないけどまあいいやという気持ちが >>11 って感じ。
2018/10/06(土) 22:58:06.04ID:0ug9OSMx0
昔から仮想コンストラクタの使い道だけ思い浮かばないのですが、
何か有用な使い方ってありますか?
2018/10/06(土) 23:00:31.50ID:YHCdyeri0
>>79
>システムハンガリアンというか、 >>4 の「型と意味の二重の思考」を批判した。

物理学において、「次元解析」なる手法が知られており、単位の辻褄を合わす
組み合わせを見出すだけでかなりの事柄が導けることが知られている。

それが丁度、「型と意味の二重の思考」に近い。
82デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/06(土) 23:07:04.84ID:3GKrUe5y0
ハンガリアンで書いてみればいいだろ。
今まで名前考えるのにどれだけ悩んでたかわかるから。
サクサクかけるでえ。
2018/10/06(土) 23:07:31.25ID:UA9NipTw0
>>79
微妙な整数型の違いではまった経験があると
お前さんの理想論より泥臭くとも現実的な対処の仕方を優先したくなるんだよ
84デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/06(土) 23:12:29.30ID:3GKrUe5y0
サクッちょサクサクやで。
2018/10/07(日) 00:02:27.52ID:2FImrXZj0
>>79
>命名法を全否定したつもりはないけどな。
それはすまんかった
要するに記法に型を入れる必要は無いってこと?

まぁ型はちゃんと自分の目で確認しろよ、という考え方を否定するつもりはないけど
他人の書いた長いコード読んでると途中で忘れることもあるしなぁ
(特に数文字とかの短すぎるローカル変数名で長い関数書かれると地獄)
わかりやすけりゃ何でもいいんだけどさ

自分はテンプレートを理由にハンガリアンを否定するのは違うだろって言いたかっただけ
86デフォルトの名無しさん (スップ Sd02-YLcB)
垢版 |
2018/10/07(日) 00:05:36.66ID:rbebcA6zd
>>85
まだ理解できてなくてワロタw
2018/10/07(日) 00:10:22.96ID:2FImrXZj0
>>86
受け売りエアプ野郎は帰ってね
2018/10/07(日) 00:33:33.16ID:77445U4A0
>>85
私の思想では変数名が型を表すこともよくあるということを説明したつもりが、
まるで逆に受け取っているのでどう説明すればいいかわかんないや。
これ以上の説明はもうしない。
2018/10/07(日) 00:36:57.44ID:2FImrXZj0
>>88
システムハンガリアンには型だけでなく意味(というか用途)まで混じってることを批判してるんじゃないの?
90デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/07(日) 01:06:34.13ID:iX7g/tHs0
いまどきハンガリアンごときで論争かよ。
間抜けだな。
日本人としての矜持はどこ行った。
今やるべきことはモンゴリアンの発表だろ。
作る人の板だぞここは。
91デフォルトの名無しさん (ワッチョイ d980-A6IM)
垢版 |
2018/10/07(日) 01:11:39.10ID:mIq+f5AO0
この板は底辺ドカタしかいないからな
しょうがない
2018/10/07(日) 01:52:24.01ID:r4TItDH9M
>>80
抽象クラスで配列作れるでしょ
2018/10/07(日) 01:59:47.96ID:mnW0GgxkM
>>91
そろそろ働けよ…
能書きだけじゃ食ってけないって身に沁みたろ?
2018/10/07(日) 03:09:32.05ID:A62LOxJG0
>>80
古来よりコピー作る(機能を提供する)のに使われている
2018/10/07(日) 06:58:40.31ID:874mFeqU0
>>80
フィルタ(固有の動作状態を持つ(←重要)ブツ)のの配置や接続をユーザーがGUIで変更可能なフィルタアプリを作るとき使う
これは(部品)create()とclone()の両方が覿面に要る
イメージ的にはDirectShowのgraphEditみたいなアプリを考えたら良い

ユーザーがすでに書いた組み合わせフィルタ(A→B)を最終段にもう一発入れたいというときに、
今日日一般的で親切な操作インターフェースはワークシートにすでに描かれている(A→B)をclone()することである
フィルタが過去の入力履歴に依存するケースがあり、そういった記憶はフィルタのインスタンス固有なので、ポインタのコピーでは済まず、clone()である必要がある
(Visioみたいに単に部品の接続だけが問題なブツなら、部品自体はポインタのコピーで済ませて部品間の接続情報を別途管理するという構成も可能だが、部品の動作状態が絡むとclone()止む無し
2018/10/07(日) 11:07:53.26ID:rhwre/Em0
>>92,94,95
うーん、よくわからない。
純粋に
class A {
virtual: A() {}
}
のvirtual事なのですがその事を仰ってますよね?
"x* create()"と"x* clone()"が要る場合があるのは理解できるけど、
"x* create()"を実装するのにコンストラクタを仮想にする必要が無いような。
もう少しわかりやすくしてもらえると助かりますが、面倒でしたらスルー
していただいても結構です。ありがとう。
2018/10/07(日) 11:38:47.25ID:FoRhSX54a
コンストラクタってvirtualできたっけ?
2018/10/07(日) 11:40:37.47ID:kve7u25tM
>>96
すまん。virtual constructer ってファクトリーメソッドの
別名というか旧い名前なんで其方の質問かと思ってたわ
2018/10/07(日) 11:41:19.51ID:kve7u25tM
>>97
私の知る限り出来ないな
2018/10/07(日) 13:37:26.97ID:Ty3ihyC20
>>97, >>99
そもそもできてもどうやって使うんだ?
2018/10/07(日) 14:16:30.30ID:kve7u25tM
>>100
さぁ?80に教示した人でないとわからないかも
「昔から」とあるから、独自処理系なのかも :-p
2018/10/07(日) 14:41:28.41ID:874mFeqU0
コンストラクタはC++の構文上はvirtualにでっきない
抽象クラスx (Product)のx*を返すcreate()メソッドを何かのクラス(Creator)に設けたら機能としてはできる
Creatorが内部で実際の生成をサブクラスに委譲する場合は正にファクトリーメソッドパターン(のProductが抽象クラスのケース)になる

さらにその「何かのクラス」(Creator)まで抽象クラスにしたブツがアブストラクトファクトリーパターンというやつで、もはや
ProductとCreatorが同じ抽象クラスであってもかまわない。
ここまでやって初めてclone()が抽象化できるすわなち「インスタンスの」クローニングを抽象化のうちにやれる

抽象コンストラクタとはフツーアブストラクトファクトリーパターンかつProductとCreatorが共通の抽象クラスのケースを指す(のだと思う

※ 個人の感想です
2018/10/07(日) 14:46:34.66ID:9AlsaWAK0
コンストラクタの中でそのクラスのvirtual関数を呼んでも
基底クラスのが呼ばれるよな。
基本的にコンストラクタの中ではあんまりいろいろしないほうがいい。
2018/10/07(日) 14:50:52.53ID:874mFeqU0
>基底クラスのが呼ばれるよな。
うそぴょん
自身のが(非仮想関数同然に)呼ばれる
理由はこんなかんじ↓
ttp://isoparametric.hatenablog.com/entry/20080707/1215396846
2018/10/07(日) 15:14:33.44ID:ldfyXuEU0
元の質問主はデストラクタと間違えたのかな?
コンストラクタにvirtual付けたらコンパイルエラーだからすぐわかるだろうし
2018/10/07(日) 15:45:00.91ID:L7dKBNcwp
>>96に書いてるからそれはないだろ
最近コード書いてもみないで頭の中だけで机上の空論こね回すのが流行ってんだろ
初心者の間で
107デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/07(日) 15:47:27.26ID:iX7g/tHs0
手を動かさずに脳内ですべてを完結させられたら、それはもう初心者じゃないだろ。
スーパープログラマの誕生だ。
2018/10/07(日) 16:09:28.90ID:9AlsaWAK0
>104
え?派生クラスのほうが呼ばれる??
2018/10/07(日) 16:17:18.47ID:ldfyXuEU0
「基底クラスのが呼ばれる」だと最基底のクラスの奴が呼ばれるみたいに見えるから突っ込まれたんでしょ
何を継承してようと何が派生してようと、あくまで自分自身のが呼ばれる
2018/10/07(日) 16:21:48.20ID:9AlsaWAK0
>>109
なるほど
たしかに基底でなくて自分自身が正しいな
2018/10/07(日) 16:59:03.29ID:8iCyHK6sd
HLSLのfloat4みたいに、xyzwでもrgbaでも扱える、
所謂エイリアスを実現するスマートな方法は参照でしょうか?

class float4
{

float x;
float& r=x;
};
2018/10/07(日) 17:46:55.03ID:ldfyXuEU0
getXYZW()とgetRGBA()を作る
2018/10/07(日) 18:09:26.41ID:AFK+s8Ok0
>>17
CStringを使うのに「あのエディタ」以外を使うアホを救う必要あるか?
2018/10/07(日) 18:20:34.91ID:AFK+s8Ok0
typedef char* A;
typedef A B;
typedef B C;
typedef C D;
typedef E F;
typedef F G;

G lpszOmanko;
型が知りたいときに宣言を見ないアホを救おうと一生懸命なアホの書くコード
2018/10/07(日) 18:24:01.97ID:2FImrXZj0
>>111
無名共用体じゃあかんの?
2018/10/07(日) 23:30:13.67ID:EwS6ucBG0
>>112
>>115
ありがとうございます。

(A)VC++のプロパティ機能を使って、ゲッター、セッターを変数のように書く
(B)無名共用体

これらを試してみます。
2018/10/08(月) 01:39:38.90ID:LP2GoVYR0
無名共用体でもっともスマートに実装できました。

class float4
{

union{ float x; float r; };
union{ float y; float g; };
・・・
};

ありがとうございました。
118デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/08(月) 03:22:10.62ID:mztv/TPA0
どういたしまして。
2018/10/08(月) 05:30:07.70ID:64IsVtKl0
float f4; float3 f3 = f4.ayx; が難しいみたいな話かと思った
2018/10/08(月) 09:51:00.66ID:LP2GoVYR0
>>119
swizzleは(A)で対応できました。
2018/10/09(火) 12:09:32.42ID:R91wWJMl0
class parent {
public:
void disp() {
cout << "parent\n";
}
void disp(char* str) {
cout << str << "\n";
}
};

class child : public parent {
public:
void disp() {
cout << "child\n";
}
};

disp(char* str)を呼び出すにはどうすればいいですか?
2018/10/09(火) 12:49:30.07ID:+8izRWpu0
Boland C++ Builder 5を使用していたのですが仮想コンストラクタ
でコンパイルできませんでした。失礼しました。
VCLライブラリのTGraphicなどのヘッダーが仮想コンストラクタで記述
されていたのでてっきり仕様で認められている物だと・・。
このライブラリ(というかBuilder)だけ特殊ということで理解しました。
皆さんありがとうございました。
2018/10/09(火) 13:18:44.86ID:URt3e1HT0
try __finally も使えて糞便利なんだよなアレ
2018/10/09(火) 13:27:53.34ID:p4x9lnrf0
>>121
引数にconstつければ、"文字列リテラル"も渡せる。
2018/10/09(火) 13:33:57.94ID:3NZxPpTya
引数なしのdispをオーバーライドしたから引数ありの方が隠蔽されたとかかな。明示的にusingしてみては?
2018/10/09(火) 18:41:14.63ID:Cr2TK041a
void disp(const char* str){
cout<<str<<\n;
}

virtual void disp(){
disp(“parent”);
}

void disp(){
disp(“child”);
}

124の言う通りconstつけろという話じゃないかな
2018/10/09(火) 18:55:23.66ID:sicZSpN90
class parent {
public:
void disp() {
cout << "parent\n";
}
void disp(char const* str) { //added: const
cout << str << "\n";
}
};

class child : public parent {
public:
using parent::disp; //created
void disp() {
disp("child"); //changed: cout -> disp
}
};
2018/10/10(水) 03:27:24.85ID:gfJl3N9PM
clangの開発に携わりたいと思ったのですが、C++で書かれていて、テンプレートの理解も必要だし、簡単ではないですよね?
2018/10/10(水) 09:18:24.61ID:Mncb4eyW0
clangの開発って、LLVMのチームに入りたいってこと?
だとするとC++のスキルは世界的な有名人になれるくらい凄腕でないと厳しいだろうな
130デフォルトの名無しさん (ワッチョイ e2d2-pJhu)
垢版 |
2018/10/10(水) 09:46:07.79ID:HW3BEf/50
ん?プルリク送るだけじゃないの
2018/10/10(水) 10:14:02.27ID:T78UR1cm0
日本のC++トップ集団ってどれなの?
2018/10/10(水) 10:29:11.53ID:Mncb4eyW0
手続きの話と、務まるかって話は別だろ
2018/10/10(水) 11:30:32.89ID:2TMLSXoid
C++の世界レベルのスキル。
かっこいいなぁ。
2018/10/10(水) 16:14:19.56ID:Mncb4eyW0
gnuの連中と真っ向やり合って勝とうって話だぜ
少なくとも、おまえらではゴミにすらカウントされんだろ
2018/10/10(水) 17:08:56.41ID:MsVaxrK/0
バグの指摘だとか、
ドキュメントの typo を直すくらいの役にはたてるかもね。

ただ、自分のミス (未定義を踏んだとか) ではなく
コンパイラのバグであると確信をもって主張するには、
規格をかなり把握しておく必要は有るので、
それだけでもなかなか大変だ。
136デフォルトの名無しさん (スプッッ Sdda-YLcB)
垢版 |
2018/10/10(水) 17:33:55.95ID:+jUb1Zszd
ハンガリアン使ってる奴には無理だろうな
137デフォルトの名無しさん (ワッチョイ a6b3-XM+q)
垢版 |
2018/10/10(水) 18:50:52.92ID:ApxL+L/D0
真のJava scriptがあればいいと思うのだが。
2018/10/10(水) 19:56:55.02ID:TfVezTBt0
至る所に try catch を書かなきゃいけないスクリプト言語か
2018/10/10(水) 20:03:19.96ID:kd4mysCH0
最近Java触ってないんだけど
あの検査例外指定を必ず書かされる糞仕様はまだ残ってるの?
2018/10/10(水) 20:57:53.79ID:1d6HAJSZ0
>>135
どっかの日本人が規格書だけ必死に読んでる間に
世界のプログラマは言語気にせずに必要なアプリ作ってるけどね。
そういうとこだよ。
2018/10/10(水) 21:24:35.61ID:r0MKwZEq0
>>135
コンパイラのバグ報告くらいなら、別に規格理解してなくても
ググったりメジャーなコンパイラで動作比較したらわかるけどな

さすがにコンパイラの開発に携わるなら規格読まないとダメだろうけど
2018/10/10(水) 22:41:09.57ID:MsVaxrK/0
より詳しい人が精査するという前提でとにかく目を増やす、
おおざっぱでもバグを発見する目になるというのも悪いわけじゃないしな。
開発メンバーが少ないならそういう雑多な情報は嫌がられることもあるかもしれんが、
CLANG 級のソフトならそれなりにきちんとした開発体制は出来てるだろう。
2018/10/11(木) 08:11:33.98ID:2jR4X2Zc0
バグ探しとかそういうレベルじゃなく
今なら並列に重きを置く最適化とかが勝負だろうが
2018/10/11(木) 09:29:29.42ID:WBThZCRQ0
>>128は開発に携わりたいと言ってるのに、一人が無理と言い出し、多数バグ探ししか無理と言い
誰もアドバイス出来てないところが面白い
2018/10/11(木) 09:49:26.64ID:RY8aHP4O0
結局のところ、マウント取りたいだけなのよね
2018/10/11(木) 11:10:54.68ID:dKSczptfd
会社にもそういうやつの多いこと多いこと…
2018/10/11(木) 11:39:55.98ID:2jR4X2Zc0
ム板で返す言葉に事欠いて人格批判か
会社にも、論文に人情論を書くようなアホはさすがに少ないな
2018/10/11(木) 13:36:17.85ID:PBtwUpWj0
>>144
本人が簡単ではないと思ってるから、 (割とハードルが低く) 出来ることもあるとアドバイスされている。
2018/10/11(木) 15:41:08.81ID:WBThZCRQ0
>>148
まあ新型のゲーム機のバグを見つけてネットで大騒ぎするというアドバイスは、本人は望んでなさそうだけどな
2018/10/11(木) 16:14:12.43ID:AkyZHzlY0
何言ってんだこいつ
俺は>>128への直接の回答じゃないけど、単にコンパイラのバグ報告ってそんな敷居の高いものではないよ、と
言っておきたかっただけなんだが
2018/10/11(木) 17:25:23.27ID:2jR4X2Zc0
話の腰を折るようで悪いが
128が言っているのがclang自体の開発かどうか
まだ仮定なんだが
2018/10/12(金) 01:44:46.58ID:/I0EFebir
スマートポインタの中身ぶち壊して他のアドレス与えて使いますことってできる?
2018/10/12(金) 04:03:45.88ID:EXEDaiYK0
C++言語でok
てかそれ単に代入すりゃいいんじゃないの
reset でもいいけど

unique_ptr
https://stackoverflow.com/questions/37806616/reassign-unique-ptr-object-with-make-unique-statements-memory-leak

shared_ptr
https://stackoverflow.com/questions/31438714/stdshared-ptr-reset-vs-assignment
2018/10/12(金) 04:25:48.47ID:/I0EFebir
>>153
代入したら、元の生ポインタはいつ消えるの?
2018/10/12(金) 05:16:36.75ID:Q8TQ4FMY0
>>144
> 一人が無理と言い出し
まあ務まるような奴ならこんなところで質問しない
156デフォルトの名無しさん (ブーイモ MMcf-NsMu)
垢版 |
2018/10/12(金) 05:17:14.20ID:1iFt3dhJM
scopeから出たら消える
2018/10/12(金) 05:40:31.89ID:ZYTXH3K/d
>>154
「消える」って言葉で何を意味してるのかがわからない
ポインタは消したりできるものではない

ポインタが指している先のインスタンスがデストラクトされるってことなら、
代入なりresetなりした時に前のをdeleteする必要があればdeleteされる

foo * p = new foo;
unique_ptr<foo> q(p);

みたいなときに q に何かして p に nullptr が入って欲しいならそれは無理
2018/10/12(金) 06:06:36.57ID:U+Po+Cgl0
>>154
https://ideone.com/UjRAh1
2018/10/12(金) 16:26:55.42ID:KckWK6Wl0
最近、gccを8.2にアップグレードしたのですが、
行列ライブラリGLMの最新版を使おうとすると、
std::log2他幾つかの数学関数(cmath)が未宣言とか言われてエラーがでます。
#代わりに::log2を使えとも
ネットを調べてみると、
「log2等はC99以降の追加なのでstd名前空間には入らない」
等のコメントが見つかったのですが、
ここら辺の真偽について教えてください。

仕様的な真偽以外にも、
1. 他のOSのg++8.2以上でも(自宅はFreeBSD10.0)でも同じなのか?
2. コンパイラオプション等で制御する方法はあるのか?

についても情報を求めています。
2018/10/12(金) 16:33:39.71ID:KckWK6Wl0
追記:
-std=c++11でも-std=c++17でもダメでした。何故?
2018/10/12(金) 20:11:37.97ID:ic9zmoqmr
>>157-158
ありがとうございます
勉強します
2018/10/12(金) 20:50:53.44ID:aBKT1Xur0
namespace std{
#include <math.h>
}
2018/10/12(金) 21:26:30.53ID:v3EBhOgT0
>>159
言語仕様的には C++11 で std::log2 は追加された。
なので、 C++11 以降なら cmath を include していれば std::log2 を使うことは出来る。

C++ は C が提供する関数は基本的に使えることになっていて、それらは std 名前空間に属するが、
C++03 の時点で想定していた C は C90 のこと。 なので、 C++03 には log2 は無かった。
ただ、環境に C99 用の math.h があればそれを include すれば (C++03 の仕様には無いが) std 名前空間に属しない関数として使えていた。
2018/10/12(金) 23:30:34.87ID:1VvBVVcs0
>SCHEME
こりゃお見それしました
2018/10/13(土) 14:24:29.26ID:EibBUXfA0
>>163
ふむ。ネットで調べた上での仕様的な解釈はだいたい正しかったみたいですね。

gcc 8.2.0で-std=c++11以降つけても使えないのは単なるバグなのか機種依存なのか……
2018/10/13(土) 18:50:17.42ID:F7qz0ZHX0
>>165
どっち?

- GLM を使おうとするプログラムで std::log2 が未宣言というエラーになる
- cmath を include したどんなプログラムでも std::log2 を使えない
2018/10/14(日) 00:07:05.78ID:IgMlyec50
>>165
gcc -std=c++11 -pedantic かも
2018/10/14(日) 00:28:07.68ID:rMQ7HlNZ0
-pedantic は拡張機能を無効にするオプションなので、
紛うことなき C++11 の機能である std::log2 に影響しそうにないと思うけど……。
169デフォルトの名無しさん (ワッチョイ 67b3-JlWZ)
垢版 |
2018/10/14(日) 01:19:47.45ID:k35qB8Cf0
gccがバグってる派と規格がバグってる派の争いが勃発するのでは。
2018/10/14(日) 06:17:49.56ID:1QMkRc1k0
今のgccは-std=c++14がデフォだろ
7.0以後だっけ
2018/10/14(日) 09:57:28.32ID:JAcCHmYY0
江添亮はなんて言ってる?
2018/10/14(日) 10:06:18.57ID:wo9o1/Qh0
奴はお前のお母さんじゃないぞ
2018/10/14(日) 10:10:08.01ID:muYkF5p70
江添さんって規格を変えられるほどの発言権あるの?
2018/10/14(日) 10:14:36.46ID:wo9o1/Qh0
一応ISOへ意見を言う機関(日本NB)で意見する権利くらいは持ってるんじゃないの
2018/10/14(日) 10:16:58.23ID:1QMkRc1k0
range-based forでADLが効くことにすべきか否か
不特定多数に意見を請うてたな

奴は反対に傾いていたようで
俺とは見解を異にしていた
2018/10/14(日) 10:50:05.94ID:muYkF5p70
そうなのか。
江添さんもすごいけど、このスレの人もすごいね。
177デフォルトの名無しさん (ワッチョイ 277f-4Hut)
垢版 |
2018/10/14(日) 11:47:14.18ID:xrZwnrIj0
俺も江添とは見解が異なるわ
どちらかというとビョーンの見解に近い
2018/10/14(日) 12:37:47.83ID:rMQ7HlNZ0
>>175
へー。 ADL が使えないのなら、
std::begin と std::end の特殊化でやるってこと?
2018/10/14(日) 13:43:56.98ID:S1kOckUF0
特殊化ってなんだ
ここで聞くよりググれよ、すぐ見つかるぞ
2018/10/14(日) 14:46:41.69ID:iHlUkB5I0
実際に発言権持ってるのってビャーネとGCCとかLLVMとかclingとかの中の人とその他お金出してる企業くらいだろ
2018/10/14(日) 15:17:03.44ID:rMQ7HlNZ0
江添氏はメンバ関数のみを対象にする案を推してたのね。
https://cpplover.blogspot.com/2011/02/range-based-for.html
2018/10/14(日) 16:32:31.63ID:izrX1EIe0
>>166
宅環境で後者。

FreeBSD以外でgcc8.2使ってる人だれかいませんかね?
2018/10/14(日) 18:03:31.93ID:rMQ7HlNZ0
>>182
https://wandbox.org/permlink/N7ZxNx76GMs332sk
2018/10/14(日) 19:57:55.19ID:rMQ7HlNZ0
>>182
念のために確認するけど、コンパイル時のコマンドは g++ だよね?
たぶん >>159 の書きぶりからすると、ちゃんと出来てるとは思うんだけど。

gcc コマンドに -std=c++11 を付けると C++ としてコンパイルはしてくれるけど、
サーチパスが gcc と g++ では違ったりすることもあるから、
ヘッダファイルを見つけられないとか標準ライブラリのリンクに失敗するとかいうことはある。

でも、ヘッダファイルが見つからないんじゃなくて、
ヘッダファイル中にあるはずの宣言がされてないっていうのがよくわかんないね。
実際に cmath の中身を辿ってみるしかないんじゃない?
185デフォルトの名無しさん (ブーイモ MMcf-NsMu)
垢版 |
2018/10/14(日) 21:17:29.63ID:WLfX4fFSM
cmathはM_PIが未定義とか言われてハマったことはあるな
186デフォルトの名無しさん (ブーイモ MMcf-NsMu)
垢版 |
2018/10/14(日) 21:20:39.47ID:WLfX4fFSM
これだな
#define _USE_MATH_DEFINES
2018/10/14(日) 21:51:25.46ID:cnUSrnZ50
めんどくセーからdockerでも使ってメジャーな環境でやればいい。
2018/10/14(日) 22:16:35.02ID:1QMkRc1k0
数学定数は標準に欲しいが言い出すとキリないからなあ
2018/10/14(日) 22:43:26.50ID:wo9o1/Qh0
でもπとeくらいは用意しとけよ標準
2018/10/14(日) 22:54:22.32ID:iHlUkB5I0
MSVCのかつてのマクロでひどい目に会ってるから定数を用意していなくて正解
2018/10/14(日) 23:18:09.29ID:r1bPQqR/a
min,maxの事だな。

マクロじゃなければいいんだろうということでstd名前空間にconstexpr変数ならどうだろう?
2018/10/15(月) 10:38:16.29ID:FjE86ied0
smallも定義されてた
193デフォルトの名無しさん (ワッチョイ 2723-NsMu)
垢版 |
2018/10/15(月) 10:42:34.46ID:/DZZgAIK0
extern(C){
}
みたいに
#defineとかならまとめて
namespace HOGE {
}
に入れてしまえれば良かった
2018/10/15(月) 12:12:04.88ID:EhepTNcp0
環境依存問題でしたが一応解決しましたので、軽く報告。

<cmath>内で
#ifdef _GLIBCXX_USE_C99_MATH_TR1
以下で囲まれた部分がばっさり切られていたので
/環境依存パス/bits/c++config.hを調べてみると、
#undefされていたのが直接の原因。

#defien ... 1
に書き換えてみたところ、
今度は<cmath>内の
using ::tgammal;他4行がエラーになりましたが、
どうもFreeBSDの<math.h>にはその4関数がない模様。
#tgammafとか引数違いの類似物はある
結局その4行をコメントアウトすることでコンパイルを通すことに成功しました。
GLM最新版も使えたのでOKです。

まあ思うところはありますが、
gcc派 vs 規格派 vs マイナーOS派の話になりそうなので解決とします。
2018/10/15(月) 12:50:55.56ID:A4+xGAqjM
#include <tr1/cmath>
だったら使えたのかな?
2018/10/15(月) 13:30:53.01ID:rnCB9VMH0
>>194
それは環境依存というよりそのあたりのパッケージを管理してるメンテナの手が回ってない感じでは……。
Linux に比べると BSD 系はだいぶん人口が少ないらしいし、そういうことも致し方ないのやもしれぬ。
2018/10/15(月) 14:31:54.20ID:7k7Dj2O30
g++ -std=c++17は試したか?
tr1だった関数がstd直下に来てるぞ
198デフォルトの名無しさん (ワッチョイ ff8b-CE2c)
垢版 |
2018/10/15(月) 16:08:03.29ID:FzvdOK9e0
ドラクエ10プレイヤーからの質問。

死んでいるのに動けてしまう『死亡ラグ』
http://egg.5ch.net/test/read.cgi/dqo/1539560522/

改善の余地があると思えますか?
199デフォルトの名無しさん (バットンキン MMbf-CE2c)
垢版 |
2018/10/15(月) 16:26:28.74ID:tvJDbt95M
ドラゴンクエスト10の下請けプログラマーはC/C++の名人ばかりですよ?
2018/10/15(月) 16:28:24.70ID:/mdlwLZy0
>>198
猫耳猫オンラインを目指しているのでしょう
201デフォルトの名無しさん (バットンキン MMbf-CE2c)
垢版 |
2018/10/15(月) 16:44:25.17ID:tvJDbt95M
友人がドラクエ10プログラマーなんだけど、C/C++については何でも彼に聞くようにしている。
2018/10/15(月) 17:23:10.52ID:EhepTNcp0
>>196
書いてませんでしたけど、パッケージじゃなくて全部ソースから./confugre以下ビルドして入れてます。
まあそのconfigureが「4関数足りないから切っちまえ」と判断した本人ですが。
2018/10/15(月) 21:14:12.69ID:E6pr56BO0
 私たち日本人の、日本国憲法を改正しましょう。
総ム省の、『憲法改正國民投票法』、でググって
みてください。拡散も含め、お願い致します。
204デフォルトの名無しさん (ワッチョイ dff7-1yL/)
垢版 |
2018/10/16(火) 05:10:47.74ID:2DZhjJ9l0
C++がオワコンってマ?
Cの次に C++→C#→ほかの言語 の順番で勉強しようと思ってたんやが・・・
せっかく脱ニートしようと思ったのに水差された気分やわ
寝るわクソが
2018/10/16(火) 08:02:21.90ID:oqEWuMcG0
20年前からオワコンと言われ続けてるからオワコンが嫌いならやめた方がいいよ
2018/10/16(火) 08:05:29.93ID:7CCe71Wvr
C++11 以降、いろんな可能性があるように思えてきた
2018/10/16(火) 08:22:47.24ID:RwiWe9L4M
ちな昨日のニュース記事。
http://egg.5ch.net/test/read.cgi/bizplus/1539603497/
C++erも困惑の結果。
2018/10/16(火) 08:31:56.14ID:ChMhlbB0d
C++11以降は神
209デフォルトの名無しさん (ワッチョイ dff7-6Dpv)
垢版 |
2018/10/16(火) 08:39:41.73ID:2DZhjJ9l0
神なんやな
よし次はC++やるわ
ありがとな
2018/10/16(火) 09:38:01.41ID:VHaobsT+0
C++やるとか何プログラマーになるきよ。
つか、言語増やせばいいってもんじゃねぇぞ
2018/10/16(火) 09:47:44.01ID:VHaobsT+H
まぁC++はちょっと別格にうざいけど、言語だけ増やしても役立たずの烙印だぞ。そんな言語増やすことに一生懸命になることより一つアプリ作れるほうが重要だわ。
だから、例えばJavaを使ってandroidアプリ開発できるとか。
要は言語以外にクラスライブラリやUIフレームワークの知識や経験を身に付けることに一生懸命頑張ったほうがいいと思う。
2018/10/16(火) 10:39:57.45ID:kKW6G61E0
>>208
神は全盛時までのCだろ
無駄のない細マッチョ

思いつきでゴテゴテ重装備するC++やC99以後はそうじゃない
C++11はそれまでを反省はしてるけど重装備指向は変わってない
2018/10/16(火) 10:40:14.59ID:rifs1aEYa
オワコンだとか安易な神だとか、そういう子供っぽい発送だとどうせすぐに飽きてやめるんじゃないかと思えてくる。
214デフォルトの名無しさん (ワッチョイ dff7-6Dpv)
垢版 |
2018/10/16(火) 10:55:42.15ID:2DZhjJ9l0
大丈夫やで
まず覚悟があるんや
ワイは死ぬまで趣味に生きると決めとるんや
それに動機もあるで
Android NDKでC++でもAndroidアプリ作れると聞いとるからな
ほんで一攫千金の大逆転や
2018/10/16(火) 11:13:47.50ID:OaARVILoM
いいかみんな、どんな新規格を使って作るかが目的じゃないぜ?

まあ使いたくなるんだけどね
216デフォルトの名無しさん (アウウィフ FFeb-NsMu)
垢版 |
2018/10/16(火) 11:56:04.30ID:YLHbxnbGF
>>206
せやな
217デフォルトの名無しさん (アウウィフ FFeb-NsMu)
垢版 |
2018/10/16(火) 11:57:59.03ID:YLHbxnbGF
>>212
装備にこだわってる人が多いみたいだけど
エラーメッセージをもっと判りやすくするべき
2018/10/16(火) 13:21:59.25ID:DXK1BkAG0
>>215
新しい機能はそれを使った方が良くなる (場合もある) から追加してるわけだし、
どういうときに便利なのかに慣れるためには最初は過剰なくらいに使ってみてもいいと思うけどね。
いきなり本格的に導入する前に実験的なプロジェクトで試すくらいはした方がいいかもしれんが。
2018/10/16(火) 13:45:02.82ID:DjFJv3DN0
以前は完全にbetter Cとしてしか見ていなかったが、STLとかBoostを積極的に使うようになってから面白くなってきた
2018/10/16(火) 14:05:38.44ID:ChMhlbB0d
「うちはSTL禁止」と言われて辞めたくなったw
2018/10/16(火) 14:18:14.23ID:OaARVILoM
>>220
稀によくあるw
理由は「他のメンバーが読めないから」w
222デフォルトの名無しさん (アウウィフ FFeb-NsMu)
垢版 |
2018/10/16(火) 14:39:57.19ID:YLHbxnbGF
BOOST禁止は見かけるけどSTL禁止はひどいな
2018/10/16(火) 14:45:06.11ID:GbK/byr70
いやまて、その真意は動的メモリ割り当てを減らしたい、かもしれんぞ
2018/10/16(火) 15:10:13.15ID:RUqX36lE0
言語増やせばいいってもんじゃないけど、プロのプログラマなら一通りどの言語も少なくともアマよりは使いこなせるでしょ
225デフォルトの名無しさん (アウウィフ FFeb-NsMu)
垢版 |
2018/10/16(火) 16:24:19.15ID:YLHbxnbGF
必要なのは言語の多寡ではない
CS(Customer Satisfaction ではないぞ)への理解
2018/10/16(火) 16:25:43.12ID:AEURreP/p
標準ヒープ禁止ならSTL禁止にはなりうるだろうな
アロケータ指定すりゃいいけど結構不便だし
2018/10/16(火) 16:42:01.42ID:DXK1BkAG0
何が STL なのかっていうのは意見が分かれる部分もあるからなぁ。
便宜的に STL と呼ばれているものは仕様的には完全に C++ の一部で、
他の規定と区別するものは何もない。

Wikipedia にも簡単な歴史が書かれてるけど、
https://ja.wikipedia.org/wiki/Standard_Template_Library#%E6%AD%B4%E5%8F%B2
ここには「stringのようなその他のC++標準ライブラリの機能にも影響を与え」
とあり、 string 自体は STL ではないかのようにも読める。
でも、 string が STL の一部かというとだいたいの人は STL だと思ってるだろうし。

他の人が読めないからっていうのが理由ならテンプレート自体がもうダメってことなんかな。
2018/10/16(火) 17:03:12.74ID:AEURreP/p
STLってあくまで俗称やろ、定義は曖昧
俺も「読めないからテンプレート使わないでくれ」と言われたことはあるなぁ
PC向けなんだしSTLくらいは我慢してもらったけど

でも世の中標準のヒープ自体使っちゃいけない業種、結構あるやろ
コンシューマゲーム機も大抵そうやで
アロケータ渡せばいいって言われるだろうけど正直不便
2018/10/16(火) 17:20:07.77ID:DXK1BkAG0
つっても、そこそこの規模のプログラムだと
STL は使わないにしても
ちゃんとしたフレームワークを用意するやろ?
そうでもないのかな。 割と泥臭くやってたりするのかな。
2018/10/16(火) 17:24:00.16ID:5Df0UEAr0
>>215
当たり前
欲しくて欲しくて渇望してた機能がやっと来るのがC++だから
使いたくなるのは自明だ
231デフォルトの名無しさん (オイコラミネオ MMfb-u0q9)
垢版 |
2018/10/16(火) 17:28:01.22ID:rnwRcPOpM
X他の人が読めない
O無能が読めない
実際は多くがこうな訳だけど仕方ないよね
お勉強全くしない奴少なくないしそれに合わせないとだもんね
2018/10/16(火) 17:35:42.75ID:AEURreP/p
>>229
社内ライブラリはもちろんあるけど
検索機能を含むコンテナとなるとやっぱりSTLが楽なんだよなぁ
さすがに二分木やハッシュで検索、まで自社で作るほど
そういう用途に頻繁には遭遇しない

ほんとはそういう中小企業でPC向け、ってなったらそれこそ標準ライブラリには頼れよと言いたかったけどね
2018/10/16(火) 17:52:27.17ID:GbK/byr70
コンテナ禁止なのか、<algorithm>まで禁止なのかにもよるな
前者だけなら自前コンテナでもメンバー関数揃えておけばソートや探索は後者使えるし
ただ<algorithm>の中で本当にヒープ使ってないのかというのは
2018/10/16(火) 17:53:25.84ID:VsgeYI1JM
バカに合わせないとお前が一生メンテする羽目になるぞ
2018/10/16(火) 18:17:14.69ID:5Df0UEAr0
>>231
その昔、バカでも読める言語ってのが一世を風靡したね
そのお陰で、バカ人口が増えて生産性に比例しない人件費がうなぎ登りして
たーまやーとばかりに弾けた
ピンサロで嬢が知り合いだったときはマジびびった
236デフォルトの名無しさん (アウウィフ FFeb-NsMu)
垢版 |
2018/10/16(火) 18:20:58.72ID:YLHbxnbGF
>>227
>ここには「stringのようなその他のC++標準ライブラリの機能にも影響を与え」
>とあり、 string 自体は STL ではないかのようにも読める。

stringというかSTLって「標準」のくせに亜種がいっぱいあった希ガス
2018/10/16(火) 18:30:46.21ID:VMchfhmP6
科研費余ってるんだが、C++ とかプログラミング関係の書籍で必読だったり面白いもの教えてくれませんか

Effective C++、ストラウストラップ、リーダブルコードくらいは持ってます


個人的には C++ Coding Standards 欲しかったが新品じゃ売ってないな
2018/10/16(火) 18:31:08.20ID:GbK/byr70
そら当然、STL策定直後は当時のコンパイラにはSTLは付いてきてなかったわけで
結構な数のサードパーティが追加ライブラリとして売ってたから
2018/10/16(火) 18:33:54.71ID:u+WV2+U20
>>237
D&E
2018/10/16(火) 18:57:22.46ID:u+WV2+U20
ってD&Eも中古しかないな、すまん
2018/10/16(火) 19:34:49.65ID:TeNN2wBh0
C++ 標準化委員の本

C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014

C++11/14 コア言語、江添 亮、2015
2018/10/16(火) 19:35:39.88ID:2gS77l+u0
>>238
付いて来た某MS標準のSTLが酷い代物でな
2018/10/16(火) 19:37:34.26ID:w/54xJNv0
バカでも読める…Goかな?
2018/10/16(火) 19:41:09.29ID:3k1bGaxFr
>>241
上と下は結構マニアックな感じしますね
真ん中は良さそうです


>>239
今回買わなくてもいずれ読みたいです
これにしても C++ coding standards にしても、需要ないんですかね
2018/10/16(火) 19:44:09.89ID:qu1dabNTM
>>234
これなw
笑えなかったりするが
2018/10/16(火) 20:09:37.15ID:3k1bGaxFr
データ構造とアルゴリズムの本もほしいんだよなぁ
2018/10/16(火) 20:43:54.27ID:+sj1AQoJ0
>>231
こういうこと言う奴に限って3ヶ月後には自分でも読めないクソコード書きやがるからな。。
2018/10/16(火) 21:00:30.49ID:4qUYryqZ0
「俺のコードは馬鹿どもには理解できない!」
2018/10/16(火) 21:18:43.52ID:uMB0oNTuM
>>224
趣味でやってる奴でも結構深いところまで使いこなしてる奴いるし
逆にプロは最新の機能とかをあえて使わなかったりするから一概にはなんとも言えん
2018/10/16(火) 21:34:11.34ID:DXK1BkAG0
>>237
ワイも D&E を推すやで。

C++ はツールやドキュメントの発展と足並みを揃えることで上手く発展してきたという話が書かれていて、
現実的な事情を踏まえた歴史の流れがわかる。
ただ綺麗にデザインした言語とは違う現実の重みを感じる。
(まあそれが負債になってもいるんだけど。)

単純に読み物としても面白いよ。
2018/10/16(火) 21:35:52.97ID:YZqafHqA0
>>212
>神は全盛時までのCだろ

ライブラリは今でもずっと悲惨なままだと思いますです……
2018/10/16(火) 21:38:41.78ID:DXK1BkAG0
>>224
もちろん色々と使いこなせればそれが強みにもなるんだけど、
使ったことない言語やフレームワークを使ったプロジェクトにアサインされるなんてよくあることみたいだし、
そういうときに (使いこなせるとはとうてい言えなくても) 動くものをでっちあげる能力ってのも
それはそれで重宝されたりっていう話も聞くし、
どういう強みでやっていくかっていうのは千差万別なんじゃないかと思う。
2018/10/16(火) 22:14:25.18ID:fyfgXtmf0
江添並のC++の知識が欲しい
皆江添に頼ってるし
254デフォルトの名無しさん (オイコラミネオ MMfb-u0q9)
垢版 |
2018/10/16(火) 22:58:29.81ID:rnwRcPOpM
C++17は和本だと江副氏の一択なんだけどあれは
そうなった背景とか使い道にはそんなに触れられてないのがな
逆引き辞典とか流し読みして大まかな把握するには便利だけど
2018/10/17(水) 01:15:28.13ID:GtdoA72O0
>>249
プロ棋士の居飛車党が振り飛車指したからといってアマに負けたら恥だと思うが

「振り飛車指せないって言っても、居飛車よりはって意味や。君ら如き一間飛車でも勝てるで?」的な

「F# 書けないって言っても、メインで業務に使ってるC++よりはって意味や。君らよりは書けるで?」的な

(F# の部分にはマイナー言語が入るものとする)

プロ名乗るなら。
2018/10/17(水) 03:05:57.24ID:WnKnONn0d
普段使わない言語なんて普通に読めて普通に書けりゃ十分だろ…
257デフォルトの名無しさん (JP 0Hbf-CE2c)
垢版 |
2018/10/17(水) 04:54:36.62ID:oHwaYHH6H
ドラクエ10の下請けプログラマーが精鋭揃いだということはわかりますが、こういう苦情が後をたちません!

534 名無しさん@ゴーゴーゴーゴー! (ワッチョイ 4910-binO [180.51.97.166 [上級国民]]) sage 2018/10/15(月) 09:26:17.41 ID:5tgKKwqc0
https://hiroba.dqx.jp/sc/forum/prethread/408523/

移動速度が遅すぎてプレイする気になれない……

ぎのぎ
[GM468-320]
テーマ:操作性・メニュー 2018/10/15 09:17
こんにちは。ドラクエ10を始めて、着飾りもストーリーもたくさん楽しませていただいています。
ストーリーは進むたびにたくさん泣けて、ゲーム内容には大満足です。

しかし、移動速度があまりにも遅すぎて、ストレスが溜まってしまい、最近はゲーム自体から足が遠退いてしまっています。
ドルボードではまだ耐えられます。
ストレスになるのは、特に町のなかです。

以前の投稿で、早くなる料理はできない、とお答えしていらっしゃいましたが、移動速度が上がる装備はありますよね。
そちらの方がよっぽどあるのとないのと変わりそうですし、やりこみ具合で差が開く部分に思います。
時間設定のあるダンジョンなどもあるそうで、考慮するのは確かに大変そうです。

なんなら、素のスピードが変わらなくても構いません。町中だけでもダッシュ機能のようなものをつけていただけませんか?
ただ方向キーを押すだけの時間が、本当に苦痛なんです。


ストレスになるなら止めちゃいなw誰も止めないよw
2018/10/17(水) 04:55:56.73ID:dMmY0qiN0
>>255
プロは言語の機能を使えるかどうかでなんて勝負しない
書いたコードの性能、わかりやすさ、バグの少なさとかで勝負する
2018/10/17(水) 05:02:17.48ID:WHt6d16aM
>>258
せやな
使うべきときにスマートに使う
これがプロだわな
2018/10/17(水) 07:36:08.50ID:IIN7z2610
RPGとか糞時間の無駄
2018/10/17(水) 07:43:25.83ID:QT9QvtrA0
>>260
敵車両の破壊には有効だが
2018/10/17(水) 07:57:03.78ID:Nvagglal0
今の戦車にゃ効かんだろ
2018/10/17(水) 08:18:18.25ID:DWSbH/V/0
対戦車壕でも掘るか
2018/10/17(水) 09:23:52.75ID:4yuTjZOF0
RPGってあれだろ、IBMの作ったCOBOLもどきだろ、確かに時間の無駄だし戦車には効かんだろ
2018/10/17(水) 09:25:52.61ID:Nvagglal0
ん、ソ連製だよ
2018/10/17(水) 17:39:50.55ID:imhsxBLOM
OpenCVのtemplatematchingについてなのですが、
しきい値を決めて類似度がしきい値以上の物を全探索で複数探すものはあったのですが、
類似度の上位2つのみを探す方法って無いですかね?
全探索は遅いので上位複数個だけ取れたらいいなと
2018/10/17(水) 18:57:16.89ID:QT9QvtrA0
最後の一個が最大だったらどうするの
2018/10/17(水) 19:02:36.72ID:+XF2eq+O0
閾値を適用するコードを探してチャチャっと改造すればいいんじゃね?
つか、最大値を求めるアルゴリズムも知らないのにOpenCVやってんの?
2018/10/17(水) 19:12:33.43ID:9fdgZI6P0
高速に判定できる軽量版データ(部分画像、低解像度、モノクロなど)がありうるなら
それで箸にも棒にもかからないものを高速にふるい落としてから
残ったものだけをちゃんと調べればいいよ
270デフォルトの名無しさん (アウアウカー Sa7b-v5lg)
垢版 |
2018/10/17(水) 20:15:44.53ID:MwWLHD/ka
並べ替えて上位複数個取り出すんじゃダメなん?
2018/10/17(水) 21:50:01.45ID:4yuTjZOF0
>>266は、閾値以上の値を全部取ってくる関数の代わりとして
上位n個(nは定数)を取ってくる関数はないか、ってことだろ?

> 全探索は遅いので
と書いちゃうから誤読されてそう。上位n個の場合でも全部見る必要はあるんだから
272デフォルトの名無しさん (JP 0Hbf-CE2c)
垢版 |
2018/10/17(水) 21:56:50.45ID:oHwaYHH6H
このゲームすぐ持ち物いっぱいになるな
http://egg.5ch.net/test/read.cgi/dqo/1539336435/

使い道のないアイテム(無駄なコード)が多すぎやしないか?
273デフォルトの名無しさん (アウアウカー Sa7b-v5lg)
垢版 |
2018/10/17(水) 22:16:11.68ID:MwWLHD/ka
>>271
だよね。
全部閾値以下って可能性考慮しても、並べ替えて上位から閾値以上か確認しながら取り出した方が早いべ。
2018/10/17(水) 22:41:59.25ID:vRAfxvML0
>>273
ソートは要らない
275デフォルトの名無しさん (アウアウカー Sa7b-v5lg)
垢版 |
2018/10/17(水) 23:07:41.45ID:MwWLHD/ka
>>274
んじゃどうすんの?
最大値を見つけた後に、最大値省いたリストなり配列から次の最大値(2番目に大きい数)探すにしたって、最大値を省くために最大値が有った場所を覚えておいて、そこを削除するなりしないと駄目でしょ?
面倒くさいし、速いと思えないんだけど。
2018/10/17(水) 23:12:11.03ID:3nZpVaoed
https://teratail.com/questions/68835
277デフォルトの名無しさん (アウアウカー Sa7b-v5lg)
垢版 |
2018/10/17(水) 23:17:55.90ID:MwWLHD/ka
。。。。。え“
5番目の大きさまでさがすとなら、5個もelse if書けと?
任意の個数なら、毎回書き直しか?
アホかと。
2018/10/17(水) 23:23:37.00ID:3nZpVaoed
バブルソートを知っていれば、任意個数でもいける。しかし、抽出個数を任意にすると、まあちょびっと遅くなる。
2018/10/17(水) 23:23:37.66ID:vRAfxvML0
>>275
元の質問が2個取り出すだけだからそれを前提にしてたすまん
n個を取り出すならソートしないとだめだな
2018/10/17(水) 23:25:33.43ID:3nZpVaoed
テンプレートの再帰を知ってれば遅くならずに任意個数いける。
2018/10/17(水) 23:37:39.44ID:4yuTjZOF0
元データをソートしなくても、結果用にn個のソート済み配列(flat_setとして提案されてるやつ)を用意して
そこに追加していきゃいいのでは。既に閾値以上のがn個集まってたら以降は最小のと比較して交換
282デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/18(木) 00:31:36.03ID:qf9NxgCDa
>>281
n個のソート済み配列って、ソート済み配列を何個も用意してどうする。。。と言う言いたいこと分かるけど、書き間違いでおかしな事言ってるっぽくなってるっていうツッコミは置いといて。。。
閾値が在るんだから、先に閾値以上の物だけ別の配列に入れてソートすれば良いってのは確かに任意個数で一番速そう。
2018/10/18(木) 00:47:10.59ID:0DBeL9M10
交換が発生する度にn個中の最小を検索する必要がある
閾値以上のを1回ソートとあまり変わらないような・・・データ次第か
全ソートして上から閾値見ながら、で充分じゃね?
選択部を工夫してもたいして効果なさそう
2018/10/18(木) 00:52:16.35ID:fwCHkrgD0
>>283
ソート「済み」配列なので最小は必ず端にあるから検索の必要はないよ
代わりに追加の度に二分探索をする
それをイメージしてもらうためにflat_mapって書いたんだが未策定のものは伝わらないな、うん

>>282
すまん、要素数n個のソート済み配列を1個、で
2018/10/18(木) 00:59:51.74ID:fwCHkrgD0
s/flat_map/flat_set/

orz
2018/10/18(木) 01:37:39.33ID:uQXK6ghcM
すみませんありがとうございます
ここに出てたの試してみます
287デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/18(木) 01:42:23.05ID:qf9NxgCDa
>>283
正直、追加の話見るまで最小と交換って私も「?」になった。
要するに1回目はソート済み配列が無いので >>282 をする。
要素を追加する度に、閾値以上かを見て、閾値以上ならソート済み配列で小さい順から二分探索して順番になる位置に挿入。

全要素1000で閾値以上が100とかなら、ソートするのが100だけだから、かなり高速化する。
追加もソート済みに入れるだけなので、遅くは無いし、次に取り出す事考えると(追加と同時にソート済みにしておく)、ソート済みから取り出すだけになるので全体として速くなる。

と言う考えであってる。。。と思う。
2018/10/18(木) 02:00:19.06ID:fwCHkrgD0
>>287
近くなったがまだちょっと違う
結果用の配列は要素数nしか確保しない。閾値以上が100個あってもn=2なら要素数2
で、元データを順に見ていって、3個目以降が見つかったら結果用の配列に入り切らないので
後から見つけたのが結果用の配列の中の最小よりも大きければ、最小のを捨てた上で二分探索した位置に挿入する
……というつもりだった

元データに後から追加があったら、みたいなことを考えて書いたわけではないです
2018/10/18(木) 02:11:57.61ID:acZxv8zY0
std::upper_bounds とかで挿入位置を決めて挿入、
n個を超えたら小さい方を1つ切り捨てるって感じだよね
たかだか数件ならループで位置を決めてもいい
290デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/18(木) 03:05:15.05ID:qf9NxgCDa
>>288
なるほど。
今全部分かった。

うーん。
それは任意の個数nと閾値以上の個数が近くないと、n個目以降が見つかる度に比較、探索、挿入を繰り返す事に。。。
データによりけりではあるけど、微妙。

>>282 は、イメージとしてはクイックソートの最初のピボットを閾値にして、閾値以下はソートしない様に変形させた感じ。

どっちがどうとかは、実測しないとなんとも言えなさそう。
2018/10/18(木) 05:26:46.31ID:6XxFpebh0
それってQuickselectみたいな感じ?
https://en.wikipedia.org/wiki/Quickselect
292デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/18(木) 07:53:42.77ID:qf9NxgCDa
>>291
そっちのが凄い。
任意のnーmまでの範囲だけクイックソートっぽくソートするのか。
最上位(m)からn位までのソートでおkじゃないか。
2018/10/18(木) 08:01:48.62ID:nYU4kM3H0
標準にstd::partial_sortってのがあってな
2018/10/18(木) 19:43:13.60ID:O6IwnbGd0
ほとんど中身を知られていないalgorithmさん
295デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/18(木) 20:00:49.79ID:qf9NxgCDa
それは >>282,>>290,>>292 書いた私の事だろうか。
そんな呼び名がつくのは光栄だけど、高卒で基本アルゴリズムしか知らないんだ。
その割には悪く無い処理を考えられたと自画自賛してたんだけど、やっぱ頭のいい人の考えるアルゴリズムは凄いね。
2018/10/18(木) 21:00:06.41ID:KO6AKpPQM
ヘッダファイルさんのことだと思うよ…
2018/10/19(金) 01:06:20.80ID:KjS8CKpl0
partial_sortなんてあったのか……orz
でもquickselectは元データを並び替えてしまうから
それができないならこのスレに書かれた方法でもいいけどな(負け惜しみ)

負け惜しみついでに>>290の議論だが、mは元データの個数、nは欲しい個数として
>>282の閾値以上を抽出してから一括してソートは
最速のソートが使えるのでオーダーはO(m log m)、空間使用量は元データと同じ作業領域がいるのでmに比例
>>288(俺)のソート済み配列に追加していくのは
挿入ソートを小分けにしてるわけだからオーダーはO(m*n)、空間使用量はnに比例

nとmが近いかそもそものデータ量が小さければ>>282が、そうでなければ>>288有利かな
……で良いと思う
298デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/19(金) 01:22:58.84ID:SjrnPnkZa
>>297
大丈夫、私も同じく沈んだw
純粋に貴方と私のロジックでは、貴方の方が有利という試算なのね。
おk。了解した。
2018/10/19(金) 01:38:12.56ID:KjS8CKpl0
いやまああくまで最悪計算量なんで、結局実際のところは実測しないとだけどもね
オーダー上は挿入でnに比例するから二分探索に意味はない、と書きながら気付いたりもしてる(苦笑)
300デフォルトの名無しさん (オイコラミネオ MM1b-Z4f9)
垢版 |
2018/10/19(金) 11:38:23.88ID:m66PCHeZM
>>294
地味に標準指定のアルゴリズムも改善されてて追いきれないよぉ
2018/10/19(金) 15:50:31.89ID:7aKWzf4h0
そして誰からも忘れられているstd::nth_element
2018/10/20(土) 00:02:17.58ID:qs+WVIEc0
ていうか4位同順が10万画素ぐらいあったらどうするんじゃスレ主、
2018/10/20(土) 11:06:48.96ID:5VFLqtlv0
ttps://www.magezinepublishing.com/equipment/images/equipment/H6D50c-6100/highres/Hasselblad_SHOT_01_F1_RGB_1460032379.jpg
一枚一億画素
jpg一枚で25MB

FFでは開けた
304デフォルトの名無しさん (アウウィフ FF9f-T/6m)
垢版 |
2018/10/20(土) 13:36:14.45ID:u8BRF3D8F
専ブラのプレビューでも相当時間掛かった
リンクを踏む気は無い
2018/10/20(土) 14:20:59.31ID:qs+WVIEc0
できたので貼る
Insertion sortで上位5件の相関値と座標(x, y)を表示するやつ:
ttps://ideone.com/L0fXH2
これは、同着があっても上位5位に入れば全部出力する。

get_top_N_pixels()がご本尊の関数
get_top_N_pixels_exp()が比較用に作ったバージョンで、std::sortで全画素並べ替えて上位5件を出力する。

上位5位以内に同着があまりに多いとget_top_N_pixels_exp()の方のが早いが
適当に作ったランダムな値の条件でQVGAぐらいの画像サイズだったらget_top_N_pixels()の方が8倍ぐらい早いっぽ
2018/10/20(土) 14:29:43.99ID:8XvHu+iJ0
>>303
Edge@androidでも開ける
2018/10/21(日) 13:32:51.16ID:CG65RjWX0
訂正 s/同着/同順/g

で、同順がそれなりにある前提でパホーマンスをちゃんと計ったら8倍どころではなかったわ3000倍以上早かったわ;
条件は以下の通り

■ 画像サイズ:
W=320 - 10, H=240 - 10
(Number of pixels=71300)

■ データ
値域[-5000.0F, 5000.0F]の一様分布。データ重複無し。

■ Basic design の結果(get_top_N_pixels_exp(): 全画素std::sort())
387 sec @ 反復回数ntimes=100, TOP_N=256 --> ntimesを10倍にすると3870 secの見込み

■ Practical designの結果(get_top_N_pixels(): TOP_N画素のInsertion sort
1 sec @ 反復回数ntimes=1000, TOP_N=256
14 sec @ 反復回数ntimes=10000, TOP_N=256

とゆーわけで、今回は一様分布かつデータ重複無しでこうだったので、TOP_N=256は一般条件における128と解釈するとして、
上位5位に入るデータの個数が128個以下なら>>305のpractical designで上記のパホーマンスが出る見込み
2018/10/21(日) 13:46:01.97ID:CG65RjWX0
ごめwwwwwデータ訂正および結論は480倍早かった、に訂正、

■ Practical designの結果(get_top_N_pixels(): TOP_N画素のInsertion sort
1 sec @ 反復回数ntimes=1000, TOP_N=256
8 sec @ 反復回数ntimes=10000, TOP_N=256 -- 3870 / 8 = 483.75
14 sec @ 反復回数ntimes=10000, TOP_N=65536
2018/10/21(日) 14:18:55.75ID:CG65RjWX0
ごめwwwwww結論は3000倍以上早かった、で訂正の必要はなかったorz

Basic designの結果
 387 sec @ 反復回数ntimes=100, TOP_N=256
に対して、Practical designの結果
 8 sec @ 反復回数ntimes=10000, TOP_N=256
は、(387/100) / (8/10000) = 4837.5倍早い

今日日のCPUアーキテクチャーとinsertion sort様様じゃ
2018/10/22(月) 08:41:03.37ID:zV72Tsc+M
江添と2ちゃんねらーどっちが頭いいですか?
2018/10/22(月) 08:50:48.56ID:pX1YSS+g0
お前が最高だよ
2018/10/22(月) 09:11:16.83ID:zV72Tsc+M
>>311
ありがとう//
2018/10/22(月) 15:27:10.69ID:vlwo9A120
STLってもはやスクリプト言語などと変わらない使用感でプログラム書けるな

最高過ぎる
314デフォルトの名無しさん (アウウィフ FF9f-T/6m)
垢版 |
2018/10/22(月) 15:49:25.60ID:H1W4+XYRF
tupleが便利だけどまだちょっと物足りない
2018/10/22(月) 17:48:12.06ID:MQnoZdqg0
C++17の構造化束縛を使うときありがたい
316デフォルトの名無しさん (エムゾネ FF8a-T/6m)
垢版 |
2018/10/22(月) 18:11:37.07ID:N4Dlk9u9F
インライン変数って使ってる?
2018/10/22(月) 19:19:03.71ID:OLEUht090
c標準ライブラリの関数ってstd名前空間にあるのに必ずしもstd::をつける必要ないよね
なぜか分かる人いない?
2018/10/22(月) 19:25:06.82ID:Bb4f3r+9d
C言語との互換性のため。
using使っているから。
2018/10/22(月) 19:32:50.75ID:9pYssRud0
cstdio → stdで囲まれる
stdio.h → 囲まれない
320デフォルトの名無しさん (アウアウカー Safb-dUTK)
垢版 |
2018/10/22(月) 19:39:34.29ID:3rTgJh0aa
横から納得w
古いC++(C互換重視)と新しいC++(新世界の王に俺はなるモード)の互換のためか。
ナル。
2018/10/22(月) 21:20:30.74ID:OLEUht090
>>318
なるほど
ありがとう
2018/10/23(火) 18:14:01.09ID:Au3cxoDNM
directory_recursive_iteratorで各ディレクトリを読み込むと読み込み順がおかしくなりますが、これvectorに突っ込んでソートしないと辞書順に戻せないのですか?
2018/10/23(火) 18:22:08.06ID:L3KABBTH0
>>322
戻すっていうか、普通のファイルシステムでは辞書順に並ばないことの方が多いんじゃないの。 知らんけど。
言語仕様的には recursive_directory_iterator が辿る順序は未規定。
2018/10/23(火) 21:40:23.22ID:/OGOSsnj0
二次記憶装置のデータをいちいちソート済みに保とうとするとオーバーヘッドが無茶苦茶だからな
読み込み順がおかしくなるんじゃなく、いつもOSがソートして見せてくれてたのが元のまま出てきただけだ
DOSの時代はdirに/oスイッチが追加されたとき便利になったものだと思ったよ
2018/10/23(火) 21:41:56.02ID:VWRpZj9Jd
C++こそ至高
2018/10/23(火) 22:17:33.35ID:cC1ZIpo7d
毎日毎日ソートして表示してくれてる ls や dir.exe や exproler.exe には頭が上がりません
2018/10/23(火) 23:09:18.58ID:VQ3XT5xj0
総統も相当ソートがお好きですなあ
ガハハハハハハ、
2018/10/23(火) 23:09:49.99ID:/OGOSsnj0
ピキン
329デフォルトの名無しさん (ワッチョイ f380-tM5n)
垢版 |
2018/10/23(火) 23:15:54.90ID:+Sb0MP+K0
また低学歴知恵遅れたちは頭わるいこといってるわ。。。
dir.exe?
dirはcmd.exeの内部コマンドだからな
dir.exeなんかあるワケがない

ソートするのはcmd.exeがdirコマンドを受けつけたときの機能で
OS自体の機能じゃないからな

ホントな低学歴知恵遅れたちは基本的なことが分かってない
2018/10/24(水) 01:34:13.78ID:K3Hn81Y7a
半角さん全角で書いてる・・・
2018/10/24(水) 01:53:57.74ID:ht/B3MxL0
>>330
最近飽きられてきたから(構ってもらえなくなったから)、芸風を変えてきたんだろ。触らないのがよろしいかと。
332デフォルトの名無しさん (ワッチョイ f380-tM5n)
垢版 |
2018/10/24(水) 22:50:08.00ID:WtQFT3Lb0
全角の部分を半角で書き込むと403ではじかれる

わかった?

低学歴知恵遅れの書き込みはいつも浅はか
2018/10/24(水) 23:09:52.03ID:2LYWqLo00
cmd.exe を半角で書いたら、
コマンドが実行されて、サーバーをハッキングされるとか、
5ch・サーバーの運営は、頭おかしい

素人がシステム・サーバーの運営構築してる

漏れは、何十冊も本を読んでいるけど、
cmd.exe を送ったら、ハッキングできるという記事を見たことがない
2018/10/24(水) 23:31:31.21ID:831HCs6w0
dir .exe
dir
cmd. exe
OS
ホンマや!弾かれた!!
2018/10/24(水) 23:34:37.74ID:831HCs6w0
サニタイズの最先端・ユーザーに入力させない←いまここ

いや知らんけど多分、
2018/10/24(水) 23:36:41.49ID:K3Hn81Y7a
326はどうやって書き込んだのか
2018/10/24(水) 23:42:29.72ID:2VbPUKOa0
dir.exeは実在しないから
2018/10/24(水) 23:45:51.61ID:H1sgDttB0
cmd.exe
2018/10/24(水) 23:47:41.25ID:H1sgDttB0
5chのNGワードチェックには文字参照という抜け穴が空いてる。
2018/10/24(水) 23:47:52.54ID:VdYWesL2F
dir.exe とかはどうだろう
2018/10/24(水) 23:49:12.41ID:VdYWesL2F
間違えた cmd.exe か
>>339
実体参照は書き込めない短縮url貼ったりするときにも使えるよね
2018/10/24(水) 23:49:46.74ID:VdYWesL2F
cmd.exe か
2018/10/25(木) 00:27:44.75ID:pvv+BGAWa
&copy;
2018/10/25(木) 01:10:25.04ID:ZE3NVml10
文字実体参照・数値文字参照なら、コマンドが実行されて、5ch サーバーをハッキングされる事もない

cmd.exe

dot, period は、ascii コード、46 (0x2E)
2018/10/25(木) 01:38:31.34ID:AmP2wyvxM
2018/10/25(木) 11:03:54.05ID:S9429CZWH
戻り値がオブジェクトの関数書きました。
すると上司が、変更があったとき不具合の原因になるからポインタで返せと。
これ本当でしょうか。stackoverflowとか覗いてるんですがオブジェクトで返すかスマポで返すかみたいな論調ばかりです。
少なくとも生ポインタ使えという意見は見当たりません。
(生)ポインタ使ったほうがいいケースというのは実際にあるんでしょうか。
347デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 11:14:40.21ID:5Cy/pQlUF
>>346
malloc してるやつなら
FILE * とかな
348デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 11:14:58.15ID:5Cy/pQlUF
ああ
もちろんスマポは否定しない
2018/10/25(木) 11:19:20.78ID:UTTFABgo0
>>346
参照返しでもポインタ返しでもプログラムの堅牢性は大差ない気がする。
ちなみに俺は、NULLを返すケースがある関数はポインタ返し、
NULLを返すケースがない関数は参照返しにしてる。
2018/10/25(木) 11:36:26.68ID:kug3Loto0
c++ の標準のスマートポインタでは循環参照を持つもの、
例えば get_child() と get_parent() を持つような木構造やリスト構造は扱えない
で、大抵の場合これらは単に生ポインタで実装される。
2018/10/25(木) 11:52:04.34ID:ytpwmPM20
>>346
C++ のミスりやすい箇所ってのはメモリ管理が多くを占めるので、
生ポインタは面倒くさいわってのが普通の感覚だと思うし、
不具合の原因になるってのはよくわからん言い分なので、
もっと掘り下げて聞かないとなんとも言えん。

共有オブジェクト (DLL) のインターフェイスにする場合なんかだと
ABI の都合とかでおかしなことになったりすることもあるかもしれんなぁ
みたいな可能性を想像することは出来るが、
書いてるプログラムや開発環境の性質に固有の事情はわからん。

一般的には、生ポインタにせざるを得ないことは有っても生ポインタの方が良いってことはあんまりなさそう。
2018/10/25(木) 12:00:30.29ID:kug3Loto0
ファクトリー関数は生ポインタ返すように作るのが良いと思う
353デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 12:24:55.50ID:5Cy/pQlUF
たしかにどこも指してない参照を返したいときは
NULLポ使えるポインタ返しにする

ダミーの空オブジェクト作れるように
C++が最初からルートオブジェクト基底してくれてればよかったのにと思うことはある
2018/10/25(木) 12:31:40.62ID:O+EPl0Ul0
struct Point{int x; int y;};
みたいな単純なPOD構造体をstructだからって教条的にいちいちnewとポインタで取り回してるプログラムは時々見かけるけど
そういうのは危ないし遅いしウザいからやめてほしい
2018/10/25(木) 12:36:58.91ID:kug3Loto0
そんなの参照と値渡しでいいということには同意するが
point 型を new / delete してるコード見た経験はないな
2018/10/25(木) 13:10:30.18ID:CpJhCfWv0
>>346の上司が言ってるのは、コピーコンストラクトや代入が正しく機能するということを
保証しなくちゃならなくなるから、ってことだろ
そこまで気にかけてる暇はないし、生ポで書くのが一般的な職場だというならそれに倣うしかない
2018/10/25(木) 13:17:16.94ID:qRFZNeCrd
そういえば俺コピー不可のクラス書いてもちゃんと private だ何だで実際に代入できないようにしてないな…
2018/10/25(木) 15:12:05.05ID:UTTFABgo0
コピー不可で思い出したけど、コピーコンストラクタと代入演算子をprivateにしたクラスを
vectorにpush_back()する記述がコンパイルエラーになるよね。

vector<Hoge> hogeVec;
hogeVec.push_back(Hoge()); // コンパイルエラー

これってどうすればいいの?
359デフォルトの名無しさん (ワッチョイ a17f-7TBo)
垢版 |
2018/10/25(木) 15:24:01.65ID:GHCvVeSE0
emplace_back使うとか
360デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/25(木) 15:28:42.80ID:5Cy/pQlUF
friend
2018/10/25(木) 16:12:31.55ID:ytpwmPM20
>>358
std::vector の要素は CopyAssignable と CopyConstructible の要件を満たす必要がある。
実際、 std::vector は内部で要素をコピーしたり代入したりすることがあるんだから、
それが出来ない要素を入れられないのは当たり前の話で、
コンテナに入れるならポインタ (上記要件を満たすスマートポインタでもよい) を入れるようにするくらいしか方法はないと思う。
2018/10/25(木) 19:22:18.01ID:Xzu40Yvw0
>>358
ムーブしてもいいならムーブコンストラクタと代入演算子を定義すれば行けないかな
2018/10/25(木) 19:29:07.62ID:wLNEFoo10
どうせ所有権意識して std::move を使うなら個々のクラスには
手を加えず unique_ptr かますのが楽じゃないかな
2018/10/25(木) 20:30:19.71ID:ytpwmPM20
>>362-363
ムーブ可能なだけでは必要な要件を満たしてない。
コピー可能であることが要求されている。
2018/10/25(木) 20:44:45.18ID:Xzu40Yvw0
>>364
vectorの型Tの満たすべき要件は操作による
push_backとかresrveとかはコピーかムーブのどちらかが可能ならば問題ない
2018/10/25(木) 23:00:25.21ID:ZDfhcJz3r
リストのイテレータ使って周期的な処理をしたいんだが、そういう使い方合ってる?

N 要素のリストのイテレータ it = s.begin() を N 回インクリメントしたら、it はルート(?)を指すわけだが、そうじゃなくて s.begin() と同じところを指してほしい
こういう場合、どうしたら良いだろうか
2018/10/25(木) 23:40:18.35ID:NT+vxu3F0
くるくる回るシングルリンクリストを自前でこしらえたほうが手っ取り早いと思うけど、
https://www.boost.org/doc/libs/1_65_1/doc/html/circular_buffer.html
368デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/25(木) 23:59:33.84ID:ZWxqLT/20
スアホポインタみたいな頭ワルイの使うぐらなら
C++なんかつかわなければいいのに

低学歴知恵遅れは新しいもんができると
使わないといけないという使命感があるらしい

低学歴知恵遅れは自分で要否が判断できない
2018/10/26(金) 00:05:29.09ID:q2UMXiCp0
そうだね痴呆おじいちゃんには7年前に標準化された最新機能は難しすぎるから仕方ないね

半角に限らず今でもウヨウヨいるからあんまり笑い事じゃないんだけど
370デフォルトの名無しさん (ワッチョイ 1d80-SUE8)
垢版 |
2018/10/26(金) 00:08:04.60ID:7cGNdWT70
あんのが難しい?
知恵遅れは頭ワルイシロモノを使ってる自覚がないからな

低学歴知恵遅れはアレで難しいもん使ってるつもりでいんのか
へー
2018/10/26(金) 00:12:31.03ID:xVkfT4g2r
>>367
それ参考にして自力で実装してみます
ありがとうございます
2018/10/26(金) 01:29:12.07ID:D2okE+fs0
>>365
あ、ほんまや。 ワイの記憶は C++03 時代のやつやった。
ムーブないからしゃーなしでコピー必要やったんやな。
2018/10/26(金) 11:08:50.27ID:R8qtZuY20
うろ覚えで>>364みたいなこと断言してたのかよ
自分の記憶を疑う癖つけた方がいいよマジで
2018/10/26(金) 13:04:49.03ID:D2okE+fs0
>>373
いや、このサイトを見て確認はしたんだよ。
https://ja.cppreference.com/w/cpp/container/vector
ただ、 「C++11 以前」という書き方になってたから、前後を見ずに C++11 は含むのだと思ったし、
(現在の最新ではないとはいえ) C++11 くらいには配慮すべきだろうなっていう前提で言ってたの。

でも、ちゃんと仕様を確認したら「C++11 以前」は C++11 を含まないことに気づいたって次第。
2018/10/26(金) 14:50:04.44ID:R8qtZuY20
あー、確かにあれは紛らわしいかもね・・
でもすぐ近くに「C++11およびそれ以降」ってあるしな
2018/10/29(月) 12:48:55.53ID:oLCvh0eX0
Cとhaskellはどちらがどれくらい速いですか?
2018/10/29(月) 12:50:29.22ID:cH/HmFkLM
たらい回し関数でも作って遊んでろ
2018/10/29(月) 15:30:56.80ID:oLCvh0eX0
STLのリストは要素を挿入するごとにメモリーの割り当てが起こるのか一度に割り当てられている場所に
なのかどちらですか?
2018/10/29(月) 17:02:30.38ID:AJZhbohO0
規格は要素ごとに割り当てるのを想定してるだろうけど
例えば10個分まとめて、みたいな実装もOKじゃないかな……
挿入削除やイテレータの++がO(1)みたいな各種要件さえ満たしてれば
2018/10/29(月) 18:06:21.97ID:cH/HmFkLM
vectorならともかく、そんな実装するってメリットがあまり無い気が
2018/10/29(月) 18:28:09.22ID:wGJRVi/I0
メモリのローカリティを維持できれば性能がよくなる可能性もあるんじゃね?
2018/10/29(月) 19:36:47.21ID:oZEcP9DNd
>>380
メモリのアロケーションは意外にコスト高いからまとめてアロケートしておいて
node を用意するときにそこから placement new とかして使ってゆくと高速になる
リストのノードに限らず、プロファイル取って new が時間
食ってるときにオブジェクトについてはこれで簡易に改善できる

最近はデフォルトのアロケータが高性能で意味がないこともあるけど
2018/10/29(月) 19:40:02.85ID:oZEcP9DNd
続き
解放も一気にしないと面倒なので基本追加一方で不要になったら全部消すみたいな場合に使う

巨大 xml の dom を作って、不要になったら全解放みたいなとき。
2018/10/29(月) 22:12:03.67ID:88V2EdRw0
大きいデータだと何十万回、何百万回もnewしなくちゃいけないようなクラスは
1メガくらいまとめてnew [] したほうが絶対いい。
実行時間比較すればわかるけど、かなり高速になる。
2018/10/29(月) 22:12:56.73ID:JnF9Re6Y0
1メガくらいという根拠の薄いマジックナンバーに依存する糞コード
2018/10/29(月) 22:36:16.47ID:88V2EdRw0
>>385
当然、実装するときは、まとめて確保するメモリ量は指定できるように作るのが当たり前。
いちいちそんなこと言わなくてもみんなわかると思って、例えば1メガという意図で「1メガくらい」
と書いたが、バカには伝わなかったみたいだな
2018/10/29(月) 22:38:25.00ID:JnF9Re6Y0
で、1メガという定量的な根拠は? いくら罵倒しても自動的には出てこないぞ
2018/10/29(月) 22:40:37.61ID:YGs2BWq10
パフォーマンスを求めるシーンでダブルリンクリストって
2018/10/30(火) 00:35:43.38ID:0KkuIlNzd
ダブルかどうかは知らんが深さが不定の木構造なら仕方ない

んでメモリ確保はn個まとめればアロケーションコストはほぼ1/nになるんで
10とか100で十分で別にそんなに増やす必要はない
が、大量にアロケートするときしか使わない手法なので1000とか大きな数にするのが人の情
2018/10/30(火) 09:09:19.02ID:/5i0cROz0
何百万回もnewする想定なのに1メガでいいの?
2018/10/30(火) 10:54:57.24ID:aDKxpfal0
まあnewするクラスのサイズによるだろ
サイズが100バイトのクラスなら1メガでもnewの回数が一万分の1になるので効果はありそう
2018/10/30(火) 11:32:05.07ID:/tj4m1Wy0
データ構造全体でどれくらいの大きさになるのか事前に見積もれればいいんだけどね。

ガチでチューニングしようと思ったら
各アプリケーションでのメモリの使い方の特性を考慮しなきゃならんし、
パラメータの微調整は実際にやって試してみるしかしょうがない。
2018/10/30(火) 12:17:01.56ID:aDKxpfal0
>>392
>データ構造全体でどれくらいの大きさになるのか事前に見積もれればいいんだけどね。

そうだな
実行開始して何時間も待たされた挙句、メモリ不足でエラー終了とかマジ勘弁して欲しいわ
最初に使用メモリ量を予測してエラーにしてくれよ
2018/10/30(火) 14:48:22.73ID:bp+Jjz8rM
今時はメモリエラーなんて出さずに延々確保しにいってスラッシングしまくるだけ
395デフォルトの名無しさん (ワイーワ2 FF33-gZJR)
垢版 |
2018/10/30(火) 15:06:52.69ID:p4LrBCE7F
>>387 >>385
キャッシュなんだから 2のn乗で適当な大きさ持ってれば大丈夫
2018/10/30(火) 16:22:00.39ID:YIrhnuea0
2^N+αの方がいいぞ
2018/10/30(火) 21:01:00.62ID:Z4vjmLqM0
>>395
テキトーの用語の使い方を間違っているな
2018/10/31(水) 00:35:59.17ID:7q2lQPFCM
適当には適切という意味もあるんやで
2018/10/31(水) 00:55:16.82ID:n3cdWN/k0
jemallocのデフォルトチャンクサイズは1MiBらしいな
経験的に悪くない数字なんだろう
2018/10/31(水) 00:55:23.06ID:2bLA79Ru0
一気解放テクというのはN億個のオブジェクトをフルスピードで作って10秒かかったとして、
破棄するときもバカ正直に10秒かけるつもりなのかとかそういう話だが
オブジェクトがリソースを所有しておりデストラクトを要するブツだったりすると
オブジェクトの占有メモリだけ一気に解放することはできないから成立しない
というわけでコンパイラの中で構文解析結果であるところの木構造を破棄するのにお目にかかるぐらい
なキモス
2018/10/31(水) 01:44:07.13ID:y5TVZzW10
ソースコードを読んだわけじゃないが、
ウェブサーバの H2O はドカンと大きいメモリを確保して頭から順番に使っていくという戦略を取ってるのでクソ速いというのを
どこかで見た覚えがあるな。

ウェブサーバならセッションが基本単位と考えれば、
セッション開始時に大きいメモリを確保してセッション終了でまるっと捨てるというのは確かに理にかなった方針だと思う。
2018/10/31(水) 03:43:29.87ID:dHrKLKTO0
>>400
いやnewもdeleteもインプレイスでやるからメモリの確保と解放はまとめてできるんだ
んでコンストラクタとデストラクタはどっちにせよ必要なので、メモリの確保と解放が問題なんだよ

で、指摘の通り
メンバ変数がまたメモリを確保/解放してるとご利益がぐっと薄れるので
まとめて確保を使い始めるとベクターだなんだもショートストリング最適化みたいな
小サイズなら静的に確保したメモリを使うようなテクニックを使い始める。
LLVM の SmallVector やそれを基にした boost の smallvector なんかがそれか
2018/10/31(水) 03:44:09.76ID:dHrKLKTO0
boost のは small_vector の typo
2018/10/31(水) 05:48:21.49ID:dHrKLKTO0
まとめてアロケートするコードのテストコードを書いてみた
簡単なリストのアロケーションと解放
100個ずつと1000個ずつではだいぶ違った
1000を10000にしても大差ない

https://ideone.com/oyIM5p
2018/10/31(水) 07:57:39.93ID:dHrKLKTO0
上の例はリストのノードにstring を持たせているが、
これをvectorにするだけで高速化の倍率はひどく悪化する。
https://ideone.com/k6XiHK

string は SSO(ショートストリング最適化)で小サイズならメモリのアロケートを行わないが、
vector はサイズ1でも必ずアロケートするため。
406デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 13:42:46.70ID:XAA9QXm2F
vector禁止
2018/10/31(水) 15:36:31.08ID:wG8+54SGM
よーしパパbitset使っちゃうぞ
2018/10/31(水) 17:52:51.32ID:HGEk6qvJ0
opencv(c++)で適当な画像をDCTしてDCT係数をテキストファイルにプログラムを教えていただけませんでしょうか。
画像をDCTするとこまでは分かったんですがそのあとが分からないです。
2018/10/31(水) 17:53:54.59ID:HGEk6qvJ0
>>408
テキストファイルに表示するです
2018/10/31(水) 18:14:35.77ID:N9TdgOC+0
日本語でOK
411デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:23:30.41ID:XAA9QXm2F
>適当な画像をDCTしてDCT係数をテキストファイルにプログラム

日本語で
2018/10/31(水) 18:28:26.25ID:HGEk6qvJ0
>>408
もう1回書きますがテキストファイルに書き出すです
413デフォルトの名無しさん (アウウィフ FFb3-gZJR)
垢版 |
2018/10/31(水) 18:30:01.31ID:XAA9QXm2F
ファイルに表示
2018/10/31(水) 18:44:17.50ID:YG0rnI8eM
OSが分からんが、一番楽チンであれこれ考えなくて良いのは普通にprintfしてファイルにリダイレクト。
2018/10/31(水) 21:27:56.35ID:HGEk6qvJ0
windowsです
2018/10/31(水) 22:31:25.44ID:wG8+54SGM
dctは出来るのにストリームへの出力は出来ないのか
2018/10/31(水) 22:34:24.39ID:Cti468/q0
ofstreamでファイル開いて<<で出力
ascii文字だけなら文字コード気にしなくてもいい
2018/11/01(木) 01:13:06.51ID:PigZrB5P0
DCT係数が配列に格納されているんですがそのすべてを書き出すのができないです
419デフォルトの名無しさん (ワッチョイ a323-WkUi)
垢版 |
2018/11/01(木) 10:51:44.25ID:z733lC2q0
>>416
https://twitter.com/Campaign_Otaku/status/1057156200981135361/photo/1

空で字描ける人が着陸の仕方を「どうやるの」なんて疑問は出てくるはずがない。
「どういう風に降りようかな」って意味なら判る。
完全に誤訳
https://twitter.com/5chan_nel (5ch newer account)
2018/11/01(木) 20:17:49.41ID:Pz4tYpgEd
>>418
Mat 型の変数 m に入ってるなら
std::cout << m;
で標準出力に出るだろう

参考
http://opencv.jp/cookbook/opencv_mat.html
2018/11/01(木) 20:42:34.69ID:yQbjy7jF0
C言語は高校・大学の頃やったので大体わかります
今更ですがC++勉強するのに良い教材は何でしょうか?
本が良いですがもっと良い方法がありましたらそれでも良いです
2018/11/01(木) 20:56:14.21ID:Pz4tYpgEd
>>421
まずは「プログラミング言語 C++」を読んでみては?
高いから図書館で借りるといい
2018/11/02(金) 00:38:53.71ID:YtkatxxE0
effective c++とか
2018/11/02(金) 00:55:59.17ID:bpaiY9An0
C++ってnumpyみたいに2次元配列から範囲を指定して抜き出しとか出来ないですかね?

10, 20, 30, 40, 50
60, 70, 80, 90, 100
110, 120, 130, 140, 150
160, 170, 180, 190, 200

このようなvectorがあった際に
70, 80, 90
120, 130, 140
170, 180, 190
を抜き出したいです
425デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/02(金) 01:08:54.86ID:KoqyjIsr0
equal_rangeを使う
2018/11/02(金) 01:34:41.33ID:T61e9sN/0
>>424
自分で書きたくないならあり物のライブラリ使えばいいのでは
よく知らんけど opencv の Mat とか BLAS とか

https://minus9d.hatenablog.com/entry/2014/03/21/114514
2018/11/02(金) 01:58:52.59ID:CMIkY+8nr
boost の multi_array でできる
かなり調べた結果これに行き着いたから、他のを見つけるのは至難の業だと思う
2018/11/02(金) 02:00:44.27ID:CMIkY+8nr
まぁ2次元配列に限るなら正直 vectorのvector でそういう動作するもの簡単に作れるよね
2018/11/02(金) 04:22:50.02ID:T61e9sN/0
普通こういうものの部分行列はデータをコピーしないで動作するんだよ。用途によるけどだいたいは。
2018/11/02(金) 09:58:57.11ID:UBXHQBH/0
>>423
質問者に合ってると思うか?
431デフォルトの名無しさん (ワッチョイ 9723-VEUj)
垢版 |
2018/11/02(金) 16:44:40.29ID:ggr9EF3w0
>>424
C++ から python も numpy も使える
2018/11/02(金) 21:55:06.47ID:yMnDBJfs0
>>424
vectorではなくvalarrayの使いどころだ
2018/11/02(金) 22:55:21.07ID:lVpg8bJur
valarrayじゃなきゃ駄目な場面なんて知らんがな
2018/11/03(土) 00:31:38.77ID:ogvvzewS0
slice使える
435デフォルトの名無しさん (ワッチョイ 5b80-Q1ft)
垢版 |
2018/11/04(日) 13:10:56.85ID:MKH8Qowh0
そもそも2次元の配列使う必要がない
1次元で十分
池沼はいちいちみため2次元にしたがる
436デフォルトの名無しさん (アウアウカー Sac3-XPOZ)
垢版 |
2018/11/04(日) 15:35:15.29ID:NU/4ChKLa
20年前の本読んでも問題ないか?
2018/11/04(日) 16:00:02.15ID:T2TFtaIb0
みため二次元ねえ

int vec[][5] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200 };
これで済むことを、

int& elm(int row, int col)
{
static int vec[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200 };
return vec[row * 5][col];
}
いちいちこう書くやつも充分に池沼なんだが

そういうやつをちょっとプロファイリングしてみると
配列へのポインタに腹を立て、ポインタの配列にmallocして
強引に**で二次元を扱えることにするテクニックを某所で自慢したら
タコ殴りにされて、すっかり心を病んでしまい
以後、二次元配列というワードで凶暴化するようになった、とかね
438デフォルトの名無しさん (ワイーワ2 FF12-VEUj)
垢版 |
2018/11/04(日) 17:10:10.81ID:dwIn1XjHF
>>436
tcl/tk なら枯れてるから大腿同じ
2018/11/04(日) 17:55:13.85ID:ntvnp4Zh0
ていうか(アドレスp)[x]は*(p+x)の別表記に過ぎないというのは規格上の話にすぎなくて、
実際問題としては一次元配列アクセスと二次元配列アクセスには最適化のかかり方次第でかなり速度差が生じるお
一次元配列にすると、概念上の次の行の要素への移動が加算1発で済むというのが喜ばしい
これとループ最適化が組み合わさると、配列スキャンが主な仕事の処理は爆速になり得る

といいつつ次の例はideoneでこそ一次元配列アクセスの方が遅いが(爆
Visual C++ 2010だと一次元配列は10倍超速いお
https://ideone.com/K7uLo9

(VC++での結果)
******* Array 1D opt:
ntimes=100000^2, sum=2372578304
Consumed time=0 sec

******* Array 2D:
ntimes=100000^2, sum=2372578304
Consumed time=10 sec
440デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:13:58.07ID:rLQVzKFuF
http://mimumimu.net/blog/2009/01/24/getmessage-%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%80%82/
441デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:16:57.25ID:rLQVzKFuF
C/C++で「二次元配列」と言った場合
char *hoge[N]; の方を指すのであって
char **fuga; の方は決して「二次元配列」ではない

Javaなら後者を指してるので
これらが初心者には混乱の元
442デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:17:36.23ID:rLQVzKFuF
ごみん
いきなり間違えた
char *hoge[N]; じゃなくて
char (*hoge)[N]; こうです
443デフォルトの名無しさん (エムゾネ FFba-VEUj)
垢版 |
2018/11/04(日) 18:19:01.87ID:rLQVzKFuF
439 の言うばふぉーマンスは
char **fuga; だから落ちるのであって
char (*hoge)[N]; では落ちない
2018/11/04(日) 18:28:12.23ID:ntvnp4Zh0
ていうか>>439のやつもよく調べたら1000倍近い速度差で一次元配列の方が早いお
今日日のCPUアーキテクチャーでよく見られるいつもの光景だお…

(VC++でntimes = 百万の2乗にした結果)
******* Array 1D opt:
ntimes=1000000^2, sum=2273652736
Consumed time=0 sec

******* Array 2D:
ntimes=1000000^2, sum=2273652736
Consumed time=928 sec
2018/11/04(日) 18:30:20.30ID:ntvnp4Zh0
>>443はジャグ配列と通常の二次元配列の区別も付いていないおむつも取れていない赤ん坊だお;;
2018/11/04(日) 18:41:14.77ID:egw3UDrd0
>>444
VC++は2次元配列が苦手ってだけじゃない?
手元のgccとclangは最適化なし(-O0)だと1次元の方が少し遅くて最適化あり(-Ofast)だと1次元と2次元で計算部分は全く同じアセンブリになった
447デフォルトの名無しさん (アウアウカー Sac3-U2lQ)
垢版 |
2018/11/04(日) 18:58:49.68ID:pidkuN2Fa
>>436
文法古くて生産性低いってだけで、コードは動くよ。
448デフォルトの名無しさん (ワッチョイ df8a-6RPj)
垢版 |
2018/11/07(水) 14:24:50.89ID:ldKnJvNa0
黙って行列ライブラリ使えよ
2018/11/07(水) 15:48:05.24ID:fYDz1ZKKr
いい質問があったら鬼のように加速するけど、そうじゃないときはかなり穏やかなんだな
450デフォルトの名無しさん (ワッチョイ a323-VEUj)
垢版 |
2018/11/07(水) 15:52:57.02ID:IyZ6SaMg0
話題毎にスレ移動してる遊牧流民族
2018/11/08(木) 19:45:44.59ID:Zz75hCICM
おいEffectiveC++がいつの間にかオライリーになって高価くなってるじゃねぇか
誕生日におばあちゃんにもらった図書カードでも買えないぜ
2018/11/08(木) 22:34:24.42ID:6GweSoQWM
毎日少しずつスマホで撮影
2018/11/09(金) 00:41:56.16ID:mEWiZt760
中古で2版かった
2018/11/09(金) 00:45:44.84ID:yH/J6wNO0
オライリーが不要な人
「オラ、要りません」
2018/11/09(金) 03:59:09.39ID:NPFxlpZr0
Arduinoの教本は安くなってた気がする
456デフォルトの名無しさん (ブーイモ MMb9-NrKH)
垢版 |
2018/11/15(木) 19:31:27.51ID:u78hdNWAM
>>454
おまいはNGな(´・ω・`)
2018/11/21(水) 14:25:07.64ID:2bTou3MI0
Javaが来年頭から死亡展開になるの今日知った
C++はやっぱ平和だな
ところでみんなはC++で何を作ってるの?
2018/11/21(水) 14:26:25.56ID:eXoP5Hir0
ゲーム
2018/11/21(水) 14:38:58.30ID:2bTou3MI0
了解ありがとう
2018/11/21(水) 15:00:42.00ID:5XDVWHjZ0
>>457
Java は無償サポートが薄くなったってだけで、
使うだけなら特に制限が強くなるわけではない。
そんなにサポート利用してたか?
2018/11/21(水) 16:15:38.69ID:2bTou3MI0
使うだけならね
Androidの商業開発は痛いよ
googleがdart言語を着々と開発をしてるのはこれを避ける為だったと
2018/11/21(水) 21:52:05.40ID:hmzhTBXoM
何を自演してるの?
2018/11/21(水) 22:09:59.66ID:0eUwt8A90
C++を長年使ってきた身としてはようやくJAVAとかいうゴミが一掃されてまさしく自らガーベッジコレクト自爆してくれて清々する
2018/11/21(水) 22:29:03.89ID:rlO03g2l0
聳え立てた糞の山を保守するために生き残り続けるよ・・・
2018/11/22(木) 07:07:56.56ID:ykkp0iR40
Javaが出てきた頃はまさかこんなCOBOL並の糞山生産言語に成り果てるとは思わなかったな
悲しいなあ
466デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/22(木) 12:42:34.39ID:blyr971hF
>>463
ほんそれ
467デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/22(木) 12:42:56.61ID:blyr971hF
>>465
当初から言われてたぞ
468デフォルトの名無しさん (ワッチョイ cfa5-L5v9)
垢版 |
2018/11/22(木) 17:56:25.68ID:RROqQEmy0
test
2018/11/22(木) 19:19:12.39ID:FdxQ3S5p0
スマートポインタってガベージコレクションではないの?
2018/11/22(木) 19:30:02.59ID:3Ij8+ioXM
違います
2018/11/22(木) 19:37:13.80ID:3NeFI3xN0
ガベージが発生しないもんな
2018/11/23(金) 09:57:38.38ID:xUgPEkHQ0
ガベージか非ガベージか、どうやって見分けるの?
見分けられないなら逆説的にガベージはない
全部データと言える
すると言う通りにガベージは発生しない
2018/11/23(金) 11:48:27.57ID:nZV4GP9h0
どっちも参照カウンタが0になった瞬間はガベージと言えないこともないが、スマートポインタだとその場で即削除される。
ガベージコレクションは参照カウンタが0になったメモリをメモリアロケータが適当なタイミングで削除する。
2018/11/23(金) 11:53:50.43ID:/6hb/Gdud
自分の中で結論出してるみたいだから説明したくないなあ

スマートポインタはリファレンス(参照)がなくなったときにメモリやオブジェクトを解放する。
ガベージ(参照不能なオブジェクトやメモリ)がどこかに溜まって、
いつかのタイミングでそれらをコレクトするような動作はしない。

スコープを抜けるときにスタックフレーム上のオブジェクトが破棄されるのと同様。

異論はいくらでもどうぞ
2018/11/23(金) 11:57:18.90ID:D5DlZHs/0
書いてて思ったけどスタックという仕組みは素晴らしいハックだよね
2018/11/23(金) 13:11:50.55ID:QYpEy3WT0
「部屋を最後に出る奴は電灯消せよ」がスマポ(std::shared_ptr)
電灯付けっぱで誰もいない部屋を探して消し回るおばちゃんがGC
C++にはそういうおばちゃんはいない
2018/11/23(金) 13:17:17.72ID:l4mTlUt60
>>476
面白い表現だね。
いつかパクらしてもらおう。
2018/11/23(金) 13:21:17.14ID:00BNAcCe0
うむ。わかりやすいw
2018/11/23(金) 13:35:53.07ID:WmoXs2+nM
スマポって何に使うん?
趣味グラマーだけど使ったことない
cv::Matとかに使われてるだけで個人では使わないようなものなの?
480デフォルトの名無しさん (アウウィフ FF27-OXRW)
垢版 |
2018/11/23(金) 13:44:09.05ID:e4GZHgy/F
生ポを上手に使えない人が使えばいい
自信があれば無くてもOK
2018/11/23(金) 13:53:48.42ID:o3+kYr4A0
可能なら生ポインタは避けるのが良い作法。
単純に、 delete を書くのめんどいから勝手にやってくれた方がよくね?
そりゃあ場合によっては生ポインタが必要な箇所もあるだろうけど、
スマートポインタは高度なライブラリ内だけでしか使われないってほど特殊なもんではない。

ポインタ型のデータメンバを持つクラスのコンストラクタで
発生した例外を function try block で捕捉して後始末をするよりは
スマートポインタを使った方が勝手に解放してくれて楽というのもある。

例外が絡むと本当にめんどいし、思考停止したい。
2018/11/23(金) 14:17:24.18ID:e/BZMkzC0
>>476
参照カウントはガページコレクタの一つでは?
https://ja.wikipedia.org/wiki/%E5%8F%82%E7%85%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88
2018/11/23(金) 14:36:29.45ID:D8he5SEKM
>>482
参照カウントがGCの実装アルゴリズムとして使われることがあるというだけで、スマポがGCと言ってるわけではないよ。

だいたいガイジンにとってガベージコレクションといえば↓コレなんだから、広範に収集しないスマポをGCと呼ぶのはすごい違和感。
https://money.usnews.com/careers/best-jobs/garbage-collector
2018/11/23(金) 14:46:07.98ID:o3+kYr4A0
スマポが GC かっていうのはちょくちょく話題になるね。

私自身は std::shared_ptr はガベジコレクタの一種だと考える派って話は前スレにも書いた。
https://mevius.5ch.net/test/read.cgi/tech/1535353320/303
考え方によるので定義を定める必要はないとも思ってるけどね。

>>473-474
C++ でデストラクタで不要なメモリにマークだけしておいて
実際の解放処理は後回し (とか別スレッドでやる) だとかいう手法もあるけれど、
あなたがたの基準ではこれは GC と言える?
2018/11/23(金) 14:46:51.54ID:i3QERm52r
>>476
すげー分かりやすいw
2018/11/23(金) 14:52:59.28ID:i3QERm52r
はちみつさんは女の人だったんだ
2018/11/23(金) 19:35:02.76ID:00BNAcCe0
C++で電気を消して回るおばちゃん作れないの?
2018/11/23(金) 19:39:11.60ID:tufcyCUn0
作れるよ。C++でガベージコレクタを実装した言語を。
2018/11/23(金) 21:53:31.89ID:qlpWVHw40
変な質問ですみません。
C++をBetterCとして使いたいのですが、C言語が分かる前提で、おすすめの書籍などないでしょうか?
コーディング規約ではないですが、その書籍に書いてあることまでは使っていいような形にしたいのですが。
2018/11/23(金) 23:04:28.25ID:LRYgqZxfr
vectorなども禁止したいのであれば、ない
2018/11/23(金) 23:47:03.05ID:QYpEy3WT0
なんでC++をC++として使わないのか、使いたくないのか、使う度胸もないのか
まずそこをはっきりさせよう
2018/11/24(土) 00:07:45.09ID:V6N696Kv0
ベターCなんぞというあまっちょろい考えのヤツはC++道破門だ
そんなあまっちょろい考えだからJAVA上がりのようなデストラクタもろくに使いこなせない小わっぱだらけになるのじゃ
2018/11/24(土) 01:07:38.96ID:yk09TxVj0
C++ を Better C として使ってもよいというのは設計者自身も言ってる。

だけど、あくまでも、 C をわかっている人が完全には C++ を理解できなくとも
わかる範囲で C++ を実務をに使いながら C++ への理解を深めていける (より高度な C++ 使いになることを目指す)
という前提付きだ。

C から C++ への段階的な以降がスムーズに出来るという話であって、
>>489 のように C++ の固定されたサブセットを Better C として使うのはちょっと違う。

強いて言えば Embedded C++ とかいった規格の提案もあったけどさぁ、
https://ja.wikipedia.org/wiki/Embedded_C%2B%2B
企画倒れに終わったので書籍とかはあんまりないと思う。
2018/11/24(土) 01:16:38.96ID:tc+IepjYM
c++をc++として使ってる人っていったい何作ってんの?
ゲーム?
でもゲームってAAAクラスだと未だに例外なしで作ったりしてんでしょ
495デフォルトの名無しさん (スップ Sd1f-xGPl)
垢版 |
2018/11/24(土) 08:17:49.70ID:WC34mdadd
ゲームは例外ダメだったりC++03だったりしたけど
今はだいぶ現代的なC++になってきてるよ
2018/11/24(土) 08:30:31.18ID:qVCgFVzS0
>>494
ミサイルの射程距離の計算
497デフォルトの名無しさん (ワッチョイ 5305-04Xy)
垢版 |
2018/11/24(土) 08:45:19.63ID:sJe2ncgH0
>>484
shared_ptrがGCと似た仕組みで動いている場合があるからといって、
shared_ptrがGCの一種であるというのはちょっと飛躍してない?
2018/11/24(土) 09:04:42.05ID:3CbvFbkZ0
C89以上C99未満のBetterCという意味ならわからんでもないが、その場合
参考にするのはやっぱりC89の本だろうな。
2018/11/24(土) 10:04:19.96ID:yk09TxVj0
>>497
メカニズムは GC だから GC であるという単純な主張だよ。 似ているんじゃなくてそのものだと言ってる。

前スレで QZ 氏が書いている言語との関係性、抽象化の仕方による区別にも説得力を認めてはいるけど、
一般的に GC 付きで実装される言語のほとんどでは意味論としては GC を要求しているわけではなく、
「オブジェクトの寿命を無期限にする」という要求があって、それをある程度実現するために GC が
使われているに過ぎないということを考えれば言語側の意味論とメカニズムは切り離す方が自然で、
メカニズムが GC ならそれは GC だというのが私の考える理屈。
2018/11/24(土) 11:54:49.92ID:FpJ57Whd0
>>493
そういう選民思想的な考え方はいかがなものかと思うけどね
実際C++をCのような低レベル部分も含めてちゃんと理解し
テンプレートを使った総称的プログラミングまで使いこなし、最新のライブラリも使いこなすのに
どれだけの学習コストがかかるか
世の中ははちみつみたいなヒマ人ばっかじゃないんだよ?
俺スゲーと言いたいがためにC++の普及を妨げるな
501デフォルトの名無しさん (アウアウカー Sa87-ZX3B)
垢版 |
2018/11/24(土) 12:10:10.43ID:1C+vWWG1a
>>489
案外C++入門書ってCと同じ文字列は文字型の配列とか、そう言うところから入っちゃうから、
文字列はstring型、配列の代わりにvector型とかが入門の時点で説明されてるのって案外少ない。

ストラウストラップのプログラミング入門 とかどうよ?

そうじゃなくて、文字列や配列はCと同じの使いたいなら、適当な入門書から使えそうなの抜き出せば良い。
2018/11/24(土) 12:19:21.49ID:FpJ57Whd0
あ、>>500にはオブジェクト指向プログラミングも追加しとく
2018/11/24(土) 14:44:00.89ID:yk09TxVj0
>>500
隅々まで使いこなせと言ってるわけじゃない。
フルセットの C++ を自分なりに使えよと言ってるのであって、
その根拠として、一定の形に定まった C++ のサブセットという試みは
ろくでもない結果に終わったという事実を紹介してるだけだ。
504デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/24(土) 14:45:16.71ID:4kdGLnPdF
初心者や C++ しか知らない人が
C++ を Better than C として使うことは不可能に近い

C も C++ も知ってて C++ を敢えて C として使うことが出来る人だけが
Better than C として使える
2018/11/24(土) 14:54:34.26ID:LPhqEBYf0
Cで書くならちゃんとCとしてCの範疇で規格に沿って書けと思うけどな
準拠先はC89でもC99でもC11でもいいけどさ
なんで異言語(C++)を中途半端に混ぜようとするの?
506デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/24(土) 15:10:55.48ID:4kdGLnPdF
そういうときは拡張子 .c にする
2018/11/24(土) 15:13:10.06ID:yk09TxVj0
D&E では、 C から C++ への段階的な移行が出来ることを
意図して C++ を設計した (Better C として使える) ということが書いてあって、
確かに私も C を知らなかったら C++ はまともに使えなかっただろうなと思う。

でも、 C の延長線上で C++ の便利な機能を使ったプログラムって
どこまで C++ の機能を取り入れても「C++ 的なプログラム」ではないなとも思う。
C++ を (綺麗に) 使うなら C++ を前提とした設計が必要なので、
Better C として使うことを積極的には勧めにくいという気持ちもある。

欲しいのが「C++」ではなく「考え方は C っぽいけどもうちょっと高級なやつ」ならば
Go あたりを考えてもいいんじゃないかな。
508デフォルトの名無しさん (ワイーワ2 FFdf-OXRW)
垢版 |
2018/11/24(土) 15:17:05.59ID:4kdGLnPdF
Dが過疎ってるしな
2018/11/24(土) 15:40:53.59ID:HpxmFCOFa
D++が出来るんじゃない?
2018/11/24(土) 16:54:40.98ID:27muaU+t0
     ∧_,,
    (#゚;;-゚)++
    /;; ;;っ
  〜;; ;; ノ
   (/"'J
2018/11/24(土) 17:12:59.04ID:A/C05uoVM
C言語を知らなかったら、C++が書けないのはありえない
2018/11/24(土) 17:15:34.96ID:oBJLSqih0
入門書の初っ端にcin,coutを多用しておきながら、C言語から段階的に移行出来るとか寝言は寝て言えって感じやなw
それでいてoperatorの説明は最後の方とか。大人しくprintfとscanfにしとけや。
2018/11/24(土) 17:19:16.90ID:0+zZ0hnRM
まだBetterCがどうとかいってるのか
何十年前だよ
普通にC++を使えよ
2018/11/24(土) 17:30:37.66ID:aTKLem3I0
>>511
否定が多すぎて読み取りにくい。
「C言語を知らなかったら、C++が書けないのはありえない」→「C言語を知らなかったら、C++が書ける」→「C++ を書けなかったらC言語を知っている」
515デフォルトの名無しさん (ワッチョイ 83b3-A3/R)
垢版 |
2018/11/24(土) 18:10:05.30ID:sj/p1kLr0
禿げは預言者に過ぎず、C++を授けたのは神なのでは。
2018/11/24(土) 18:47:29.20ID:F/l20HKb0
>>503
お前D&E読んでるならEmbedded C++の話はまた別だと知ってるはずだが
EC++はC++の方言を作ろうとしたのが失敗したんであって
「そんなもん使うくらいなら、職場やらプロジェクトでC++の一部の機能に限定して使え」と
禿も言ってたろうが

質問者の質問無視して何押し付けてんの?何様だよ
言語の使い道を決めるのはお前じゃない
2018/11/24(土) 19:00:59.66ID:27muaU+t0
--no-exceptions --no-rtti
これで充分だね
518デフォルトの名無しさん (ワッチョイ 83b3-A3/R)
垢版 |
2018/11/24(土) 19:18:10.31ID:sj/p1kLr0
C++はマングリガエシがどうのこうのって話を聞いたことがあるな。
2018/11/24(土) 20:22:24.24ID:8ycC8usL0
全部extern "C"{}の中に書くかw
2018/11/24(土) 20:28:56.70ID:yk09TxVj0
>>516
ん〜、俺の言ってることが伝わってないな。
「自分なり」の、つまりは各プロジェクト、各チームの事情に合わせて (制限して) 使うべきで、
どっかからよくわからん「固定されたサブセット」を引っ張ってくるのはクソって話だから、
あなたの言うそのままのことを俺は言ってるつもり。
2018/11/24(土) 20:51:25.26ID:F/l20HKb0
>>520
いやいやお前の言い分の方がわからんよ
だったら>>489の言う使い方で文句ないだろ
2018/11/24(土) 20:52:49.16ID:F/l20HKb0
今後ともC++を覚える気は無い、なんてどこにも書いてなかったしな
(さすがにそれだったら俺も「Cでええやろ」と思うけど)
2018/11/24(土) 22:01:12.79ID:yk09TxVj0
>>521
事情に配慮せずそこらへんの書籍を適用したって上手いこといかんという単純な話じゃないの。
2018/11/24(土) 23:33:07.16ID:MFu7deOdM
>>496
へー、そんな仕事やってんだ
どこの会社か興味あるけど
まぁそれはさておきc++である必要性って何なの?
525デフォルトの名無しさん (ワッチョイ c380-1YVs)
垢版 |
2018/11/24(土) 23:37:53.13ID:or35NFsF0
C++ではいろんなもんが作られてる
クリティカルなシロモノでスクリプトが使われることなんか滅多にない
2018/11/25(日) 00:13:09.35ID:zFZWesGa0
要するに本を口実にして人間の能力を制限したいってことでしょう
ンなモンC++の理念には全く反してるんじゃあないスかね
そいつの能力の限界まで迫れなきゃあC++を使う意味なんてないよ

会社の教育目的なんだろうけど「本に書いてあること以上はするな」ってのは
公教育の理念に縛られたクズが言いそうなこと
他人の能力にストッパー掛けて制限したいための口実に過ぎない

だからBetter Cとかは全く関係ない
ただ単に目的は「そいつの能力を制限したい」
これだけ
2018/11/25(日) 00:21:47.13ID:zFZWesGa0
だから>>489の思想は教育に名を借りた能力制限だよ
敗戦国の植民地でよくよく見られる思想だ
ハッキリ言えば危険思想、撲滅した方がいい
2018/11/25(日) 00:55:56.60ID:/03oe8m30
こういう中二病みたいなやつ増えたな
こういうのに限って一度もまともなソフト書き上げてない
529デフォルトの名無しさん (ワッチョイ 83b3-A3/R)
垢版 |
2018/11/25(日) 01:11:41.31ID:0mYB5fkb0
リファクタリングすると重いソフトになる。
何故なのか。
2018/11/25(日) 03:06:29.17ID:dzula6mP0
>489みたいなのは、よくあることだろう?
大抵はコーディング規約で、なんらか制限したりとかしていると思うけど。

そもそもC++を使えるプログラマが、そんなにいるとは思えない。
EffectiveC++を知らない(”読んでない”でなく)プログラマも数多くいる。
チーム全員がと言うことになると、一番下の人に合わせることになるだろう。
2018/11/25(日) 04:44:35.38ID:bdma9Nzw0
1. 入門書
2. Effective 何々
3. 逆引き・レシピ本
4. メタプログラミング

どの言語でも、この順番。
3まで読んで、そこからプロ!

1だけの開発者は、素人だろw
2018/11/25(日) 05:21:48.71ID:0mYB5fkb0
高橋マナ著やさしいC++。
2018/11/25(日) 07:41:16.76ID:tOsyjBp30
C++ boost.asioについて質問です。
boost::asio::ip::tcp::acceptorのasync_acceptはスレッドセーフ?
サーバーを実装するとき1ポートで1acceptorになるはずだけど
このacceptorは複数のスレッドからasync_acceptしても大丈夫?
一つのacceptorを複数のスレッドでacceptするのはパフォーマンスの観点からも良いですか?
534679 (アウアウカー Sa87-ZX3B)
垢版 |
2018/11/25(日) 08:03:57.75ID:ae+bi37xa
>>531
ポイントカードやクレジットカードのデータを読み込んで表示させるプログラム自作する営業がいる一方で、
プログラマーとして入って何も出来ない奴もいる。
(こう言うのは早々に消えるが)

実力じゃなくて、何が主な収入かでプログラマーと言われてる所はある。

まあ、あれはプログラマーが外人で、都合の悪い事は認めないから証拠集めに仕方なく覚えたスキルってのもあったかもだけど。
535デフォルトの名無しさん (ワッチョイ 239d-A3/R)
垢版 |
2018/11/25(日) 09:47:53.23ID:2raeFUr40
>>533
スレッドセーフかどうかなんて簡単に調べられるんじゃない?
セーフかどうか調べる方法がわからんの? 先ずはその調べる方法を確立したほうが
いいんではない?
2018/11/25(日) 10:03:03.47ID:x3zl9kFB0
そんなものあるのか
2018/11/25(日) 10:55:12.29ID:muUUE+vN0
>>533
https://www.boost.org/doc/libs/1_68_0/doc/html/boost_asio/reference/ip__tcp/acceptor.html#boost_asio.reference.ip__tcp.acceptor.thread_safety

共有オブジェクトはスレッドセーフではない様子
2018/11/25(日) 11:08:44.99ID:RzG0cEVO0
>>529
それアホなリファクタリングしてるだけだろ w
2018/11/25(日) 15:23:23.22ID:kV357oGtM
OOPをやりたいんですけど、C++やったことありません
Smalltalkを勉強したほうがいいですか?
2018/11/25(日) 16:02:56.45ID:FjBIbaie0
そういうアプローチもあるだろうね

求めるものがサイエンスなのかテクノロジーなのかで
選んだらいい
541デフォルトの名無しさん (ワッチョイ cf81-GWSg)
垢版 |
2018/11/25(日) 17:20:24.93ID:tOsyjBp30
>>535
>>537
ありがとうございます。
勉強します。
2018/12/04(火) 20:28:11.90ID:/xOJWoqIa
メンバ関数の末尾に&や&&がつくのって何か意味があるのですか?

constやnoexcept、volatileはわかるのですが・・・
2018/12/04(火) 20:36:07.22ID:JesHgwEq0
>>542
これのことか?
https://cpprefjp.github.io/lang/cpp11/ref_qualifier_for_this.html

おそらくほとんどの人が知らないだろうし俺も使ったことがない
2018/12/04(火) 20:57:45.56ID:17CDnqE60
代入演算子に左辺値参照修飾しとくと、右辺値に代入できなくなったりする
他はなんかあるかな・・・
2018/12/04(火) 21:58:17.69ID:/xOJWoqIa
C++11で追加だったのね。ありがとうこざいます。
2018/12/05(水) 00:32:10.11ID:IHVRryeE0
https://kagasu.hatenablog.com/entry/2017/05/02/120156

このページで、例えば

ifs.imbue(locale(locale::empty(), new codecvt_utf16<wchar_t, 0x10ffff, consume_header>));

というのがあって、locale()の第二引数でnewされたものがありますが、
これをdeleteする記述が見当たりません。
他のページでも同様です。
リークしてそうで怖いのですが、一体どこでdeleteされてるんでしょうか??
2018/12/05(水) 01:09:33.49ID:TcB8ybQf0
>>546
参照カウント方式で管理されてて、デストラクタでdeleteされます
2018/12/05(水) 01:12:09.10ID:IHVRryeE0
>>547
素晴らしい!
RAIIですね。
安心しました。
ありがとうございました!
549デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 18:46:56.03ID:ASlfAML90
普通にどうプログラムを書いていいのかわらないので
質問したいのですがよろしいですか?
すれ違いならすいません
550デフォルトの名無しさん (ワッチョイ 1723-C97y)
垢版 |
2018/12/05(水) 18:51:05.82ID:kX9gokKe0
書いてみ
551デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 19:04:59.96ID:ASlfAML90
図1
000
000
000
図1の0の部分を0から9までのすべての数字に置き換えたものを
表示して変数に格納する
図では3X3にしましたがnXnだとしてください。
説明が下手かもしれませんがよろしくお願いします
552デフォルトの名無しさん (ワッチョイ 1723-C97y)
垢版 |
2018/12/05(水) 19:17:46.46ID:kX9gokKe0
0から9までのすべての数字は10個あるが
場所は9個しかないがどうするの
553デフォルトの名無しさん (アウアウウー Sa47-+RRK)
垢版 |
2018/12/05(水) 19:19:02.10ID:A1G7ulzba
表示も必要?
554デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 19:34:26.69ID:ASlfAML90
説明が下手ですいません
236
000
011
こんな感じで9か所すべてに0から9まで入ったものを全パターン格納したいです 
555デフォルトの名無しさん (ワッチョイ 237f-C0zt)
垢版 |
2018/12/05(水) 19:44:08.41ID:3dIXAL6A0
変数に全パターン格納するのは死ぬほどメモリ食うな
2018/12/05(水) 19:51:44.72ID:SKoNUOBmM
294
753
618
557デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 19:55:45.26ID:ASlfAML90
.csvにして出力したいので
excelで手打ちするよりはいいのかなと
2018/12/05(水) 20:42:06.10ID:GtowYFeTM
たぶん、20GBほど必要だけどいいんか?
全パターンにこだわらず、乱数で必要な数だけ生成したほうが良いのでは?
2018/12/05(水) 20:46:39.65ID:GtowYFeTM
おっとinodeの最小サイズがあるから100倍くらいかしら
2018/12/05(水) 21:02:47.61ID:OZlj6GiF0
それは3*3を1次元で考えると
0 0 0 0 0 0 0 0 0
から1ずつ増やして
9 9 9 9 9 9 9 9 9
まで表示して全パターンを変数に格納ってこと?
単純に1桁1バイトで考えると1パターンにつき9桁9バイト必要なので、格納領域だけで9000000000バイト=約8.4ギビバイト必要なんだけどそういうこと?
1000パターン/秒の速度で表示したとしても104日かかる計算になる。
課題か何か知らないけど、問題を勘違いしてるのでは?
561デフォルトの名無しさん (ワッチョイ 1a61-2OVW)
垢版 |
2018/12/05(水) 21:04:45.27ID:zPVAi42/0
>>551
0からN×N桁の 10進数
562デフォルトの名無しさん (ワッチョイ 0bb3-hzet)
垢版 |
2018/12/05(水) 21:04:58.31ID:RkaIFTNe0
3*3だったら要素数9の配列を用意してループで回せばいいだけじゃないの?
2018/12/05(水) 21:12:05.38ID:8vnwU0Eo0
9!≒36万行のcsvが欲しいのか?

4x4だと16通りで16!=20?922?789?888?000
おおよそ21京行のcsvファイルが出来上がる

5x5だとwikipediaにもoeisにも載ってないが
15,5112,1004,3330,9859,8400,0000 らしいので
15.5穣行のcsvファイルが出来上がる
Yが一歩手前の??なんで、世界中の記憶媒体を寄せ集めても足りるかどうか・・・

6x6だと36!の
37,1993,3267,8990,1217,4679,9944,8150,8352,0000,0000
37正
csvファイルを作り終える前に人類滅亡するレヴェル
564デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 21:19:06.30ID:ASlfAML90
実際に必要なのは160万通りぐらいだけど無理?
無理なら諦めます
2018/12/05(水) 21:23:57.37ID:wa0lRPZw0
全ての場合分けを検討できないから、枝刈りしようよ。
566デフォルトの名無しさん (ワッチョイ dbe7-hzet)
垢版 |
2018/12/05(水) 21:25:59.07ID:ASlfAML90
すいません諦めます
ありがとうございました
567デフォルトの名無しさん (ワッチョイ 0bb3-hzet)
垢版 |
2018/12/05(水) 22:03:07.79ID:RkaIFTNe0
諦めたらそこで終了だよ!!!
2018/12/05(水) 22:07:49.82ID:wa0lRPZw0
糸冬 了
2018/12/05(水) 22:08:02.64ID:u9wJX+Xt0
全パターン網羅じゃなくてピックアップでいいなら乱数という手段もありでは
570デフォルトの名無しさん (ワッチョイ 0bb3-hzet)
垢版 |
2018/12/05(水) 22:14:00.75ID:RkaIFTNe0
蟻ちゃん、なに終わらせてんのさ。
2018/12/05(水) 22:59:00.47ID:9Lrh1TK3a
乗り遅れた…
鏡像とか回転の扱いをどうするかとか
楽しそうな課題だな
2018/12/06(木) 04:47:25.11ID:bHPTeUA/0
N×N のテーブルを N 種類の値同士の演算結果と考えて
その演算結果が群の性質を満たすパターンだけを取り出す
というような課題はやったことがあるな。

群論的には値の個性は意味がなくて、
たとえば全ての 1 と全ての 2 を交換したようなパターンは
等しいという扱いになってしまうので、
それを除去するのが面倒だった。

いや、この話題の流れには関係ない話なんだけど >>571 を見て思い出したもんだから。
2018/12/06(木) 07:30:52.06ID:OnZIks560
日記帳
2018/12/06(木) 10:06:21.52ID:ijJePQDkM
ZDDかお姉さん問題でggr
2018/12/06(木) 23:01:59.32ID:CWnIHGMVH
vector A に vector B を部分代入することってできないの?
つまり、代入後は vector B が vector A の部分vectorになっててほしい
2018/12/06(木) 23:06:11.56ID:7A1Pu7RI0
insert
2018/12/07(金) 02:03:39.38ID:vYfFg2B+0
std::copyでどう?
2018/12/07(金) 02:14:13.85ID:MQVHpO7o0
部分vectorって言ってるから、Bを参照扱いで挿入出来ないかってことじゃないの?
Bを書き換えたらAにも反映されるみたいな。
まぁ、vectorじゃ構造上無理なんだけど。
579デフォルトの名無しさん (ワッチョイ 0123-GoBb)
垢版 |
2018/12/07(金) 14:42:20.03ID:lkrG/qbb0
slice
2018/12/07(金) 23:37:48.83ID:iNxdNg3x0
>>572
>N×N のテーブルを N 種類の値同士の演算結果と考えてその演算結果が群の性質を満たすパターンだけを取り出す
すごく興味がありますね…
準同型を検出するのが難しそうですが、ガウス吐き出し法で同一解(ただす解を小さいもの順に並べなおす)を弾くようにするだけでなんとかなりますか?
ググッてみると、位数12 の群のひとつは、巡回群でも巡回群の直積でもない、これより低位には現れなかった新たなパターン、らしいのです、これはどんな群なのか具体的に知りたいものです
2018/12/08(土) 08:26:12.03ID:qW/ttJcB0
>>580
とうほぐの人?
2018/12/08(土) 08:34:46.70ID:Cv6IL/oI0
小さい群ならいいだろうけど、散在型単純群が出てくるサイズになっても対応できるかな
2018/12/08(土) 13:35:08.63ID:cc77YSwU0
using FUNC = std::function<void(Params&)>;

struct Params {};

template<> std::tuple<> convert_params(const Params&) { return {}; }
template<> std::tuple<int> convert_params(Params& p) { return 0; }

template<typename... Args>
inline static auto message_handler(void(*func)(Args...))
{ return [=](Params& m) { std::apply(func, convert_params<std::tuple<Args...>>(p)); }; }

template<typename... Args>
inline static auto message_handler(std::function<void(Args...)> func)
{ return [=](Params& m) { std::apply(func, convert_params<std::tuple<Args...>>(p)); }; }

template<typename T, typename... Args>
inline static auto message_handler(void(T::*func)(Args...), T* obj)
{
 assert(obj != nullptr);
 return [=](Params& m)
 {
  std::apply(func,
   std::tuple_cat(
    std::tuple<T&>(*obj),
    convert_params<std::tuple<Args...>>(p))
   );
 };
}
2018/12/08(土) 13:35:36.54ID:cc77YSwU0
↑の続き

前の投稿で定義した関数を使い、下記の通りに呼び出そうとしているのですが
std::functionを通さずにラムダ直で呼び出した場合に、なんとなく上手にやってくれる
方法がどうしても思いつけません。何か手はないでしょうか?

1 void myfunction(int);
 FUNC func = message_handler(myfunction); // OK グローバル関数

2 void myclass::myfunction(int);
 FUNC func = message_handler(myfunction, this); // OK メンバ関数

3 FUNC func = message_handler([](int){}); // NG ラムダ直

4 std::function<void(int)> myfunction = [](int){};
 FUNC func = message_handler(myfunction); // OK std::function
2018/12/08(土) 13:43:44.31ID:7QrgfN7v0
頭に+つけると上手くいくと思う
FUNC func = message_handler(+[](int){});
2018/12/08(土) 14:25:14.54ID:cc77YSwU0
>>585
あれ、マジでうまくいきました。
調べ方がいまいちわからないのですが、これはどういった機能でしょうか?
2018/12/08(土) 14:29:45.48ID:cc77YSwU0
すみません、お礼を言い忘れています。
ありがとうございます。
2018/12/08(土) 14:59:08.12ID:7QrgfN7v0
>>586
std::decayと同じ働きをするようなもので、ラムダ式を同等の関数ポインタへ変換する(ただしキャプチャをしてはいけない)
なんて調べればいいのかはよくわからない・・・
2018/12/09(日) 14:22:21.02ID:xJ41Kt/M0
突然すまんが、
winnt.h の中に次のような構造体定義があって、外部では、構造体タグ名
_RTL_CRITICAL_SECTION が不完全定義すらもされないで、
_RTL_CRITICAL_SECTION_DEBUG の中でポインタのために使用されている。
仮にこれで、「内部クラス」扱いにならないのだとすれば、
逆に、「内部クラス」を使いたい場合、もし完全定義を与える前に、
不完全なままポインタのために使いたい場合は、どうしたらいいのだろう?

typedef struct _RTL_CRITICAL_SECTION_DEBUG {
WORD Type;
WORD CreatorBackTraceIndex;
struct _RTL_CRITICAL_SECTION *CriticalSection;
LIST_ENTRY ProcessLocksList;
DWORD EntryCount;
DWORD ContentionCount;
DWORD Spare[2];
} RTL_CRITICAL_SECTION_DEBUG,*PRTL_CRITICAL_SECTION_DEBUG;

typedef struct _RTL_CRITICAL_SECTION {
PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
LONG LockCount;
LONG RecursionCount;
HANDLE OwningThread;
HANDLE LockSemaphore;
DWORD Reserved;
} RTL_CRITICAL_SECTION,*PRTL_CRITICAL_SECTION;
2018/12/09(日) 14:26:38.84ID:xJ41Kt/M0
確か、構造体タグ名は、ブロックに名前空間があって、C と C++ で仕様がごちゃごちゃしていた
気がした。
確か、既に定義がある場合は、それが定義された段階の名前空間を使うが、
完全に新規に定義する場合は、最も内側のブロックの名前空間に登録される、という
感じだった気がしたんだけど。

一度も外部では定義も宣言もしなかった場合、最も内側のブロックの名前空間に登録されるの
だとすれば、クラスや構造体内部の内部クラスに関してもそれの応用になって・・・、と思うんだが、
少なくとも、旧来の C のヘッダファイルでは、その解釈ではまずいことになっている気がする。
591デフォルトの名無しさん (アウウィフ FF05-GoBb)
垢版 |
2018/12/09(日) 14:59:08.32ID:rgDJoSoNF
struct _RTL_CRITICAL_SECTION;
って行があるんじゃね
2018/12/09(日) 15:15:39.34ID:LCYDMKL+0
不完全な型はそれを解決する必要があるときに完全な定義が得られればいいんで、
それがどこの名前空間に存在するかについてもそのときに解決できればよかったはず。
2018/12/09(日) 17:56:05.02ID:xJ41Kt/M0
>>591
無い気がする。

さっき思ったんだけど、C++ の場合、winnt.h の大部分は、extern "C" {・・・} で囲まれて
パースされて、旧来の C の仕様のままになるので、内部クラスの概念が無いから
あれでいいのかも知れない???
2018/12/09(日) 18:15:26.56ID:xJ41Kt/M0
>>592
_XXX_DEBUG の方で、_RTL_CRITICAL_SECTION を _XXX_DEBUG の構造体に所属する
「内部クラス」 に解釈してしまった場合、外側の _RTL_CRITICAL_SECTION では、
タグ名としては同じ名前であっても、コンパイラにとっては全くの別の構造体に見なされて
しまうので、たとえば、ポインタを代入する際に、
 「異なるポインタ型への代入がある」
などのエラーが出る可能性がある。
2018/12/09(日) 18:24:17.47ID:hgaiHSHh0
>>593
extern はリンケージを制御する仕組みで、
extern "C" にしても文法の解釈には影響を与えない。
C として解釈されたりはしないはず。
2018/12/09(日) 18:24:29.50ID:LCYDMKL+0

その「内部クラス」 の定義は存在しないんだから。
2018/12/10(月) 11:35:19.25ID:z9e5AxLyM
何のための不完全型かと
型の中身を意識する必要はない
リンケージなんか関係ない
2018/12/10(月) 13:10:56.95ID:Hs8Qkrq90
>>597
不完全定義でも、厳密にどの構造体かは区別されている。
2018/12/10(月) 21:40:39.61ID:merQK3Z90
不完全型でいけそう
https://ideone.com/SFcGAQ

内部クラスと解釈はされないみたい(内部クラスと解釈されたらリンクリストで困るような)
https://ideone.com/DcYHNu

詳しい仕様は誰かプリーズ
2018/12/10(月) 23:34:55.84ID:Hs8Qkrq90
>>599
>(内部クラスと解釈されたらリンクリストで困るような)

しかし、外部クラスと解釈される場合は、本当に内部クラスにしたい場合で、
それ自身が自己参照を持つリンクリストにしたいような場合に、逆に困る
事になるかも知れない。
2018/12/10(月) 23:43:57.33ID:ba1HqxVH0
struct Bの定義は内と外両方同時に存在し得て、検索順で近い方に解釈されるというだけだろ。
何を心配してるのか。
2018/12/10(月) 23:48:43.81ID:Hs8Qkrq90
>>601
別の名前空間の構造体だと解釈されれば、ポインタの代入も出来ない。
2018/12/11(火) 01:46:14.52ID:sJmjlCIC0
>>589
このようにしたらいい。
struct _RTL_CRITICAL_SECTION;
struct _RTL_CRITICAL_SECTION *CriticalSection;

https://timsong-cpp.github.io/cppwp/n4659/basic.lookup.elab#2
https://timsong-cpp.github.io/cppwp/n4659/basic.scope.pdecl#7
2018/12/11(火) 08:05:37.73ID:ULPnecUk0
>>602
1つのコンパイル単位内でそれはないだろ。
2018/12/11(火) 09:54:05.21ID:CMkzN/Tv0
>>589
変数の宣言をした時点で解決可能なクラスが使われるというしごく当たり前な結果に。
https://ideone.com/JyKDmi
https://ideone.com/gTeZlX
https://ideone.com/uPjViG

解決不可能だった場合は、一番近いnamespaceから選択される
https://ideone.com/LpC58v
2018/12/11(火) 10:10:46.46ID:CMkzN/Tv0
>>605の一番近いnamespaceからというのは嘘でした
×https://ideone.com/LpC58v

正しくは、解決不可能だった場合は、同じ階層から選択されるみたい。

AとBがともにNS2に存在する場合
https://ideone.com/m5leMs

コンパイルエラー。 AがNS2 Bがひとつ外側のNS
https://ideone.com/9IY4BC

同階層にBがない場合、グローバルからも選択されることはない。
https://ideone.com/cMhwpW
2018/12/11(火) 10:13:00.28ID:CMkzN/Tv0
コンパイルエラー。 AがNS2 Bがひとつ外側のNS
× https://ideone.com/9IY4BC
https://ideone.com/JOSLLa
2018/12/11(火) 14:13:57.27ID:TeIOtXwo0
>>604
ある。
単に人間に見えているタグ名が同じというだけで、コンパイラ内部では、
全く別の識別番号(というより、通常、コンパイラ内部の構造体定義データの先頭アドレス)
になっており、タグ名が同じでも識別番号が異なれば、全く別物と扱われる場合がある。
2018/12/11(火) 15:07:44.16ID:TeIOtXwo0
>>603
ものすごい微妙な動きをするみたいだ・・・。
struct Base の定義を見てみると、外側に既に struct Data が定義されていても、
なぜか、Data は、「nested Data」すなわち、Baseの内部クラスの方を「参照」して
しまうらしい。規則性はどこにあるんだろう。まだ英文読んでないけど。

struct Node {
struct Node* Next; // OK: Refers to Node at global scope
struct Data* Data; // OK: Declares type Data
// at global scope and member Data
};

struct Data {
struct Node* Node; // OK: Refers to Node at global scope
friend struct ::Glob; // error: Glob is not declared, cannot introduce a qualified type ([dcl.type.elab])
friend struct Glob; // OK: Refers to (as yet) undeclared Glob at global scope.
/* ... */
};

struct Base {
struct Data; // OK: Declares nested Data
struct ::Data* thatData; // OK: Refers to ::Data
struct Base::Data* thisData; // OK: Refers to nested Data
friend class ::Data; // OK: global Data is a friend
friend class Data; // OK: nested Data is a friend
struct Data { /* ... */ }; // Defines nested Data
};
2018/12/11(火) 15:29:10.50ID:TeIOtXwo0
【違いの分析】

1. 外部クラスを参照したい場合の書き方:
struct Data {
 struct Node* Node; // OK: Refers to Node at global scope
 ・・・
};

2. 内部クラスを参照したい場合の書き方:
struct Base {
 struct Data; // OK: Declares nested Data
 ・・・
};

【考察】
後者の方は、「『宣言子』を「何にも書かずに」、ただ不完全定義として、
「struct Data」と書いている。こういう独特の特徴的な書き方で、
新しいタグ名の導入と見なされているのではないか。

一方、前者の方は、 「struct Node」だけではなく、「*Node」という「宣言子」を
書いてしまっているので、新しいタグ名の導入とは見なされない気がする。


先日書いた、CRITICAL なんたらの例では、宣言氏を書いていたので、「1」
の方の扱いとなり、外部クラスの参照と見なされた・・・。
2018/12/11(火) 15:34:19.91ID:pCenHJYt0
>>609
D&E の 6.3.1 にそのあたりの解説があるので読んでみると面白いかも。
「病的な例」を含めてわかりやすい解決ルールを作ろうと奮闘したあげくに
まあまあマシなルールとしてそうなったって感じ。
2018/12/11(火) 17:25:37.23ID:TeIOtXwo0
>>611

結局、>>610 のような結論であってるのかな?
613デフォルトの名無しさん (ワッチョイ 2b80-Po2/)
垢版 |
2018/12/11(火) 22:53:03.48ID:yA4tg2d20
ぜんぜん違う
ポインタだからサイズが決定できることになる

ポインタなら前方宣言で前方参照できる
2018/12/11(火) 22:54:56.40ID:essnCSQz0
2. のほうは構造体を宣言してるから、そこに新しく nested class が作られてる。
1. のほうは構造体へのポインタを宣言してるから、対応する構造体を探して外部の定義を見つけてる。

そんなに微妙でもないと思う。
2018/12/11(火) 22:59:45.95ID:yA4tg2d20
そもそもポインタでない場合、前方宣言でなくクラス(もしくは構造体)の宣言がないと
インスタンスのサイズが決定できないし
コンスタラクトタも呼び出せない

普通にコンパイルエラーになる

クラス(もしくは構造体)のメンバにアクセスする場合も同じく
前方宣言でなくクラス(もしくは構造体)の宣言がないと
メンバがわからない

普通にコンパイルエラーになる
2018/12/11(火) 23:02:27.89ID:yA4tg2d20
ポインタもしくは&の参照だけなら
前方参照だけで問題はない

マジで頭悪いシロウトしかいない
2018/12/11(火) 23:59:39.80ID:6HVoAQt60
おじいちゃん今はタグ名前空間の話でしょ
不完全型のポインタが完全型になる話なんか今更ドヤ顔でしても恥ずかしいだけだよ
2018/12/12(水) 00:09:55.89ID:1Fc61En10
また低学歴知恵遅れが的外れなこといってるし
低学歴知恵遅れってなんでこんな頭悪いん

頭悪いくせに頭悪いレスをする
2018/12/12(水) 00:10:41.87ID:1Fc61En10
まず低学歴知恵遅れはC/C++言語の特性すらわかってない
2018/12/12(水) 08:26:27.80ID:G3zhlg3lM
半角恥ずかしいな
さすが低学歴
2018/12/12(水) 08:48:09.25ID:RRyKxOPE0
>>614
C/C++ では、ある1つの宣言で、ポインタ変数を定義する場合でも、それと同時に構造体の
宣言(定義)が行われる事がある。たとえば、
TYPE *ptr; は、ポインタ変数の ptr を定義しているが、TYPE の部分が
struct TPerson { ・・・ }
だった場合は、変数 ptr の定義と同時に、構造体 TPerson も定義する。
さらに、TYPE の部分が、
struct TPerson
であった場合も、不完全定義として構造体 TPerson を定義することがある。
実際、先に挙げた例では、1つの行で、全く始めて _RTL_CRITICAL_SECTION 構造体が
出てきて、その不完全定義と同時にその構造体へのポインタ型のメンバ変数を宣言
していた。
2018/12/12(水) 21:29:50.61ID:6r+JK94x0
型が struct TPerson みたいに書かれてて、 TPerson の宣言が見つからない場合、そこで TPerson が前方宣言されたものとして扱われる。
この前方宣言は一番内側の namespace かブロックに所属する扱いになる。

要するに一部の前方宣言は省略できるってだけだよ。
2018/12/12(水) 22:39:31.89ID:rtWaVZVk0
>>610における2の書き方が新しいタグ名の導入と見なされる、というのが特殊ルールなだけで
あとは>>613でおk
オール無問題
2018/12/12(水) 22:45:13.11ID:rtWaVZVk0
>>622
>>610における2の書き方を前方宣言と解釈するなら、
構造体定義の中で前方宣言可能なブツが他にはfriendぐらいしか無い件について:
(externは書けない、staticは別の意味になる
しかもfriendは直後に完全型かポインタか参照を要求するですしおすし、
struct Data;という構文の際立ったユニークさは明らかすぐる…
2018/12/12(水) 22:55:10.10ID:rtWaVZVk0
ていうかstruct Data;という構文には構造体の定義ブロックの外に書いたとき発動する存在意義が別にあるが
そちらは前方宣言と言って良いかも試練、
2018/12/12(水) 23:07:33.30ID:rtWaVZVk0
こういうやつ↓↓↓

struct Data;

struct Foo {
  struct Data* m_pData; // struct Fooはstruct Dataへのリンクを有する
  /*....*/
};

struct Data {
  struct Foo* m_pFoo; // Dataはstruct Fooへのリンクを有する
  /*...*/
};

そもそもなんで型の名前やクラス名だけではなくて、タグ名なんてものが存在し続けているのかというと、
struct Data;というのがやりたかったから、およびその必要が(上のようなケースで)あったからに他ならない
2018/12/12(水) 23:22:51.72ID:0D13QgVz0
>>624
struct Data* ptr;の記法が特殊なだけで、
struct Data;は一貫して前方宣言なのでは?
2018/12/13(木) 00:40:06.98ID:6BRdw/E00
>>627
>struct Data* ptr;の記法が特殊なだけで、
(不完全型)* ptr; とされてもコンパイラはptrへの代入や関数に引数渡しするコードを問題なく吐けるから
int val; というのと大して変わらない話
コンパイラにとってはスゲー普通の日常業務

>struct Data;は一貫して前方宣言なのでは?
前方宣言というには>>610における2の書き方で新しいタグ名の導入と見なされるという挙動がビョーキ
もはやそれは内部クラスの定義にほぼ等しい(不完全な定義というだけ
2018/12/13(木) 00:47:56.23ID:fs9Sguzb0
struct Data* ptr;の記法が特殊な根拠

struct A {
 struct Data* ptr; // as ::Data
2018/12/13(木) 00:52:46.20ID:fs9Sguzb0
struct Data* ptr;の記法が特殊な根拠

struct A {
 struct Data* ptr; // ::Data
};

struct A {
 struct Data;
 struct Data* ptr; // A::Data
};


前方宣言のあるなしで、解釈の変わるstruct Data* ptr;の記法はやっぱり特殊なんだと思うけど。
C++において、不完全な型という概念はあるけど、不完全な定義という概念はないのでは?
2018/12/13(木) 00:59:11.60ID:fs9Sguzb0
struct A { struct Data* ptr; };
と記述した場合、そこからたどれる名前空間のどの階層であっても
事前に宣言または定義が行われていれば、その時点で特定可能なstruct Dataへのポインタと解釈されるけど、

解決不可能であった場合には、struct Aと同階層にあるstruct Dataとみなされる <- この動作が特殊
2018/12/13(木) 01:06:53.33ID:RmgWred00
アタリマエじゃん
バカなのかな?
2018/12/13(木) 01:25:06.35ID:6BRdw/E00
struct Bar;が前方宣言では「ない」という主張は撤回する
なぜなら、次のコードの(A)、(B)のコメントアウトを外しても
それ自体はエラーにならない(つまりstruct Bar; は同一スコープ内で重複が許される
このときは(D)でエラーになる

しかし、(A)と(B)をコメントアウトすると何のエラーにもならない
むしろstruct Bar* m_pBar; の方が普通に前方宣言的に働く(Fooのスコープに縛られない

#include <stdio.h>
struct Foo {
//struct Bar; // (A)
//struct Bar; // (B)
struct Bar* m_pBar; // (C)
};
struct Bar {
int x;
int y;
};
struct Bar* g_ptr;
int main()
{
Foo test;
test.m_pBar = g_ptr; // (D)
}
2018/12/13(木) 01:32:49.21ID:6BRdw/E00
ちょっち訂正
△: struct Bar;が前方宣言では「ない」という主張
○: 構造体の定義ブロック内のstruct Bar;が前方宣言では「ない」という主張

で、struct Bar* m_pBar; の方が普通に前方宣言的に働く(スコープローカルな新たなタグBarを作ったりしない)のに --(1)
構造体の定義ブロック内のstruct Bar;は明らかにスコープローカルな新たなタグBarを作り出すという変態機能を有している --(2)

つまり(2)を指して一貫して前方宣言だと主張するなら、(1)のstruct Bar* m_pBar;も前方宣言の一種だと言わねば不正直である
2018/12/13(木) 01:52:26.13ID:397gSR3k0
>>634
構造体の定義ブロック内のint i;は明らかにスコープローカルな新たな変数iを作り出すんだけど、
それも変態機能だと思うの?
2018/12/13(木) 02:46:28.04ID:5hqeTMOU0
(1) が前方宣言的に働く理由は >>622 で説明したんだけど、通じなかったかな…
2018/12/13(木) 08:36:49.07ID:fs9Sguzb0
>>634
>struct Bar;は明らかにスコープローカルな新たなタグBarを作り出す

構造体定義ブロック内に限らずとも、前本宣言はもともとすべてスコープローカルだけど。

それはグローバルであっても、中間階層の名前空間であっても、
多重ネストの構造体の中間階層で会っても同じ。
638デフォルトの名無しさん (ワイーワ2 FF42-yWnt)
垢版 |
2018/12/13(木) 13:11:12.72ID:zFPTCGevF
拘ってる人は自前でコンパイラでも作ろうとしてるのか?
2018/12/13(木) 16:31:01.00ID:jSkPpV300
>>615
ポインタでない場合というと

struct aho;

struct boke
{
aho begin();
aho end();
};

こういうのもあるな
2018/12/14(金) 15:03:53.29ID:TcnBR/ER0
最初に質問を書いた者だが、この話は、実は仕様が決まっていて、
記憶だと、手元にある ARM(Annotated Reference Manual) にも、確か
何か書いてあった。

見るのがメンドクサくてここに質問を書いたんだ。スマン。
641デフォルトの名無しさん (ワッチョイ 2b23-yWnt)
垢版 |
2018/12/14(金) 17:33:38.94ID:6VLPSm+70
3日で忘れる脳みそ
2018/12/14(金) 20:33:44.26ID:PXFrjbZo0
レスdクス、

>>636
なるほどスゲーよくわかりた

>>635
構造体の定義ブロック内のint i;は2回同じものを書いたらエラーになるから宣言ではなくて定義じゃわパオーン
構造体の定義ブロック内のint i;は2回同じものを書いたらエラーになるから宣言ではなくて定義じゃわパオーン

その他の方々もだいたいおk
2018/12/15(土) 18:02:44.15ID:9IWy3eNma
プログラム間でデータ共有する方法はメモリ共有とファイル経由以外に何がありますか
2018/12/15(土) 18:19:26.83ID:a5AQAbac0
>>643
RPC
2018/12/15(土) 20:09:27.38ID:0fkVwVva0
>>643
・WM_COPYDATA メッセージで送り合う。
2018/12/15(土) 20:24:45.65ID:l0ksdq3r0
>>643
Windows ならメールスロットとパイプもアリかな。
2018/12/15(土) 20:36:21.43ID:NSrOcjuo0
質問者の意図がようわからんが
データ本体(スゲー巨大かもしれない)の共有にいちいち通信時間を要する手段は除外されるんじゃ…
やっぱプロセス間の同期をミューテックスか何かのプロセス間でも使える同期オブジェクトまたはソケット通信とかでとる前提で、
データ本体のはメモリ共有かファイルという手段になるのではなかろうかと、
2018/12/15(土) 21:19:09.14ID:hAY8T09E0
>>643
OpenClipboard
2018/12/15(土) 21:55:14.09ID:px2y3yP70
ファイル渡しの方が通信よりよっぽど時間がかかると思うが。
2018/12/15(土) 22:03:48.34ID:hAY8T09E0
オンメモリのはずの処理が秒待たされて・・・
2018/12/15(土) 22:05:56.86ID:NSrOcjuo0
>>649
共有のニーズが生じてからファイルを作るのならそうだが
最初から共有データとしてファイルが存在する場合はそうではない
というわけで質問者の意図にはようわからん点がある
2018/12/15(土) 22:15:15.80ID:px2y3yP70
ディスクアクセスの遅さ考えたらわかるだろ、ふつう。
2018/12/15(土) 22:47:45.19ID:NSrOcjuo0
>>652
想像力が欠如すぐる…
共有しようとするデータのサイズが1 TBなら、全部送ろうとしたら3GB/sの転送速度でも333秒かかる
ファイルを1個置いといてfseek()する方がまだまし
2018/12/15(土) 22:51:21.25ID:a5AQAbac0
たった一行の素朴な質問からどこまで膨らませられるかコンテスト開始
2018/12/15(土) 22:54:08.01ID:NSrOcjuo0
通信推しの人としてはそう言いたくなる気持ちもワカル
2018/12/15(土) 22:58:01.76ID:px2y3yP70
1TBのデータ共有するのにファイルからは1TB読まなくてもいいという謎比較。
657デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/15(土) 23:09:43.46ID:8aRCy95z0
同一の計算機で何度も読むことが分かってるのに
別の計算機でディスクアクセスさせて
それを通信でやりとするアホなシステム構成にするヤツがあとを絶たないのがよくわかる

著しい低学歴知恵遅れがそういうことよくやる
658デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/15(土) 23:23:37.08ID:8aRCy95z0
世の中には常識をこえるすごい頭悪いヤツラがいるからな

何度も何度も計算機Aから計算機Bの数十ギガを超える共有ファイルの内容を計算機Aにすべて読み込んで
計算機Aで処理をなん百回も繰り返す

しかも共有に使うSamba
つまりNBT()
Windows共有とまったく同じ

つまり毎回毎回計算機Bにディスクアクセスして通信(NBT経由)使って
計算機Aで読込むということを意味する

それで遅い遅いなんでといってたからな。。。
世の中には想像を超えるこんな頭悪いのが現実にいる
2018/12/15(土) 23:35:37.00ID:NSrOcjuo0
>>656
むしろ毎回データ全部を丸ごと送る想定なら、高速な通信手段で良くて
「データ共有する」(>>643)という質問者の動機にならない件について:

メモリ共有であれば通信より高速を目指す目的で毎回データ全部を丸ごと送る風に使われることもあるが
質問者>>643は共有手段として「ファイル」も挙げているから
いきなりそこまで話を限定できないワケ
2018/12/15(土) 23:49:56.32ID:NSrOcjuo0
んまー今思いついたがメモリ共有やファイルの他には
データベースみたいなデータを出し入れ管理するプロセスなりサーバなりを設けるというのも
>>643の答えに含まれるのかもしれん…

>>656の思い込みとはうらはらに、
データベースXにアクセスするプロセスA、Bは、明らかにXが管理するデータを共有しているが、
Xの管理するデータ丸ごとを毎回送りつけ合うわけではないし、
2018/12/16(日) 08:13:31.96ID:OmvADhcW0
なんか長々と書いているようだが、全部送ろうが一部だろうが正しく同条件で比較すれば一目瞭然だろう。

1. プロセスAが巨大なファイル中の一部のデータの読み込みをファイルシステムに要求する
2. ストレージから読みだされたデータが返される

1. プロセスAがプロセスBが持つ巨大なデータ中の一部のデータをRPCで要求する
2. プロセスBからデータが返される
2018/12/16(日) 08:26:49.11ID:sqE5CAYo0
>>660
データベースなら例えばSQLでやりとりやね
既にオンメモリで数ギガ扱うのに対応してるしプログラム間通信も高速
なにより統一されたプロトコルでオンメモリからネットにまでアクセスできるのが便利
2018/12/16(日) 08:37:36.18ID:OmvADhcW0
>データベースみたいなデータを出し入れ管理するプロセスなりサーバなりを設けるというのも

これを実現する手段として>>644-646のような手段があるわけだが、それ認識してなかったのか。
2018/12/16(日) 08:48:33.22ID:sqE5CAYo0
それはデータベースとは言わんのじゃ?
COPY_DATAやメールスロットはOS提供の簡易的なプロセス間通信サービス
RPCはデータ以に上さらに高度にアクセスするプロシージャ
2018/12/16(日) 09:09:15.05ID:OmvADhcW0
データをどう持つかというのはこの際どうでもよくて、>>663はそのサーバープロセスと
データをやり取りする手段の話ね。
2018/12/16(日) 12:31:06.96ID:DTKapPnl0
>>663
>これを実現する手段として>>644-646のような手段があるわけだが、それ認識してなかったのか。
>>644-646はデータを送りつけるという通信の手段のみ述べており、データ共有の実現に行き着いていない
もちろん通信だけでもプロセスAとBの間で情報の共有はできるが、
>>644-646の言説だけでは、情報を表す入れ物である「データ」の共有に行き着いていないワケ

>>644-646の言説が含意するのは、同じ情報iを、プロセスAがデータa、プロセスBがデータbとして持っている状況、
というところ止まりで、aとbは別物。さらにいうと、同じ形式のデータであることすら導くことができない

この差異は形而上の問題ではなく、現実の設計の問題である
>>644-646だけでは、AがBに情報伝達するにあたりBに通信する(通信のエンドポイントとしてBを起こす)必要があるから
Bが風邪で休んだりするとAの仕事まで止まってしまうことが確定する
一方、AがExcelシートXに情報を書き、Bが必要なときXの情報を参照する、という方式だと(他に付帯条件が無ければ)Aは問題なく仕事を続けられる
データ共有というのは後者
2018/12/16(日) 13:20:15.29ID:OmvADhcW0
今度は「共有」という言葉の定義論か。それを>>647で言っていたんならそう問題はなかったろうがな。
どっちにしても通信時間が云々というのが的外れなのは変わらない。
見苦しい。
2018/12/16(日) 13:30:30.74ID:7UXd2BE00
なぜ機能とそれを実現する手段を混同して語るかなぁ…
Excelのブック共有だってExcelアプリケーションがファイル共有とか使って頑張ってるから実現できてるんだし
そもそも>>643は手段レベルの話だし
2018/12/16(日) 13:34:08.04ID:DTKapPnl0
>>667>>668は通信でおk、と叫びつつ、ネットワークのトポロジーの差異を認識しないおマヌケちゃん
結局通信についてもデータ共有についても素人なのでした
2018/12/16(日) 14:20:42.94ID:7UXd2BE00
ネットワークトポロジー
最近覚えたのかな? w
2018/12/16(日) 16:50:47.90ID:n9CIi+tQ0
郵送が確実。
2018/12/16(日) 16:58:48.71ID:JWRTcoVNM
残念ながらリアル郵便網を使うプロトコルスタックはないので伝書鳩にした方がいい
2018/12/16(日) 17:10:47.56ID:wjNPlWwl0
伝書鳩はパケットロスの可能性が高いので冗長化が必要
2018/12/16(日) 17:24:43.78ID:lv3vm4Nk0
ループバックができる鳩は往復鳩といって
普通の伝書鳩より訓練が難しいんだぞ
2018/12/16(日) 17:39:03.15ID:wY/NrJSLa
往復とか出来たのか… あれ一方通行だと思ってたわ
2018/12/16(日) 17:49:06.67ID:i39EOxKBM
手段の話であれば極論口頭でもいいわけたが、勿論そんなこと聞きたい訳でもなし
2018/12/18(火) 13:15:19.65ID:G1V4hdx+0
>>643
実は、GDI の Device Context の HDC も、プロセスの垣根を越えて渡す方法がある、
メモリコピーは伴わずに。やり方は、PrintWindow(HWND hWnd, HDC hDC, DWORD flag)
API を使って、WM_PRINT メッセージを送るというもの。これを使えば、グラフィックデータ
ならBITMAPデータも伝達できる。たとえば、HDC を用いて GDI+ の LockBits() を
使うと良い。L。

https://mevius.5ch.net/test/read.cgi/tech/1474384848/338
678デフォルトの名無しさん (ワッチョイ 2b23-yWnt)
垢版 |
2018/12/18(火) 13:30:16.37ID:/M0/bFGF0
共有メモリにクラウドが入ってくる時代はもう来てる
2018/12/18(火) 14:51:58.63ID:RxVtOB6VM
C++を使ってる仕事につきたいのですが、どこもC++を使ってるところは組み込み系とかの経験の募集ばっかです
私はwebしかやったことないので組み込み系の経験はありません
2018/12/18(火) 15:31:06.75ID:aA/jUlRpx
>>679
ここはダーマの神殿ではない、と言いたいとこだけど、年齢によるね。
未経験でも30歳前後なら余裕、35歳超えなら諦めろ。
というか組み込み系でC++を使っている分野ってあるにはあるけどそんなに多くはないよ。
組み込みLinuxでのアプリ開発ぐらいなんじゃない?
老害から言わせてもらうとアレは組み込みソフトじゃないけど。
2018/12/18(火) 17:11:33.44ID:RxVtOB6VM
>>680
25です
Linuxでのアプリ開発分野ならあるんですね‥
別に組み込みじゃなくてもいいんですけど、探したら組み込みがほとんどって感じです
本気で探しているのですが、難しいです‥
頑張って探してみます
2018/12/18(火) 17:30:13.67ID:zLgJOfCSM
25歳なら第二新卒扱いで組み込み未経験でも全然OKよ。
募集要項に経験者って書かれてても怖がらずどんどん応募してみては?
相変わらずこの業界は人手(奴隷)不足なのでそう苦労せず転職できると思う。
売り手市場の今は転職先の会社を見極めて選り好みすることができるので、下手に妥協せず納得行くまで転職活動頑張って!
2018/12/18(火) 17:36:02.29ID:RxVtOB6VM
>>682
ありがとうございます!
目標に向かって頑張ります
相談に乗ってもらってありがとうございます
相談してよかったです!
2018/12/18(火) 17:41:07.57ID:tlRM8wuS0
普通にC++でWindowsようのデスクトップアプリ作ってるけどなあ
それように人員を募集してるかっていうとしてないけど
2018/12/18(火) 18:14:29.56ID:RxVtOB6VM
>>684
普通に羨ましいです‥
自分は中々見つからないです
2018/12/18(火) 19:02:13.39ID:/UA4EEmuM
>>680
組込でガッツリは使ってないけどBetter CとしてC++使ってる所はそれなりにあるよ
2018/12/18(火) 21:39:11.18ID:w60GoDWR0
ちっこく作って別プロセス立てするってやり方はあるけど
それ以外だと大規模なゲーム開発くらいしかあんまり聞かないな。
2018/12/18(火) 22:06:41.05ID:F4O/hB15M
なんでc++の仕事したいんだ?
言語縛りにする意味がわからんな
2018/12/18(火) 22:15:12.74ID:xgHv4hiI0
自分が使える言語で探すのはそんなにおかしいか?
2018/12/18(火) 22:16:48.41ID:tlRM8wuS0
C++じゃないとやる気起きないし
2018/12/18(火) 22:38:17.18ID:w60GoDWR0
それは異常だろ
2018/12/18(火) 23:31:30.78ID:6RhNbAj70
C++の最新仕様に詳しくてもあんまり仕事で使えないからな
メタプログラミング駆使して行数少なく書いてもぶっちゃけ大した価値ない
逆にやりすぎて嫌われるのがオチ
CPU、キャッシュ、バスアーキ、OS、ABI、Toolchain、各種デバッグ手法などを知ってる方が重要
2018/12/19(水) 00:09:24.93ID:GdGFtcE30
言語仕様詳しい癖にmake書けない奴とかいるからな
2018/12/19(水) 00:10:12.36ID:UC31GMnJ0
VisualStudioばっか使ってるからmakeかけないわ・・・
695デフォルトの名無しさん (ワッチョイ 1e80-2dqZ)
垢版 |
2018/12/19(水) 00:13:50.49ID:jOXn0Ht90
makeは依存ファイルと生成ルールをひたすら書くだけだからな
あんなしょうもないのを書けないほうがおかしい
2018/12/19(水) 00:14:21.79ID:m3ixYsdj0
自作のmake.pyなら
2018/12/19(水) 00:33:44.41ID:ct7Lx3nM0
makeは暗黙ルールとか特殊変数とか予約ターゲットとかアーカイブの特別扱いとか
罠や地雷や落とし穴が満載で人間が書くもんじゃない
2018/12/19(水) 00:38:35.31ID:PtV3oISf0
昔はmake書けないやつ馬鹿にしてたが、ひざに矢を受けてしまってな……
今いるのやや学術よりのとこなんだけど、回りがPythonばかりになってきて690の気持ちが分かってしまう
2018/12/19(水) 01:21:09.11ID:3jKO9qdxM
linuxのmakefileをwindowsで使おうとしてハマってぶん投げたのはナイショ
2018/12/19(水) 01:42:35.97ID:+UCKDvEZM
makeは泥沼、mkmfやら数多のツールすら呑み込む底無し沼・・
2018/12/19(水) 02:18:50.35ID:BcJ2DwBBd
makeからCMakeへ時代は動いている。
2018/12/19(水) 02:41:43.59ID:4vZcLUvu0
makeを書くだけなら簡単だがクロスプラットフォームで更にいくつもオプションが増えてくると人力で書くこと自体が間違いでしかなくなる
2018/12/19(水) 05:34:26.63ID:yisopo3/0
環境導入楽なGUIアプリケーション作成用ライブラリないかなぁ
QtはQtCreatorが使いづらくて
2018/12/19(水) 08:20:09.90ID:fZnQLneQ0
標準ライブラリにGUIが入らないのは何故なんだぜ?
制御系とかそもそもGUIが無い環境に実装出来ないから?
2018/12/19(水) 08:34:28.71ID:4vZcLUvu0
通信ライブラリですらいつ策定されるか分からない状態なのにGUIとかC++29くらいになりそう
それに最近はGUIはweb方面のエコシステムを流用するのが流行だしはっきり言って厳しい
2018/12/19(水) 10:09:57.72ID:i1OD7WIV0
GUI ライブラリの提案だけは出てるけどね。
cairo を取り入れようとか、
ウェブアプリケーション風の DOM ベースのやつ (?) とか。

動作モデルが色々とあるので、
どれかに統一するのはしんどいと思う。
ベースの動作モデルを意識させないほど厚いライブラリを
標準に入れるのもちょっとどうかと思うし。
2018/12/19(水) 10:20:42.79ID:G6mG3us50
>>704
そういうのは「言語」かってことだよ
ISO/IEC14882は言語を定義する規格で、
GUIを定義する規格なら別の文書番号になるだろう
OSを定義する規格がそうであるように
2018/12/19(水) 11:42:47.34ID:auFS4SnhM
標準ライブラリは最小限でいい派
標準のスレッドすら不要
大抵結局native handle使うはめになるし
デバッガと連携しないし
一方でatomicは使えるな
2018/12/19(水) 12:28:04.06ID:o9SPlDa00
お酒はぬるめの燗がいい
肴はあぶったイカでいい
2018/12/19(水) 13:04:47.28ID:RjqFkMVC0
質問です。
ノートPCのキーが勝手に連打されるような状態になったので、
「キー入力の連打を感知したら、連打された入力をキャンセルする」というソフトが欲しいのですが、
どこかにあるでしょうか?

無ければ、自作も考えますが、キー入力をキャンセルさせる方法がよくわかりません。
2018/12/19(水) 13:13:01.18ID:4vZcLUvu0
キー入力のイベントをフックしてごにょればできるんじゃないの
2018/12/19(水) 13:24:01.60ID:i1OD7WIV0
>>710
いわゆるチャタリングってことかな。
ざっとググってみた感じだと ccchattttter や Keyboard Chattering Fix というソフトがあるみたいだね。

ソフトウェアとしては、他のプロセスが受け取るイベントを横取りすることになるから、
アプリケーションレベルでやるならフックを仕掛ける (DLL Injection など) か、
あるいはデバイスドライバのレベルでどうにかするという方法も考えられる。
2018/12/19(水) 14:20:16.58ID:RjqFkMVC0
ありがとうございます。

> ccchattttter や Keyboard Chattering Fix
さっそく、試してみました。
これらは、同じキーが連打された場合のみのキャンセルでしょうか?
違うキーが連続で誤入力されたりするので、その場合は対応できないかも?

フックするというのは、どうやるのかわかりませんが、ちょっと調べてみます。
2018/12/19(水) 14:42:07.56ID:Yvire5cb0
https://qiita.com/leon-joel/items/81415c1ef355c6246280

constexpr unsigned N = 10;
std::array<int, N> arr = {{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }};

2行目の 二重の中括弧は何を意味してる?
どう解釈するの?
2018/12/19(水) 15:04:48.65ID:wepwiZF/a
その制限c++14で撤廃してなかったけ(うろ覚え)
2018/12/19(水) 15:27:41.05ID:G6mG3us50
>>710
それキーボードに異物が入ってないか?
かつて俺が面倒見てた客先ではホチキスの針が原因の障害が複数回あったぞ

異物が入っていない正常な状態で起きるチャタリングは
設計の段階でしっかり対策されているはずなので
それまで問題なかったキーボードが突然そういう状態になったのなら
何らかの事故を疑ったほうがいい
717デフォルトの名無しさん (ワッチョイ 9fe3-S6R4)
垢版 |
2018/12/19(水) 15:30:09.30ID:Yvire5cb0
https://www.codesdope.com/cpp-stdarray/


以下の二種類あるらしいけど、何で2.の方は二重括弧になってるの?
外側の括弧の意味、内側の括弧の意味がそれぞれ知りたい。

1. std::array<int, 5> n = {1, 2, 3, 4, 5};
2. std::array<int, 5> n { {1, 2, 3, 4, 5} };
2018/12/19(水) 15:36:10.74ID:7xp8Igl8d
std::arrayのメンバーの初期化リストになってる可能性。
2018/12/19(水) 15:56:47.23ID:G6mG3us50
外側の括弧はコンストラクタへの実引数ならびを囲む
内側の括弧はコンストラクタの仮引数がinitializer_listであることに対応
= は、一時オブジェクトを作ってコピコンかムブコンという意味だったが
C++17でこの意味が廃止され単なる過去の名残となった
2018/12/19(水) 16:12:08.78ID:Yvire5cb0
>>719
つまり、2. の方は、以下の記法の ()を{} に変えただけということ?

3. std::array<int, 5> n ( {1, 2, 3, 4, 5} );

つまり、コンストラクタ名を Xxxx とすれば、
Xxxx( リスト型 &list1 ) {
}

みたいな事になってるということかな。
2018/12/19(水) 16:21:41.32ID:Yvire5cb0
https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00752_source.html

↑ libstdc++ の template struct(?) の array のソースを見てみたら、


// No explicit construct/copy/destroy for aggregate type.

とコメントされていた。明示的なデストラクタが何も無いので、その {・・・}
の部分は、コンパイラが初期化処理まで全部やってるってことなのかも
知れないけど、どういう仕組み?

TYPE _M_instance[N] みたいなメンバがあるけど、ここにコンパイラが初期値を
書き込むんだろうか。どういう仕様なんだろう。
2018/12/19(水) 16:35:50.86ID:Yvire5cb0
まず、以下の 2, 3 のような書き方が出来て、それで array の場合は、
ああなるってことかな。まだよく分からん。

1. CPerson person = CPerson( 25, MALE, "Yamada Taro" );
2. CPerson person = { 25, MALE, "Yamada Taro" };
3. CPerson person { 25, MALE, "Yamada Taro" };
723デフォルトの名無しさん (アウアウカー Sa6b-SUIi)
垢版 |
2018/12/19(水) 16:41:39.76ID:yP9yNdl2a
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
2018/12/19(水) 19:25:23.79ID:UC31GMnJ0
>>721
std::arrayはpublicに内部の配列を公開してて、コンストラクタデストラクタを一切書かないことで集成体となって、その初期化は集成体初期化で行う
二重かっこの外側はarrayの初期化、内側のかっこはstd::array内部配列への集成体初期化
ただし、C++14以降は二重かっこを省略できる
https://cpprefjp.github.io/lang/cpp14/brace_elision_in_array_temporary_initialization.html
2018/12/19(水) 20:44:10.56ID:C9bIO99C0
>>692
>バスアーキ
古い8086とかだったら書籍に載っていましたが、最近はどうでしょうか?わけのわからない仕様書しかないのでしょうか?
2018/12/19(水) 23:24:40.75ID:vlvnW3Fh0
PCならPCI Expressだな
2018/12/20(木) 01:57:39.19ID:Gok/GJGq0
>>724
なるほどだんだん分かってきた。
struct CPerson {
int m_dat1[2];
int m_dat2[3];
};
なら、古い C の時代から、確か、
CPerson person = { {1,2}, {3,4} };   // (1)
みたいに書けた。だから、
struct CMyArray {
int m_dat1[5];
};
なら、
CMyArray a = { {1,2,3,4,5} };     // (2)
と書けるのは当然、ってことだよね。それでC++14以降はさらに、
(1)の場合は、全部一列に並べて、
CPerson person = { 1, 2, 3, 4 };   //(1')
と書ける様になった。結果として、(2)も、
CMyArray a = { 1,2,3,4,5 };     // (2')
と書ける様になった。

そういうことだよね、多分。それでさらに、「=」を省略したような書き方も
できると。そういえば昔から、コンストラクタを持つ CPerson の場合に、
1. CPerson person=CPerson(・・・);
2. CPerson person(・・・);
は確か等価で引数つきのコンストラクタが呼び出されるんだった。
そして、新しい C++ では、小括弧 () を、波括弧 {} に書き換えることも
可能になったみたいな話で、
3. CPerson person=CPerson{・・・};
4. CPerson person{・・・};
みたいなことも書けるようになったのかな。
2018/12/20(木) 08:10:15.22ID:qx3kfu0o0
>>727
その通りだと思う
集成体以外で{}を使う初期化を一様初期化と呼ぶそう
https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html
729デフォルトの名無しさん (アウアウカー Sa51-9xJM)
垢版 |
2018/12/20(木) 11:33:42.81ID:pms7BJwLa
贅沢なお願いなんですが
OpenGLを使って
注視点を行列で回転させたいのですが
どなたか参考になるサイトやソースが
あれば頂けないでしょうか
2018/12/20(木) 13:08:35.90ID:zDBAwFJg0
>>729
確か、古くからある OpenGL の場合、GL_XXXX 見たいな定数を指定して、ViewMatrix
見たいなのを設定するんだったはず。
731デフォルトの名無しさん (ワッチョイ 6d23-1q7i)
垢版 |
2018/12/20(木) 13:58:01.82ID:P4Rv6f7s0
>>723
http://www.mss.co.jp/technology/report/pdf/19-08.pdf
http://www.mss.co.jp/technology/report/pdf/18-07.pdf
2018/12/20(木) 14:06:29.86ID:Stk2JPJbp
>>729
スレチ
ここにもゲ製作技術板にもGLスレあるだろ
あとは線形代数の勉強しろとしか

>>730
そんな手順の話じゃないと思うぞ
2018/12/20(木) 14:19:20.62ID:BW/0WCvFM
>>729
スレチ
2018/12/20(木) 23:21:08.79ID:mxfZwT1A0
C++でこんな感じの構文見たんですが、どういったものなんでしょうか?
「const auto 関数名 = [変数名](引数) -> 戻り値の型」
例えば、以下のように書くとcに5が返ります。
int X;
const auto hoge = [X](int a, int b) -> int
{
return a + b;
}
int c = hoge(2, 3);
[X]のところは、宣言してある変数ならなんでもいいみたいですが、何者かよく分かりません。
2018/12/20(木) 23:27:13.41ID:KfVqhHRV0
ラムダ式でぐぐれ
2018/12/20(木) 23:32:09.33ID:Lef4v1AJ0
俺はラムダ式は認めんぞ
2018/12/20(木) 23:35:27.42ID:mxfZwT1A0
ラムダ式なんてものがあるんですね
知らなかった。。
2018/12/20(木) 23:46:51.76ID:P+SDVgfX0
ラムダ式使わない奴はNGだわ
2018/12/21(金) 00:39:41.69ID:JoOPbSrC0
>>734
その[X]は、関数外部の変数 X を関数内部で使えるようにする意味があるらしい。
それを書いておかないと、グローバル変数やクラスのメンバ変数以外は、参照できなく
なるようだ。
2018/12/21(金) 00:49:34.51ID:kHtIL9Hb0
なにか書くよりはとりあえず[&]って書いといた方が良いと思う
741デフォルトの名無しさん (ワッチョイ 457f-q1e7)
垢版 |
2018/12/21(金) 00:57:46.38ID:8z6lrJJh0
必要ないなら何も書くなよ
2018/12/21(金) 01:08:05.95ID:kHtIL9Hb0
よく分からないまま書いて、使えないー、コピーされてるーとか言うことになるよりはトラブル少ないかと思った
必要ないなら空はその通りだと思う
2018/12/21(金) 04:24:29.96ID:z0fETMsD0
キャプチャーが空のラムダ式は関数オブジェクトと互換性があるので、可能ならインライン展開も行われたりするから、必要ないなら書かない方がいい。
2018/12/21(金) 15:04:45.84ID:JoOPbSrC0
C++って、「関数オブジェクト」ってあるんだっけ?
2018/12/21(金) 15:09:53.69ID:SQCtvUnrd
C++で言う所の関数オブジェクトはoperator()をオーバーロードしたクラスのオブジェクトであって、それは大昔からある
お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
2018/12/21(金) 15:12:43.01ID:JoOPbSrC0
>>745
>お前さんが思い浮かべてるカッコで括ったそれと同じものかどうかは知らん
特に何も思い浮かべてないけど。
2018/12/21(金) 22:35:22.62ID:SVNbSsFy0
じゃあ「関数オブジェクト」という名前で呼ばれるものがC++に存在するかという質問?
2018/12/21(金) 22:37:25.80ID:Co0MMJAt0
#include <stdio.h>
class Hoge {
 int m_x;
 Hoge(int x) : m_x(x) { }
 int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
 int X = 10;
 Hoge hoge(X);
 int c = hoge(2, 3);
 printf("c=%d\n", c); // 15
}
2018/12/21(金) 22:39:05.01ID:Co0MMJAt0
キャプチャがあるからインライン展開されない、というのは
C++におけるラムダ式の存在意義を半否定している
と思ったり
思わなかったり…
2018/12/21(金) 22:42:29.52ID:Co0MMJAt0
ちなhoge[&X]の場合の伝統的な関数オブジェクト版はこういったカンジになるヨカン↓↓↓
#include <stdio.h>
class Hoge {
 int& m_x;
 Hoge(int x) : m_x(x) { }
 int operator(int a, int b) const { return a + b + m_x; }
};
int main() {
 int X = 10;
 Hoge hoge(X);
 int c = hoge(2, 3);
 printf("c=%d\n", c); // 15

 X = 20;
 int c2 = hoge(2, 3);
 printf("c2=%d\n", c2); // 25
}
751デフォルトの名無しさん (ワッチョイ cb80-5YD5)
垢版 |
2018/12/22(土) 00:09:01.87ID:b6CiPLFa0
バカほど新しもの好き
2018/12/22(土) 00:11:23.62ID:lj97J/9W0
スマン>>750訂正orz
誤: Hoge(int x) : m_x(x) { }
正: Hoge(int& x) : m_x(x) { }
2018/12/22(土) 02:02:20.62ID:NPmZd5n00
関数オブジェクトって言わないのかな、良くしらんがw
つまり、

auto f1 = [](int x){ retrurn x;}
auto f2 = [&](int x){ reutrn x; }

この場合、f1の型は通常の関数ポインタ、f2の型はstd::functionになるということ。
2018/12/22(土) 02:05:38.24ID:DIzquj+Ya
f1もf2も型不明じゃなかった?
2018/12/22(土) 02:21:53.10ID:NPmZd5n00
不明というか、auto以外で受けるのを禁止されているだけで、内部的にはちゃんと型を持ってるでしょ。

たとえば、

void hoge(auto func(int x)->int)
{
.....
}

こういう関数を作ったとして、f1は引数に渡せるけど、f2はエラーになるし、
f2を渡そうと思ったら、std::functionで受ける必要がある。
2018/12/22(土) 02:36:35.21ID:lj97J/9W0
関数オブジェクト==ファンクタ
多分、

>この場合、f1の型は通常の関数ポインタ、
mjk、
>>748に関数ポインタにならずにすむからくりまで示したのに…

>>755
f2はテンプレート引数で渡せば良い
主にそういう目的のブツのはず
2018/12/22(土) 02:43:48.49ID:6gYvZ8/20
>>753
f1は同じシグネチャの関数ポインタに暗黙変換可能、であるだけで型自体はコンパイラ依存のラムダ式の型
2018/12/22(土) 02:47:42.19ID:lj97J/9W0
スマンf2はテンプレート引数で渡せば良いは撤回
普通にf1を引数渡ししてインライン展開を気体するものでだいたい合ってるはず…
2018/12/22(土) 06:27:13.75ID:K2b4MxYI0
関数ポインタに変換できるのはqsortとか昔のインターフェースに渡すのに便利なだけで
今から書くコードで積極的に使うもんじゃない
2018/12/22(土) 09:28:59.71ID:NPmZd5n00
関数ポインタとstd::functionじゃ実効コストが全然違うから、用途によって選べば良い。
qsortみたいな用途だったら、新しく書くコードでも関数ポインタが適していると思うけどね。
2018/12/22(土) 10:10:26.54ID:K2b4MxYI0
比較関数を動的にとっかえひっかえするんじゃなかったら全く適してないぞ
2018/12/22(土) 10:15:50.91ID:Op/4E6E/d
インライン展開のできるstd::sortが最速なんじゃ。
2018/12/22(土) 13:40:32.94ID:DIzquj+Ya
関数ポインタよりstd::functionの方が遅いんじゃないの?
2018/12/22(土) 14:28:59.21ID:Op/4E6E/d
https://stackoverflow.com/questions/16729941/are-stdfunctions-inlined-by-the-c11-compiler

std::functionよりテンプレートの方が早いみたいだね。
2018/12/22(土) 15:14:07.07ID:+oRc8mMV0
ポインタはどう頑張ってもポインタだが関数オブジェクトならインライン展開される可能性がある
2018/12/23(日) 11:18:27.58ID:AQ4G8Wg10
クロージャみたいなものと、
関数の静的型チェック、自発的なメモリ管理
って恐ろしく相性悪いと思われる。
そんな無理するくらいならおとなしく継承、オーバーライド使った方がマシ。
767デフォルトの名無しさん (ワッチョイ 95b3-Kal0)
垢版 |
2018/12/23(日) 13:14:37.02ID:zy+sQveZ0
キャッシュミスを許さない会。
2018/12/23(日) 13:27:07.40ID:swCrUp5Z0
静的型チェックとクロージャの相性が悪いところってたとえばどんな?
2018/12/23(日) 17:41:57.71ID:Wgmswpxd0
最近、QueryPerformanceCounter() を使って色んな速度測定をしていたら、
32バイトくらいの memcpy() でも、数マイクロ・セカンド位(1.0*10^(-6)(s))かかる事が分かった。
ちなみに、1クロックは、3.3 * 10^(-10) 位なので、たった32バイトに1万クロックくらいかかって
いる事が分かった。
ためしに単純な for ループと DWORD *ptr で転送してみても結局、それ位の
小さなサイズだと、同じくらいかかることも判明。
同じマシンでも、もっと大きなサイズのコピーだと、for ループで行っても、
1回のループで、4クロックくらいしかかからない。

推測だが、jmp 命令は、10バイト程度前の番地に戻る程度でも、ループ回数が
少ない場合は、物凄く極端に遅いが、ループ回数が多くなるとなんと1クロックで
実行できるようになるらしい。

ただし、余り定かではない。
2018/12/23(日) 17:45:32.05ID:Wgmswpxd0
それか、QueryPerformanceCounter() の精度の問題かもしれない。
いくらなんでも、32バイトで1万クロックは遅すぎるように思う。
ちなみに、Sleep(1000); とすると、ちゃんと、1.0 (s) と表示されるので、
速度の計算ミスではないはず。
2018/12/23(日) 17:57:02.41ID:Wgmswpxd0
そうか、これは、RDTSC 使ってないのか・・・。
「高分解能」と言っても、1.0 マクロセカンド位の精度だったとは、予想外・・・。
2018/12/23(日) 19:37:24.93ID:V9dsb1PW0
スレッドのディスバッチ、キャッシュのヒットミス、パイプラインストール、バスのI/O待ち、etc…。
memcpy1つとってもそうそう単純なものではない。
2018/12/23(日) 19:56:30.39ID:AQ4G8Wg10
>>768
引数がどんな型を持つ関数を渡すかを事前にどこで決めるかが問題だし、
それ事前に決められるならクロージャーの必要性は低くなるだろ。
あと資源解放のタイミングをどうするかを明示させるシンタックスってのは多分相当難しい。
その辺、クロージャーを用意する言語は普通はGCに任せる。
2018/12/23(日) 20:38:33.04ID:swCrUp5Z0
クロージャって関数とその外側の環境を合わせたものだろ。
「関数を渡す」って何がどこに関数を渡す話なんだろうか。
2018/12/23(日) 21:40:29.80ID:AQ4G8Wg10
色々シチュエーションは考えらるだろうけれどreactなら
var ChildInput = React.createClass({
_onChange: function (e) {
this.props.onChange(e.target.value);
}
}
)
とかするやつをイメージしてる。
2018/12/23(日) 22:50:15.98ID:zy+sQveZ0
キャッシュミスは犯罪です。
2018/12/23(日) 23:48:12.36ID:UknIutZS0
>>774
>クロージャって関数とその外側の環境を合わせたものだろ
それは新たな関数を作ったことになるんじゃー
>>748
> int X = 10;
> Hoge hoge(X);
という部分は、f(a, b) = a + b + 10という関数を作ってゐる
Xを変えることによってg(a, b) = a + b + 9とかh(a, b) = a + b + 8とか
Hogeクラスのクロージャでいくらでもバリエーションを作れる
2018/12/24(月) 00:09:16.83ID:MCFE6K0T0
>>777
>>748で言えばHoge::operator()が関数でm_xがその外側の環境だろ。
そこで関数を渡すとか作るとかあるいは静的型チェックと相性が悪いというのが
どういうことを言っているのかわからん。
関数オブジェクトを作ってるというならわかるけど。
2018/12/24(月) 01:08:30.96ID:+hyoXfJx0
C++ のラムダ式は関数オブジェクト生成の構文糖でしかないので、
従来と比べて特に良くなったり悪くなったりするわけはない。

オブジェクトの寿命の管理がやりづらいってのは C++ では今更な話で、
ラムダ式がどうこうとか言ってもしょうがなくない?
2018/12/24(月) 01:17:53.78ID:GJkiS2EE0
>>778
>m_xがその外側の環境だろ
オブジェクトhogeの中に囲い込まれている(キャプチャされたブツである)からちげう
hogeをコピーしたり別の関数に引数渡ししたら付いていくという意味でも外側の環境ではない
781デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 01:47:35.44ID:SeeEk3oh0
>>779
諦めたらそこで終了だよ!!!
2018/12/24(月) 03:46:32.26ID:6FDZj5qC0
長時間のプログラム終了を手元のスマートフォンで確認したい(メールなど)という願望からそういったプログラムを書きたいんですがさっぱり分かりません
開発環境はvisual studioです
2018/12/24(月) 06:57:18.93ID:N0NAok1A0
普通に、Linux コマンドを並べたら、1・2の順番で実行される。
PowerShell でも良い

command_1 ;
command_2 ;

コマンド1 が終わったら、メール送信するなら、

command_1 ;
メール送信 ;

複雑な処理は、コマンド・シェルスクリプトよりも、Ruby などで作る方がよい
2018/12/24(月) 07:58:21.71ID:RySeMjgB0
>>782
今は知らんけど、数年前だったら、メール送信は知識が結構必要だった。
SendMail Transfer Protocol なるものを使うんだけど、それを便利に発行できる
関数なりCUIプログラムがあれば使えるんだけども。
2018/12/24(月) 08:02:13.26ID:RySeMjgB0
>>784
Linux だったら、aaa.txt に以下のような内容を書いて、
---------------------------------------
From: my@mail.address (あなたのメールアドレス)
To: foo@example.com
Subject: This is test mail.
(ここに空行を入れる。ここまでがヘッダ。ここから先がボディ)
メールの内容
.(ドットのみの行を入力すると終了)
---------------------------------------

$ sendmail foo@example.com < aaa.txt

とすると後れるらしい。sendmail は、CUI コマンド。
だから、VisualStudio からだと、

system( "sendmail foo@example.com < aaa.txt" );

とすれば、sendmail コマンドが存在しているなら動作する。
2018/12/24(月) 08:28:06.03ID:N0NAok1A0
Linux に、mail コマンドある
2018/12/24(月) 08:57:29.99ID:MCFE6K0T0
>>780
>>774で言っている関数の外側の環境って意味だよ。それがクロージャの中なのは当然。
いいかげん、元の「関数を渡す」って話からずれまくっているが、結局どういうことを言いたいんだろう。
2018/12/24(月) 10:01:04.57ID:JYq0MjYj0
>>779
いやだからc++なら継承でメソッドでオーバーライドする方が
わかりやすいし、資源も管理しやすいんじゃない?って話。
他の言語にあるからみたいな理由で合わんもの入れてもなということなんだけど。
2018/12/24(月) 11:33:35.23ID:GJkiS2EE0
>>787
>結局どういうことを言いたいんだろう。
クロージャ=関数
特に()のオーバーライド(int Hoge::operator()(int a, int b) { ... })までやった場合、
HogeクラスのインスタンスhogeはC++の構文的にも関数同然に機能の呼び出しを行える
(関数オブジェクトとかファンクタとか呼ばれるやつになる

>元の「関数を渡す」って話
クロージャ=関数なのであるから、クロージャを、クロージャを受け取る他の関数またはクロージャに渡すという話、-- (A)
継承を使う場合のsome_typeのベースクラスをsome_typeのベースクラスを受け取る他の関数に渡すことに対応する --(B)

この場合、クロージャを使うやり方に対する継承を使うやり方のデメリットは…
、と静的型チェック周辺の話に持っていくことができるが、その前に(A)や(B)が共通認識になったのか、それとも理解不能なのかどうか確認しておきたい
2018/12/24(月) 12:11:45.35ID:up8qL/8xM
デリゲートとクロージャを混同してるって話?
2018/12/24(月) 12:34:04.96ID:MCFE6K0T0
>>789
>クロージャ=関数

そういう前提で言っていたのか?
ID:AQ4G8Wg10は明らかにクロージャと関数を使い分けているようだが。>>766>>773

じゃあそこは了解したとして、(A)(B)の条件の下でもう一度>>768の質問をするよ。
関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
2018/12/24(月) 12:42:22.68ID:GJkiS2EE0
デリゲートは、オブジェクトを参照キャプチャするクロージャと同じ
(マルチキャストみたいなおまけ機能もファンクタとして実現したクロージャになら追加できる
ファンクタとしてクロージャする分には型安全性も同等なので、ファンクタとデリゲートは混同上等のはず…
2018/12/24(月) 12:55:51.01ID:GJkiS2EE0
>>891
>関数の静的型チェックとクロージャの相性が悪いところってたとえばどんな?
知らん
>>766はクロージャの実現方法について黒魔術的な何かを想定しているのではないか…
C++におけるクロージャの簡単な実現方法はファンクタ、であって、ファンクタには特に型安全や資源解放に関するファンクタ固有の問題は無いと思う
何しろファンクタは普通のクラスHogeの普通のインスタンスhogeとして>>748風に書けるので…

一方、広義のクロージャは、変数を束縛するしくみ=クロージャなので、型安全という概念をそもそも含まない
この広義のクロージャをC++上で実現しようとしているのだとしたら知らん
2018/12/24(月) 13:03:08.89ID:+hyoXfJx0
>>788
> いやだからc++なら継承でメソッドでオーバーライドする方が
> わかりやすいし、資源も管理しやすいんじゃない?って話。

だからそんなことはないと私は述べてる。

ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
それも一回しか使われないような使い捨てのものをだ。
使い捨てるのならば、別の場所で定義して (名前を付けて) から使うのはまわりくどい。
わかりにくくて管理しづらくなる。

もちろん、場合によってはラムダ式が適さない場合だってある。
そういう場合まで何もかもをラムダ式に置き換えろってんじゃないだ。
ラムダ式が適しているときにラムダ式を使えってだけのことで、しかもそれは案外に多いってことだ。
2018/12/24(月) 13:07:57.67ID:MCFE6K0T0
ああわかった。
>>776ではクロージャと関数を区別して書いていたのに対して、>>777は単に

>クロージャ=関数

と言いたかっただけなんだな。
2018/12/24(月) 13:15:42.46ID:MCFE6K0T0
アンカー間違えた。>>776じゃなくて>>774か。
2018/12/24(月) 14:08:48.90ID:GJkiS2EE0
訂正orz
誤: 変数を束縛するしくみ=クロージャ
正: 変数を束縛して作った関数(ただし束縛すべき変数のリストが空のときもある)=クロージャ

型安全な言語なら型安全に、そうでない言語でもそれなりにやっぱクロージャ=関数ェ、
2018/12/24(月) 18:39:17.08ID:JYq0MjYj0
>>794

>ラムダ式を使いたいときというのはほとんどの場合は小さな関数を作りたいときなんだよ。
>それも一回しか使われないような使い捨てのものをだ。
ここが自分の感覚と違う。
ラムダ式を使いたい時ってもう少し動的な関数作成に関わる場合という感覚。
単に名前付けを省略したいくらいならどうとでもなると思うし、個人的にはそんな興味ない用途。
2018/12/24(月) 20:19:23.43ID:5oUfBIDD0
C++のラムダ式でどうやって動的関数生成なんかやるの?
何かを根本的に勘違いしてるとしか思えない
2018/12/24(月) 20:43:50.96ID:NsJUy6rqa
生成と作成は違う・・・
2018/12/24(月) 20:57:22.56ID:xV9Qcj/20
どうやって動的に生成するんだ
2018/12/24(月) 21:38:45.00ID:SeZ4reQO0
jsのノリをc++に持ち込もうとして、
面倒だってぶつくさ言うやつ定期的に現れるよな
なぜc++使おうとしているのか、自分を見つめ直した方がいいぞ
803デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 22:54:19.63ID:SeeEk3oh0
Javascriptのほうが速いのにな。
2018/12/24(月) 23:31:10.01ID:RySeMjgB0
>>803
有り得ない。
805デフォルトの名無しさん (ワッチョイ 95b3-6UAB)
垢版 |
2018/12/24(月) 23:33:25.79ID:SeeEk3oh0
さてはオヌシ、Javascript使ったことござらんな。
806デフォルトの名無しさん (スッップ Sd43-/Sup)
垢版 |
2018/12/24(月) 23:40:50.37ID:osgTLlKWd
何が速いの
2018/12/24(月) 23:56:41.67ID:ckTogqpu0
ガイジやん
2018/12/25(火) 00:08:46.01ID:66hcSiRr0
new演算子について教えてください。

自分で定義したクラスをインスタンス化してグローバル変数として扱いたいです。
グローバル変数には実体がないといけないと思うのですが、new演算子は
ポインタにしか使えないですよね?
この場合どうしたらいいでしょうか
2018/12/25(火) 00:19:05.74ID:wezhkWA50
newなんか使わずそのままグローバル変数として
myclass mc;
とか定義すればよい
2018/12/25(火) 00:20:38.06ID:C9xreq1F0
>>802
いやだからc++でなんでラムダ式とか入れちゃうのかっていう話をだね。。
jsのノリを無理やり入れたがってるのはc++の仕様の方で別に俺は入れたくない
って意見なのだが。
2018/12/25(火) 00:27:18.17ID:elDAcQKF0
>>810
wwwwwwwww
2018/12/25(火) 00:50:16.50ID:MFQdZUcza
無名関数としてのラムダはないと困る。
2018/12/25(火) 00:53:54.64ID:HIPAf7J10
>>810
オブジェクトとクロージャはメカニズム的には似たようなもんだ
という感覚は言語処理系に明るい人の感覚としては元々ある。

C++ にラムダ式が追加される前に書かれたこの記事が面白いよ。

"クロージャとオブジェクトの微妙な関係"
http://www.itmedia.co.jp/enterprise/articles/0703/29/news069.html

JavaScript の「オブジェクト」だって、その内実は環境への操作だ。
つまりはクロージャを基礎にしてオブジェクトに見せているんだから、
その逆をやる言語があったって別に不自然なことではなかろ。
2018/12/25(火) 01:47:45.90ID:66hcSiRr0
>>809
なるほど!
教えてもらったとおりnew使わないでできました!
2018/12/25(火) 03:05:41.87ID:hUN0giiJ0
クラス・クロージャは、同じ。
関数・メソッドから、引数渡しでもないのに、外側の変数を参照できるから

Ruby のブロックがクロージャ。
ブロックの外側の変数が参照できる

一方、Ruby の関数は、外側の変数を参照できないから、
JavaScript, Python, PHP よりも、すごい強固

Ruby だけは、クロージャの外に、関数をスコープを作っている。
さらに関数の外側がクラスで、クラスの外側がモジュール

モジュール > クラス > メソッド(関数) > ブロック(クロージャ)

Ruby 独特の構造!
2018/12/25(火) 17:51:31.77ID:Twr4vy9N0
エディッタだけで、Visual Studioコンパイル済まで持って行けた。。。
2018/12/25(火) 18:10:25.20ID:Ra4BufOa0
サンタさんがくれた素敵な奇跡。だからその瞬間を宝物にして、書き込みしたくなっちゃうんですね
2018/12/25(火) 18:35:59.59ID:HIPAf7J10
恥ずかしいセリフ禁止!
2018/12/25(火) 18:44:45.00ID:C73Cga6+0
はちみつ餃子さんってC++を使ってる業務に就いてるんですか?
2018/12/25(火) 18:50:42.42ID:HIPAf7J10
前にも書いたことあると思うけど、ワイは完全に趣味でやっとる人やで
2018/12/25(火) 19:33:29.77ID:C9xreq1F0
理解が深まった。ありがとう。
しかし理解すればするほど、c++ならやっぱクラス生成でよくね?って気になるが。
2018/12/25(火) 19:48:34.00ID:KqaRCMCm0
クラス生成するのがC++のラムダ式なんだが
2018/12/25(火) 21:36:34.76ID:HIPAf7J10
>>821
繰返して述べるが、 C++ のラムダ式は単純なクラスの定義と使用を同時に出来る構文糖でしかない。
何故か「クロージャ」と混同した書き込みがあるが
(もちろんいわゆるクロージャの概念からおおいに影響は受けているのだろうが)
C++ のラムダ式は C++ に新しい概念を導入するものではない。
2018/12/26(水) 00:41:02.88ID:qfoPSrF6a
c++の属性構文が出来たけどc++17で不明な属性は無視するという規定が出来たからには、コンパイラによっては独自の属性があるの?
2018/12/26(水) 06:42:20.48ID:GQqJjkng0
> C++ のラムダ式は C++ に新しい概念を導入するものではない。

これはさすがに言い過ぎ
関数型のリテラルという概念は C++98 にはなかった
だから C++11 になったとき新しく憶えた
既存の概念の組み合わせでできているから
割とすんなり憶えられたけどね
2018/12/26(水) 07:11:59.75ID:Y8+MwfS4M
元々各社の属性指定方法を統一化したものだし
827デフォルトの名無しさん (アウアウウー Sac9-6UAB)
垢版 |
2018/12/26(水) 21:22:57.27ID:qfoPSrF6a
VC++で[[deprecated]]使ったら警告じゃなくてエラーになっちゃう。
いやまあ正解なんだけどさ・・・
2018/12/27(木) 10:07:41.48ID:1rJdmURK0
>>827
ん、cl.exe の 19.16.27024.1 では通るが?
2018/12/27(木) 18:09:20.50ID:DLCsZ7Bsa
警告になる?
2018/12/28(金) 06:03:28.17ID:4iocbykD0
ならない
2018/12/28(金) 06:04:31.02ID:4iocbykD0
つーか、[[deprecated]]って書いてある関数を使っても警告しないのはつまらない
2018/12/28(金) 15:46:17.14ID:50PB7VSs0
Emscripten で、マウスの動きに合わせて JS の canvasに直線を描いたりする
ようなGUIプログラムを作って試していて、local auto 変数に確保した
16バイトの char 配列に、sprintf で色の #RRGGBB の文字列を合成
して JS に渡して canvas の context の style に直線の色を設定していた。
で、同時に、KeyDown イベントでで20文字ほどのグラフィック文字列を出して
いた。なお、そっちの方でも、全く同じ関数を使って、上記の色の文字列
を合成していた。
すると不思議なことに、KeyDownイベントで文字列を書いた後は、
必ず、直線の方の色が変わってしまう。必ず青色で書くようにしているはずなのに。
ログをとってみると、
char szBuf[16];
sprintf(szBuf, "#%02X%02X%02X", r, g, b);
で szBuf に対して、最後の 0終端文字が、書き込まれていないことが判明。
よく見ると、KeyDownイベントで色のためではなく、出力したい
文字列そのものの文字の一部が直線描画の方の szBuf の #RRGGBB の直後に
残ったままコピーされているように振舞っていた。

ためしに、sprintf() の命令の直前に、memset(szBuf, 0, 16); とすると
正常化することも確認した。

Emscripten のライブラリの不具合だろうか?
833デフォルトの名無しさん (ワッチョイ 91e3-h5Ay)
垢版 |
2018/12/28(金) 16:23:41.67ID:50PB7VSs0
char szCol[16];
memset( szCol, 0, 16 );
memset( szCol, 'W', 10 );
szprintf( szCol, ・・・ );

とした場合は、W の文字が残ったままになることも分かった。
2018/12/28(金) 16:55:00.81ID:bcsUwMQ/0
szprintf() の直後に
szCol[7] = 0;

とすると、正常化することも分かった。
2018/12/28(金) 19:27:07.61ID:NSIH2Vow0
C++でクラスポインタにnewしたオブジェクトを配列の様に複数作りたいのですが、
エラーがでてしまいます。

ポインタの宣言
TimerParameter *_timerParameter;

インスタンス化
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

TimerParameterコンストラクタ
TimerParameter::TimerParameter(ULONG time, void(*function)(), bool one_loop)
{
_function = function;
_oneLoop = one_loop;
_timeSpan = time;
resetTimer();
}

自分で作ったTimerParameterクラスをnewして_timerParameterメンバに入れると以下のエラーが発生してしまいます
sketch\timerState.cpp: In member function 'bool TimerState::timerSet(long unsigned int, void (*)(), bool)':
timerState.cpp:14:30: error: no match for 'operator=' (operand types are 'TimerParameter' and 'TimerParameter*')
_timerParameter[_timerSize] = new TimerParameter(time, function, one_loop);

インスタンス化の左辺が適切でないのが原因だと思うのですが、この書き方はダメなのでしょうか?
2018/12/28(金) 19:48:22.38ID:S+ORIZ660
配列の実体がないじゃん
2018/12/28(金) 20:14:43.49ID:NSIH2Vow0
>>836
newすれば実体確保できるとの認識でしたが、やはり別に実体を用意しないといけないのでしょうか

https://www.s-cradle.com/developer/sophiaframework/tutorial/Cpp/newdelete.html
2018/12/28(金) 20:30:07.39ID:t3Tixi/x0
ポインタの配列が無いって話だろ
2018/12/28(金) 21:37:00.90ID:IR9VtjpT0
_timerParameter[_timerSize]の型はTimerParameter
new TimerParameter(...)の型はTimerParameter *

あと、
Type * ptr;
ptr[2] = createType();
なんてやっちゃダメなのわかってる?

Type * ptr;
ptr = new Type[10];
ptr[2] = createType();
ならいいんだけど

あと、"_"で始まる名前は処理系予約だし
timeはcの標準関数にtime_t time(time_t *t);があるんでやめれ
2018/12/28(金) 23:30:44.23ID:2sBVkvJt0
アンダーバー2つかアンダーバー+大文字で始まるものが予約されてるだけでアンダーバー+小文字で始まるのは大丈夫
2018/12/28(金) 23:49:39.38ID:foyNhCLxM
vector<vector<float>> = {
{1.33333334, 3.99918277},
{2.56883338, 1.29994666}
}

このようにvector<vector<float>>をdouble型の要素で初期化しようとすると縮小変換が必要とのエラーが出ます
どうしたら縮小変換しつつ初期化出来るんですかね?
2018/12/29(土) 00:24:51.94ID:igG8GHWt0
floatのリテラルを使わない理由が分からない
2018/12/29(土) 02:57:26.73ID:9LI18QIG0
>>839
>ならいいけど
よくないだろ。なぜコピーさせるのか
2018/12/29(土) 06:39:32.70ID:2E+KpNh/a
>>841 数字の末尾にf
2018/12/29(土) 06:40:13.70ID:2E+KpNh/a
もしくはstatic_cast<float>
2018/12/29(土) 17:02:40.74ID:UQDnLnHIM
BoostやSTLのDeveloperになりたいんですけど、テンプレートを極めればなれますか?
2018/12/29(土) 17:05:30.58ID:mHcV7M6o0
テンプレートに限らずC++を極めてるのは当然の前提として
Developerとして参加するプロジェクトをどうしたいとか、どんな価値を提供できるかとかが重要じゃないかな
2018/12/29(土) 17:17:06.00ID:U1nQeVxJ0
BoostならBoost相当の性能のライブラリを作って水準に合うドキュメントと何故それがBoostに必要なのか説明する提案書を書いて提出すれば100回リジェクトされる頃には採用されるかも知れない
2018/12/29(土) 17:35:17.80ID:UQDnLnHIM
>>847
C++をより良い言語にしたいです
今はアルゴリズムの研究をしてるのですが、C++をより良い言語にしたいと個人的に思ってるのと、自分が作った言語機能を人に使ってほしいんです
>>848
Boost‥
100回リジェクトされた頃には相当な経験が詰めるはずなので挑戦してみます
2018/12/29(土) 17:56:06.46ID:mHcV7M6o0
>>849
C++自体を改良したいなら標準化委員会に行くかコンパイラの開発に参加しよう
2018/12/29(土) 18:16:38.42ID:UQDnLnHIM
>>850
どっちも検討してみます
2018/12/29(土) 18:34:59.20ID:EkrQifAZ0
すばらしい、C++標準化に参加して、文字コードの扱いの混乱した現状をなんとかしてほしいw
char型はwindowsがsjis、それ以外がutf8、
wchar型は64bit linuxが32bitで、それ以外は16bit、
どのプラットフォームでも同じようにつかえるchar16_t/char32_tはAPIやライブラリが未整備な上、エンディアンの問題がつきまとう、
と、マルチプラットフォームで各種文字コードの透過的な相互運用は事実上不可能な状態だからな……
2018/12/29(土) 18:45:45.22ID:fhXB+EYEa
bomの有無とか?
2018/12/29(土) 19:04:16.27ID:EkrQifAZ0
そう、それな、ポータブルな保存形式はutf8で良いと思うんだけど、BOMの有無とか、冗長コードの問題とかで実際にやってみると意外と面倒なんだよね。
2018/12/30(日) 05:24:49.23ID:I1/5m0WE0
Windows では Shift_JIS (CP932) という前提もホント駄目な勘違い。
2018/12/30(日) 08:17:58.30ID:vtZx8IN+a
visual studioはいろんなエンコードに対応してるように見せかけてshift-jis前提で動いてる気がする。


デバッガでpngのシグニチャ確認したら臼ngとなるとか、コメントにπを書いたら赤の波線が出るとか。
2018/12/30(日) 11:01:04.79ID:KcpheNgcd
>>856
ユーザーのコードページを変える以外に方法がないらしい。
2018/12/30(日) 11:15:52.66ID:vtZx8IN+a
>>857
方法あったの!?
2018/12/30(日) 11:36:24.11ID:JDxg8BDU0
Windowsの言語パック入れて表示言語を選択すればたぶん変わる。
2018/12/30(日) 11:43:21.51ID:TL6Cx54I0
windowsは英語設定安定
2018/12/30(日) 11:59:41.73ID:bm6ZOgnS0
まぁ、マイクロソフトも徐々にUTF8を標準サポートにする方向みたいだから、2〜3年したらVisual Studioもデフォルトがutf8になるかもね。
エンディアンの問題も、x86,ARMに続いてRISC-Vがリトルだから、流れとしてはリトルで統一ってことになるのかな。そうなったら楽でいいなw
2018/12/30(日) 13:40:53.27ID:Ux/rKcR40
RISC CPUが出始めたときはビッグの勢いあったけど
結局リトルに収斂したな
おれは昔からリトルが自然と感じてたのでいい流れだ
ネットとの相性が悪いのは残ってしまうが
2018/12/30(日) 13:46:05.24ID:31DgsdhN0
Emscripten で Cソース中に以下のようなプログラムを作ると、MyPrintf()内の
(2) で (3)の vsprintf() を呼び出そうとした瞬間に、なぜか (4) に来ずに、
(5)に戻ってきて a4 に制御が戻って来てしまうことが判明。タイマーイベント
を使ってる。誰か原因の見当が付く人いない?
EM_ASM( {
  function js_OnTimer() {
    console.log( 'begin of js_OnTimer()\n' ); //a1
    var cl_OnTimer = Module.cwrap('OnTimer', 'number', ['number']);
    console.log( 'js_OnTimer(), before calling cl_OnTimer(1)\n' ); //a2
    var rc = cl_OnTimer(1);       //a3
    console.log( 'js_OnTimer(), after calling cl_OnTimer(1)\n' ); //a4
    console.log( 'end of js_OnTimer()\n' ); //a5
  }
  setInterval(js_OnTimer, 1000);
});
extern "C" int OnTimer( int a ) {
  OnTimerCore();
  return 0;
}
void OnTimerCore() {
  MyPrintf( "begin(MyPrintf) of OnTimerCore(), %d", 123 ); // (1)
  printf( "begin(printf) of OnTimerCore(), %d\n", 456 ); // (5)
}
2018/12/30(日) 13:46:34.18ID:31DgsdhN0
>>863
void MyPrintf( const char *pszFormat, ... ) {
  char      szBuf[2048];
  va_list     va;
  va_start( va, pszFormat );
  EM_ASM( { console.log( 'MyPrintf, before call vsprintf()\n' ); }); //(2)
  vsprintf( szBuf, pszFormat, va );    // (3)
  EM_ASM( { console.log( 'MyPrintf, after call vsprintf()\n' ); }); //(4)
  va_end( va );
}
2018/12/30(日) 14:57:17.90ID:31DgsdhN0
>>863
原因は、main 関数の最後に書いておいた、次のループにあった :
for ( ;; ) {
  emscripten_sleep(36000000);  // 何日間も待つ。
}
このループをコメント・アウトするだけで、vsprintf() が1つ前の戻り先に
戻ってしまう不具合も、sprintf() が 0 終端文字を書いてくれない不具合も
共に起きなくなった。

このループを書いていたのは、Emscripten 1.35 で、かつ、
wasm ではなく、asm.js で試していたときに、キー押下イベント
などが発生した時に
 Assertion failed: the runtime was exited (use NO_EXIT_RUNTIME to keep
 it alive after main() exits)
というエラーが出るためだった。つまり、main() 関数が終わると、
「ランタイム」(ランタイム・ライブラリ?) も終了してしてしまうので、
main() を終わらせられなかった。だから、main() の最後に、なんらかの
無限待機の仕組みが欲しくなって書いていたのだった。

現在は このループを除去しても警告が出なくなっているが、
Emscripten の Version を上げたせいか、asm.js ではなく、wasm の方を
使うようになったせいかは分からない。
866デフォルトの名無しさん (ワッチョイ 557c-Oscs)
垢版 |
2018/12/30(日) 16:16:05.88ID:Y/PcKL5Q0
なんでリトルが自然なん?
あとから拡張しやすいって意味か?
2018/12/30(日) 17:21:44.51ID:JDxg8BDU0
加算器は下の桁から処理していって桁上げする方が自然とか、複数バイト長のワードで
ビットアドレスとバイトアドレスの増加方向が同じになるとかかな。
ワードサイズが変わっても低位バイトの位置が変わらないから拡張しやすいってのも
もちろんあると思う。
2018/12/30(日) 17:42:37.29ID:8KuoxE+z0
ハード作ってる時はビッグエンディアンの方が自然な気がするがソフト作ってる時はリトルエンディアンの方が自然な気がする
まあ、FPGAと高級言語を使うようになってからは滅多に気にすることは無くなったけど
2018/12/30(日) 17:43:15.81ID:+xBnY0nz0
>>867
cast するときにも便利。

メモリに書かれた 32BIT整数を 8BIT 整数として取得したい際など、
先頭アドレスが変わらないので、速度効率が上がりやすい。

もし、BIG ENDIAN だとそのようなときに、「3」足さないといけなく
なってしまうと思う。
2018/12/30(日) 17:44:09.88ID:vtZx8IN+a
fstreamでリトルとビッグの切り替えってどうするの
2018/12/30(日) 17:50:27.67ID:JDxg8BDU0
逆にビッグエンディアンの方が自然に思えるのは16進ダンプ見てるときくらいしか思いつかない。
2018/12/30(日) 17:52:58.01ID:31DgsdhN0
Uint32 u32;
BYTE u8;
u8 = (BYTE )u32;

とするコードがあったとする。u32 を、ポインタで置き換えたいとき、

Uint32 *pUint32;
u8 = (BYTE )*pUint32;
と書くのも正解だが、

u8 = *(BYTE *)pUint32;
と書くのも正解で、実は、後者の方が効率は良い場合があるとされる。
なぜなら、メモリから前者は4バイト読んでから上位バイトを捨てるが、
後者では最初から上位バイトを読まないから。

この場合、Little Endian だと、後者の書き方でも混乱が少ないが、Big Endian
だと何を意味しているのか分かりにくくなる。というのは、
(BYTE *)のようなポインタ型への cast は、旧来の C では、アドレス値自体は
変更せずに、型だけを変更するというのが伝統的な実装だったため
(ただし、C++ の場合、多重継承していた場合は、その原則を破ってアドレス値が
変化する事があるが。)。

BigEndian の場合、最後の書き方の実装に不安定要素が残るように思える。
2018/12/30(日) 18:06:14.60ID:vtZx8IN+a
この場合static_castは使えんの?
2018/12/30(日) 18:10:27.41ID:Q7hIiacN0
>>836,>>839
ありがとうございました。
配列の実態作ったらできました!

_を接頭文字で使うのは結構規模の大きいオープンソースプロジェクトのソースで
メンバー変数の頭に_を使ってたのでやってました。
気を付けます。

話は少し変わるんですが、>>809でクラスをnewせずに使うというのが書かれていますが、
オブジェクトをnewせずに使うことって結構あるんでしょうか?
普段C#やっているのですが、クラスは基本的にnewでインスタンス化して使うものと思っていたので、(コンストラクタで特に初期化処理がなくても)
2018/12/30(日) 18:24:04.22ID:31DgsdhN0
>>874
>話は少し変わるんですが、>>809でクラスをnewせずに使うというのが書かれていますが、
>オブジェクトをnewせずに使うことって結構あるんでしょうか?

どちらかというと、C++では new する必要ない場合は、new しないことが
良い書き方。new は、好きなタイミングで削除したいようなオブジェクトの場合
のみ使用する。構造体やクラスのメンバの中に、別のクラスのオブジェクトが含まれている
ような場合は、new しないのが原則。

ある意味では、そのような習慣があるからこそ、C++ は効率が良いともいえる。
実は、new や malloc は、確保するサイズにかかわらず、大体 170 クロックほど
必要。delete や free と合わせると、合計 300 クロック必要となる。
一方、そのまま、new せずに「埋め込んだ」場合は、基本的に「0」クロック。

この差はとても大きなものとなることがある。
2018/12/30(日) 18:27:37.01ID:bm6ZOgnS0
>>874
最初から最後まで存在し続けて、特別な終了処理が必要ないオブジェクトなら、わざわざヒープを確保して実行時に初期化する必要はないでしょ。
あと、staticなオブジェクトのコンストラクタはmain関数の前にグローバルコンストラクタから呼び出されるのだが、
これを利用して、プログラム起動時にやっておきたい初期化処理をクラス内で記述する目的に使うこともあるね。
2018/12/30(日) 18:32:12.30ID:bm6ZOgnS0
>>875
さすがに良い書き方っていうのはどうかと思うけどな。
staticなオブジェクトにしちゃうと、初期化の順番が制御できないから、気をつけて使わないとコンパイラ依存のコードになってしまうし。
2018/12/30(日) 18:32:48.87ID:Q7hIiacN0
>>875,>>876
ありがとうございます。
このあたりのC++とC#の慣習の差異に違和感を覚えていたのですが、かなりスッキリしました。
2018/12/30(日) 18:55:41.08ID:31DgsdhN0
>>877
必要な場合は new しても良い。でも、クラス Cxxxの中には、文字列の CString
クラスのオブジェクトや、何らかのリストのオブジェクトが複数含まれて
いたりすることも多い。それらのメンバを全て new する場合と、埋め込み
でそのまま使う場合とでは、Cxxx をインスタンス化するときの時間に雲泥の
差が出てしまう。Cxxx が、5つのクラス・オブジェクトを含んでいた場合、
それらを new するだけで、170 * 5 クロックも余分に掛かってしまう。
この数値には、各コンストラクタの処理時間は含まれていないので。

この場合だと、全て new すると、850 クロックも余計に掛かることになる。
さらに、Cxxx オブジェクトがデストラクトされる場合には、合計で、この
1.8 倍程度の時間が new しない場合より余計に掛かることになってしまう。
2018/12/30(日) 19:01:20.20ID:31DgsdhN0
>>872
思い出したので追加しておく。
Little Endian の場合、

>Uint32 u32;
>BYTE u8;
>u8 = (BYTE )u32;

の代わりに、

Uint32 u32;
BYTE u8;
u8 = *(BYTE *)&u32;

という書き方も出来て、こっちの方が、処理効率が良い場合があるとされている。

しかし、BigEndian だとこの書き方は混乱を招きやすく、かつ、処理効率も
上がらないと思われる。

総合的に考えると、Little Endian の方が処理効率が上がりやすいはずだ。
2018/12/30(日) 20:44:44.64ID:97KQkPau0
>>877
>>875はstaticな変数のことははじめから言ってなくて、構造体のメンバやスタックに積まれるケースのように自動的にメモリ確保されるケースのことを言っていると思われる。
2018/12/31(月) 19:30:23.55ID:WGWLmLufa
cのsetjmpを使ってるコードはc++で例外に置き換えられますか?
2019/01/01(火) 22:54:34.62ID:H66xOrDI0
>>882
確か、関数呼び出し連鎖の途中の関数が誰も catch せずに放っておけば、
親の関数にまで戻れるはずなので、一応、同じようなことが出来る気もする。
長い間使ってないので、むしろ、setjmp, longjmp がどういうものだったか
の方を忘れてしまったけど。

たしかそれでいけたと思うな・・・。
884デフォルトの名無しさん (ワッチョイ 81ad-RM76)
垢版 |
2019/01/05(土) 05:14:18.47ID:XzO5Y/Fl0
EASTL - 3.12.08 release
https://github.com/electronicarts/EASTL.git
885デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/05(土) 08:34:01.93ID:rov9DpyB0
std::variantって見たんだけどこれいいね。
2019/01/05(土) 09:09:14.58ID:xejHmutN0
型安全なunionか
なかなかいいかも
887デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/05(土) 12:12:55.54ID:wMTnOPNR0
https://bitbashing.io/std-visit.html
888デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/05(土) 12:13:54.68ID:wMTnOPNR0
https://qiita.com/ktokhrtk/items/9774208863f249007462
889デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/05(土) 12:14:18.25ID:wMTnOPNR0
https://nekko1119.hatenablog.com/entry/2016/11/21/060928
2019/01/05(土) 12:21:03.48ID:ZukYwWxe0
やっぱ整数なら下の桁から上の桁に向かって書いたり送ったりするのが自然
上の桁とか(整数という概念上は)何桁まで伸びるかわからないのだから

しかし一方人間の認識上は上の桁から見て量を把握したいという要求があり、
不幸にもラテン語が左から書くのにアラビア数字が右から書く慣習だったため
二つの文化を取り持つ玉虫色の解決策としてビッグエンディアンとかネットワークバイトオーダーみたいなものが生じた
2019/01/05(土) 14:23:51.42ID:o23qSFy30
スマホアプリとかのパケット解析するとわりとビッグエンディアン使われてる
892デフォルトの名無しさん (ワッチョイ fb02-cuFO)
垢版 |
2019/01/05(土) 14:47:37.72ID:2c1WII2F0
だってビッグエンディアンはネットワークバイトオーダーでもあるから。
外に出すデータや互換性保ちたいデータは普通そうすると思うよ。
2019/01/05(土) 14:56:34.85ID:Mw4M2zcY0
>>890
アラビア数字書くとき右から書いてるの?変わった人ね
894デフォルトの名無しさん (ワッチョイ 81ad-RM76)
垢版 |
2019/01/06(日) 10:53:29.24ID:2S4Gmo3N0
数の表記だけじゃないさ。日付、人名、住所の表記も。
単純なASCIIソートで正しくソートできるのはどれかという話にもつながる。
895デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/06(日) 13:34:28.45ID:q7b7d/XL0
数値を数字に直すとき桁数を調べるには対数とればいいよ。
896デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/06(日) 14:27:57.77ID:UQlfmMBy0
中学生か
2019/01/06(日) 16:25:01.53ID:gVP3A6Xh0
>>895
数学的にはそれで完全に正しい。
しかしコンピュータには誤差があるので、
itoa() や printf() などを自分で実装するような場合、
よく考えないといけないかも知れない。

log_10(x) で計算すると N 桁だということになったとしても、
itoa() などを実装するアルゴリズムによっては、ある条件の時に
誤差によって、1ケタだけずれるかもしれない。

めったに無いことだが、これで銀行システムや戦闘機のシステムが
ダウンしたりするかも知れないので、数学は重要。
2019/01/06(日) 16:27:31.80ID:gVP3A6Xh0
ちなみにオイラは数学は首席だったが、どういう場合にそれが生じるかは
即答することは出来ない。アルゴリズムを慎重に選ばないと、その誤差によって
システム・ダウンやアプリのハングアップ、保護例外などを引き起こす可能性が
わずかだが存在するかもしれない。
2019/01/06(日) 16:32:25.57ID:BCtLt9aar
へぇ〜科目毎に首席決まるんだ笑
2019/01/06(日) 16:48:35.20ID:5fyS0TRC0
n>=0かつ10^n <= m < 10^(n+1)
のときに整数mは十進n桁の数と言える。
不等式に常用対数を適用し、
n <= log_10 (m) < n+1
が得られる。つまり、1以上の整数mに常用対数を適用し、さらにガウス記号を適用したものがmの桁数だ。
m=0のときは一桁になることに注意する。
2019/01/06(日) 16:50:11.91ID:5fyS0TRC0
計算結果の桁数が違うときは、常用対数の誤差とガウス記号の誤差の問題になる。
2019/01/06(日) 16:57:04.99ID:5fyS0TRC0
常用対数の誤差については、有効桁数を使うか、区間演算により、誤差の範囲を見積もることが可能。そこで、誤差の範囲が整数をまたぐかどうかを判定すれば、問題は解決する。
2019/01/06(日) 16:59:59.29ID:5fyS0TRC0
整数をまたぐ可能性があるときは実際に整数を文字列化すれば正確な桁数が算出可能。もしくは任意精度の多倍数演算により自由に精度を高めて再計算すればいい。
2019/01/06(日) 17:00:41.37ID:5fyS0TRC0
*多倍長演算*
2019/01/06(日) 17:07:05.46ID:5LUvK3vXd
オイラーは首席だったのか?
2019/01/06(日) 17:11:34.26ID:5LUvK3vXd
NO DATA.
2019/01/06(日) 17:23:51.30ID:5fyS0TRC0
ほら、反論しろよ?
2019/01/06(日) 17:41:26.55ID:kxJaA4Vn0
ふつー数値から文字列に変換する変換関数そのものに長さを報告させるだろ
文字列の格納先のメモリを確保するときのサイズ見積もりに対数を使う場合は
ワーストケースで誤差が出た場合に備えればいい
2019/01/06(日) 17:44:32.37ID:5fyS0TRC0
具体的なほとんどのプログラムでは常用対数の誤差を一桁以内にすることは可能だろう。
2019/01/06(日) 18:06:44.32ID:z+pllqoQ0
ゲームエンジンでおすすめありませんか?
911デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/06(日) 18:12:46.00ID:q7b7d/XL0
本屋さんにはUnityコーナーがあるよ。
2019/01/06(日) 18:19:00.70ID:z+pllqoQ0
>>911
siv3dみたいなのを探してます
オープンソースで参考になるやつ
2019/01/06(日) 18:21:40.42ID:mghQxkOO0
>>912
glfw
2019/01/06(日) 18:22:16.06ID:5fyS0TRC0
スマホゲームならWebGL一択、ハイエンドならUnity、Unreal Engine、CoCo3D、ローエンドならOpenGL, DirectDraw, Haxeといったところか。
2019/01/06(日) 18:34:54.20ID:z+pllqoQ0
>>913
>>914
うーん
一応webgl考えてみます
2019/01/06(日) 19:53:45.75ID:viPzIL890
>>908
変換関数そのものをプログラムしたい場合に、あらかじめ桁数が分かって
いる方が便利 or 効率が良い、場合があり、log_10(x)を使用したくなってしまう。
ところがが、log 計算には誤差が有る可能性があるので、その値を過信するのは
問題だと言うことが言いたかった。

例えば、文字列化する際には、多くのアルゴリズムでは、下の方の桁から
決まっていく。しかし、文字列バッファには、上のケタから左詰で入れて
行く必要がある。となると、最初から桁数が分かっていれば、簡単に
プログラムできるのではないかと言う誘惑に駆られてしまう。

後、10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズム
そのものにも誤差が有る可能性が指摘されている。
2019/01/06(日) 20:10:05.15ID:COVE8lO90
>>916
>10で割っていって余りを使う方法は簡単ではあるが、そのアルゴリズムそのものにも誤差が有る可能性が指摘されている。
え?10で割っていくのにどうして誤差が出るの?
2019/01/06(日) 20:16:22.17ID:kxJaA4Vn0
>>916
変換関数の中でメモリ割り付けを行うのが好みなのか?
2019/01/06(日) 20:27:50.31ID:Tw0qXLcy0
んま実際にわ数値の桁数とか型を見たら一発でわかるんですけどねwwwwww
logは人間の感覚特性にマッチした量的尺度を表したり(例:dB)、
情報量の表現に使う(同じものがいっぱいあるという状況は情報量を上げない)という目的が大きい
920デフォルトの名無しさん (ワッチョイ 8901-ikDe)
垢版 |
2019/01/06(日) 21:04:54.26ID:q7b7d/XL0
HTMLパーサーありますか?
2019/01/06(日) 21:27:13.56ID:kxJaA4Vn0
>>919
intは何桁だ?
2019/01/06(日) 22:23:30.07ID:IpTON8AO0
>>910
coronaがオープンソース化されたらしい
2dだが
2019/01/06(日) 22:46:51.25ID:viPzIL890
>>917
前提として浮動小数点数(float/double など) の話だけど、誤差が無いとは言い切れない
事は分かると思う。

誤差を少なくする方法として、10で割ったりせずに、最初から、
10000.0, 1000.0, 100.0, 10.0, 1.0, 0.1, 0.01, 0.001
20000.0, 2000.0, ・・・
30000.0, 3000.0, ・・・
40000.0, 4000,0, ・・・
のようなものを計算しておいて、比較したり引き算したりする方法が
あるそうな。

浮動小数点値の場合、当然かもしれないが log を使わずに、IEEE の仕様を元に
指数部のBIT部分を読んで利用する方がいいらしい。
2019/01/07(月) 08:39:12.81ID:4xwPMGVF0
桁数が重要になるような銀行や事務系の話?
それなら10進演算だろ
IEEEでも定義されてる
科学計算だと対数で問題ない
2019/01/07(月) 13:35:29.03ID:QyN6UiiI0
>>924
自分で printf() を実装する場合の、浮動小数点数を文字列に直す時の話。
2019/01/07(月) 13:47:41.82ID:hsoUdh4l0
自分でprintfを実装するとか銀行のシステムを作るよりレアケースだな
2019/01/07(月) 17:09:10.70ID:Cio2TleD0
ここがC++スレということを忘れて内科医?
printfはオーバーロードできるしグローバル以外の空間にも導入できる
2019/01/07(月) 20:19:39.05ID:hm6qCAOJ0
そんなことするんじゃねーよカスが。
2019/01/07(月) 23:14:26.87ID:lPhgCzer0
Pythonには素の遅いPythonとJITを使った素のPythonよりとてつもなく速いPythonがあるようですが
Boost.PythonでPythonスクリプトを読み込んで実行した場合は素の遅いPythonの速度になる認識であっているでしょうか?
また、Boost.PythonでJIT版Pythonを実行することは可能でしょうか?
2019/01/09(水) 00:35:27.60ID:I3YK3qiz0
>>929
全然その辺知らないけど、
そもそも、python の言語仕様自体がJITを使ったとしてもC/C++ほどの速度には
ならないはずだし、そもそも NumPy 使わないと遅いということは聞いてる。
大体のスクリプト言語は、言語仕様の段階で例えコンパイル言語化しても
どうすることも出来ない遅さが含まれてしまってる。
931デフォルトの名無しさん (ワッチョイ 917c-aDDJ)
垢版 |
2019/01/09(水) 11:18:19.67ID:+j6Vua/i0
numpy使えばC並みの速度が出るようにも書けるが
numpy使ったからと言って馬鹿が描くと素のpython以上に遅くなる
2019/01/09(水) 13:18:31.63ID:ePvWX0K6M
速度なんて誰でも気にしない優しい世界
2019/01/09(水) 19:27:53.32ID:LMntakFz0
用意されてるライブラリ使えと。
バカがイキって作ったライブラリより普通に速いから。
2019/01/09(水) 19:38:55.54ID:P7Qg82S60
numpyの使い方の話ではなく?
2019/01/09(水) 20:20:55.44ID:1OkzU/m20
というかスレチでは?
2019/01/09(水) 21:54:22.59ID:eG2hyzXv0
・動的型言語
・自動メモリ管理
・リンクリストと配列を余り区別しない書き方をする人が多い傾向。

これらがあるので、pythonをコンパイル型にしてもある程度以上の高速化は
難しいと思われる。
2019/01/09(水) 22:15:33.61ID:oaJURpH60
Cythonの話?
2019/01/09(水) 22:24:15.05ID:eG2hyzXv0
pythonの速度測定は、やってみたことないけどね。(^_^;)
2019/01/10(木) 08:22:27.02ID:jdFEneY4a
Pythonにリンクリストなんか無いだろ
Pythonの配列(list)はvector相当の動的配列
実はリンクリストが動的配列より速いケースってC++でも現実にはほとんど無くて、あまり価値のないデータ構造だよ
拡張・縮小にメモリの再確保が不要で抽象化を必要としないから、Cのような生ポインタを好んで使いまくる言語と相性がいいだけ
2019/01/10(木) 13:04:00.84ID:EKtor9ZH0
ttps://github.com/python/cpython/blob/master/Modules/arraymodule.c

3000行のありがたいソースコードを読み解けば何かが分る
2019/01/10(木) 13:06:20.15ID:RGz7BwRGM
>>940
普通に動的配列だな
2019/01/10(木) 15:05:21.30ID:681jFEkb0
ハード屋さんが頑張りすぎて必要なくなっちゃったな
でも便利だからforward_listを使うことはある
943デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/10(木) 20:06:55.51ID:Dp9bpyFY0
tupleってメンバ関数で値取り出せないのね。
std::get<N>( t ) ってファンキー過ぎやしませんか。
下手に使うとコンパイルに時間食われそう。
2019/01/10(木) 21:56:09.15ID:cH4uyoE20
関数やテンプレートで、できることとできないことを
冷静に考えてみな
2019/01/10(木) 22:54:40.61ID:pr4jZotH0
>>944
テンプレート化すればメンバ関数にすることはできるのでは?
2019/01/10(木) 23:01:28.43ID:681jFEkb0
コードを生成するのはプリプロセッサの役割
2019/01/10(木) 23:13:51.80ID:cH4uyoE20
>>945
すまん、いま泥酔状態だ
あとでな
2019/01/10(木) 23:31:47.36ID:lkkMD/RY0
メンバテンプレートにするとtupleをテンプレートに放り込んだときに
t.template get<0>()
と書かなきゃならなくなってこりゃないわーで皆が合意したからじゃ
949デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/11(金) 13:20:57.05ID:QV4rGvMY0
せめてstd::tuple::get<N>( t ) にして欲しかった。
std名前空間汚れすぎ。
950デフォルトの名無しさん (ワッチョイ a57c-Iup+)
垢版 |
2019/01/11(金) 13:34:51.99ID:5RUmP2fm0
>>943
それは確かに糞仕様だと思うが
テンプレートの意味から言えば仕方ないのかも知れない
(どんな型でも入れられるならテンプレート以外でやるべき)
2019/01/11(金) 14:22:09.67ID:gs9IdzGQM
他のコンテナでも同じように使える様にしたかったんじゃないの
オーバロードで
2019/01/11(金) 14:50:24.94ID:e7J07k250
std::getは固定長コンテナなら何でも使えるぞ
std::pairでもstd::arrayでも生配列でも
2019/01/11(金) 15:52:17.33ID:uZGQy9uP0
>>949
std::getにすることによってテンプレート引数にtupleと見なせる型(pair,array)を使うことができるようにしたいからそうなっている
2019/01/11(金) 15:56:06.33ID:uZGQy9uP0
ちなみにstd::getのユーザーによる特殊化は次から禁止される予定です
2019/01/11(金) 17:29:27.31ID:qkp6ca1e0
ポリモーフィズムを使っていて、ダウンキャストを行うときって
dynamic_castをしてみてnullptrかどうかを判断するのがベストな手順なんですか?
RTTIから実際の型情報を引っ張ってくる手段はないものでしょうか
2019/01/11(金) 18:21:19.24ID:3LH9+DohM
>>955
もちできるけど、検査したい型を継承した型を渡されたら動かないよ?
2019/01/11(金) 19:17:46.71ID:KlFqADLA0
>>955
それこそポリモーフィズムで派生クラスのthisを直でもらえばいいんじゃないの
958デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/11(金) 19:25:12.52ID:QV4rGvMY0
>>955
typeid で type_info 取れるよ。
基底クラスにenum Type 等を持たせてswitchも手の一つ。
処理内容によってはvisitor パターンが使える。俺が知ってるのはこれくらい。
2019/01/11(金) 20:46:28.26ID:e7J07k250
まず、なるべくダウンキャストなんか必要ないようにするのが最初だけどな
2019/01/11(金) 20:50:53.28ID:uZGQy9uP0
ダウンキャスト使わないのがベスト
2019/01/11(金) 21:13:21.95ID:ymL5E9Q60
>>955
ダウンキャストが必要になるなら、選択はそれしかない
2019/01/11(金) 22:23:52.97ID:jxLB4o2EM
>>955
ダウンキャストしたいんだよね?
なんで実際の型情報なんかを欲しがる理由がわからん
963デフォルトの名無しさん (ワッチョイ dd01-RNo8)
垢版 |
2019/01/11(金) 23:12:06.09ID:TUR+WyZ10
カミカゼキャストについて教えてください。
不意にフレーズが浮かんだのです。
2019/01/12(土) 00:03:01.76ID:i0P8FrwoM
SOLID守ってんのかよちゃんと
965デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/12(土) 01:42:52.85ID:Cfay/yS40
dynamic_castでnullptrなりbad-cast拾うのはお勧めできない。
2019/01/12(土) 01:53:56.64ID:ygc4MJ1X0
>>965
nullptrでキャスト可否を確認するのは普通の使い方だろ…
2019/01/12(土) 01:57:02.82ID:WnhdkTsC0
cならともかくc++でキャストが必要になるのはどっかやばいことになってる可能性を考えた方がいい
2019/01/12(土) 03:58:57.87ID:xRzP6oFDa
ライブラリの関数の引数が非constのchar配列で渡したい文字列がstd::stringに入ってるとき
.c_str()をconst_castしてるけどあかんの
2019/01/12(土) 04:35:25.22ID:vq0ymgcL0
opencvを使用して画像処理を行ってるんですが画像データにAWGNを加える方法が分かりません
グレースケール化させて処理をしています
乱数生成などは理解しているんですがその乱数を使ってどのような値として輝度値に影響させるのかが分かってません
よろしくお願いします
visual c++を使用しています
2019/01/12(土) 04:53:59.45ID:vq0ymgcL0
>>969
Mat s;
src.convertTo(s, CV_16S);
Mat noise(s.size(), CV_16S);
randn(noise, 0, sigma);
Mat temp = s + noise;
temp.convertTo(dst, CV_8U);

今こう考えているんですがあっていますでしょうか
srcが原画像、dstがノイズ画像です
2019/01/12(土) 04:55:24.88ID:k4bgy+v70
画像処理のことなんか知らん
2019/01/12(土) 05:30:28.09ID:DxcCYmak0
>>955
RTTIから実際の型情報を引っ張ってくる手段というとtypeidだね
void func(ios_base* ptr)
{
if(typeid(*ptr) == typeid(istream) { /* ... */ }
if(typeid(*ptr) == typeid(ostream) { /* ... */ }
}
2019/01/12(土) 08:53:04.29ID:Ma3Bi+e40
>>968
非constのchar配列を要求するという事は書き換えられる可能性がある
逆にconst付でchar配列を返す方は書き換えないという前提で渡してる
面倒だけどコピーしてから渡すべき
2019/01/12(土) 09:04:15.07ID:VES9RvQbM
>>973
さすがに神経質すぎる
そのライブラリの関数が文字列を書き換えない仕様なんだったら信用すればよい
そんなこと言い出したら何一つ信用できなくなってプログラムなんか書けん
2019/01/12(土) 09:10:15.98ID:Ma3Bi+e40
>>974
書き換えない、という仕様なら最初からconstを要求すればいいだけのこと
constを要求していない以上書き換えられる可能性を考慮するのは当たり前の前提
976デフォルトの名無しさん (ワッチョイ a57d-VK1S)
垢版 |
2019/01/12(土) 09:12:16.23ID:iREAiCU50
constついてないってことは内部で書き換えるという明確な意思表示だろ
2019/01/12(土) 09:29:29.58ID:VES9RvQbM
Cのライブラリに依存してるとか普通にあるだろ
2019/01/12(土) 09:31:51.80ID:VES9RvQbM
あと、ライブラリを作った奴のスキルの問題でconstを付けるべきときに付いてないのも仕事でやってりゃ普通にあるぞ
2019/01/12(土) 09:34:33.47ID:Ma3Bi+e40
Cのライブラリに渡すのならなおらstd::stringの内部配列を渡すべきでないし
そのようなスキルの低い作者の作ったライブラリの何を信用しろと言われるのか
2019/01/12(土) 09:35:58.84ID:VES9RvQbM
Cに一切ポインタ渡すなって?
凄いこと言うなあ
2019/01/12(土) 10:17:58.63ID:D4HU0Own0
なにもそう煽らなくても
現場の人間か責任を負う立場の人間かで意見も異なるのがわかるだろうに
2019/01/12(土) 10:56:59.61ID:Fa1DhIVTa
責任を負う立場の人間がconstがどうのなんて気にするわけないでしょw
「契約相手がそう言ってるなら信用すればよい。違っていたら相手の責任だ。」で終わりだよ
2019/01/12(土) 11:23:34.77ID:WnhdkTsC0
まあ契約でそうなってても残業するのは作業者だからな。。
バカの言うことなんて信用しないで安全に倒した方が正解だわ。
984デフォルトの名無しさん (スップ Sd7a-9pEX)
垢版 |
2019/01/12(土) 11:34:06.80ID:JcHNo1aqd
constは付いてないですけど内部で書き換えはしません
なんて仕様書に書いてあるのか
2019/01/12(土) 12:01:03.58ID:VES9RvQbM
void displayText(char* text);
文字列を表示します
text : 表示する文字列

これが仮にtextを書き換えてしまうとして、それをコピーで回避できたとしても、
そんなレベルのゴミがまともに機能するとは到底思えん
そんなことを言い出したらキリがない
2019/01/12(土) 12:48:58.54ID:d9Np0YH50
>>942
1. 要素数を N としたとき、1つの要素の処理に要する時間が O(N) になるか、
  O(1) などの違いなので、本質的にハードがいくら良くなっても解決する
  問題ではない。O(N) のアルゴリズムは、N が大きくなった場合には、
  ハードの良さを台無しにしてしまう。なので、アルゴリズムの選定はとても
  重要。

2. 動的配列でも、配列の最後に追加する場合は、リンクリストと遜色ない速度は
  出る可能性は十分あるが、配列の途中に追加する場合は、宇宙人でも無理。

3. 逆に、リンクリストの場合は、先頭から数えて、「k 番目の要素」にランダム
  にアクセスすることを高速化することは、宇宙人でも無理。

4. 「宇宙人でも無理」の意味が理解できるためには、数学的感性が必要。
  理解できない人には理解できないかもしれない。
2019/01/12(土) 13:04:53.68ID:VES9RvQbM
>>986
問題は、リンクリストの途中に挿入したいとき、予め挿入位置の直前や直後のノードへのポインタを持っていなければならないことだ
そんなケースは現実の開発において殆ど無い
持っていなければ挿入位置に辿り着くまでにO(N)のシーケンシャルアクセスが発生する
そして、リンクリストはメモリアクセスの局所性が欠片もないデータ構造であり、
動的配列と比較してシーケンシャルアクセスのパフォーマンスは極めて劣悪である
2019/01/12(土) 13:27:37.63ID:xzy8SRaPM
テキストエディタのバッファ管理なんてのが
そのケースなんですけどね
2019/01/12(土) 13:33:01.95ID:VES9RvQbM
>>988
うん。レアケースだね。
2019/01/12(土) 13:34:27.13ID:xzy8SRaPM
我田引水の基地と判明
991デフォルトの名無しさん (ワッチョイ 4ea0-N8Dk)
垢版 |
2019/01/12(土) 13:40:34.57ID:Cfay/yS40
>>968
あかん。データを壊したくなかったら、別途コピーしたものを渡すべき。
2019/01/12(土) 13:44:47.40ID:7KwgHC6s0
そろそろ次スレ
2019/01/12(土) 14:46:05.16ID:k4bgy+v70
俺の上司とかconstって何?よけいなもんつけんなっていうおじさんだから内政のライブラリは参照でもconst付いてないよ
2019/01/12(土) 15:06:09.76ID:k4bgy+v70
>>986
で、そのリンクリストがパフォーマンス的に勝るデータ量はおいくらだと思ってる?
大きめの画像くらいのサイズならデータの中央に挿入するとき、リンクをたどって挿入するより再確保、再配置した方がシーケンシャルアクセスになるから早いからな
ハードウェアの特性によりシーケンシャルなコピーは相当速いためPythonで一般的に扱う問題では挿入だろうが何だろうがリンクリストが勝ることはまずない
2019/01/12(土) 15:20:37.52ID:T5Trh1u0M
よくリストの特定位置に挿入を繰り返してリンクリストの方が速いというベンチマークがあるけど、あれもほとんど詐欺なんだよな
動的配列に多数の要素を挿入するなら挿入する要素数分ブロックコピーでずらしてから空けた隙間に書き込むだけだからリンクリストより圧倒的に速い
予め要素数が分からない場合は、いったん別の動的配列に追加していってから纏めて挿入すればよい
2019/01/12(土) 15:20:48.59ID:yBCTPneO0
>>994
>再確保、再配置
ここ c++ だよね
再配置というのはコピーコンストラクタが働く、てことだよね
挿入のたびにコピーコンストラクタが動くなんて馬鹿のやることだ、という常識が通用するところだよね
2019/01/12(土) 15:21:48.44ID:yBCTPneO0
>>995
>ブロックコピーでずらしてから
ユーザーによるコピーコンストラクタが定義されていたら「それだけでは済まない」のでは?
2019/01/12(土) 15:42:46.28ID:k4bgy+v70
ユーザーが勝手に遅くすることは関係の無い話だ
その場合リストを使えばいいのでは
2019/01/12(土) 16:00:10.74ID:iezJoARlM
コピーが嫌なら別途ポインタの動的配列を持てばよい
それでもリンクリストよりは速いわ
2019/01/12(土) 17:28:52.24ID:xSSM7u+V0
リストに親でも殺されたのか? w
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 98日 16時間 29分 4秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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