C++相談室 part144

レス数が900を超えています。1000を超えると表示できなくなるよ。
2019/07/22(月) 13:18:35.52ID:gptRHpgT
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part143
https://mevius.5ch.net/test/read.cgi/tech/1560574313/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
2019/09/05(木) 19:47:31.38ID:Scz25acM
>>820

該当アプリはsololearnやね。

実務で使うわけでも無いしcpprefjpに書くのは恐れ多い。
2019/09/05(木) 20:17:53.77ID:RTqjgiVl
>>779
% を使う、というのは「下位ビット」を使う、という意味と同じですよ
2019/09/05(木) 20:18:27.47ID:RTqjgiVl
>>780
rand() は線形合同法でインプリメントされているので、乱数の質はあまりよろしくないのです
2019/09/05(木) 20:58:58.28ID:XFJCfiEp
>>823>>824
うぜーなーそんなもん誰でも知ってる
2019/09/05(木) 21:59:37.41ID:04ZPpNlH
>>822
ああなるほど
あのアプリはどこかサーバーに送って実行してるというわけではないのね
それとも送った先がおかしいのか?
2019/09/05(木) 22:23:16.46ID:O7Dd9aK6
知らないジジイがいるから教えてるだけだぞ
2019/09/05(木) 22:55:03.42ID:dJChsmUT
>>823
それは違う。
2019/09/05(木) 22:55:52.34ID:dJChsmUT
% と & の違いが理解できないとは・・・。
2019/09/05(木) 23:11:16.46ID:dJChsmUT
だれが rand() が危険と教えてるんだろう。
これが日本の教育か。嘆かわしい。
2019/09/05(木) 23:13:15.63ID:emUna+dk
とりあえず
rand 危険性 下位ビット
辺りで検索して出直してこい
2019/09/05(木) 23:13:29.08ID:dJChsmUT
このスレは、自分が馬鹿だと気づいてない人が多いのが問題。
2019/09/05(木) 23:14:54.43ID:dJChsmUT
質の悪い乱数 ≠ 危険

であることも理解できないとは。
2019/09/05(木) 23:16:21.31ID:dJChsmUT
頭の悪い人は、自分が頭が悪い事に気付かない。
それが最大の問題なんだ。
だから学歴フィルターで落とす。
2019/09/05(木) 23:22:15.18ID:3AoluiiY
馬鹿だから自分の判断よりも学歴で判断することになる。
あんなもんは足切り以外役に立たん。
2019/09/05(木) 23:22:53.94ID:dJChsmUT
馬鹿は馬鹿だと気付かないからな。
学歴フィルターがあるんだ。
2019/09/05(木) 23:24:12.84ID:oF7lOGXi
悪い乱数をセキュリティ関係に使うとまずい
2019/09/05(木) 23:24:14.66ID:dJChsmUT
& と% の違いもいくら言っても理解できないんだろ。
rand() の質が悪い事を危険と思っていたりとかな。
2019/09/05(木) 23:25:02.42ID:dJChsmUT
>>837
それはお前だろ。
今回の質問は、セキュリティー関係ないだろ。
2019/09/05(木) 23:30:31.24ID:mvC8Xt02
mtだってセキュリティ目的で使うべきではないが他に分野では一般的に用いられる優秀な乱数
要件次第で何が良いかは変わる
randは対応できる要件が少なくて大抵の場合xorやmtが上位互換になれる
メモリ周りがキツい環境下ならmtは候補から外れることもある
2019/09/05(木) 23:32:50.72ID:oF7lOGXi
一般に、ビット毎のANDと、剰余(余り)は別の演算だが、最適化によっては剰余がANDになることがある。
2019/09/05(木) 23:36:21.38ID:HDKa127r
>>841
そんなもの誰でも知ってる。
and と mod は別の概念だ。
2019/09/05(木) 23:36:48.12ID:Wj2GuKre
なんで最適化が出てくるよ?除数が2の冪かどうかだけだろ。
2019/09/05(木) 23:52:27.70ID:oF7lOGXi
昔は%が物凄く遅かった。
2019/09/05(木) 23:59:42.92ID:HDKa127r
>>844
それはそうだね。
2019/09/06(金) 00:45:20.09ID:kzddYIGk
つか、事あることにセキュリティって言ってるけど、厳選された乱数を使うような、シビアなセキュリティのプログラム作るような人がここにいるの?
2019/09/06(金) 00:54:30.17ID:9umjXXHu
a=b*2^n だった場合、
rand() % a の下位 n ビットには元の rand() の下位 n ビットがそのまま現れる。
2の累乗だけでなく、2の累乗を約数とする場合も下位ビットの影響が大きい。
2019/09/06(金) 00:56:43.20ID:AgDBiA/M
パスワード管理とか通信ソフトとかオンラインゲームとか。数える位は居るだろうよ。
2019/09/06(金) 00:58:53.52ID:ZIHlUiP/
>>826
試しにwebのsololearnでも試してみたとろmt19937のデフォルトと同じ乱数列を生成したのでcpprefjpに書いてあるWindowsのGCCと同じ挙動だな。
2019/09/06(金) 01:27:15.87ID:TfAw/avA
定義の前にvirtual付ければ仮想関数になるのは分かるんだけど、動的接続の意味がちょっと分からない
2019/09/06(金) 01:28:44.78ID:cs8CUE0i
>>849
実行環境Mingwとは思えないので他にも同じことしてる実装があるんか
それとも独自実装なのか、まさか
2019/09/06(金) 01:48:27.80ID:cs8CUE0i
>>851
定義済みマクロで調べてみたら実行環境Mingwぽい・・・・
2019/09/06(金) 01:55:47.74ID:cs8CUE0i
sololearnの実行環境、Mingw GCC 7.2.0らしい
Mingw GCCのrandom_deviceが治ったのは9.2から・・・
2019/09/06(金) 07:14:39.55ID:ZIHlUiP/
>>853

char_traitsのlengthがconstexpr対応してないのもあるよ。
その為にstring_viewがconstexprに出来ない。
855デフォルトの名無しさん
垢版 |
2019/09/06(金) 08:33:08.03ID:5s+Nj0ya
constexpr を#if 〜 #endif マクロ で使えるようにできないですか?
2019/09/06(金) 08:36:49.45ID:Ai9IWLM5
それは根本的におかしい
2019/09/06(金) 10:01:31.79ID:7h7MjjwN
>>817
>>805
2019/09/06(金) 10:02:35.89ID:7h7MjjwN
>>847
それはお前の選び方が悪い
2019/09/06(金) 12:35:45.50ID:NkLDDTp5
rand使うときはまずMAXで割ってから、欲しい範囲をかけて使ってね
2019/09/06(金) 17:17:41.26ID:h7oJ0UUz
g++ -mtune=ivybridge -O3 -S
こうやってもrdrand命令使ってくれないな
2019/09/06(金) 20:30:19.25ID:mhFSZpwS
どうやったら使うの
2019/09/06(金) 20:43:09.72ID:cs8CUE0i
たぶんだけど、rdrand単体は信頼度が低いから必ずシステムの乱数源から取得するようにしてるんだと思う
2019/09/06(金) 21:22:27.86ID:ZK4CQ9gu
>>828
どう違うのですか?
2019/09/06(金) 21:22:57.75ID:ZK4CQ9gu
>>830
mt 使え、っていう意味なのでは?
2019/09/06(金) 21:23:41.99ID:ZK4CQ9gu
>>840
純粋に質問です
>mtだってセキュリティ目的で使うべきではない
それはなぜですか?
2019/09/06(金) 21:26:09.91ID:ZIHlUiP/
cpprefjpでは624個の出力で次の出力を予想出来ると書いてるな。
2019/09/06(金) 21:28:52.49ID:gp4KcBLb
>>865
ソフトウェアだけで作り出した乱数は予測可能だから
2019/09/06(金) 22:42:43.08ID:/xfj8nPF
>純粋に質問です
>>mtだってセキュリティ目的で使うべきではない
>それはなぜですか?
これはさすがにググレカス言うべきだろ。本人のためにも。
てかググって調べた方が実際本人のためだわ。
869デフォルトの名無しさん
垢版 |
2019/09/06(金) 22:52:53.67ID:5s+Nj0ya
ちまたでは「丁寧な無視」がトレンドワードですが、C/C++でエラーを丁寧な無視することで得られるメリットを教えろください。
2019/09/06(金) 22:55:08.02ID:gp4KcBLb
納期に間に合う
2019/09/06(金) 22:56:36.14ID:hgPplejZ
読めない英語の警告は丁寧に無視
2019/09/06(金) 23:23:43.95ID:6s2WTt0o
QZは質問に質問で返すアホ
無視に限る
2019/09/06(金) 23:39:21.29ID:gp4KcBLb
質問に不備がある場合は質問で返す必要がある
2019/09/07(土) 00:19:45.14ID:qWaNgvFq
QZは不備のあるなし関係なしに質問には質問で返してるぞ
マウント取りたいだけなんだろうな
2019/09/07(土) 05:13:55.94ID:1BrXByny
大量の乱数(1000x1000)を高速に求める方法はありますか?
2019/09/07(土) 05:27:55.85ID:qkjEuZ8z
GPUに乱数生成ってないのかな
2019/09/07(土) 06:50:39.07ID:HDhw8kAD
https://developer.nvidia.com/curand
2019/09/07(土) 13:49:44.55ID:VQVarZXt
valarrayさんが仲間になりたそうにそちらを見ている。
2019/09/07(土) 20:48:11.58ID:vbfnpKSX
vecter<bool>さんもこちらを見ている!
2019/09/07(土) 22:00:34.12ID:qkjEuZ8z
仲間にしますか? ▶︎いいえ NO
881デフォルトの名無しさん
垢版 |
2019/09/07(土) 22:23:43.46ID:5djAVjeX
Office2000でのイルカの消し方をイルカに質問する感性を大切にしたい。
882デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:27:12.03ID:8BL9REyc
文字列で指定したクラスのインスタンスを生成する方法ってあるのでしょうか?
883デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:30:28.50ID:m+XQHtHp
コンパイル時ならテンプレート
実行時ならDBでも用意してcaseでも使え
884デフォルトの名無しさん
垢版 |
2019/09/08(日) 13:31:17.61ID:+erxyDXy
pythonのクラスなら可能
2019/09/08(日) 13:33:13.25ID:jesnwhA+
あるけど生成したインスタンスを静的に受けとるには生成されるクラスの種類がポリモーフィズムをとれないといけない
2019/09/08(日) 15:24:20.28ID:WYqdduYI
>>885
個人的には C++ にはそういう機能はないんではないかと思うんですが。
2019/09/08(日) 15:27:47.20ID:rbzdrKrZ
リフレクションのたぐいだと思うのだが、まだない。
2019/09/08(日) 15:37:22.01ID:ijKgjVtQ
選択肢になりうるクラスの共通の親を作れば
2019/09/08(日) 16:06:14.53ID:JVGfWN1Z
生成したいクラスのリストがあらかじめわかっていれば可能
2019/09/08(日) 16:07:33.58ID:rbzdrKrZ
decl_typeが文字列を受け付ければいいが、あれも静的に解決してそうだなぁ。
2019/09/08(日) 16:14:18.54ID:qEJgkL29
>>882
文字列とクラスの対応はtype_info::name()で与えられているが
文字列の形式が処理系定義であることに注意が必要
892デフォルトの名無しさん
垢版 |
2019/09/08(日) 16:23:33.90ID:m+XQHtHp
>>886
その通りだが
自分で規定を作ってしまえ良い
全てのクラスを単一のメタクラスから派生するルールで統一汁
2019/09/08(日) 16:25:39.30ID:rbzdrKrZ
Typeを保持するタイプが欲しいわ。。

type t=int;

的な。
2019/09/08(日) 16:29:08.94ID:x7//igd4
実行時に文字列で指定したいのかソースコードレベルの話なのかわかんねえ
2019/09/08(日) 16:39:53.43ID:x7//igd4
共通の親クラス持たせてmapのキー文字列にして生成用の関数ぶっこめばいいけど
親クラスが共通じゃない場合は難しいのかな
2019/09/08(日) 16:48:58.23ID:ijKgjVtQ
全クラスに対応する必要なんてないんだったらこんな感じでいいんじゃないか
enum ClassName{
Hoge,
Hige,
Hage
}
std::any func(ClassName name){
std::any out;
switch(name){
case ClassName::Hoge:
out = new Hoge();
break;
case ClassName::Hige:
out = new Hige();
break;
case ClassName::Hage:
out = new Hage();
break;
}
return out;}

int main(){
//なんか文字列を受け取る
ClassName name;
//文字列をClassNameに変換する
auto fuga = func(name);
if(fuga.type() = typeid(Hoge*)){
auto hoge = std::any_cast<Hoge*>(fuga);
//hogeの処理
} else if 以下略
}
2019/09/08(日) 17:24:35.33ID:qEJgkL29
全クラスをユーザーが把握している必要があるなんてクソ設計だな
2019/09/08(日) 17:52:15.72ID:aYvF75oN
なぜAbstractFactoryパターンを使わないのか
2019/09/08(日) 17:58:58.65ID:qEJgkL29
>>882
GUIDで指定したクラスのインスタンスを生成する方法なら
COMのCoCreateInstance()がそれだが参考になるか?

ユニークでなければならないクラス名を文字列で指定はかなりキツいという意味で
2019/09/08(日) 18:29:25.64ID:46Wp6heU
vtableでなんとかならんの?
901882です。
垢版 |
2019/09/08(日) 21:55:34.48ID:8BL9REyc
必要な情報が色々と抜けていたのに、色々と情報をいただきありがとうございます。
私が考えていたのは実行時に型を登録するようなクラスを使う方法です。
仮コードですが下記のような感じです。
template<typename BaseType> class InheritanceContainer{
struct IInheritance{
// BaseTypeを継承したクラスを生成
virtual BaseType* Create() const = 0;
};
template<typename Type> struct Inheritance : public IInheritance{
virtual BaseType* Create() const{ return static_cast<BaseType*>( new Type() ); }
};
public:
// 型情報の登録
template<typename Type> bool Add(){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( ctti::nameof<Type>().cppstring() ); // ctti::nameof<Type>().cppstring() cttiライブラリーを利用して型の文字列を取得する
if( it != m_InheritanceMap.end() ) return;
m_InheritanceMap.insert( std::make_pair( ctti::nameof<Type>().cppstring(), new Inheritance<Type>() ) );
}
// 文字列に合わせた BaseType を継承した物を生成
BaseType* Create( const std::string& _TypeText ){
std::unordered_map<std::string, IInheritance*>::iterator it = m_InheritanceMap.find( _TypeText );
return it != m_InheritanceMap.end() ? it->second->Create() : NULL;
}
private:
std::unordered_map<std::string, IInheritance*> m_InheritanceMap;
};
一応これでも要件は満たしているのですが、
いかんせんこれだと使うクラスを予め手動で登録している必要があり、
保守管理が手間なので皆様のお知恵を拝借できればと思い質問した次第です。
頂いた情報はこれから勉強します。
2019/09/08(日) 23:12:54.90ID:35vt5+A/
C++なんだしnullptr使ってこうぜ
2019/09/09(月) 00:06:19.70ID:9HmBuaOU
基本的な事なのですが教えてください。
memcpy可能なクラス若しくは構造体はどうやって判定するのがスマートですか?
2019/09/09(月) 00:11:49.05ID:PN/XD42X
>>903
使う必要ないでしょ
Cと違うよ
2019/09/09(月) 00:22:36.87ID:9HmBuaOU
>>904
1から作られればそうするのですが、c言語のベースがあって、それをコピペでc++で改修して、そいつの改造なんでどうしても必要なんですよ。
手を出せない共通処理がmemcpyを使ってるから、チェック処理が必要だったので
2019/09/09(月) 00:23:34.34ID:gU/0Tin3
>>903
自分で解析するかコード書いた人に保証してもらうしかないと思うよ。
基本型だからコピーしても大丈夫と思ったら参照カウンタとして使われていた、なんてこともあるだろうし
2019/09/09(月) 00:30:39.85ID:cBWmqiWb
std::is_trivially_copyableとか?
2019/09/09(月) 00:44:58.27ID:k7L7RTJv
C互換ということならstd::is_podがいいのかな
2019/09/09(月) 02:56:10.10ID:L8mIN3PD
std::is_pod とかってどうやって実装されてるんだろう。
コンパイラのビルトイン? それとも template で作られてる?
2019/09/09(月) 03:00:19.03ID:MF4WMKe5
constexprでは
2019/09/09(月) 03:50:37.41ID:9JOMxNeV
type_traitsはだいたいビルトインでしょ
コンパイラは知ってるはずの情報なんだから変なトリックコードで取る必要もない
2019/09/09(月) 06:48:32.63ID:qT2kJ6NO
>>911
こちらでどうぞ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
913909
垢版 |
2019/09/09(月) 12:06:40.11ID:L8mIN3PD
>>911
自分で調査してみたところ、以下の様に、あなたのおっしゃるとおり、
中核部分は、__is_pod(クラス名) という「ビルトイン関数」を使っていました:


 // Could use is_standard_layout && is_trivial instead of the builtin.
 template<typename _Tp>
  struct is_pod
  : public integral_constant<bool, __is_pod(_Tp)>
  { };

 /// integral_constant
 template<typename _Tp, _Tp __v>
  struct integral_constant
  {
   static constexpr _Tp         value = __v;
   typedef _Tp              value_type;
   typedef integral_constant<_Tp, __v>  type;
   constexpr operator value_type() const noexcept { return value; }
#if __cplusplus > 201103L
#define __cpp_lib_integral_constant_callable 201304
   constexpr value_type operator()() const noexcept { return value; }
#endif
  };
2019/09/09(月) 12:31:11.05ID:BaqZzWRe
QTとElectronどっちが優れてますか?
2019/09/09(月) 12:34:21.95ID:L8mIN3PD
>>914
単純にQtだと思うが。
2019/09/09(月) 13:01:23.17ID:a6mWw99g
小学生のどっちが強い議論かよ
917デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:14:59.70ID:By40c52C
>>901
pythonのPyObjectのコード観てみ
2019/09/09(月) 13:38:51.72ID:BaqZzWRe
>>915
ありがとうございます
>>916
神になる方法が知りたくて‥
919デフォルトの名無しさん
垢版 |
2019/09/09(月) 13:41:26.48ID:FLVXg6p/
tk > wxWidgets > Qt > electron
920デフォルトの名無しさん
垢版 |
2019/09/09(月) 14:33:07.01ID:dQ/pGf2B
stringstreamで

std::stringstream ss;
ss << value;
std::string str = ss.str();

こんな感じで数値を文字列に変換すると、valueが3桁以上だった場合
12,000みたいな感じで勝手にカンマがついてしまうんだけど
カンマがつかないフォーマットで出力する方法を教えてください
2019/09/09(月) 14:53:29.86ID:KKylx/uA
なんかロケールがアレなんじゃ
2019/09/09(月) 15:32:31.63ID:qT2kJ6NO
普通、コンマは付かんだろ
https://ideone.com/L7hohk
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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