1 名前:デフォルトの名無しさん (ワッチョイ efda-9b8G) mailto:sage [2023/10/31(火) 07:37:38.52 ID:+ZyYyqMO0.net] !extend:checked:vvvvv:1000:512 !extend:checked:vvvvv:1000:512 ↑同じ内容を3行貼り付けること 次スレは>>980 が立てること 無理なら細かく安価指定 ※前スレ C++相談室 part164 https://mevius.5ch.net/test/read.cgi/tech/1683600652/ VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
64 名前:デフォルトの名無しさん mailto:sage [2023/12/05(火) 11:05:15.15 ID:E3GJtsiR0.net] #include <type_traits> #include <iostream> using namespace std; int main () { int value {0}; int *p {&value}; cout << is_reference <int>::value << '\n'; cout << is_reference <int &>::value << '\n'; cout << is_reference <decltype (value)>::value << '\n'; cout << is_reference <decltype (*p)>::value << '\n'; return 0; }
65 名前:デフォルトの名無しさん [2023/12/05(火) 11:09:19.91 ID:IVr4NrBA0.net] >>63 参照ってのが何を意味しているか分からんが 普通はポインターの示す場所の内容だ
66 名前:はちみつ餃子 mailto:sage [2023/12/05(火) 11:22:18.93 ID:z5PiblaY0.net] >>63 ポインター p に対して *p とした場合の型は参照ではない。 たぶん >>64 は *p が参照と言いたいつもりで書いているんだと思うけど decltype に与えられる式の型が T 型の lvalue だった場合には T& が返されるルールなので その式が参照でなくても参照が返されることがある。
67 名前:はちみつ餃子 mailto:sage [2023/12/05(火) 11:24:42.01 ID:z5PiblaY0.net] あ、ごめん。 完全に間違った説明してたわ。 忘れて……。 恥ずかしい。
68 名前:はちみつ餃子 mailto:sage [2023/12/05(火) 11:34:00.06 ID:z5PiblaY0.net] と思ってよく仕様を読んでみたらやっぱりこの (>>66 ) 考え方で正しいはず。 式が識別子式の時に限っては decltype は参照にならず式の型そのままで返すせいで decltype(value) は参照にならないが、 value と *p は型システム的にも値カテゴリ的にも同じだわ。
69 名前:デフォルトの名無しさん mailto:sage [2023/12/05(火) 12:43:28.97 ID:E3GJtsiR0.net] >>68 なるほどー! 横からだが勉強になった
70 名前:デフォルトの名無しさん mailto:sage [2023/12/05(火) 12:48:03.77 ID:E3GJtsiR0.net] 巷のスマートポインタはoperator*で参照型を返すので 生ポインタも同じかと思ってたよ
71 名前:はちみつ餃子 mailto:sage [2023/12/05(火) 13:28:25.92 ID:z5PiblaY0.net] 互換性の都合とかがあるから仕方ないね。 場合分けが大量にあって単純な一般原則の組み合わせにはなってないから仕様を読み解くのがしんどい……
72 名前:デフォルトの名無しさん mailto:sage [2023/12/11(月) 15:17:51.77 ID:7vxydTfj0.net] ある構造体Aがあります Aの比較関数が複数ありますcompA0,compA1,compA2,... 比較関数の関数ポインタがありますcompA compA = &compA2; 別の構造体Bがあります BはAを内包しています struct B{ A a; ... }; この構造体Bを、Aの比較関数ポインタcompAで比較してソートするにはどう記述すればよいですか? std::vector<B> bs; bs.push_back(...);... std::sort(bs.begin(),bs.end(),?); できればラムダ式を使わずにできるとありがたいです
73 名前:デフォルトの名無しさん mailto:sage [2023/12/11(月) 15:22:02.06 ID:F1R6HyeLM.net] >>72 ラムダ式使った方が良いと思うけど本当にラムダ式なしが良い?
74 名前:デフォルトの名無しさん mailto:sage [2023/12/11(月) 15:29:19.94 ID:7vxydTfj0.net] 使われると、ラムダ式の質問をすることになると思います・・・
75 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) mailto:sage [2023/12/11(月) 15:45:20.57 ID:wAhsIAfi0.net] >>72 もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に 比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから これ一発でいけてだいぶん楽できる。 std::ranges::sort(bs, compA, &B::a);
76 名前:デフォルトの名無しさん (ワッチョイ d701-Qbcu) mailto:sage [2023/12/11(月) 16:01:10.52 ID:dil4ai7q0.net] >>75 すげ! 今そんなのあるんやね
77 名前:デフォルトの名無しさん mailto:sage [2023/12/11(月) 16:34:20.59 ID:dil4ai7q0.net] >>74 思い出すのがしんどくなってきた #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; struct A {int value_;}; bool compA2 (const A &lhs, const A &rhs) { return lhs.value_ < rhs.value_; } struct B {A a;}; int main () { vector <B> bs; bool (*compA) (const A &, const A &) {compA2}; sort (bs.begin(), bs.end(), bind (compA, bind (mem_fn (&B::a), placeholders::_1), bind (mem_fn (&B::a), placeholders::_2))); sort (bs.begin(), bs.end(), [compA] (const auto &lhs, const auto &rhs) {return (*compA) (lhs.a, rhs.a);}); return 0; }
78 名前:デフォルトの名無しさん mailto:sage [2023/12/11(月) 17:14:54.00 ID:cVrrslE50.net] >>75 >>77 お二方、ありがとうございます 参考にして組んでみます
79 名前:はちみつ餃子 mailto:sage [2023/12/11(月) 17:25:04.51 ID:wAhsIAfi0.net] その場で合成するのはさすがに見通しが悪すぎるので、 C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。 ちょっと雑ですまんがとりあえずこんな感じ。 class compB_adaptor { private: using comparator = std::function<bool(const A&, const A&)>; comparator compA; public: compB_adaptor(comparator comp) : compA(comp) {} bool operator()(const B& x, const B& y) { return compA(x.a, y.a); } }; 使うときには間にひとつ挟むだけで済む。 std::sort(bs.begin(), bs.end(), compB_adaptor(compA));
80 名前:デフォルトの名無しさん (ワッチョイ 771f-oseA) mailto:sage [2023/12/11(月) 22:08:32.24 ID:cVrrslE50.net] >>79 求めていたものそのものであったため、採用させていただきました ありがとうございます
81 名前:デフォルトの名無しさん mailto:sage [2023/12/20(水) 23:47:12.14 ID:tqHuIeXr0.net] int x; std::cout << x; でxが正ののときは「+」符号を付けさせるのってどうするんでしたっけ…… cout.form("%+d", x)とか以外で
82 名前:デフォルトの名無しさん mailto:sage [2023/12/20(水) 23:58:48.32 ID:Qfvbx0VO0.net] cout << showpos
83 名前:デフォルトの名無しさん (ワッチョイ 1663-4if3) mailto:sage [2023/12/21(木) 08:41:44.38 ID:6wjPSKlj0.net] てきました㌧クス、 iosヘッダで探せば良かったのか、、、
84 名前:デフォルトの名無しさん mailto:sage [2023/12/21(木) 20:01:46.13 ID:i16TeC3D0.net] C++23だとこれ std::print("{:+}", x);
85 名前:デフォルトの名無しさん mailto:sage [2023/12/22(金) 13:56:54.85 ID:pQLEje080.net] PythonやC#のようなf"{x}"構文が作られる事はないんだろうか
86 名前:はちみつ餃子 mailto:sage [2023/12/22(金) 14:54:27.15 ID:gr/vrzoo0.net] >>85 リフレクションが充実すればその上に実装できるので 直接的な言語機能として用意すると 辻褄合わせが後で面倒になるだろうし、 現時点で考えるのは時期尚早だと思う。
87 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 17:42:14.24 ID:foDTiHm90.net] 質問なのですが自作クラスFooのストリーム出力演算子に引数付きのマニピュレータを追加したいのですが ↓こんなやつ Foo obj; cout << custom_setw(10) << obj; // 整数のベクトル的なオブジェクトobjの要素を幅10文字で出力 custom_setw()で与えた10という数値をつつがなくFooのストリーム出力演算子 std::ostream& operator<<(std::ostream& os, const Foo& obj) に渡すには一体どうすれば……orz
88 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 17:42:52.36 ID:foDTiHm90.net] グローバル変数渡しは最初に思いつくのですが、ostringstream os1, os2とFoo obj1, obj2に対して異なるスレッドで os1 << custom_setw(30) << obj1; // スレッド1 os2 << custom_setw(20) << obj2; // スレッド2 とかやったら詰むし std::setw()とか一体どうやってるんじゃ……
89 名前:はちみつ餃子 mailto:sage [2023/12/24(日) 18:05:55.09 ID:SfA3xmSz0.net] >>87-88 特定の型を出力するときにだけ作用する書式を設定するマニピュレータってこと? std::setw がやってるのはストリームのメンバ関数 width を呼ぶのと同じ。 ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。 もちろんあなたが定義した独自の型 (この例では Foo) に結び付いた書式を保持するところなんて存在しないから単純にはできない。 私が思いつくのは ・ ストリームのほうも新しいものを定義する、つまり basic_ostream を継承して Foo 用の書式を格納するデータメンバを増やす ・ ストリームに対応付いたデータを格納するものを std::map かなんかで保持しておいて Foo を出力するときはそれを参照する ということくらいかな。 スレッドが絡むと面倒くさいけど、しょうがないね。
90 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 19:04:41.48 ID:vbUOIudY0.net] 既存のcoutとかstringstreamとかで使いたいなら、グローバルのstd::unordered_map<std::ios_base*, MyManipData>にでも置いとくしかないだろうね ストリームオブジェクトの状態で持たせるクソ設計が悪いんだ
91 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 19:34:37.93 ID:foDTiHm90.net] レス㌧クス、 >ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。 なるほど…… これはユザーの立場からはメンバの追加ができない領域なので、Fooの側にメンバを持たせることにしますか…… class FooWrp { const Foo& m_objRef; int m_nWidth; public: FooWrp(const Foo& obj, int width) : m_objRef(obj), m_nWidh(width) { } friend std::ostream& operator<<(std::ostream& os, const FooWrp& wrp) { ...(wrp.m_objRefの要素をwrp.m_nWidthに描かれている幅で出力する処理)... } };
92 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 19:35:17.01 ID:foDTiHm90.net] // 使い方 Foo obj; cout << FooWrp(obj, 10); ダッサwwwwwwwwwwwwwwwwwww しかし、「たかが表示の整形」のために排他制御しつつmapを弄ったりTLSの利用を考えるのもアレなのでこれはこれで仕方が無いのか、orz
93 名前:デフォルトの名無しさん [2023/12/24(日) 19:45:29.51 ID:Y8qSN/i/0.net] ストリーム用の演算子なんか作らずに オブジェクトの文字列表現を返す関数を用意したほうが汎用性高くない?
94 名前:デフォルトの名無しさん mailto:sage [2023/12/24(日) 19:50:06.00 ID:foDTiHm90.net] Foo obj; std::string s = obj.str(10); // 10億ギガ文字 cout << s; 出力を完遂できるんかこれ……
95 名前:はちみつ餃子 mailto:sage [2023/12/24(日) 20:00:55.29 ID:SfA3xmSz0.net] C++20 からは std::formatter を特殊化して書式指定を解釈するコードを入れておけば std::format で独自の型を表示しようとしたときにその特殊化が使われる仕組みになってる。
96 名前:デフォルトの名無しさん [2023/12/24(日) 21:41:50.00 ID:Y8qSN/i/0.net] オブジェクトの文字列表現が10億ギガ文字もあるの!? FooWrpオブジェクトをうっかりログに出力しちゃったら大変だね!!
97 名前:デフォルトの名無しさん (ワッチョイ cf63-nyJS) mailto:sage [2023/12/29(金) 19:34:46.18 ID:MPSeCS+O0.net] 実験せずに質問するますが、 int a, b; cin >> &x >> &y; に対し、 Q1. 「100 a」を入力したら例外もタイムアウト待ちも発生せず、cin.fail()がtrueになるだけ? Q2. 「100」とだけ入力してそのまんま(リダイレクト元のファイルハンドルか何かが タイムアウトもエラーもクローズもしなければ)ならそれっきり返ってこない?
98 名前:デフォルトの名無しさん (ワッチョイ cf63-nyJS) mailto:sage [2023/12/29(金) 19:40:39.84 ID:MPSeCS+O0.net] EOFが抜けてたorz Q2のケースにおいて「100 [EOF]」なら(多分)cin.fail()でとりあえずすぐ返ってくるのかそうか、
99 名前:はちみつ餃子 mailto:sage [2023/12/29(金) 21:37:06.10 ID:0cvltfsQ0.net] >>97 実にしょうもない確認なんだけど、 言いたいことは int x, y; cin >> x >> y; でよいんだよね?
100 名前:デフォルトの名無しさん (ワッチョイ de63-J7+h) mailto:sage [2023/12/30(土) 05:42:41.89 ID:3ksfrMrT0.net] >>99 >int x, y; >cin >> x >> y; おk スマンカッタorz エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい? https://blog.emattsan.org/entry/20110819/1313743195 ここまでは分かった気がするが、 ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合 どうやってエラーを呼び出し元に通知したらええんじゃ……
101 名前:デフォルトの名無しさん mailto:sage [2023/12/30(土) 05:50:37.02 ID:3ksfrMrT0.net] クラスFooの入力ストリーム演算子の中で整数を2個読むとして、 std::istream& operator>>(std::istream& os, Foo& obj) { int x, y; os >> x >> y; if (!os.goot()) { return os; // エラー発生時は単純にreturn os; でおk? } obj.m_x = x; obj.m_y = y; return os; }
102 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 43c3-KM86) mailto:sage [2023/12/30(土) 08:47:16.28 ID:XV37Te4m0.net] >>100 ストリームのフラグを立てるメンバ関数は setstate だけど >>101 の状況ならフラグはもう立ってるから戻るだけで問題ないよ。
103 名前:デフォルトの名無しさん mailto:sage [2023/12/30(土) 13:48:41.88 ID:3ksfrMrT0.net] わかりた ていうかエラー判定(eofbit以外のビットのセットを判定)なら!os.good()や!os.goot()ではなくて os.failed()か!osですたね……orz これらに関して追加の質問が出たら初心者スレに書くわサーセン;;;
104 名前:デフォルトの名無しさん mailto:sage [2023/12/31(日) 20:09:05.68 ID:tpduSr4A0.net] class A{ char buf_[size]; } このbuf_に任意のオブジェクトをplacement newして使用するのだけど このオブジェクトをコピーしたりムーブする場合、単純にコピー元のbuf_からコピー先のbuf_にmemcopyしてしまって大丈夫ですか?
105 名前:デフォルトの名無しさん mailto:sage [2023/12/31(日) 20:44:02.18 ID:bvEcnWMM0.net] 全く大丈夫じゃない 初心者スレからどうぞ
106 名前:デフォルトの名無しさん mailto:sage [2023/12/31(日) 20:54:11.90 ID:NNsdlVTY0.net] 構造体から派生させれば出来るよ
107 名前:デフォルトの名無しさん mailto:sage [2023/12/31(日) 21:04:16.47 ID:bvEcnWMM0.net] せめてPODと言おう 初心者スレからどうぞ
108 名前:はちみつ餃子 mailto:sage [2024/01/01(月) 00:18:02.48 ID:6hyMwo3D0.net] POD は削除された。 trivially copyable の要件を満たすならその型は memcpy でコピーしてもよい。 std::is_trivially_copyable で判定できるのでどこかに制約を入れておけば安心かもね。
109 名前:デフォルトの名無しさん mailto:sage [2024/01/01(月) 00:36:03.09 ID:an53Mx2V0.net] 削除されたんですか?(バージョンいくつで?) c++20 で非推奨になった、てのはすぐ調べられたんだけどその先が分からんです
110 名前:はちみつ餃子 mailto:sage [2024/01/01(月) 00:46:07.42 ID:6hyMwo3D0.net] >>109 規格の文面としては C++20 で POD はもう削除されていて POD の概念を使わない形で再編されてる。 std::is_pod はまだある (非推奨) からこれが POD の定義だという意味ではまだあるとも言えるけど。
111 名前:デフォルトの名無しさん mailto:sage [2024/01/01(月) 00:46:34.65 ID:l/ylj5kb0.net] アライメント忘れてるぞ
112 名前:デフォルトの名無しさん (ワッチョイ e1f0-JZT3) mailto:sage [2024/01/01(月) 03:01:35.02 ID:5pNbZa2B0.net] >>104 まず自分でコード書いてみ よろしくないところは指摘してやるから
113 名前:デフォルトの名無しさん (ワッチョイ 8101-KEYj) mailto:sage [2024/01/01(月) 03:14:22.37 ID:8zoq4UeO0.net] オワコン名称出してマウント。プークスクス
114 名前:はちみつ餃子 mailto:sage [2024/01/01(月) 03:40:47.98 ID:hmX3WjmM0.net] POD が削除されたかどうかは重要ではなくて、 POD より弱い制約 (trivially copyable) で memcpy が許されるというのが主旨。 その点は C++11 からそうなってる。
115 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) mailto:sage [2024/01/01(月) 04:06:49.46 ID:hmX3WjmM0.net] 「構造体」ってのも C++ 用語的にはイケてないと思うよ。
116 名前:デフォルトの名無しさん [2024/01/01(月) 04:55:26.71 ID:e5pnn2Xx0.net] アライメントは基本型のどれかと同じアライメント制約に合わせれば良いいということなら 使おうとしているうちで最も厳しいアライメント制約に一致する基本型を含むunionで解決するというのがC言語における伝統的な手法という印象、 C++でunionにしたら(それが可能なメンバのみなら) memcpyは安全とかにはならない?
117 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 823e-OTTg) mailto:sage [2024/01/01(月) 05:30:52.12 ID:hmX3WjmM0.net] >>116 コンストラクタや代入演算子がトリビアルであることなどの制約を守れば共用体も trivially copyable になりうる。 (C++ の共用体はコンストラクタやメンバ関数を定義できるがそこらが制限されることになる。)
118 名前:デフォルトの名無しさん [2024/01/01(月) 14:24:55.17 ID:kge3DGj60.net] char* と long* のコピーは?
119 名前:はちみつ餃子 mailto:sage [2024/01/01(月) 15:31:30.97 ID:hmX3WjmM0.net] ポインタも含めてスカラ型は Trivially copyable https://timsong-cpp.github.io/cppwp/n4861/basic.types#9
120 名前:デフォルトの名無しさん mailto:sage [2024/01/03(水) 23:34:38.84 ID:w4EAqTeZ0.net] >>112 とりあえず書いてみたけどどうですかね? template<std::size_t buf_size> struct A { private: struct base_ { virtual ~base_() {}; }; template <typename F> struct derived_ : base_ { F f_; derived_(F f) : f_{ std::move(f) } {} }; base_* p_; alignas(alignof(std::max_align_t)) uint8_t buf[buf_size]={0}; public: A() :p_(nullptr) {}; template <typename F> void assign(F f) { if (p_ == nullptr) { p_ = ::new (buf) derived_<F>{std::move(f)}; } } //コピーコンストラクタ A(A& src) { p_ = ::new (buf) decltype(src.*p_); //ここが怪しい }; };
121 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 00:44:07.87 ID:/FDyuY0i0.net] decltype(src.*p_)ってbase_なのでダメだろう
122 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 00:58:18.81 ID:ECF9R1Fj0.net] ていうか、decltypeで型指定してるだけだからコピーもなにもされてないぞソレ
123 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 02:28:40.49 ID:oZapr/U70.net] std::anyのコードでも読んだほうが早い
124 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 09:11:56.12 ID:/FDyuY0i0.net] A::base_に以下を足してA::derived_で実装し Aのコピーコンストラクタから呼べば? virtual base_ *clone (void *p) = 0;
125 名前:デフォルトの名無しさん [2024/01/04(木) 13:26:37.40 ID:1KQpMTCj0.net] void*って、ポインターの先のサイズ未知だよなぁ
126 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 17:16:40.43 ID:ACseOt7T0.net] derived_かそのメンバf_の型を知るにはRTTIしかないのですかね? >>121 decltypeだと派生先の型はわからないのか >>122 実体のコピーの処理が抜けてました…
127 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 21:53:05.60 ID:ACseOt7T0.net] >>124 こんな感じです? struct base_ { virtual base_* clone (void *p) = 0; virtual ~base_() {}; }; template <typename F> struct derived_ : base_ { F f_; derived_(F f) : f_{ std::move(f) } {} base_* clone (void *p_buf){ return new(reinterpret_cast<derived_<F>*>(p_buf))(f_); } }; A(A& src) { p_ = src.clone((void*)buf); };
128 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 22:19:16.70 ID:ECF9R1Fj0.net] derived_(F f) ←この時点でムダなコピーが1度発生していることには気付いてる?
129 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 22:21:15.81 ID:/FDyuY0i0.net] >>127 書き込む前にコンパイルしなよ
130 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 22:41:26.61 ID:Dv09vJ7A0.net] バッファの中にオブジェクトを作れたら、それで何をしたいのかが気になる
131 名前:デフォルトの名無しさん mailto:sage [2024/01/04(木) 23:21:36.86 ID:oZapr/U70.net] >>127 cloneの中ってplacement newでcopy constructorを呼ぼうとしてるんだよな? いちおうあってるけどundefined behaviorまみれ
132 名前:はちみつ餃子 mailto:sage [2024/01/04(木) 23:35:27.70 ID:td6kYpbC0.net] たぶんやりたいことは std::allocator_traits::construct なのかな
133 名前:デフォルトの名無しさん (ワッチョイ 7f7c-JApz) [2024/01/11(木) 04:45:44.72 ID:wlSOhq+Y0.net] 例外って全部mainで捕捉すべきかな? 調べてみたら例外が捕捉されずにプログラムが終了する場合スタックアンワインドが起こるかは実装定義みたいなんだけど、それじゃグローバルなオブジェクトのデストラクタが呼ばれないんじゃないかって思って試してみたのよ。 https://ideone.com/wSLZfL やっぱりデストラクタは呼ばれなかったからリソースリークが起こりうるんじゃないかと思うんだけど、例外に対してはどういう態度でいるべきかな? A. リソースリークはまずい。だから例外は全部捕捉するべき。 B. 例外はロジック上捕捉する必要があるものだけ捕捉して、それ以外はほっといていい。 C. 例外が捕捉されなければstd::abortが呼ばれるので、コアダンプなりで色々調べることもできる。だからmainで例外を全部握りつぶすようなことはすべきではない。 D. 時と場合による。 例外時の挙動とか仕様とか調べてるうちに頭ぐるぐるしてわけわかんなくなってきた
134 名前:デフォルトの名無しさん [2024/01/11(木) 08:40:16.50 ID:8oRrkiTZ0.net] そもそもプログラムが終了してリソースリークするのかな? メモリー、ファイルハンドル、ソケット、ミューテックスなどのリソースはOSが責任持って解放するよね どのようなリソースがリークしますか?
135 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 08:45:02.51 ID:ETJgFBFV0.net] すべてじゃね?
136 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 08:46:53.81 ID:ETJgFBFV0.net] >>133 すべてじゃね? それらの選択肢は別に排他的な選択肢じゃないかと
137 名前:デフォルトの名無しさん (ワッチョイ 7f3a-NF1f) [2024/01/11(木) 09:02:22.25 ID:dA95iQ6m0.net] OS管理なリソースはアプリの終了なんか知らないってのもあるからなぁ 得にドライバ関連とかな
138 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 15:30:41.76 ID:hAXa3uBd0.net] >>136 あれ、少なくともAとCは排他的だと思うんだけど 全部の選択肢を選ぶとすると具体的にはどうなるのかな
139 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 20:09:25.46 ID:AWAYnmwT0.net] 今どきのOS使ってたらOSリソースはリークしない まぁプロセスがゾンビになるのはよくあるが
140 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 20:09:51.72 ID:AWAYnmwT0.net] >>137 しったかすんな
141 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 20:12:29.21 ID:h5T3Zf1WM.net] そもそもアプリ的にデータの不整合とか出るから論外だろう ファイルやなんかの外部データ使わないなら関係ないだろうけど
142 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 20:12:30.15 ID:AWAYnmwT0.net] よくあるのは異常終了時にファイルをフラッシュしておきたいとかだろ 汎用的にこれを実現するのは結構むずい
143 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 20:14:10.04 ID:AWAYnmwT0.net] あとコアダンプの観点では例外飛ばさずに即死したほうがいい
144 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 21:36:53.22 ID:40hQdtQK0.net] エラーだからって一時ファイル山盛り残して放置しないでください
145 名前:デフォルトの名無しさん mailto:sage [2024/01/11(木) 22:44:37.94 ID:wlSOhq+Y0.net] 質問した者だけど 確かに近代的なOSであればリソースの始末はよしなにやってくれるだろうし、「絶対にデストラクタが呼ばれなきゃ困る」って状況でもなければいちいちすべての例外を捕捉する必要はないのかな(毎回ボイラープレートコードみたいに書くのもやだし)
146 名前:デフォルトの名無しさん mailto:sage [2024/01/12(金) 01:18:38.26 ID:P05ikaaEd.net] 例外処理って、メモリ破壊やファイルシステム破壊みたいな絶望的な状況を想定しなきゃいけないんだよ。 ファイルに何か書き込んだら他のファイルを壊しちゃうかもしれない、みたいな。 だからファイル関連の操作をしていいのは、ファイルシステム周りの無事を確信できるときだけ。 データを上書き保存とかしていいのは、データとファイルシステム両方の無事を確信できるときだけ。 何も確信できないときは、何もせずに墜ちなきゃいけない。 ってことで例外機構はデフォルトで何もせずに異常終了するようになってるんだよ。
147 名前:はちみつ餃子 mailto:sage [2024/01/12(金) 02:09:19.72 ID:Z8/dVhwe0.net] 理想的には全ての例外はキャッチされるべき。 ただ、現実は理想的ではない。 キャッチするのは対処するためなので想定漏れで思ってもなかったような例外が上がってきた (対処が出来てない) ならそれはバグなんだから検証して修正する必要があるわけだし、検証しやすい形で止まったほうがいい。 C++ ではスタックの巻き戻しの途中で例外を送出したときの挙動は未定義なので通例ではデストラクタから例外を投げないように設計される。 つまりデストラクタでの後始末に失敗したらもうそれを (例外機構の仕組みでは) フォローできない。 想定されてない例外が上がってるときに後始末がちゃんとできずにわけのわからない動作を引き起こしたら検証にも支障がある。
148 名前:デフォルトの名無しさん (ワッチョイ 7f7c-acFs) mailto:sage [2024/01/12(金) 09:48:31.22 ID:1nCpSyqU0.net] じゃあ「投げられうるすべての例外に適切な対処ができるのが理想的だが、対処しきれない例外は投げられっぱなしにする(そしてプログラムを即座に異常終了させる)方が、思考停止でとりあえず捕捉しておくよりはまだマシ」ってことになるのかな みんなありがとう
149 名前:デフォルトの名無しさん (ワントンキン MMdf-7Pe6) mailto:sage [2024/01/12(金) 09:51:15.81 ID:Vmsz+UsIM.net] いやいや、ちゃんとデバッグしろよ こんなやつとは絶対一緒に仕事したくない
150 名前:デフォルトの名無しさん (ワッチョイ 5f4e-1VUN) [2024/01/12(金) 09:58:11.40 ID:yLdIK4jH0.net] ライブラリ書くときはライブラリで対処できない例外は握り潰さずに上位で伝搬させろ!と言われてるよね アプリも同じだと思う 明確に対処すべきことがあるなら例外をキャッチすればいいし ないならそのままプロセス落としてOSに任せればいいんでない?
151 名前:デフォルトの名無しさん mailto:sage [2024/01/12(金) 10:01:16.79 ID:1nCpSyqU0.net] 投げられっぱなしにするって言い方が不適切だったかな、別に例外のせいでプログラムが実際に異常終了するのを見ても知らんぷりするって意味じゃないよ 実際にプログラムが異常終了したんだったらその都度原因は突き止めて修正するし、そもそもすべての例外に網羅的に対処するのが現実的なときは最初からそうするよ
152 名前:デフォルトの名無しさん mailto:sage [2024/01/12(金) 10:06:03.47 ID:Umd8uX9b0.net] try {} catch {}
153 名前:はちみつ餃子 mailto:sage [2024/01/12(金) 17:12:14.63 ID:Z8/dVhwe0.net] 想定される状況には対処しているならどこで想定漏れがあるかはやってみないとわからない。 経験を蓄積し続けるしかしょうがないんだよな。 蓄積がテストケースの形などになっているとより良いと思う。
154 名前:デフォルトの名無しさん mailto:sage [2024/01/12(金) 17:26:50.90 ID:059LeD4FM.net] 自分の知らないライブラリの奥底からいつ投げられるかわからない例外なんて対処しようがない かつスタックアンワインドしたらデバッグの手がかり消えるだけ
155 名前:デフォルトの名無しさん (ブーイモ MM9f-2j6O) mailto:sage [2024/01/12(金) 17:44:35.30 ID:bUlwQWI8M.net] setjump()/longjump()
156 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 13:54:58.62 ID:rNqWj2dY0.net] やっぱC++の例外は悪…… 構造化例外ならwindbgでコアダンプを開いて!analyze -vで発生源を調べられる(仕組みは知らん がC++の例外は例外オブジェクトが持ち出した情報が全て…… という印象……
157 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 14:10:21.49 ID:rNqWj2dY0.net] やっぱ例外というブツは、 アプリケーション領域においてプログラミがいろんなリソースを取り扱うようになった結果、 C言語流に関数の戻り値で起こり得る全てのエラーを網羅してチェックする方法が 現実的でなくなってきたから設けられたブツなので >自分の知らないライブラリの奥底からいつ投げられるかわからない例外(>>154 すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿 起こりえる全ての例外の処置を書かなければ設計とは言えない主義の人(>>149 )は 寧ろ例外の使用をやめてC言語的な書き方で全てのエラーをチェックすべき (他人様が作ったライブラリが例外を飛ばしてくるのは仕方が無いから全てcatchする
158 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 14:15:12.02 ID:rNqWj2dY0.net] つなみにOSの内部ではすべてのリソースをOSが管理する前提なので例外の出る幕は無い OSの設計に対して想定外の事象がOS内部で起きるとかあり得ないじゃない レトロな(しかしメジャーな)OSがC++ではなくC言語で書かれ続けるのはそういう理由
159 名前:はちみつ餃子 mailto:sage [2024/01/13(土) 14:21:37.75 ID:3bve4IFf0.net] 何が返ってくるかわからん (ドキュメント化されていない) なら返却値の形になっていても正しく対処できないのは同じだろ。
160 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 14:37:35.65 ID:b/trpwza0.net] 例外だとテストしないドキュメントにも書かないというモラルハザードがおきやすいとは言えるだろう 返り値はエラー体系を自分で定義しないといかんからそうはなりにくい まぁそれでも失敗を安易にfalseに丸めるどアホは多いけど
161 名前:デフォルトの名無しさん mailto:sage [2024/01/13(土) 15:22:27.34 ID:o+zGF69d0.net] >>157 >すなわち設計に対して想定外の事象が起きた知らせとしてが飛んでくるというのが基本的かつ本来的な姿 それ一般にはリリース後に起きちゃいけないことでは。プロダクトにもよるが防ぐ努力は必要だと思うがね。
162 名前:デフォルトの名無しさん (ワッチョイ 7291-Qz6p) mailto:sage [2024/01/14(日) 13:01:30.73 ID:H7tsxQrq0.net] >>138 全選択肢を同時に選ぶって意味に捉えられちゃったかな? そうじゃなくて、その選択肢自体が同時に適用すべきレベルのものじゃないと思うの 例外をキャッチするって決めたなら、そこには目的があるよね? 設計手順としては目的を決めてから例外を使おうって判断になるわけ その目的次第だよね?っていうのがD 目的がリソースリーク防止ならA Aのような目的を達成するために、目的範囲内でB デバッグ目的ならC 製品等で客の目に見せたくないなどの営業目的があるならCはダメで、のべつまくなしBというのもあるかもしれない
163 名前:デフォルトの名無しさん (ワッチョイ 7291-Qz6p) mailto:sage [2024/01/14(日) 13:06:09.91 ID:H7tsxQrq0.net] 大きな目で全工程トータルを考えると全部の選択肢を適用する必要があるし、適用のしどころが違うと思うってのが>>136 の真意でした
164 名前:デフォルトの名無しさん (ワッチョイ 7291-Qz6p) mailto:sage [2024/01/14(日) 13:12:37.16 ID:H7tsxQrq0.net] >>148 これが正しいかどうかはおいといて、人命に関わらないなら、自分はその考え方に賛成! 完璧にデバッグしろというのは自動車と医療機器など人命にかかわるものだね 重要度に応じて工数のかけ方が変わってくるので、すべてのソフトウエアで一概にこうしなさいとは言えないかな そういう意味ではD
165 名前:デフォルトの名無しさん (ワッチョイ 4d34-7Ntv) mailto:sage [2024/01/14(日) 15:16:56.65 ID:by9QQMRz0.net] >>162 ああ、なるほどね 分かりやすくありがとう、助かりました
166 名前:デフォルトの名無しさん mailto:sage [2024/01/15(月) 08:10:14.00 ID:Y8oMeLNI0.net] 人命にかかわらない場合であっても、末端の関数が投げる例外の種類を見落としただけでプログラム全体が いきなり落ちるのは勘弁してほしいし、それを防ぐために全部の関数が投げる例外の種類を全部把握するというのも 無理ゲーに近い。 なので適当なレイヤーごとにざっくり std::exception をキャッチする造りにしてるな。例外の種類で選択したりはしない。
167 名前:デフォルトの名無しさん (ブーイモ MM22-7+/r) mailto:sage [2024/01/15(月) 11:54:06.38 ID:0QYW1wwzM.net] キャッチしてその後どうすんの?
168 名前:デフォルトの名無しさん mailto:sage [2024/01/15(月) 18:12:26.71 ID:FtZTeDOW0.net] 何するか思い付かないならPG辞めろ 貴様には向いてない
169 名前:デフォルトの名無しさん mailto:sage [2024/01/15(月) 18:20:04.00 ID:Y8oMeLNI0.net] >>167 そのtryブロックの処理が失敗したものとして処理を続ける。
170 名前:デフォルトの名無しさん (ワッチョイ 46ea-7+/r) mailto:sage [2024/01/15(月) 18:42:14.36 ID:Lgn9c/GO0.net] テストケース爆増じゃん
171 名前:デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ) mailto:sage [2024/01/15(月) 19:20:39.72 ID:Y8oMeLNI0.net] なんで爆増?
172 名前:デフォルトの名無しさん mailto:sage [2024/01/15(月) 20:40:13.04 ID:Lgn9c/GO0.net] その失敗する処理の具体例言ってみて
173 名前:デフォルトの名無しさん mailto:sage [2024/01/15(月) 22:10:56.13 ID:Y8oMeLNI0.net] んでテストケース爆増の話は?処理の具体例次第で話が変わったりするとか?
174 名前:デフォルトの名無しさん (ワッチョイ 46ea-7+/r) mailto:sage [2024/01/15(月) 22:45:20.95 ID:Lgn9c/GO0.net] 依存関係のあるものに影響あるのは当たり前 原因不明の例外起こっても突き進むんだったら擬似的にそのケース作ってテストするわな普通は 出し渋るなら別にださなくていいよ 参考にならなさそうだし
175 名前:デフォルトの名無しさん (ワッチョイ 6ecf-CdjJ) mailto:sage [2024/01/15(月) 23:24:57.00 ID:Y8oMeLNI0.net] それはいったい何のテストなんだろう。原因不明の例外を首尾よくキャッチできるかどうかテストしろと言っているんだろうか。 そもそもそういう例外を想定するなら、スルーして影響範囲が広がる方がテストは厄介になると思うがなあ。
176 名前:デフォルトの名無しさん (ワッチョイ 11fb-5Qxc) [2024/01/15(月) 23:36:35.23 ID:rchiNbsm0.net] たとえば業務用のラベルプリンターでAPIが提供されてるとか とりあえず try ~ catch して「印刷中に不明なエラーが発生しました」みたいなまとめかたはあるかなー
177 名前:デフォルトの名無しさん [2024/01/23(火) 17:00:13.54 ID:kD0da0AW0.net] すみません。質問させて下さい。次のコードがMinGW-w64 g++ v13.2では --itrでエラーになります。わからないのはVisual studio 2022およびVisual StudioがサポートするClang LLVMでは通って正しく 実行しているように見えます。--itrの仕様がないのはMinGW-w64 g++v13.2が正しいのでしょうか?それともVisual Studioが正しいのでしょうか? #include <iostream> #include <unordered_set> using namespace std; int main() { unordered_set<int> us = { 1,2,3,4,5,6 }; for(auto itr = begin(us); itr != end(us); ++itr) cout << *itr << endl; auto itr = us.begin(); ++itr; ++itr; cout << *itr << endl; --itr; cout << *itr << endl; cin.get(); return 0; } MinGW-w64 g++ v13.2のエラー // error: no match for 'operator--' (operand type is 'std::__detail::_Node_iterator<int, true, false>')
178 名前:はちみつ餃子 mailto:sage [2024/01/23(火) 17:23:45.88 ID:MIeJSKFF0.net] >>177 unordered_set は forward iterator をサポートしているという規定がある。 https://timsong-cpp.github.io/cppwp/n3337/unord.set.overview#1 forward iterator は進めることは出来ても戻ることはできない。 この場合は operator-- がないのが正しい。 拡張してより高機能なライブラリを提供しても仕様に反するってわけではないけど マイクロソフトのドキュメントでも特に拡張しているという文面は見当たらないから あんまりあてにしないほうが良さそうには思う。 https://learn.microsoft.com/en-us/cpp/standard-library/unordered-set-class?view=msvc-170#iterator
179 名前:デフォルトの名無しさん [2024/01/23(火) 17:34:44.31 ID:kD0da0AW0.net] おお、ありがとうございます。
180 名前:デフォルトの名無しさん mailto:sage [2024/01/28(日) 11:36:45.25 ID:W0uCnQb30.net] >>173 横やが関数foo()で1つの例外が発生したらその時点のfoo()呼び出しに至る10個かそこらの関数が中断されるわけや すなわち関数bar()が 処理A→B→C→D→return の順で処理が進むことを気体しているところに、Bで呼び出している関数baz()がfoo()を呼び出している結果、foo()で例外を生じると 処理A→B→return という処理順に変更になる。こうなっても大丈夫なようにtry { 処理B } catch ((fooが投げる例外)& e) { (eに対する適切な処置) } を書かねばならず、 これが実は潜在的には処理A、B、C、Dのどこでも起き得るから厳密なことを言えば全てについて書かねばならず、 それがfoo()呼び出しに至る10個かそこらの関数それぞれについて行われねばならない。 検証もそんだけ組み合わせが増える。
181 名前:デフォルトの名無しさん mailto:sage [2024/01/28(日) 11:40:58.52 ID:W0uCnQb30.net] というわけでそんなの現実には不可能なので、現実的な処置としては ・ライブラリ製作者はなんか都合が悪い事が起きたら何でも呼び出し元に返す。 第1選択としてはエラーステータスを返すことを検討し、それではコードが煩雑になりすぎる場合は例外を投げて異常を知らせる ・ライブラリを使う人はライブラリが例外を投げない条件で使うことを心掛け、自前のコード内でtry { } catch() { }を極力しない という処置になるわ けや
182 名前:デフォルトの名無しさん (ワッチョイ 66cf-5eDQ) mailto:sage [2024/01/28(日) 12:02:32.93 ID:Gsm093HM0.net] catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。 その場合の検証が必要だというならどっちも必要だろ。
183 名前:デフォルトの名無しさん (ワッチョイ 6d63-H5uA) mailto:sage [2024/01/28(日) 12:13:11.85 ID:W0uCnQb30.net] >>182 >catchしようがしまいが、例外が起きて 処理A→B→return となるのは同じだと思うが。 それは問題の認識がおかいし 例えば以下のコードにおいて、スレッドのゾンビを生じさせないためにはfuncB()をtry { } catch () { } は必須になる。 void bar() { funcA(); // スレッドxを起動 funcB(); // 中でbaz() → foo()の呼び出し funcC(); // スレッドxに停止シグナル発酵 funcD(); // スレッドxの終了待ち return; } このように一般に例外が飛んでくる関数にはcatchするかしないかの選択権など無い 例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない 一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある
184 名前:デフォルトの名無しさん (ワッチョイ 6d63-H5uA) mailto:sage [2024/01/28(日) 12:14:54.75 ID:W0uCnQb30.net] 訂正orz 誤:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外を受けると決めた時点でcatchせねばならない 正:例外安全なオブジェクト「だけ」で事が済んでいない限り、例外が飛んでくる想定であるならばcatchせねばならない
185 名前:デフォルトの名無しさん (ワッチョイ 797c-+np5) mailto:sage [2024/01/28(日) 12:19:26.10 ID:/bXkl1Cz0.net] >>183 それはfuncB()に失敗の可能性がある時に必ず必要な話だろ?例外どうこうじゃないじゃん funcB()が例外を投げずに古き良きintのエラーコードを戻り値で返す場合は何かが変わるの? まさか「funcBの戻り値をガン無視すればfuncCもfuncDも実行されてくれるから完璧!だから例外はクソ!」っていうゴミカスみたいな主張をしたいわけじゃないよね?
186 名前:デフォルトの名無しさん (ワッチョイ 66cf-5eDQ) mailto:sage [2024/01/28(日) 12:28:00.13 ID:Gsm093HM0.net] >>183 それはcatchが必要かどうかの話だろ。 catchしたらテストケースが増えるかどうかという話とはなんも関係がない。
187 名前:デフォルトの名無しさん mailto:sage [2024/01/28(日) 15:40:48.23 ID:JnoCOYDS0.net] そもそも未知の例外飛んできた時点でそれを通したライブラリの例外安全性が守られてるか怪しいと考えるべき
188 名前:デフォルトの名無しさん mailto:sage [2024/01/28(日) 17:01:39.99 ID:Gsm093HM0.net] 例外安全性を守るのに例外の種類やそれが既知か未知かは関係ないだろうが、 仕様に明記した例外以外は堰き止めるのが正解だろうなあ。
189 名前:◆QZaw55cn4c (ワッチョイ 3583-LgJ8) [2024/01/28(日) 20:27:29.75 ID:0TnCAHFI0.net] 思い立って結城さんのデザパタ(古いjava で記述)を総称型(テンプレート)もちゃんと使ってC++ に書き直しているけれども、 new/delete からptr::shared_ptr に書きなおすと、もう構造がわかりにくくなってしまってどうしようもない デザパタ=抽象クラスプログラミングは C++ ではオワコンなの? Visitor パターン new/delete: https://ideone.com/6d43LO スッキリ書けてきもちいい std::shared_ptr: https://ideone.com/oYzkxh 恐ろしい宣言の連発 >std::shared_ptr<Iterator<std::shared_ptr<Entry>>> iterator() { return std::make_shared<VectorIterator<std::shared_ptr<Entry>>>(v); } なんかもう書いてても意味不明 CONSTRUCTOR(CONSTRUCTOR *p) とかコピコン以外にもみたことのないコンストラクタが要求されるし
190 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+) mailto:sage [2024/01/28(日) 20:53:25.29 ID:hRRbWEE/0.net] >>189 スマートポインタを使わないバージョンも C++ 的にはすっきりしてない。 動的多態の必要が必要ないのに持つべきメンバ関数を強制するためだけに抽象クラスを使っていて不恰好に見える。 コンセプトの導入がだいぶん後回しになった C++ の問題でもあるんだが……。 設計理念が妥当かどうかはともかくとして、元が Java なら直訳めいた C++ への置き換えがすっきりと書けるはずがない。
191 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 2a3e-vdg+) mailto:sage [2024/01/28(日) 21:08:52.58 ID:hRRbWEE/0.net] ざっと見た感じだと抽象クラスとして必要なのは Entry だけかな。 ジェネリックラムダが visitor パターンで使いやすいのでそういうのが使いやすいように配慮するといいかも。 std::visit が C++ での visitor パターンのお手本だよ。
192 名前:デフォルトの名無しさん (ワッチョイ b501-PlwZ) mailto:sage [2024/01/28(日) 22:46:18.85 ID:VLKT1lFt0.net] >>189 usingなりtypedefでエイリアス作れば? using Entry_Ptr = std::shared_ptr<Entry>;
193 名前:デフォルトの名無しさん (JP 0Hbd-DQL8) [2024/01/28(日) 23:17:29.01 ID:wkb3ctO/H.net] 面白そうだからちょっと書いてみた。大きな変更点はこんな感じ。 ・accept が受け取るのは単に Visitor の参照でいい。ここで shared_ptr を使う必要はない。 ・Visitor が受け取るのも File や Directory の参照でいい。 ・SizeVisitor もいらない。File と Directory はともに Entry の子クラスとして getSize() を実装してるんだから、無理に visitor パターンを使わなくても単に getSize() を呼べばいいだけ。 ・iterator() が返すのも VectorIterator の shared_ptr ではなく、単に VectorIterator を返せばいい。 全体的に使う必要がない場面で shared_ptr を使ってるのが目立ったと思う。 https://wandbox.org/permlink/ZBKbF5iMVpb7Looi だいぶすっきりしたんじゃない?
194 名前:はちみつ餃子 mailto:sage [2024/01/28(日) 23:52:27.85 ID:hRRbWEE/0.net] なんかもうポインタをいじるのが面倒になったので値としてやりとりしていいやという気持ちと 標準ライブラリを積極的に活用することにしたらこうなった。 https://wandbox.org/permlink/BQCNjfdJRKWAR3dg
195 名前: [2024/01/29(月) 04:35:04.36 ID:M6sadnnj0.net] >>193 拝読させていただきました。なるほど、関係性を示すポインタ=参照なら std::shared_ptr でくるむ必要ガない、というわけですか。 >>194 拝読させていただきました。Entry を値で持つのはいやだなあ。 dectype の使い方を学ばせていただきました。
196 名前: [2024/01/29(月) 05:00:34.95 ID:M6sadnnj0.net] >>194 std::size_t() あたりから読めていません。operator() をどう使っているのでしょうか?
197 名前:はちみつ餃子 mailto:sage [2024/01/29(月) 12:08:36.13 ID:WXyC0nMC0.net] スマートポインタを使うにしても std::shared_ptr って必要? この場合は std::unique_ptr でよくない? https://wandbox.org/permlink/dMolraFpQHKzYtF3 設計思想によるけどファイルシステムを表現するという前提だと ひとつのルートディレクトリに連なる全てのエントリは実質的に一体のデータ構造なので ルートディレクトリエントリの寿命が尽きれば全て解体ってことにしたほうが簡単でいいと思う。 ハードリンクの表現とかも考えるなら事情が変わってくることもあるだろうけど……。
198 名前:デフォルトの名無しさん mailto:sage [2024/01/29(月) 21:21:12.23 ID:eAAuxXw40.net] >>189 c++ https://ideone.com/p3li2Y ・https://ideone.com/oYzkxh を元に若干の整理を行った ・他の人と同様shared_ptrを削除 値で持てるところは単に値で持つほうがC++っぽいと思う ただ「Entry を値で持つのはいやだなあ」とのことなので部分的に残してる Javaの参照型変数をshared_ptrに置き換えようとして困るのは size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); } ここがJavaだと単にvisit(this)で済むからスッキリするんだけど しかもこれmake_shared(this)だと多重開放するよね?? >>189 c++ https://ideone.com/2uUpwH ・https://ideone.com/p3li2Y を元に若干の整理を行った ・make_shared<File>(this)の多重開放?を修正 std::enable_shared_from_thisを使ってJavaの参照型変数っぽい使用感を得た。 ・struct this_is_private {}; これは単にコンストラクタを実質的にprivateにするためだけに使ってる https://en.cppreference.com/w/cpp/memory/enable_shared_from_this https://stackoverflow.com/questions/8147027/how-do-i-call-stdmake-shared-on-a-class-with-only-protected-or-private-const このへん参照されたし
199 名前:デフォルトの名無しさん (JP 0Hbd-IHfd) [2024/02/03(土) 04:38:02.47 ID:bq1KvR69H.net] https://wandbox.org/permlink/LEl2MT7OdGIlVKC4 なんか「子クラスのコンストラクタに親クラスのオブジェクトを渡して子クラスのメンバを初期化する」(?)みたいなことができちゃってるんだけど、これってどういう仕様でこうなってんの? Wandbox上だとC++2aではコンパイルできてC++17ではコンパイルできなかったからcpprefjpのC++20の機能の一覧も見てみたけどそれらしいものはなかったし
200 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 7932-MxBP) mailto:sage [2024/02/03(土) 09:26:19.03 ID:Sz70frqK0.net] >>199 designated initializer も C++20 からの機能なんだけど……それは脇に置く。 この場合は集成体初期化に該当する。 C++17 から基底の初期化も集成体初期化で扱えるので child c{p}; というように初期化出来ていた。 更に C++20 では集成体初期化を丸括弧で書いても良いことになったので child c(p); とすることが許されるようになった。
201 名前:◆QZaw55cn4c (ワッチョイ 3555-LgJ8) mailto:nb3f-ktu@asahi-net.or.jp [2024/02/03(土) 09:46:38.23 ID:21sfApha0.net] >>198 >size_t File::accept(std::shared_ptr<Visitor> v) { return v->visit(std::make_shared<File>(this)); } > ここがJavaだと単にvisit(this)で済むからスッキリするんだけど > しかもこれmake_shared(this)だと多重開放するよね?? 多重解放(二重解放)しないことはラッパをかませて確認済みです。そう簡単に std::shared_ptr は破綻しないと信じています https://ideone.com/GUPcSu それはともかく、皆様のご意見には感謝しております。これからもお伺いさせていただいた際にはよろしくお願いいたします。
202 名前:デフォルトの名無しさん (JP 0Hbd-IHfd) [2024/02/03(土) 09:48:07.39 ID:bq1KvR69H.net] >>200 https://cpprefjp.github.io/lang/cpp17/extension_to_aggregate_initialization.html これかあ 実は「childにコンストラクタがある場合」とか「childにprivateメンバがある場合」とか「childがparentをprivate継承している場合」とかはコンパイルが通らなくてもう意味が解らなかったんだけど、それもchildが集成体じゃなくなってたからだったんだね ありがとう、勉強になった
203 名前:◆QZaw55cn4c (ワッチョイ 3555-LgJ8) [2024/02/03(土) 10:15:36.86 ID:21sfApha0.net] >>198 >値で持てるところは単に値で持つほうがC++っぽいと思う 時代の流れを感じさせるお言葉です。なにせ K&R1 で育った世代なので(K&R1 では構造体の実体渡しはできず、かならずポインタで渡さなければならなかった)。 C++ においても、コピコンを働かせないために const & を多用する毎日です
204 名前:はちみつ餃子 mailto:sage [2024/02/03(土) 14:49:57.28 ID:Sz70frqK0.net] >>203 内部的に値で持つのでもポインタで持つのでもいいけど 「簡単に値として取り出せる」のはあまりよろしくないと思う。 これ (>>189 ) がおそらくファイルシステムを表現しようとするもの だという前提を考えたらオブジェクトの構造も ファイルシステムのモデルを抽象するものであるべきだと思うから。 ファイルはそれがある場所にも意味があるからファイルを象徴するオブジェクトが 場所から離れてやりとりされるのは違和感がある。 まあファイルシステムのモデルをどう捉えるかは私の感想でしかないから 何が妥当とは強くは主張しないけど、 いずれにしても実装上の都合じゃなくて使う側の感覚でどうなってて欲しいかという視点が要ると思う。
205 名前:デフォルトの名無しさん (ワッチョイ f7da-tydm) mailto:sage [2024/02/04(日) 11:53:17.97 ID:nmDLw2WS0.net] はちみつさん頭いいね アドバイスが丁寧かつ的確でいつも感心する
206 名前:デフォルトの名無しさん (ワッチョイ 5702-VoFb) [2024/02/05(月) 20:47:16.57 ID:dvRwXcQL0.net] ある構造体(集成体)Aについてconstexprでa1, a2, a3・・・といくつか作りました 別のクラスBのメンバ変数にconst A* m_ptrAがあってconstexprで作ったインスタンスのどれかを指すことにします この時Bのメンバ関数などで、 if(m_ptrA== &a1) という比較・条件分岐を行うのは意味のある比較になっているのでしょうか?
207 名前:デフォルトの名無しさん (ワッチョイ bfe1-tai3) mailto:sage [2024/02/05(月) 21:20:14.92 ID:crhbGtf+0.net] 意味はある でもなるべくそういう判定は無しでいけるように設計したいところだよな Aクラスを作ってる意義が薄れる あと細かいこと言えばaddressofを使ったほうが汎用的というのはある c++のクソっぷりが如実に表れている関数
208 名前:デフォルトの名無しさん (ワッチョイ 5702-VoFb) mailto:sage [2024/02/06(火) 11:08:08.32 ID:KJUqS3Ww0.net] ありがとうございました 本当に列挙型代わりに使えるのなら面白いとも思いましたが まあ変なコードには間違いないですね
209 名前:はちみつ餃子 mailto:sage [2024/02/06(火) 12:11:55.01 ID:gR/xoQQt0.net] 分岐の内容次第ではあるけど……Bが指しているAのオブジェクトごとに処理を切り替えるってのなら a1, a2, a3 …… がそれぞれ関数 (関数オブジェクト) を指す (所有する) ようにするのが常道ではあるね。 Bのメンバ関数の中では呼び出しを一文書くだけでいい。 分岐条件を網羅しそこなうしょうもないミスはよくあることだから 手作業での網羅を避けられるならそのほうがいい。
210 名前:デフォルトの名無しさん mailto:sage [2024/02/06(火) 20:42:09.19 ID:WnlTLfV5M.net] 「The C Standard says that array indexes are (signed) integers. The reason behind that is that pointers and arrays are close in C. For example, tab[index] is strictly equivalent to *(tab + index). You can use pointer arithmetic with negative values, hence an array index can be negative」 とあるので、C 言語での配列添え字は符号付き整数 ですね。 しかし、C++ では、size_t とされ、符合なし整数 のようですが、矛盾しませんか? VC++の以下のマクロでは、 #define C_ASSERT(e) typedef char __C_ASSERT__[(e)?1:-1] eが偽の時にエラーになるようになっているようです。 これはつまり、 typedef char aaa[-1]; がエラーになる事を前提にしているようです。 しかし、もし、配列の最大要素数が、符合なし整数 であるならば、32BIT 環境の場合、 -1 は、0xffff_ffff と同じと言えば同じであるはずで、 コンパイラ内部で効率よく区別するのは難しいはずです。 どうしてるんでしょう。
211 名前:デフォルトの名無しさん mailto:sage [2024/02/06(火) 20:47:53.26 ID:WnlTLfV5M.net] 何がいいたいかと言えば、32BIT環境だと 符号付き整数の最大値は、 0x7fff_ffff ですから、 char a[0x7fff_ffff]; は合法ですが、 char a[0xffff_ffff]; はエラーです。よって、 char a[-1]; はコンパイラは難しい処理をしなくても、 -1 は内部表現が 0xffff_ffff ですので そもそも範囲外の数値と見なせます。 ところが、もし、配列最大数が unsigned の領域まで許されるならば、要素数が 0xffff_ffff の配列も合法だということに なります。 ならば、要素数の[] の中に-1 を指定した 場合の処理は難しくなりそうだ、ということです。 なおそもそも、32BIT の Windows 環境 だと、ユーザーが使えるアドレス空間は 最大で 0x7fff_ffff 程度までですから、 バイト数的に確保は出来ませんが。 ならば、そもそも、C++がunsigned 型 であるところの、size_t を採用しているもの なかなか不可思議であります。
212 名前:デフォルトの名無しさん mailto:sage [2024/02/06(火) 21:10:01.10 ID:cxCkHHUF0.net] 長いからよく読んでないけどコンパイラは型を認識をしてんだから-1と0xFFFFFFFFは区別してるだろ
213 名前:デフォルトの名無しさん mailto:sage [2024/02/06(火) 21:25:24.39 ID:82wR+tAN0.net] call -151
214 名前:デフォルトの名無しさん mailto:sage [2024/02/06(火) 22:29:48.57 ID:SZ6XHr3I0.net] C++の配列添字はstd::ptrdiff_t(符号付き)です
215 名前:デフォルトの名無しさん [2024/02/06(火) 22:36:10.13 ID:pbGHBGq1H.net] 配列を宣言するときの構文と添字演算子を使うときの構文を混同してない?前者はブラケットの中身が正じゃなきゃだめで後者は負でもいいってだけの話だと思うんだけど int main() { int hoge[-1]; // ここで負の値を指定することはできない hoge[-1]; // でもこれはいい (*((hoge)+(-1)) と解釈される) } せっかくだからC++23の仕様書も見てみたけど、§9.3.4.5の1には「配列のサイズはstd::size_t型(に変換された)定数式で、その値は0より大きくなければならない」って書いてあって、§7.6.1.2の2には添字は「スコープ無し列挙型か整数型」て書いてあったよ(該当箇所だけつまみ読みしたから正しく読めてる保証はできないけど)
216 名前:はちみつ餃子 mailto:sage [2024/02/07(水) 01:09:12.04 ID:kuiQPbhX0.net] >>210 C の配列宣言子の角括弧内に書ける数値は 0 より大きい値に評価される整数定数式であることが条件で、具体的な型に規定はない。 式の型がなんらかの具体的な型に強制 (型変換) されたりはしないので signed int なら signed int だし、 unsigned int なら unsigned int のままだ。 VLA のときは定数式という条件は外れるけどそれ以外の制限はだいたい同じ。 C の添字演算子の場合もそう。 型は整数であればよい。 (値は制限の範囲内である必要はある。) どこで見た説明を根拠にしているのか知らんけど、その signed が括弧書きなのは signed 「でもよい」という意味だと思うよ。
217 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 12:42:17.44 ID:7NJYw5ei0.net] std::functionって、有効な関数がセットがされているかどうかでブール値を返しますが、 一旦有効化した後にこれを無効化したい場合って、nullptrを代入したりしていいんでしょうか そしてその場合std::functionの中身はうまいこと解放されたりするんでしょうか 場合によってはラムダ式を使ってオブジェクトをキャプチャしていたりして あまりその辺りの説明が見当たらない感じがしました
218 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 12:56:29.41 ID:0txhPX/d0.net] それでいいよ
219 名前:はちみつ餃子 mailto:sage [2024/02/07(水) 13:12:18.32 ID:kuiQPbhX0.net] >>217 https://timsong-cpp.github.io/cppwp/n3337/func.wrap.func.con#15
220 名前:デフォルトの名無しさん (ワッチョイ bf9a-Ehcu) mailto:sage [2024/02/07(水) 14:19:19.97 ID:7NJYw5ei0.net] >>218 ありがとうございます!
221 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 18:20:13.87 ID:aGYGzZDDM.net] >>212 >長いからよく読んでないけどコンパイラは型 >を認識をしてんだから-1と0xFFFFFFFFは >区別してるだろ char a[100-101]; みたいに結果的に -1 になった場合は、 32BITコンパイラの場合、果たして内部で 0xffff_ffff と区別をつけているかどうか。 unsigned型と考えれば0xffff_ffffであり、 signed型と考えれば -1 です。 ターゲットが 32BIT Windows どちらもエラー になる可能性は高いですが、理由は結構異なる と言えば異なると思います。
222 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 18:25:16.10 ID:aGYGzZDDM.net] もっと言えば、32BIT ターゲットで、 char a[0x80000000 | 1]; みたいな場合、中味は signed と 捉えれば「負数」ですが、unisgned と 捉えれば、0x80000001 という大きな値 に過ぎません。 どちらもエラーになる可能性が高いですが。
223 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 18:40:38.44 ID:0txhPX/d0.net] リテラルにも型がある 1はint 0x80000000はunsigned int 演算結果はunsigned int ルール決まってるから
224 名前:デフォルトの名無しさん mailto:sage [2024/02/07(水) 18:55:38.23 ID:V2I2BIn30.net] x86のアセンブラのディスプレースメントは符号付いてるけどな 他のマシン系はワカランけど
225 名前:デフォルトの名無しさん (ワッチョイ bfa4-syIJ) mailto:sage [2024/02/07(水) 20:52:20.31 ID:L6yrYnPT0.net] >>222 32bit環境には64bit整数はないと思ってるの??
226 名前:デフォルトの名無しさん (オイコラミネオ MMeb-tjaG) mailto:sage [2024/02/08(木) 18:55:38.81 ID:DVUqgRU9M.net] >>223 なるほど。そうなるわけですね。 本当に書いた人の意図がどうかに関わらず、 規則で決まっていると。 1UL のように書いてあれば unsigned。 そして、UL のようなものを書いてない場合、 1 のように小さな値は、signed ですが、signed の 範囲を越えるようなものは、unsigned になる、 などの規則があるわけですね。
227 名前:デフォルトの名無しさん (オイコラミネオ MMeb-tjaG) mailto:sage [2024/02/08(木) 18:56:00.93 ID:DVUqgRU9M.net] >>225 そういう問題ではないようですが。
228 名前:デフォルトの名無しさん (ワッチョイ 5763-dZsi) mailto:sage [2024/02/10(土) 12:18:06.78 ID:KJGevrBa0.net] >>185 >>183 の主張の >一方、例外を生じないライブラリの使い方(関数の呼び出し方)を心掛けるかどうか。これなら選択肢がある が完全に読み飛ばされている件について: 例外を生じないライブラリの使い方で設計したら、funcB()から例外が飛んでくるのはバグなので 調査と修正の対象になる。 (結果的にやっぱtry { funcB(); } catch (/*略*/) { ... } いるじゃーん?となる可能性はあるがたいていはそうはならない >>188 のように自分が何をやっているのか認識しないまませき止めるのは論外すぐる……
229 名前:デフォルトの名無しさん (ワッチョイ 5763-dZsi) mailto:sage [2024/02/10(土) 12:26:53.58 ID:KJGevrBa0.net] >>186 >catchしたらテストケースが増えるかどうかという話とはなんも関係がない。 あっる catchする必要性箇所を設計で厳選すればcatchが減るのだからテストケースは減らし得る 例外を使う場合: スルーしたりcatchして再スローが生じるfoo()の呼び出し箇所(とするのが現実的でないなら呼び出しパティーン)がm個、 スルーしたりcatchして再スローする段数が(簡単のためここでは平均とする)a個、 foo()が例外を生じるパティーンがn個なら、m^a^n個のテストケースが必要なところであるが catchする必要性箇所を設計で厳選した場合: foo()の呼び出し箇所(とするのが現実的でないなら呼び出しパティーン)がm個だとしたら、 例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ……
230 名前:デフォルトの名無しさん mailto:sage [2024/02/10(土) 16:57:16.73 ID:Qku1mp0Z0.net] >>228 読み飛ばしてねえよ funcB()は処理を中断すべきエラーが発生する可能性があるんだろ?だったらそれを適切に処理して後続の処理をやったりやらなかったりする必要があるわけだろ? それはfuncB()がエラーを例外で返そうと戻り値で返そうとなんか他の方法で返そうと何も変わらないはずじゃないか
231 名前:デフォルトの名無しさん mailto:sage [2024/02/10(土) 18:55:23.41 ID:0f3gz8pL0.net] >>229 >例外が飛んでこないことを確認するのテストケースがm個のオーダーで要るだけ…… いったい何をテストしようとしているんだろうか。 仮に「例外が飛んでこないことを確認するテスト」なるものができたとして、catchしたらそれができなくなるのか? 前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか。
232 名前:デフォルトの名無しさん mailto:sage [2024/02/10(土) 20:56:08.28 ID:0f3gz8pL0.net] >>228 >>>188 のように自分が何をやっているのか認識しないまませき止めるのは論外すぐる…… どこが論外?>>169 でぜんぜん問題ないが。
233 名前:デフォルトの名無しさん (ブーイモ MM8f-tai3) mailto:sage [2024/02/10(土) 21:22:31.20 ID:dL54PN9cM.net] >>232 それは未知の例外投げてきたライブラリを信用し過ぎ 製品ならそういう「たぶん大丈夫っしょw」的なのは許されないね
234 名前:デフォルトの名無しさん mailto:sage [2024/02/10(土) 22:40:34.32 ID:0f3gz8pL0.net] >>233 逆だろ。catchしないのはライブらにが未知の例外を投げてこないだろうと信用してるってことだろ。
235 名前:デフォルトの名無しさん (ワッチョイ bf27-tai3) mailto:sage [2024/02/10(土) 23:44:13.35 ID:iRyhZExm0.net] >>234 catchしないということは終了させるということ 見かけ上動き続けたらいいってもんじゃない
236 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 03:08:09.08 ID:4PD3HqyC0.net] >>232 それは未知の例外投げてきた原因を調査しなさすぎ 製品ならそういう「たぶん大丈夫っしょw」的なのは許されないね >>233 ドキュメント通りに例外発生条件にならないように呼んでやったのに 例外を飛ばしてくるライブラリって一体…… 製品やぞ……
237 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 03:16:41.24 ID:4PD3HqyC0.net] 質問なのですが Q1. std::ldexp(0.0, 0.0) が0.0なのですがこれは 0^0 = 0という大胆な主張なのですが何で決まっているの? STLがIEEE735に従っているだけ? Q2. 最小の(絶対値が最小の正の)非正規化数は const auto min_expn = std::numeric_limits<double>::min_exponent; const auto digits = std::numeric_limits<double>::digits; として、std::ldexp(0.5, min_expn - digits + 1) で正しい? (実際 std::ldexp(0.5, min_expn - digits + 1) > 0.0 やが std::ldexp(0.5, min_expn - digits + 1) / 2.0 == 0.0 であっる Q3.にもかかわらず、 std::ldexp(0.5, min_expn - digits) > 0.0 になるのはなんで……orz
238 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 03:25:12.56 ID:4PD3HqyC0.net] 訂正 |||。n_ 誤1: IEEE735 正1: IEEE754 誤2: 非正規化数 正2: 非正規数
239 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 06:22:40.58 ID:2tL2xZqD0.net] >>237 wandboxに書いてみ
240 名前:はちみつ餃子 mailto:sage [2024/02/11(日) 07:55:26.62 ID:nHqSm2on0.net] >>237 決まっていない。言語仕様としては未規定。 std::numeric_limits::is_iec559 が真であるならその挙動をあてにしていいがそうでないときは各環境の事情による。
241 名前:デフォルトの名無しさん (ワッチョイ 16cf-BOeC) mailto:sage [2024/02/11(日) 09:19:29.20 ID:XOPhWcHA0.net] >>236 あんたの認識じゃ catchする=見かけ上動き続ける なんだ? なんか根本的に勘違いしてる気がする。
242 名前:デフォルトの名無しさん (ワッチョイ 637c-IqbK) mailto:sage [2024/02/11(日) 09:29:04.38 ID:9XvrSVak0.net] 例外は「関数外にエラー発生を伝える」ための「方法の一つ」でしかない 関数の処理がどんなエラーを発生させうるか、受け取った外側の処理がその情報をどう取り扱うべきかという問題とは完全に直交してる (言語ごとにある程度の慣例はあるけどあくまで慣例) 例外に変なこだわりや的外れな批判をしてる奴は大体そこを勘違いしてる
243 名前:デフォルトの名無しさん (ワッチョイ 16cf-BOeC) mailto:sage [2024/02/11(日) 09:47:48.61 ID:XOPhWcHA0.net] アンカ間違えた、すまん >>241 は>>235 宛な。
244 名前:デフォルトの名無しさん (ワッチョイ 1e27-2ki6) mailto:sage [2024/02/11(日) 09:47:48.79 ID:2tL2xZqD0.net] >>242 お前はバグのないお花畑を考えてるからそういう理想的な抽象論を持ち出すんだよ c++の現実は道を踏み外したら即カオス stlのコンテナのpopに返り値がない理由は知ってるか? あのレベルの考察でソフトウェア設計している人間が世の中にどれだけいると思う?
245 名前:デフォルトの名無しさん (ワッチョイ 1e27-2ki6) mailto:sage [2024/02/11(日) 09:55:44.37 ID:2tL2xZqD0.net] >>241 >>169 を否定している 知らない例外が飛んできた場合にcatchして握りつぶしてそのまま動作を継続するかどうかって話な
246 名前:デフォルトの名無しさん (ワッチョイ 637c-IqbK) mailto:sage [2024/02/11(日) 10:07:06.72 ID:9XvrSVak0.net] >>244 バグのあるなしなんか関係ない設計の話だし、「例外はエラー伝達の具体的方法の一つ」って話のどこが抽象的なのかも分からないし、 「C++の現実」とか「カオス」が具体的に何のことで何の関係があるかも分からないし STLにpopがないのはnoexcept moveがない時代に例外安全に出来なかったからだけど今の話に何の関係があるかわからないし そんなのまともなC++erなら誰だって考えて設計してると思うけど、そうでないタコの話が何の関係あるかわからないし何もかも分からなすぎてすごい 仕事でそんなドキュメントやレビューコメント出すなよ >>245 知らない例外を握り潰すのも、知らない戻り値をガン無視するのも一緒 errnoが変わってるのを無視するのもint*err引数に渡した変数の値を無視するのもexpected<T,E>で帰ってきたEを無視するのも「知らんエラーを無視した」という結果は一緒 知らんエラーを無視していいかどうかの意味論と、そのエラーがどう伝播して来るかかは関係ない 関係ない話を混ぜるからお前のC++はカオスなんだよ
247 名前:デフォルトの名無しさん (ワッチョイ 16cf-BOeC) mailto:sage [2024/02/11(日) 10:14:56.00 ID:XOPhWcHA0.net] >>245 ? そのtryブロックの処理が失敗したものとするって書いてあるじゃん。
248 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 11:18:37.96 ID:4PD3HqyC0.net] >>231 >前半のよくわからない計算はcatch句を書いたらそのC0網羅のためのテストケースが必要になるとかいうことなんだろうか 例外が関数の階層をぶち抜いてfall-throughしてくることを忘れている発言 1. catchが書かれた関数が正しくcatchし、適切に処理するか(処理してせき止め or/and 必要な場合再スロー)(←要テスト! 2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト! 2をテストもせずに放置するとおかしくなる例は>>183 のとうーり これにより、例外を生じる関数foo()の呼び出しパティーンn個それぞれに対し、a個のテストが必要になっる 例外を発生させない使い方をするなら、n*a*mではなくmの定数倍(例外を飛ばさない使い方に依存擦る定数)。 例外が飛んで来たらバグ。わかりやすい 例外を多用しつつn*a*mをよくわからない計算とか言っている時点で以下略
249 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 11:18:50.45 ID:4PD3HqyC0.net] >>244 以下の主張のどこが抽象論なのかkwsk、 1. ライブラリのドキュメントに従い、可能な限り例外を生じない使い方で設計する(>>236 2. 例外が生じない前提としたところは例外が生じないことをテストする(m個のオーダー)(>>229 3. 1と2の過程で意図に反して飛んでくる例外がある場合は原因を調査し、修正を試みる(>>228 例外が飛んで来たらバグ 4. 3を意図通りの形で解決できないことが判明した場合は (ライブラリの使用方法の当方の誤解、ライブラリのドキュメントの不備、ライブラリの作りの粗さによりこれはあり得る、 結果的にtry { } catch (/*省略*/) { ... }を付ける可能性もある(>>228 5. 例外を複数段fall-throughか再スローを許し、かつそれが起きた後もプログラムの 正常な動作の継続を意図する場合はテストケースが爆発する(>> 設計し、検証し、必要とあらばtry { } catch ( ) の追加も含めた修正を行うと言っているのやぞ;;; いっぽう藻前らの主張は 1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼 2. 例外を処理したりfall-throughしたり再スローしたりする関数はn*a*m個のテストしなくても動くっしょ (←自己のコードに対する無制限の気体 3. ドキュメントは100%信頼せず、読まない の3成分からなるわけやが……
250 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 12:01:58.52 ID:XOPhWcHA0.net] >>248 >例外が関数の階層をぶち抜いてfall-throughしてくることを忘れている発言 やっぱり意味不明だな。catchすれば「階層をぶち抜いて」ってことはないわけだが。 >2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト! もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する 呼び出し階層全部でテストをしなきゃならないってことになるが。
251 名前:デフォルトの名無しさん mailto:sage [2024/02/11(日) 12:31:22.40 ID:XOPhWcHA0.net] >>249 >1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼 なるほどな。 catchする⇒無視する、握りつぶす って脳内変換されてんだな。 catch書いたからといって上に挙げられたようなテストができなくなるわけじゃないっしょ。必要と思うならやればいい。 3.の意図しない例外の原因調査なんて main() に例外が上がってきてプログラムが落ちてからより 発生個所に近い下層で catch できた方がはるかに調査しやすいと思うんだがな。感覚が違うなあ。
252 名前:デフォルトの名無しさん (スプッッ Sd52-oDfP) mailto:sage [2024/02/11(日) 12:37:47.91 ID:AyRTgUB7d.net] 仕様書や規格書はその意図を正確に読み取ろうとするのに 掲示板の他人の書き込みは積極的に曲解しようとするのは何故か?
253 名前:デフォルトの名無しさん (ワッチョイ ef8b-u/MX) mailto:sage [2024/02/11(日) 12:44:06.42 ID:E8bU9+6D0.net] 見下しているからよ こいつらは俺より下なはずと
254 名前:デフォルトの名無しさん (ワッチョイ 5eda-5kwM) mailto:sage [2024/02/12(月) 07:49:39.70 ID:4SfsXRB60.net] 本気で面白いと思ってやってんだろう
255 名前:デフォルトの名無しさん (ワッチョイ 637c-IqbK) mailto:sage [2024/02/12(月) 08:44:56.68 ID:WngRm50l0.net] 例外は糞!危険!意味不明!テスト漏れる!って言ってる奴ほど if (err != 0) { return -1; }が大好きなんだよな 本質的にやってること変わらないのに
256 名前:デフォルトの名無しさん mailto:sage [2024/02/12(月) 15:42:15.86 ID:NdUIQhSh0.net] ファイル名に年月が使えないの困ります。 2024/02/11_データ.txt とか
257 名前:デフォルトの名無しさん mailto:sage [2024/02/12(月) 15:46:00.47 ID:QicyHe7E0.net] >>256 それ検索性最悪だから良くないんだよなぁ。 データ/2024/02/11/データ.txt データ.txt/2024/02/11/データ.txt あたりならまだ許せる。
258 名前:デフォルトの名無しさん [2024/02/12(月) 16:40:43.94 ID:MdmHk5EH0.net] ふつう年月日はハイフンで区切るよね
259 名前:はちみつ餃子 mailto:sage [2024/02/12(月) 17:02:03.84 ID:4VueJhli0.net] スラッシュを使う習慣が悪いわけではないが プログラマの感覚だと ISO 8601 の方式に馴染みが有ることが多いってのはある。
260 名前:デフォルトの名無しさん (ワッチョイ 5edc-s3Gl) mailto:sage [2024/02/12(月) 17:31:20.60 ID:rGOG+Ewu0.net] 年月日は「ふつう」がないのでみんなが苦労している 日本とアメリカとイギリスで順番が違うし 日本には「令和」とかあるし
261 名前:デフォルトの名無しさん [2024/02/12(月) 18:43:50.33 ID:zGvIVge80.net] Windowsでも / をディレクトリ区切り文字として使えるけど(場面は限定的かもしれないけど)、その認識で使ってるのかな…
262 名前:はちみつ餃子 mailto:sage [2024/02/12(月) 20:07:00.91 ID:4VueJhli0.net] Linux で * という名前のファイルを消そうとして うわあぁぁぁとなった話はたまに聞く。 使えたとしても使うべきでない文字もある。
263 名前:デフォルトの名無しさん (ワッチョイ f7cb-nOVH) mailto:sage [2024/02/12(月) 21:44:07.99 ID:zGvIVge80.net] 262>> それ以外のファイルをすべて退避した上でディレクトリごと削除したことがあったな
264 名前:デフォルトの名無しさん (ワッチョイ f7cb-nOVH) mailto:sage [2024/02/12(月) 21:46:10.68 ID:zGvIVge80.net] すみません、261ですが、Windows限定の話ではなかったですね 失礼しました…
265 名前:デフォルトの名無しさん (ワッチョイ 5edc-s3Gl) mailto:sage [2024/02/13(火) 05:53:49.07 ID:QIUviIGO0.net] Linuxならi-nodeをしていすれば findと組み合わせてどんな名前のファイルも消去できるんだけどなあ windowsはなんか複雑だったような気がした
266 名前:デフォルトの名無しさん mailto:sage [2024/02/13(火) 09:36:03.89 ID:7CLA20rP0.net] iso8901にしない人はたぶんこの規格を知らないわけで意識低すぎだろと思ってしまう
267 名前:はちみつ餃子 mailto:sage [2024/02/13(火) 11:18:57.32 ID:T85IlqBy0.net] >>266 ISO 8901 は情報交換用 (要するに機械同士のやり取り) の時刻フォーマットを定める規格であって 言葉や文章で使うもの (人間が読み書きする目的) ではないと適用範囲の言及がある。 ファイル名はどちらの用途もありうるので >>256 がどのような状況を想定しているかによって ISO 8901 が適切かどうかは違う。 もし非技術者向けのシステムなら 文化固有の日付表現に対応できてないほうが意識低いという見方もある。
268 名前:デフォルトの名無しさん mailto:sage [2024/02/13(火) 12:55:27.90 ID:c63MYIIQ0.net] >>267 エンドユーザーの文化的背景に配慮したデータフォーマットの利点は、エンドユーザーの知識やメタファーを利用した学習曲線の低勾配化であって、技術的には負の遺産になりやすいことには注意が必要。 典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。 あるいは大きな桁から始まるバイト列とか。あんなの1桁目から始めればエンディアン問題とか無かった。
269 名前:デフォルトの名無しさん mailto:sage [2024/02/13(火) 13:07:38.28 ID:mTl8FNrx0.net] > 典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。 それは人間から見たときと機械から見たときの見やすさの違いでしかないような気がする でも日本の住所は大きい方から始まるんだよな アメリカは個人から始まる 文化の違いやけども、日本人は機械生命体だったのかもしれぬ
270 名前:デフォルトの名無しさん (ワッチョイ 6b74-e92p) mailto:sage [2024/02/15(木) 04:22:25.92 ID:MOgQCM5N0.net] >>58 亀だがクロスで使ってるよ
271 名前:デフォルトの名無しさん mailto:sage [2024/02/16(金) 22:41:08.10 ID:/bcZ41DF0.net] enable_shared_from_thisなクラスで、shared_from_this()はコンストラクタの中では 呼べないようですね コンストラクタの中の処理でthisを渡したい処理があるのですが、どうしたら... そもそもそれ自体が間違っているのでしょうか コンストラクタが呼ばれる行の次でその処理を呼べばいいという説もありますが、 現在のコードがそれをやりにくい形になっていて
272 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 11:55:24.05 ID:hsYxYbKj0.net] >>250 >>2 . fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト! >もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する >呼び出し階層全部でテストをしなきゃならないってことになるが。 その通り。テスト不要としたいなら、例外が出た原因を調べて出ないようにするのが筋 原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい >>251 >catchする⇒無視する、握りつぶす って脳内変換 脳内変換ではなくて、予防的に入れたtry { } catch ()部分のテストが不十分な限り事実じゃーん? >>252 >本質的にやってること変わらないのに 別に。 return -1; は呼び出し側のバグで見落とすかもしれないが throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル むしろ予防的なtry { } catch () が例外のメリットをreturn -1; に縮小してゐる
273 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 12:01:54.73 ID:hsYxYbKj0.net] >>253 藻前が二の句をつげないのは藻前の見識と資質の問題であって 漏れの責任ではないのでお間違えなきよう、 なのですよ……
274 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 12:35:51.03 ID:mUyTgSzm0.net] テストって想定した動作環境、データ入力に対して想定した動作をするか確認をするわけで 想定しえないエラーや割り込みに対してはテストのしようがないんだけどな そのための例外処理だろ
275 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 13:04:42.05 ID:4+T7+QKn0.net] 例外が上がってくるってことはどこかで例外を投げてるってことだぞ。 問題が起きたところでその問題に対して例外を投げるという対処をしてる箇所がある。 想定してないなら例外送出すらできないよ。 その上で人間は大きいプログラムの全体を把握することは困難だし 機械的なチェックがしづらいという現実はあるって話だ。
276 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 13:33:26.89 ID:mUyTgSzm0.net] アプリケーションを作っているのとOSを作っている人は別 それと同様に利用するライブラリがどのような例外を投げてくるか、もしくはそのライブラリがさらに下位のライブラリから投げられた例外をどう処理しているか アプリケーション開発者はそれらすべて想定できているとでも? ハードウェアやシステム含めて全部ひとりで作り上げる(もしくは密に情報共有できている)ならお前の言う通りだけどな
277 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 13:41:06.46 ID:4+T7+QKn0.net] >>276 「把握することは困難」という現実の話もしてる。 想定してはいて、しかしそれが伝わってない。 コミュニケーションの問題、自動化の問題として捉えるべき。
278 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 13:56:12.85 ID:mUyTgSzm0.net] 俺も、(もしくは密に情報共有できている)なら、と言う話をしているがな ただ「現実の話」と言うならば、伝わっていないことをコミュニケーションの問題、自動化の問題と言うのはナンセンスだわな お前自身がこう言っている > その上で人間は大きいプログラムの全体を把握することは困難だし > 機械的なチェックがしづらいという現実はあるって話だ。 ではWindowsと言う巨大プログラムにおいてMSの中の人はどの程度全体を把握していて、発生しうる例外を公開しているのか アプリケーション開発者はその公開情報をもとに *想定し* プログラムを組まなくてはならない さてアプリケーション開発者はOSなど下位のモジュールから飛んでくる例外をすべて想定できるのか? そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに (ここで言う継続的な処理とは問題なしとして先に進むだけでなく、異常があったとして正常な(処理の)出発点に戻るという意味でもある) 起こりえる例外をすべて想定せずともプログラムを安全に継続するための仕組みが例外処理だろ
279 名前:デフォルトの名無しさん (ワッチョイ 6332-A7R9) mailto:sage [2024/02/17(土) 15:09:15.47 ID:4+T7+QKn0.net] C++ の設計理念としては「そうは言っても現実はこうなっとるやろが!」という 状況に対処する方法があることも大事にしてはいる。 たとえ綺麗な方法ではなくても。 どのような問題が起こりうるのか (それなりには) きちんと想定するのは当然の大前提で、 それでもこれからリリースするソフトウェアに何が起こるかわからんのは仕方がないという話であって、 想定が不十分でも構わないという話でもない。 よくは無いが悪いときでもなんとかなるという程度の仕組みだよ。
280 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 15:39:40.77 ID:snTd9S980.net] >>271 一番いいのはコンストラクタの中でthisを渡す部分を何とかすることだけど、それが必ずしも間違ってるかは分からないので コンストラクタの中だけでその処理が呼ばれるなら生のthisを渡すことを許容しつつ、その処理の呼び出し可能範囲を限定するか そのクラスの構築をファクトリ関数経由に限定して、ファクトリ関数の中に構築とその処理呼び出しをまとめてしまうとか
281 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 15:49:12.98 ID:mUyTgSzm0.net] > 想定が不十分でも構わないという話でもない。 誰もそれで構わないとは言っていないので それでも起きてしまうエラーや割り込みに対応するための仕組みが例外処理だろ 身も蓋もない言い方をするなら そもそも想定できているなら事前に排除するだけで済むわけで例外処理の必要もない (もちろん分かっていても事前に排除せず意図的に例外処理に丸投げすることもあるのは知っている) アプリケーション開発者にとってもっとも想定できない問題ってのは実行環境に起因するもの
282 名前:デフォルトの名無しさん (ワッチョイ 16cf-BOeC) mailto:sage [2024/02/17(土) 20:37:07.00 ID:QSMcEn770.net] >>272 >原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい 相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ。 >return -1; は呼び出し側のバグで見落とすかもしれないが >throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル 戻り値のチェック漏れは静的局所的にチェックできるが例外は出てみなけりゃ結局澪とされるわけだが。 リリース後にユーザーサイドでその見落とされていた例外が発生してプログラムが落ちたりしたらそれはただのバグ。
283 名前:デフォルトの名無しさん [2024/02/17(土) 23:18:00.46 ID:v62CV0mD0.net] >>278 > そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて > どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに それは幻想 c++の例外安全の達成がどれだけ難しいか理解していないね 簡単にリークするし、オブジェクトが想定外の状態を持ったりする 動作保証ができない だから仕様に明示されていない例外が来たら基本は終了だよ そのまま継続してそれが原因でその後別の場所で落ちられたら無駄な調査の手間が増えるだけ
284 名前:デフォルトの名無しさん mailto:sage [2024/02/17(土) 23:48:07.59 ID:QSMcEn770.net] 例外安全と例外の種類には特に関係はないわけで、知らない例外だと例外安全の保証が困難になるなんてこともない。
285 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 00:24:49.13 ID:JX7gxI3D0.net] >>284 例外の種類しか頭にないのか 任意の場所での例外発生に対応するなん現実的にできないということ
286 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 09:00:09.02 ID:c1Urupub0.net] >>269 そのあたりの難しさを考えると、例外廃止してoptionalに統一したほうがいいかもな。 少なくとも例外みたいに変なフローで飛んで来ないし。
287 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 09:39:44.00 ID:9f8IS57r0.net] ぶっちゃけ>>283 がなに言ってるのかわからない 継続してそれが原因で? いやいやw 突如落ちるより、保存できるデータは保存してもらう機会を与えることは出来るだろ なんでお前は何事もなかったかのように作業を続ける前提でしか話を聞かないんだ? オブジェクトの状態が変わっているかも? 変更前のデータと比較して変わっていたらユーザに確認すればいいだろ 例えば図形情報のうちTopの読み込みで例外が発生した場合に想定してないからとアプリ落として全情報ロストさせる気か? Topは0で初期化させ読み込めなかったことをユーザに伝えて修正、もしくは再読み込みの機会を与えるだけの話だろ
288 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 09:41:50.12 ID:WHoJTRhT0.net] >>285 >例外の種類しか頭にないのか >>283 が仕様に明示されていない例外を話題にしているからだが。 >任意の場所での例外発生に対応するなん現実的にできないということ これはどういう意味なんだろうな。 着目するのは自分が呼び出している処理から上がってくる例外に対して例外安全かどうかであって それは基本的に局所的に判断できるもの。 下層の、例外が通過してきた処理が例外安全な実装になっているかどうかってのはそっちの責務。
289 名前:デフォルトの名無しさん (ワッチョイ e3f9-NGC7) mailto:sage [2024/02/18(日) 12:27:32.99 ID:9f8IS57r0.net] > これはどういう意味なんだろうな。 そうそれ tryブロックで囲った部分(つまり任意)の例外発生に対応するのが例外処理なのになにが出来ないというのか 想定している例外が発生して継続できると判断したなら続ければいいし ダメならユーザに通知してもちょも安全な方法を選択させればいい でもってそれは想定していない例外の発生でも同じ ただ致命的でどうしようもないなら強制終了させるだけの話で、想定していない例外はなんでもかんでも強制終了じゃ例外処理使う意味が薄まってしまう
290 名前:デフォルトの名無しさん (ワッチョイ e3f9-NGC7) mailto:sage [2024/02/18(日) 12:28:39.34 ID:9f8IS57r0.net] もちょも は もっとも の まちがい
291 名前:デフォルトの名無しさん (ワッチョイ 6f5b-ERL4) mailto:sage [2024/02/18(日) 13:22:22.19 ID:JX7gxI3D0.net] >>287 ファイル保存するなとか言ってない それぐらい終了処理のひとつだろ ログファイルもシグナルトラップして必ずフラッシュさせるのが常套手段だろ 意味不明な例外が発生しました データが破損してないかあなたが確認してください 動作無保証ですが処理継続しますか?yes/no こんなUIだすやつセンスの欠片もない
292 名前:デフォルトの名無しさん (ワッチョイ e304-hmqi) [2024/02/18(日) 14:01:41.78 ID:6Yt/CDIt0.net] 私が20代の頃に見かけた論争が今も繰り返されてるのかわいい🩷
293 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 15:55:07.22 ID:1iQutSwY0.net] >>291 それを思いついたお前のセンスがないと言うことになるが… 俺は確認しろと言っただけだし確認には様々な方法がある
294 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 16:26:47.97 ID:WHoJTRhT0.net] >>291 まさか、何も言わずにいきなり落とす方が良いとか言うわけじゃあるまい。
295 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 17:54:38.27 ID:L2mk1x1ad.net] >>289 もちょカワイイよね
296 名前:デフォルトの名無しさん mailto:sage [2024/02/18(日) 18:17:37.55 ID:LeQ06zof0.net] >>280 実生活のあれと似てますよね。「引っ越すことになりました。新住所はXXです」と早めに 連絡したら、気の早い知人がそこに押しかけてきて「なんやまだ引越しとらんやんけ」となる やはり引越し作業完了を待ってからの方がいいのか。ってちがうか
297 名前:デフォルトの名無しさん mailto:sage [2024/03/02(土) 23:41:07.84 ID:C77pR/Zl0.net] >>282 >相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ >249に賛同いただけていないということは、発生してもいない例外について予防的にtry { } catch () を入れようとしていることは 確定的に明らか で、例外というブツは「例外なく」悪い知らせなので(∵仮に良い知らせを例外で寄越すライブラリがあったらそれ自体悪い知らせである 普通の人は悪い知らせが来る前に処置しようとする。すわなち例外が来ないように(可能な限り)修正する。 try { } catch ( ) でひっかけて原因調査兼確実な修正でざい、それが一番効率が良い方法論である、などと主張するのはおかしい人だけ……
298 名前:デフォルトの名無しさん mailto:sage [2024/03/02(土) 23:49:37.41 ID:C77pR/Zl0.net] >>284 例外安全というもののスコープに対して考察が足りていない 1. 例外安全なオブジェクト foo のデストラクトが他の例外によって引き起こされるケースでは foo の安全な終了は(メモリかファイルステムか何かが物理的にぶち壊れてOSがパニックになったとかでない限り ほぼほぼ保たれるから>>284 のような言い方はできるっていやーできるが、 システム全体については>>283 の通りであって全然安全ではない 2. fooの中の例外処理が本当に完璧かはfooのコードに書かれている全てのtry { } catch () について 全ての例外発生条件についてテストか厳格めのコードレビューでも行わないことには安全性が担保されない。 (つまり例外安全にした実装したと主張するだけでは話がただちには簡単にはならない
299 名前:デフォルトの名無しさん mailto:sage [2024/03/02(土) 23:57:46.67 ID:C77pR/Zl0.net] それはそうとして、予防的なtry{ } catch () の何が一番駄目かというと、設計上のトレードオフをわけわかんなくすることが確実な点 例外発生後の状況というのはたいてい>>283 の通りのわけなので、何かを捨てて何かを取る (例えばシステムは最悪落ちても構わないが、例外安全なオブジェクトfooでリソースAの整合性は死守する等) のトレードオフが発生するがそういうのこそ慎重な設計と考慮が必要な事項であることは確定的にあきらか プログラムの全階層にtry { } catch ()入れたら完璧などというアフォはやっぱtry { } catch () しないのが正しい
300 名前:デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8) mailto:sage [2024/03/03(日) 21:57:15.41 ID:735dldsp0.net] >>298 自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかをごっちゃにしてるだろ。 しかも、呼び出す関数からドキュメント化されていない想定外の例外が発生するなら例外安全に作られていないだろうという 変な決めつけが混じってる。 例外安全なコードは例外の種類に依存しない。知ってる冷害に対しては安全だけど知らない例外が飛んできたら安全じゃない なんてのはそもそも例外安全とは言わない。
301 名前:デフォルトの名無しさん (ワッチョイ ef0a-qSkN) mailto:sage [2024/03/03(日) 22:08:48.84 ID:qMaLplcd0.net] >>300 お前さ、すべてのnoexcept関数呼び出しの例外テスト書いてんのか? それが出来もしない理想論だって言ってんの
302 名前:デフォルトの名無しさん (ワッチョイ 3b7c-85wQ) mailto:sage [2024/03/03(日) 22:31:19.01 ID:GdJ/jhkt0.net] >>301 自分でnoexcept指定した関数のことなら投げないことを確認するテストくらい書けよ当たり前だろ
303 名前:デフォルトの名無しさん mailto:sage [2024/03/04(月) 00:08:35.31 ID:gWJ01aQ50.net] >お前さ、すべてのnoexcept関数呼び出しの例外テスト書いてんのか? 悪魔の証明をテストすんのか
304 名前:デフォルトの名無しさん (ワッチョイ ef0a-qSkN) mailto:sage [2024/03/04(月) 07:57:02.63 ID:D3yk9beu0.net] >>302 100%自分で書いてるコードなら未知の例外なんて起こらんだろ 話の筋理解してからレスつけろや三流
305 名前:デフォルトの名無しさん (ワッチョイ 8b63-eOBD) mailto:sage [2024/03/04(月) 07:58:21.27 ID:KYG2Ugpe0.net] なんか予想外に低レなレスポンスを寄越した>>299 …… さすがに>>283 の後に>>284 のような楽天的なことを言えるだけのことはあるということか…… 例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える が、例外安全なオブジェクトだけかをもれなく機械的に確認する方法は無い上に、 中断したら別物になる(処理の順序が命)というアルゴリズムというものの本質的特性により、 >>183 のような try { } catch () が必要なケースは隙あらば混ざり込んでくるから(※1) >>284 が空想するようなシステム全体の例外安全化などは現実には不可能。 せいぜいある程度の規模のオブジェクトであれば、十分テストすれば (自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかを慎重に確認せねばならない) ほぼほぼの信頼度で実現できるというぐらい。
306 名前:デフォルトの名無しさん (ワッチョイ 8b63-eOBD) mailto:sage [2024/03/04(月) 07:59:55.02 ID:KYG2Ugpe0.net] (※1) >>183 の関数そのものは、例外安全なスレッドオブジェクトでも使ったらtry { } catch () 無しの例外安全な関数うに書き直すことはできうる
307 名前:デフォルトの名無しさん (ワッチョイ 8b63-eOBD) mailto:sage [2024/03/04(月) 08:09:49.95 ID:KYG2Ugpe0.net] あと寝てて思ったがプロセスが死んでもサービスが継続したらお客様には迷惑を掛けずに済むので (直接そういうのをやってちるわけではないので強くは言わんが ウォッチドッグタイマー的な死活監視で異常あらばプロセス再起動とかマシンを切り替えるとか方法はいくつもあって、 十分テストされたプログラムならクラッシュ頻度をポアソン分布とみなして信頼度も出せる やっぱ「お客様の前で落ちたら恥ずかしいから」というつまらないプライドを基本的動機とする try { .... } catch (std::exception& e) { log_e("std::exceptionがスローされました"); }; みたいなコードをリリースコードに含めましょうという>>282 の調査のスタンスは全く正当化されない 100日に一回しか再現しないバグの修正を3日でやれと言われて手元にあるのがメモリダンプの代わりに上の23文字のログメッセージだけだったりしたら >>282 は自○が真剣に考慮すべき選択肢に……
308 名前:デフォルトの名無しさん (ワッチョイ 9fad-ZLJX) mailto:sage [2024/03/04(月) 08:50:22.67 ID:MzjtGtOW0.net] > なんか予想外に低レなレスポンスを寄越した>>299 …… 299はお前自身じゃないのか、と俺は思う
309 名前:デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8) mailto:sage [2024/03/04(月) 08:53:34.53 ID:gWJ01aQ50.net] >例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば >その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える 例外安全だからといってcatchが不要になるわけないだろ。 根本的なところで勘違いしてるから頓珍漢が主張を続けてるわけだな。
310 名前:デフォルトの名無しさん (ワッチョイ abe4-XE6S) [2024/03/04(月) 10:20:12.57 ID:QvxlWFfk0.net] 例外安全には基本保証・強い保証・no-fail保証がある 例外がスローされない関数を作ればno-fail保証がある 基本保証や強い保証は例外発生後も不整合が発生しないもの たとえば例外が発生した関数をもう一度呼び出すと「すでに実行中です」とエラーを返すようなものは例外安全ではない(おそらく実行中フラグ変数が立ったままになっている)
311 名前:デフォルトの名無しさん (ワッチョイ abe4-XE6S) [2024/03/04(月) 10:23:14.03 ID:QvxlWFfk0.net] 10行のデータをファイルに出力するとき、例外が発生して5行だけデータが出力されてしまうのは強い保証があるとはいえない 例外が発生した際にデータを書き込む前のファイル状態に戻れば強い保証がある(例外安全である)といえる
312 名前:はちみつ餃子 mailto:sage [2024/03/04(月) 12:10:26.04 ID:ASLjljy+0.net] 誤解のないように念のため補足。 この場合の「強い」という用語は性質の分類であって強いことがより良いというわけではないという話をしてる。(んだよね?) 例外を出さずに済むならそれに越したことはないよ。 でも、ひとつの部品の中では問題を解決できないことがあるからこそ例外を用いて他の部品と連携しての解決を試みるわけ。 連携するには保証の強力さよりも保証範囲の明瞭さ (明瞭でもカバーしようがない設計はあかんが) が大事で、プログラム全体で整合性が保たれていれば例外安全と言える。 仕様が不明瞭なライブラリもあるのが現実だってのはそりゃそうだけど、出来が悪い部品とつじつま合わせをしきらないってのは例外のせいでも C++ のせいでもない。
313 名前:デフォルトの名無しさん mailto:sage [2024/04/08(月) 15:38:53.52 ID:IvxniXPw0.net] std::initializer_listについて質問です 下の例ですがコンストラクタの引数に配列リテラルを指定した場合、リストがコピーされてしまいますよね? これは無駄なので回避したいのですが良い方法はありますか? https://cpprefjp.github.io/reference/initializer_list/initializer_list.html
314 名前:デフォルトの名無しさん (ワッチョイ df01-g9Lk) mailto:sage [2024/04/09(火) 12:13:11.96 ID:gepNgOiE0.net] どこのコピー?
315 名前:デフォルトの名無しさん (ブーイモ MM3e-Nnmc) mailto:sage [2024/04/09(火) 12:52:21.68 ID:80QuF/MqM.net] リテラルのコピーを気にするならconstexprじゃねーの? ほんとにコンパイル時に定数になるかは知らんけど
316 名前:デフォルトの名無しさん mailto:sage [2024/04/09(火) 15:22:07.81 ID:hsAXyuRl0.net] >>313 C++ に配列リテラルはない。 その書き方で出てくる波括弧はリスト初期化の構文の一部で、 波括弧の部分単体は配列リテラルではない。 実行時にオブジェクトの構築を避けるならコンパイル時に構築することになるが それはそれで色々と制約があるんでほんまにそれが必要なんか? というのはよく考えないといけない。 あえてやるならこんな感じかな……。 https://wandbox.org/permlink/HStrLq8ddyC3tby2
317 名前:デフォルトの名無しさん mailto:sage [2024/04/09(火) 20:10:25.18 ID:T/amOWJO0.net] とあるtemplateの関数を実装しているのですが、 const指定の振る舞いがよくわからなくなったので 質問させてください。 以下の(だいぶ簡略化した)コードで、 f_without_const<const int*>(const int* a) はコンパイルが通るのですが f_with_const<int*>(const int* a) がコンパイルが通らないのは何故でしょうか。 https://wandbox.org/permlink/OIgKM2DTqvpGduRV
318 名前:デフォルトの名無しさん mailto:sage [2024/04/09(火) 20:30:45.76 ID:lDhzon+/0.net] >>316 なるほど ここまでやるメリットはなさそうなので大人しくデフォルトの書き方にしておきます
319 名前:デフォルトの名無しさん mailto:sage [2024/04/09(火) 21:45:08.71 ID:+RmfoJzl0.net] >>317 templateは型が違うと全くの別物として処理するからだと思う
320 名前:デフォルトの名無しさん mailto:sage [2024/04/09(火) 22:00:45.26 ID:5hAg3cgl0.net] >>317 template <class T> void f_with_const (const T t); これに対応させるなら f_with_const<int*>(int *const a)
321 名前:はちみつ餃子 mailto:sage [2024/04/10(水) 08:39:45.44 ID:Fk7YBwaR0.net] const T t に対して const int* a が来たら 字句の順序としては T に int* が対応してるように見えちゃうもんな……。
322 名前:デフォルトの名無しさん mailto:sage [2024/04/11(木) 21:42:31.84 ID:0cjrPM+u0.net] 317です、返信遅くなってすみません 確かに言われてみればconstが修飾してるのはint*なので、意味的にint *constが正しいですね… ありがとうございました
323 名前:デフォルトの名無しさん mailto:sage [2024/04/14(日) 14:49:11.63 ID:tTNkn9kB0.net] 先月東京で標準化委員会の会議あったらしいけどなんか情報ないの?
324 名前:デフォルトの名無しさん mailto:sage [2024/04/14(日) 15:03:51.38 ID:H7y3imqp0.net] あるよ。 https://github.com/cplusplus/papers/issues?q=sort%3Aupdated-desc
325 名前:デフォルトの名無しさん (ワッチョイ 7f52-9wFU) mailto:sage [2024/04/16(火) 00:50:18.09 ID:38VQ+8UT0.net] >>323 https://www.reddit.com/r/cpp/comments/1bloatw/202403_tokyo_iso_c_committee_trip_report_third/
326 名前:デフォルトの名無しさん (ワッチョイ 67b1-Jq5A) [2024/05/01(水) 21:36:46.68 ID:/DCu7vsT0.net] python みたいに何でも格納できる辞書型ってC++には無いよね?
327 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8732-nVjz) mailto:sage [2024/05/01(水) 22:29:05.62 ID:IV4TsWNk0.net] >>326 要素を std::any にすればだいたいどんな型の値でも入れられる。 いろんな型を入れたところで使うときには元の型として取り出さないといけないから 処理は煩雑になってあまり良いことはないけど。
328 名前:デフォルトの名無しさん (ワッチョイ 8f7c-Y/5H) mailto:sage [2024/05/09(木) 20:23:09.67 ID:MzADiHDk0.net] https://cpprefjp.github.io/lang/cpp23/add_support_for_preprocessing_directives_elifdef_and_elifndef.html #elifって今まで非標準だったのかよ…
329 名前:デフォルトの名無しさん (ワッチョイ bed6-w0ma) mailto:sage [2024/05/09(木) 21:19:14.71 ID:M6C6+6vz0.net] 何いってんだ
330 名前:デフォルトの名無しさん mailto:sage [2024/05/10(金) 11:53:06.45 ID:P+BretyD0.net] #elifは大昔からあるぞ
331 名前:デフォルトの名無しさん mailto:sage [2024/05/11(土) 09:12:25.64 ID:YR9R4Y390.net] cpprefjpが間違ってるだけ? それともずっと規格から欠落してたけど誰も気付いてなかったパターン?
332 名前:デフォルトの名無しさん mailto:sage [2024/05/11(土) 11:19:25.57 ID:PrWZroBw0.net] 規格が読めないならC++やめろ
333 名前:デフォルトの名無しさん (ワッチョイ 0b63-IWIS) mailto:sage [2024/05/11(土) 19:02:18.20 ID:RotYKdRC0.net] elifを逆から読んだらfile ラリーはこれを嫌ってPerlではelsifにした(適当
334 名前:デフォルトの名無しさん mailto:sage [2024/05/11(土) 22:20:47.67 ID:HBPowvO20.net] シェルが変だからな case ~ esac if ~ fi
335 名前: mailto:sage [2024/06/06(木) 07:08:30.09 ID:Glzej5210.net] てst
336 名前: mailto:sage [2024/06/06(木) 07:55:41.85 ID:Glzej5210.net] 質問なのですが Q1. std::fstreamでファイルを開くときのフラグの指定の仕方は次のどれが正義? std::fstream ofs("foo.txt", std::ios::out | std::ios::binary); // (1) std::fstream ofs("foo.txt", std::basic_ios::out | std::basic_ios::binary); // (2) std::fstream ofs("foo.txt", std::fstream::out | std::fstream::binary); // (3)
337 名前:デフォルトの名無しさん (ブーイモ MMde-FHn0) mailto:sage [2024/06/06(木) 15:53:22.90 ID:Vp529NVwM.net] フル手書き前提がくそださい
338 名前:デフォルトの名無しさん mailto:sage [2024/06/06(木) 19:13:19.37 ID:FMMlTunO0.net] fstreamなんだったらfstreamのメンバで書くのがいいんじゃない
339 名前: mailto:sage [2024/06/06(木) 23:36:07.51 ID:Glzej5210.net] (1)は#include <ios>が要るし、 (2)は「basic_」の6文字×フラグの数 だけ長いし、 (3)も同様でありなおかつ>>337 に従ったとき use binary = std::fstream::binary; use ibinary = std::ifstream::binary; use obinary = std::ofstream::binary; となってしまい、 どれもこれもコード量最小化原則的にビミョーなことに…… ていうかなんで同じことをするのに複数の書き方があるのかっていうか、 Perlじゃあるまいし……
340 名前:デフォルトの名無しさん mailto:sage [2024/06/06(木) 23:54:13.70 ID:7ZzCG2hU0.net] iostreamはまあしゃーない…
341 名前:デフォルトの名無しさん mailto:sage [2024/06/07(金) 02:20:24.96 ID:GhXFHGen0.net] C++の悪評の4割くらいはiostreamのせいだからな
342 名前:デフォルトの名無しさん (ワッチョイ a944-l7CW) mailto:sage [2024/06/07(金) 04:24:11.05 ID:qf+nnTv50.net] ここでCmakeとNinjaについて聞くのダメ? どーも関係がよくわからなくて?
343 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-zlCG) mailto:sage [2024/06/07(金) 05:26:04.94 ID:zM43Xr/H0.net] >>342 そういう雑多な話題のちょうどよいスレは見当たらんし、単発で終わる質問程度なら許容されると思うが……。 質問の内容が漠然としているなら丁寧な回答は得られないと思う。 「よくわからない」という状況になるときってのは大抵の場合に関連する前提知識が足りてないので 質問が連鎖的に発生してダラダラ続いたりするから。
344 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-zlCG) mailto:sage [2024/06/07(金) 05:36:24.41 ID:zM43Xr/H0.net] >>336 第四の選択肢 std::fstream ofs("foo.txt", ofs.out | ofs.binary);
345 名前:デフォルトの名無しさん (ワッチョイ fee5-FHn0) mailto:sage [2024/06/07(金) 13:37:29.47 ID:kav19u0f0.net] copilotで補完でok
346 名前:デフォルトの名無しさん (ワッチョイ 6af0-AYul) mailto:sage [2024/06/07(金) 17:07:58.06 ID:NFmVQMC40.net] バカの解決策
347 名前:デフォルトの名無しさん mailto:sage [2024/06/07(金) 21:12:45.28 ID:70o6R+hDM.net] また時代に取り残されるじじい
348 名前:デフォルトの名無しさん (ワッチョイ 1563-WQ8n) mailto:sage [2024/06/07(金) 21:48:19.45 ID:ORLoeNdF0.net] >>344 ofsのスコープの隙間を突きなおかつ静的メンバをドット演算子で参照する等 テクニカルですばらっし
349 名前:デフォルトの名無しさん mailto:sage [2024/06/08(土) 01:03:51.86 ID:k3Jnk/Aj0.net] 静的解析で文句言われる可能性あるからやめときな 頻発するならスニペット作ればいいだけ そういう表面的なことにこだわる奴は三流
350 名前:デフォルトの名無しさん (ワッチョイ f344-7AaF) mailto:sage [2024/06/09(日) 04:26:59.39 ID:RJYm8+UN0.net] lldb v14.0.0 で正しくプロセスを実行できません apt insrall でインストールしたもので, 環境はwsl 1 です 具体的には下のサイトのIssue Encountered:と全く同じ症状です https://stackoverflow.com/questions/78275920/troubleshoot-lldb-on-ubuntu-wsl 改めて書きますと Hello World 表示だけのソースを clang でコンパイルし, lldb で読み込み run させると Process 20784 launched: '/home/Hustler/c++/move/move' (x86_64) と表示されたまま応答がなくなり 放置すると(サイトでは強制終了させてるようですが) Process 20784 exited with status = -1 (0xffffffff) lost connection となってコマンド入力待ち状態となります ちなみにプログラムはそのまま実行して正しく動作しますし gdb でも何の問題もありません これに関して何か情報をお持ちの方いますか?
351 名前:デフォルトの名無しさん (ワッチョイ f344-7AaF) mailto:sage [2024/06/09(日) 05:11:57.08 ID:RJYm8+UN0.net] 今やってみたのですが lldb-14をuninstall(remove)し lldb-15をインストールしてみましたが 状況は改善しませんでした
352 名前:はちみつ餃子 mailto:sage [2024/06/09(日) 15:07:14.43 ID:bthWHIYm0.net] WSL1 は (ある程度) Linux 互換のシステムコールを windows 内に実装することで実現していて Linux カーネルそのものではないので色々と不足がある。 (そのかわり Windows と親和性がある部分もある。) WSL1 で用意してない Linux の機能に依存したアプリケーションは動かない。 まともな互換性が必要ならWSL2 を使いなさいという話なので手間をかけて WSL1 を積極的にはサポートしないと思う。
353 名前:デフォルトの名無しさん (ワッチョイ f344-7AaF) mailto:sage [2024/06/09(日) 20:56:05.63 ID:RJYm8+UN0.net] >>352 wsl2 ではlldbは問題なく動いてるんですか? 古いCPUなのでwsl2がインスコできないもんで 上のサイトはwslのバージョンは書いてなかったようですし
354 名前:デフォルトの名無しさん (ワッチョイ 6363-vt9G) mailto:sage [2024/06/09(日) 21:14:14.41 ID:VES2dE5O0.net] WSLはlldbが使うシステムコールが足りてないって昔から言われていたかと ターゲット機を別にするとかWSL2にするとかじゃね?
355 名前:デフォルトの名無しさん (ワッチョイ f344-7AaF) mailto:sage [2024/06/09(日) 21:36:35.88 ID:RJYm8+UN0.net] >>354 >WSLはlldbが使うシステムコールが足りてないって昔から言われていたかと なるほどTHXです clang使ってなかったので全然わかりませんでした 動かないlldbもさんざんggったんだけど system call未実装にはたどり着けませんでした ようやくすっきりしました
356 名前:はちみつ餃子 mailto:sage [2024/06/09(日) 22:04:05.34 ID:bthWHIYm0.net] ざっとググってみた感じたと wsl1 では procfs が提供する情報が少ないのが lldb が動かない直接の原因みたいな数年前の情報は見つかる。 内部構造がまるで違うはずなのに表面的なインターフェースは互換にするなんてのは無理のある話なので互換性が「ある程度」にとどまるのは仕方ない。
357 名前:デフォルトの名無しさん (ワッチョイ f344-7AaF) mailto:sage [2024/06/09(日) 22:18:48.29 ID:RJYm8+UN0.net] んー clangちょっと調べたかったんで Visual Studioにclangインスコして調べますわ できるならwslでやるのが手っ取り早いんですが Q9550とQ9550sしか持ってないもんで 以来CPUの爆値上がりと最近の円の爆下がりで新しく組めてないんですわ ダイサイズ変わらないのにCPU 3万ー> 10万とか購買意欲が萎える
358 名前:デフォルトの名無しさん mailto:sage [2024/06/10(月) 18:15:47.68 ID:bkv2YMA2M.net] >>355 github のwslのissueを漁れば出て来るかと。 結論がWSL2使えだったかと
359 名前:350 mailto:sage [2024/06/10(月) 21:38:00.71 ID:gvR5xwnw0.net] 自己レスです その後 Visual Studioのインストールオプションでclangを選択し 正しく動作することは確認したのですが... 今や誰でもロハで使えるインテルコンパイラがとっくの昔にllvm化されてたんですね clangに拘りがなければ x86/x64のwin/linux/wsl は素直にopenAPI使っとくのが幸せかも. ちなみにwsl 1にlinux版をインストールしましたが コンパイラicxもデバッガgdb-opwnapiも何の問題もなく動いてます(今のところは) なので Visual Studio はインストールオプションのclang は外してもとに戻し wsl は >apt remove clang clang-15 >apt remove lldb lldb-15 しときました
360 名前:350 mailto:sage [2024/06/11(火) 06:20:17.73 ID:Ip4/j3Hv0.net] ☓ openAPI ◯ oneAPI
361 名前:デフォルトの名無しさん (ワッチョイ 3bb1-hWAc) mailto:sage [2024/06/21(金) 22:07:24.38 ID:sN/1ehEs0.net] 今だけです https://i.imgur.com/5bqwPrd.jpg
362 名前:デフォルトの名無しさん mailto:sage [2024/06/22(土) 13:52:54.53 ID:5xyD4PGd0.net] 今だけです https://i.imgur.com/NugsGdH.jpg
363 名前:デフォルトの名無しさん (ワッチョイ 43d7-pk1M) [2024/07/13(土) 19:06:26.39 ID:Dtkl2SPB0.net] 若者のBoost離れ
364 名前:デフォルトの名無しさん (ワッチョイ 0501-twcF) mailto:sage [2024/07/13(土) 19:56:34.01 ID:vwgbCsGD0.net] と言いますと?
365 名前:デフォルトの名無しさん (ワッチョイ f5f9-pk1M) [2024/07/13(土) 21:42:42.00 ID:Rh1MnFN10.net] VS17.10.xでBoostがビルドできなくなってるのに 誰も触れない
366 名前:デフォルトの名無しさん (ワッチョイ f5f9-pk1M) [2024/07/13(土) 21:47:29.39 ID:Rh1MnFN10.net] MSVC143から144に変わったせいでビルドできないらしいですよ
367 名前:デフォルトの名無しさん (ワッチョイ e91c-hIhh) [2024/07/16(火) 12:22:56.57 ID:gS8T2k/f0.net] >>342 CMakeとNinjaはC++の話題なのでOKです
368 名前:デフォルトの名無しさん (ワッチョイ 4901-V77j) mailto:sage [2024/07/27(土) 17:57:44.53 ID:KDd62vAV0.net] C++、 型の指定が、めんどい 速いぐらいしか、利点ないよな
369 名前:デフォルトの名無しさん (ワッチョイ 7b95-4q6c) mailto:sage [2024/07/27(土) 20:53:02.50 ID:eNksZtKQ0.net] 顧客目線に立てない三流の感想
370 名前:デフォルトの名無しさん (ワッチョイ 4901-7phL) mailto:sage [2024/07/27(土) 21:03:15.66 ID:zOSUCWw50.net] >>368 auto使えば?
371 名前:デフォルトの名無しさん (ワッチョイ 1379-xel+) mailto:sage [2024/07/27(土) 23:40:34.69 ID:iHlVB6Tw0.net] ランタイムに依存しない(し難い)のが最大の利点だろうに さらに大抵のアーキテクチャには用意されてるからクロスプラットフォームの観点でもなんだかんだ最強なんだよ むしろ最近はChatGPTが他の言語で書いたやつまで適当に書き直してくれるのもあって最強度がより高まってきてると感じるね
372 名前:デフォルトの名無しさん (ワッチョイ 8e95-N8l3) mailto:sage [2024/07/28(日) 00:00:39.51 ID:ePI6t8jD0.net] 全く同意できんな むしろ環境依存上等で使うのがC/C++だろ パッケージシステムも標準がないしビルド環境もばらばら どこが最強やねん 標準ライブラリで完結するようなしょぼいプログラムなら他の言語使ったほうが楽
373 名前:デフォルトの名無しさん (ワッチョイ bdf0-+IYp) [2024/07/28(日) 00:11:55.23 ID:4HqkcgMt0.net] 型の指定のサンプル GetProcAddressに変換をかけるマクロ #define ENTRY_INTERFACE(api) api = (decltype(api)) GetProcAddress(hInst,"_INTERFACE_"#api) ね?簡単でしょ?
374 名前:デフォルトの名無しさん (ワッチョイ 5d01-viEi) mailto:sage [2024/07/28(日) 12:00:20.72 ID:x9q80Pnt0.net] >>370 auto オートね (いいこと聞いた
375 名前:デフォルトの名無しさん (ワッチョイ aa3e-cE1m) mailto:sage [2024/07/28(日) 17:36:32.24 ID:9wLF96CX0.net] >>374 あとテンプレートを使ったダックタイプとかも便利。
376 名前:デフォルトの名無しさん (オッペケ Sr05-viEi) mailto:sage [2024/07/28(日) 21:14:24.07 ID:roXukc4Cr.net] >>375 ふむ 実践的な(アプリを作るとか)、c++、書籍かなんか、おすすめ、ありますか? cmake、とかの、関門もあるのだが (githubにあがってるやつを、きっちり理解したい)
377 名前:デフォルトの名無しさん (ワッチョイ 4132-nuT0) mailto:sage [2024/07/29(月) 08:53:31.23 ID:cQQT2a1I0.net] 実践に入る前に言語の入門は読んだほうが良いと思う。 基礎を積まずに実践しようとするのは無謀。
378 名前:デフォルトの名無しさん (ワッチョイ 9a05-pVLH) mailto:sage [2024/07/29(月) 15:25:34.30 ID:heyNGOtI0.net] なんでも、まずは改造から入るんだぜ こうですか、うんたぶんこう
379 名前:デフォルトの名無しさん (ワッチョイ 4132-nuT0) mailto:sage [2024/07/29(月) 19:25:02.89 ID:cQQT2a1I0.net] C++ には未規定がやたらたくさんあるんだ。 実際の挙動から仕様を想像しようとすると意味不明でグダグダやねん。
380 名前:デフォルトの名無しさん (ブーイモ MM9a-N8l3) mailto:sage [2024/07/29(月) 20:07:37.15 ID:Nl7D5VelM.net] ネットでいくらでも勉強できるだろ 書籍なんかいらん
381 名前:デフォルトの名無しさん (ワッチョイ aa3e-cE1m) mailto:sage [2024/07/29(月) 20:36:26.35 ID:9/o4+28+0.net] 結局ライブラリが重要だから、作りたいアプリで流行っているライブラリの入門をやるのがいい。 作りたいアプリそのものじゃなくても、類似アプリを作るのはやる気に繋がる。
382 名前:デフォルトの名無しさん (オッペケ Sr05-viEi) mailto:sage [2024/07/29(月) 22:02:41.02 ID:8hMQwTW/r.net] >>377 github にあがってるやつを、理解しようとして、助けになる本は、結局ない希ガス 実際、実践的なものがないので、文法理解で終わってしまうという https://github.com/TadaoYamaoka/cmajiang これ、再利用して、アプリを作りたいのだが
383 名前:デフォルトの名無しさん (ワッチョイ 4132-nuT0) mailto:sage [2024/07/29(月) 22:18:19.65 ID:cQQT2a1I0.net] >>382 言いたいことがわからん。 auto すら知らんかったということは文法もまだ十分に理解してないってことだろ? 文法が分かったら読めばいいだけなんだから何の本が必要なんだ?
384 名前:デフォルトの名無しさん (ワッチョイ 0168-qw7+) mailto:sage [2024/07/29(月) 23:36:56.61 ID:7XbSB18u0.net] >>382 立直麻雀のシミュレーターなら mjx の方がいいんじゃないかな? マイクロソフトで麻雀 AI Suphx の開発に携わってた人が作ったシミュレーターで 動作検証も天鳳の牌譜で実施したらしい https://github.com/mjx-project/mjx 他のシミュレーターだと - libriichi (Rust製 麻雀 AI Mortal に付属 天鳳ルール準拠 AGPL) https://github.com/Equim-chan/Mortal - kanachan.simulation (C++製 麻雀AI kanachan に付属 雀魂ルール準拠 MITL) https://github.com/Cryolite/kanachan/tree/v2 とかも参考になると思う 作りたいアプリの内容がわからないけど ネット麻雀を作りたいなら cmajiang の元ネタの電脳麻将 https://github.com/kobalab/Majiang https://kobalab.net/majiang/ AI 用の対戦シミュレーターなら mjai.app https://github.com/smly/mjai.app https://mjai.app/ が参考になりそう
385 名前:デフォルトの名無しさん (ワッチョイ 0168-qw7+) mailto:sage [2024/07/29(月) 23:43:38.11 ID:7XbSB18u0.net] >>382 書くのを忘れてた cmajiang の元ネタ majiang-core は作者が解説本を出してる 実際買ってみたけど、やっぱりソースコードだけ読むより分かりやすい https://www.shuwasystem.co.jp/book/9784798067889.html ブログでも解説されてるけど、お目当ての記事を探すのが大変だし本の方が見やすいと思った https://blog.kobalab.net/
386 名前:デフォルトの名無しさん (ワッチョイ bdf0-+IYp) mailto:sage [2024/07/30(火) 12:23:26.36 ID:8UDCP+we0.net] >>379 未規定というか、C++11よりも古い規格のは、古参でないと扱いが難しいからね そういう古い規格のものが仕事で入ってい来たりすると新人は頭悩ますかもしれんね 03~11まで結構間に空いてるしね
387 名前:デフォルトの名無しさん (ワッチョイ 5d01-viEi) mailto:sage [2024/07/30(火) 23:52:38.43 ID:KT8SFJ0h0.net] >>385 はい、 すべて、既読です make, pybind11 とか入ってて、 デバッグビルド、わかりませんorz
388 名前:デフォルトの名無しさん (ワッチョイ 1bef-BWtz) mailto:sage [2024/08/04(日) 06:24:46.59 ID:WlfSsbJh0.net] ラムダ式が渡された側って、キャプチャの内容をチェックしたりできないのでしょうか。 例えば以下の例で、funcA()の中でfの中のthisをチェックして挙動を変えたりとか? そういうことをしたいなら、ラムダの引数で渡したりすべきでしょうか? #include <iostream> class A { public: void funcA(const std::function<void(int)>& f, int a) { f(a); // can I check 'this' (B class) in f? }; }; class B { public: void print(int b) { A objA; objA.funcA([this](int i) { std::cout << "val = " << i << "\n"; }, b); } }; int main(void) { B objB; objB.print(2); }
389 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-NesV) mailto:sage [2024/08/04(日) 10:12:57.69 ID:w7HjtqNP0.net] >>388 キャプチャした変数はラムダ式の中で使う以外の方法ではアクセスできない。 どのような方法で解決すべきかはそれをしようとする意図によるのでなんとも言えない。
390 名前:デフォルトの名無しさん (ワッチョイ a94a-ImVy) [2024/08/04(日) 14:50:32.12 ID:ao1w9dwD0.net] それはラムダ式を使う理由とズレてるな A側で判定が必要なものならラムダ式の引数もしくはfuncAの引数で渡すべき A側は受け取るものを「intをひとつ受け取ってvoidを出力する関数」として抽象化してるんだから、それ以外のことは知れないし、知るべきではない Aは渡された関数が何であろうとintを一つ渡すだけで、その詳細 (関数がどのような値や参照をキャプチャしてるのか、渡した引数がどのように使われるのか) には触れられない ラムダ式を使うのはこのような抽象化が目的のはずだから、キャプチャした値を知りたいというのは用途から外れるかと思う
391 名前:デフォルトの名無しさん (ワッチョイ 9b72-3sGu) mailto:sage [2024/08/04(日) 18:55:04.35 ID:knGBcNlu0.net] なんか最近自分でで適切なインターフェースを定義して使うって発想がなくなってる気がする ひたすらありものを繋ぐだけで作り切るみたいな
392 名前:デフォルトの名無しさん (ワッチョイ c1f0-3TXu) mailto:sage [2024/08/04(日) 19:21:38.37 ID:oxQURbTu0.net] 仕組みを追求することをせずにどっかから完成した㌬をドッキングするだけの作業は情報収集力さえあれば組み込み系の作業員でもできるし己のチカラにはならんのよな で、いろんなもの付け合わせていった結果、とんでもない容量のものが出来上がる上におまえそれメンテとかどうするんだよって方向に走ってって…あとは想像のとおりに
393 名前:デフォルトの名無しさん (ブーイモ MM8b-3sGu) mailto:sage [2024/08/04(日) 19:54:18.08 ID:wSg2UiB1M.net] オブジェクト指向オワコン論からの風潮
394 名前:デフォルトの名無しさん (ワッチョイ 1320-cRFB) mailto:sage [2024/08/04(日) 21:00:47.00 ID:YVKn/U480.net] なんでオワコンなの?
395 名前:デフォルトの名無しさん mailto:sage [2024/08/06(火) 01:29:43.68 ID:DDRjgUjC0.net] 全然関係ないよな 取って貼っ付ける行為とオブジェクト指向は 全体の概要設計を把握してメンテ出来ていれば何の問題もない
396 名前:青木康善 [2024/08/07(水) 04:36:25.01 ID:S6qXQ6lv0.net] 素晴らしいなあみなさん。早すぎる!C plus plusは!
397 名前:デフォルトの名無しさん [2024/08/07(水) 09:54:05.95 ID:+pgWMXtY0.net] JavaはCの20倍速いを知らん人か
398 名前:デフォルトの名無しさん [2024/08/07(水) 17:07:58.21 ID:RPpAsXPKa.net] >>391-392 チェンジニアをチェンジ >>395 オブジェクト指向でもクラスライブラリを造る側とただ使う側では理解度に雲泥の差がある
399 名前:青木康善 [2024/08/08(木) 00:15:58.93 ID:Qfze0mfg0.net] マジっすか?Cの20倍?しかし、専門学校の先生に、青木!バカもん!プログラミング言語Cが一冊で事足りる、と言われても、高校数学でつまづいて大鬱病になったんで、問題が解けない。。。有隣堂本店さんで、リッチーの本置いているから、いつか買います!
400 名前:デフォルトの名無しさん mailto:sage [2024/08/08(木) 04:05:43.03 ID:G3QDAupS0.net] 今のANSI対応版は易しくなってると思うけどな。 不安ならアンサーブックとセットで買えば良いベ
401 名前:デフォルトの名無しさん mailto:sage [2024/08/08(木) 16:07:46.41 ID:fgfi2g+JM.net] VMのオーバーヘッドがあるのに20倍って? あるいは20倍時間が掛かる?
402 名前:青木康善 [2024/08/09(金) 13:02:28.92 ID:FZEpuz0a0.net] いや、プログミング言語は、駿台電子は、国語の倒置法なんです。夜間の一年で、javaからで、二年でCなんです。いや、アンサーブックは、池袋ジュンク堂本店さんには、置いてなかったような。。。。。ありがたいというか、ビックリ。。。。マジか。。。機械語を仕事でプログラミングしていた先生が、喫煙所で、青木、お前、一つのことを本当に深く考えたことがあるか?と質問してくれた恩師なんです。
403 名前:デフォルトの名無しさん [2024/08/10(土) 12:16:45.89 ID:xFKQiXk00.net] スカイネットの誕生日
404 名前:デフォルトの名無しさん [2024/08/10(土) 23:52:09.93 ID:oQf4NdPPd.net] 御巣鷹山ノボレ
405 名前:デフォルトの名無しさん [2024/08/24(土) 08:35:54.88 ID:yYuYqoCz0.net] すみません。教えて下さい。 template<class T, class U>void (T& x, const U& y) { x=y; ... } double ←complex<double> の代入がコンパイルエラーとなるconceptの書き方あるんでしょうか? complex<double> ← doubleの代入ではエラーが出てほしくないです。
406 名前:デフォルトの名無しさん [2024/08/24(土) 09:05:25.59 ID:yYuYqoCz0.net] あ、上では関数名fが抜けてましたね.concept使わずとも template<class T> void f(complex<T>& x, const T& y)とすればいいでしょうけど、 y=xのときはどうかとか、あるいは complex<double>←float の代入はokにしたいとか、 いろいろ考えているとテンプレート関数なのに関数のオーバーロードが増えてしまって面倒だなと思ったものですから。
407 名前:デフォルトの名無しさん (ワッチョイ 7f78-/FHh) [2024/08/24(土) 09:23:02.26 ID:yYuYqoCz0.net] y=xのときは忘れてください。(f(complex<T>& y, const T& x)とすればいいだけ)。どういう状況のためにconceptが必要なのか要点がまとまっていませんね。失礼しました。
408 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 09:53:34.49 ID:PPcTgFGr0.net] conceptで無理やりくくるよりか、static_assertのほうが楽そう template<class T, class U>void f(T& x, const U& y) { static_assert(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value,"絶対にゆるさない!絶対ニダ!!"); x=y; ... }
409 名前:デフォルトの名無しさん [2024/08/24(土) 11:11:32.60 ID:yYuYqoCz0.net] && は右辺値参照ではなくてandの意味なんですね。std::is_same<double,T>はdouble型とT型が一致するかどうかを調べるヘルパー変数テンプレート、::value は trueかfalseのいずれかの値をとる定数ですか。static_assertは自分でエラーメッセージを作れるのがいいですね。完全にわかっていないですが、勉強します。ヒントありがとうございました。
410 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 11:44:22.45 ID:6PXbzil00.net] 最近、初心者にいきなり右辺値参照とかテンプレート教える風潮は良くないと思うんだよなぁ・・・論理andとごっちゃになってるやんけ ともあれis_same自体は構造体で、中にあるvalueは定数値やで 変数テンプレートはis_same_vの方。利便性(::value書くのがめんどい)のために用意されてるだけ static_assertの第一引数(bool)に条件式を与えてるんだが、間違ってる static_assert(!(std::is_same<double,T>::value&&std::is_same<complex<T>,U>::value),"絶対にゆるさない!絶対ニダ!!");
411 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 12:20:38.61 ID:PPcTgFGr0.net] !抜けてたわ スマソ
412 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 12:40:45.95 ID:PPcTgFGr0.net] // こういう書き方もある if const_expr ( std::is_same<double,T>::value && std::is_same<complex<T>,U>::value ) { //許されない処理 static_assert(false,"許さんぞ!!"); }else { //正常処理 }
413 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 12:43:11.34 ID:PPcTgFGr0.net] また間違えたw × const_expr ● constexpr
414 名前:デフォルトの名無しさん [2024/08/24(土) 14:40:14.03 ID:yYuYqoCz0.net] いろいろとありがとうございます。参考になりました。 template<class T, class U> void f(T& x, U& y) { if constexpr ( !(std::is_same<T,double>::value && std::is_same<U, std::complex<T>>::value) ) static_assert(false,"ワシャ許さんぞ!!"); y=x; } template <class T, class U> void g(T& x, U& y) { static_assert( (std::is_same<T,double>::value && std::is_same<U, std::complex<T>>::v alue),"ワシャ許さんぞ!!" ); y=x; } int main() { using namespace std; double x=3.14159265358979; complex<double> z; f(x,z); g(z,x); // 順番変えたり、xをfloatにするとエラー cout<<z<<endl; しかし、コンパイル時にifがつかえるんですねえ。凄いな、constexpr
415 名前:デフォルトの名無しさん [2024/08/24(土) 15:09:12.28 ID:yYuYqoCz0.net] std::is_same<T,double>::valueの代わりにstd::same_as<T,double>でも良いみたいですね.
416 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 16:42:04.52 ID:6x2BzwZB0.net] #ifdef NDEBUG /*pass*/ #else class dbg_complex { std::complex<double> m_complex; public: // std::complex<double> のメソッドのうち使うやつ同じシグネチャのメソッドを書き並べ、m_complexに移譲 ... private: dbg_complex(doble); // 禁止 }; #define complex dbg_compled #endif ※ 個人の感想です。
417 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 16:48:40.66 ID:6x2BzwZB0.net] いちいち移譲せねばならないのはstd::complex<T>の継承が禁止されているためorz 実際デストラクタが十中八九virtualではないし、 >>416 の最後の #define complex dbg_complex みたいな穴だらけの置換手段が嫌ならもうstd::complex<double> を普段からcomplexdbl という別名にすると決めてまう すると #ifdef NDEBUG using complexdbl = std::complex<double>; #else using complexdbl = dbg_complex; #endif で済む
418 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 18:35:31.16 ID:BJpt+Mj00.net] >>412 これかなり新しめのコンパイラじゃないと動かないので注意
419 名前:デフォルトの名無しさん mailto:sage [2024/08/24(土) 19:16:42.78 ID:6PXbzil00.net] 行うべき解放処理が無い上ポリモーフィズムも不要なら、別にデストラクタがvirtualである必要は無いぞ このケースで継承すべきかどうかはまた別として
420 名前:デフォルトの名無しさん [2024/08/24(土) 23:53:59.32 ID:4DIR6G6I0.net] >>412 constexpr if が使える (= C++17以上) なら std::is_same<T, U>::value よりも std::is_same_v<T, U> を使う方がシンプルだと思う
421 名前:デフォルトの名無しさん mailto:sage [2024/08/25(日) 00:16:13.89 ID:LfSHCV3h0.net] ま、お好きなの使えいいんじゃないんすか~ こちとら例文示しているだけで極めているワケじゃないからぬ
422 名前:はちみつ餃子 [2024/08/25(日) 01:15:32.96 ID:zZ+WMAII0.net] >>414 テンプレート型引数に require 節などで制約を付けた場合に制約に合致しなければオーバーロード解決候補から除外されるが、 static_assert や if constexpr での判定は解決が終わってテンプレートが実体化されるときに判定される。 つまり、より優先順位の低い候補に当てはめたいかもしれない場合は static_assert や if constexpr での判定をすべきではない。 状況によって使い分けがある。 それと >>418 が注意しているのは、テンプレートはテンプレート引数に依存しない部分は実体化されなくても検証されるルールだから。 (Two phase name lookup について調べてみて。) つまり static_assert(false, ほにゃらら) と書いてあったらそのテンプレートが使われるかどうかに関係なく問答無用でエラーとして報告されていた。 新しい仕様では static_assert は実体化のときまで検証しないように挙動が改められたのだが、これは欠陥報告の形で問題提起されて過去の仕様に遡って修正されるので C++11 からこの仕様だったことになった。 新しいコンパイラでは C++11 を指定したときでも新しい挙動になる。
423 名前:デフォルトの名無しさん [2024/08/25(日) 01:34:45.73 ID:GxcwnqZY0.net] まあ、そんな小難しいこと言われても。C++が嫌われる理由だわ
424 名前:デフォルトの名無しさん mailto:sage [2024/08/25(日) 02:05:31.18 ID:LfSHCV3h0.net] 実体化ってどっちみちコンパイルするときにエラー発生するんだから結果かわらねぇだろバカがよう
425 名前:デフォルトの名無しさん mailto:sage [2024/08/25(日) 06:41:14.01 ID:n8ainESh0.net] static_assert(false, "")は何かしらダミーの値入れて回避してたけど修正されてたんだ、知らんかった
426 名前:デフォルトの名無しさん mailto:sage [2024/08/26(月) 00:27:52.82 ID:JWWBXqLI0.net] false効かないバカコンパイラはどうしようもないからどうにもならんか //requires を使った方法 template<class T, class U> requires(!(std::is_same_v<double,T>&&std::is_same_v<complex<T>,U>)) void f(T& x, const U& y) { x=y; ... }
427 名前:デフォルトの名無しさん (ワッチョイ 2963-G6Q9) mailto:sage [2024/08/27(火) 07:16:06.25 ID:NdPbjHCm0.net] 特定の引数型についてテンプレート展開を阻止したいんなら 特殊化してその中にstatic_assert(false, "*** ERR ***")書いても昔は駄目だったんか恐ろしい……
428 名前:デフォルトの名無しさん mailto:sage [2024/08/27(火) 07:35:09.57 ID:NdPbjHCm0.net] しかしまあ特殊化してテンプレート引数の型Tについて 態と存在しないメソッドを呼ぶように書いたらその特殊化ケースについて展開を阻止できうる(適当 クラス内でint型定数が欲しかったら古き良き enum { ONE, TWO, THREE } で十分やし 同じことをやる手段を増やせば良いってもんじゃないぞPerlじゃあるまいし……
429 名前:デフォルトの名無しさん [2024/08/27(火) 14:55:30.59 ID:oHcafaf7a.net] perlの面白仕様
430 名前:デフォルトの名無しさん mailto:sage [2024/08/27(火) 17:14:33.06 ID:K2iTXH930.net] まぁ普通にSFINAEなり=delete指定なりコンセプトなりでオーバーロード候補から外す方が利用者視点でいえば自然だな
431 名前:デフォルトの名無しさん [2024/08/27(火) 17:33:30.75 ID:K7dNHCWQ0.net] #include <iostream> #include <complex> template <class T> decltype(auto) f(T x) { decltype(abs(std::declval<T>())) w; w=abs(x); return w; } int main() { using namespace std; cout<<f(-1) << endl; cout<<f(2.f)<< endl; complex<double> z=complex<double>(1.0,1.0); cout<<f(z)<<endl; cin.get(); return 0; } いちかばちかでやったら、通りました。abs! Who are you? sizeof演算子と同じくコンパイル時に評価されるんですか? というか、地味だけど declval が凄い。
432 名前:はちみつ餃子 mailto:sage [2024/08/27(火) 18:27:19.33 ID:WfqXHPCU0.net] >>431 sizeof や decltype のオペランドは評価されないということになってる。 だからその文脈で関数を使う場合でもその関数が定義されている必要はない。 (宣言だけあればよい。) 評価されないけど実体化は起こるのでそのへんの理屈は複雑でよくわからん。
433 名前: mailto:sage [2024/08/30(金) 02:40:03.60 ID:qLymVnYK0.net] decval使ったコード始めてみたかも
434 名前:デフォルトの名無しさん mailto:sage [2024/08/30(金) 05:15:18.21 ID:ZIPlhev80.net] 相互参照わっかんねぇ
435 名前:デフォルトの名無しさん [2024/09/02(月) 12:36:59.33 ID:bqeYsc0k0.net] 相互参照は必要ない 最近はウェブプログラマのほうが賢くなった すそ野が広がると質が良くなるらしい
436 名前:デフォルトの名無しさん mailto:sage [2024/09/02(月) 13:00:06.45 ID:Rco2Fp/20.net] 必要ない理由ぐらい言ったら?
437 名前:はちみつ餃子 mailto:sage [2024/09/02(月) 14:42:22.37 ID:o+5p2SR60.net] プログラムの文法要素が相互参照になっている状況という意味? たとえば前方宣言が必要な場合とか。 それとも (実行時の) データ構造が相互参照ということ? たとえば循環構造の後始末のやり方がわからんとか。
438 名前:デフォルトの名無しさん (ワッチョイ 0701-+rOo) mailto:sage [2024/09/02(月) 19:52:42.06 ID:cn5uZ01w0.net] >>435 その「相互参照」って何?
439 名前:デフォルトの名無しさん [2024/09/05(木) 00:06:16.92 ID:/oUqYYg3a.net] 相互参照も自己参照も一緒 自己参照なんて参照してるのは自己ではない ホントの意味での自己参照は循環参照
440 名前:デフォルトの名無しさん [2024/09/05(木) 18:17:57.29 ID:xTcyjaky0.net] shared_ptrを使いたくなったら設計を見直すべき
441 名前:デフォルトの名無しさん mailto:sage [2024/09/06(金) 07:27:10.33 ID:Qb4sTpDj0.net] >>440 それは無理があるんじゃないのかね。 データ共有とかインターフェイス共有とか本質的に所有者が複数存在するオブジェクトはsharedptr使うべきかと。 設計ではモジュール間の疎結合・インターフェイスの汎用化を重視すべきで、そのためにはデータの共有方法が重要になる。
442 名前:デフォルトの名無しさん mailto:sage [2024/09/06(金) 11:54:45.03 ID:onD85wsiM.net] >>440 マルチスレッドセーフ考えたら使わざるを得ない場合は多々ある 言ってる意味がわからないならお前は経験不足
443 名前:デフォルトの名無しさん [2024/09/06(金) 22:35:55.77 ID:0hxwMUxG0.net] recurcive_mutexが欲しくなったら設計を見直したい、なら分かる気もする
444 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 11:45:08.02 ID:Zy1zUumM0.net] C++11あたりから「生ポは使うな」みたいな極論で分かった気になってる思い上がった初心者が増えたからなぁ
445 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 11:58:09.00 ID:UFsx2JaR0.net] >>444 生ポ使うよりかスマートポインタの参照を使った方がマシだったりするからなぁ。スマートポインタがスタックフレームにあるなら安全だし。 スタック変数専用仮引数とかあればもっと安全になるのになぁ。 仮引数の種類はもっとあっていいと思う。
446 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 16:26:14.57 ID:lSV8lU690.net] >>445 考え方にもよるだろうけど、確保も解放も所有もしない関数でスマポ受け取る必要あるか? 特定の用途で管理されている特定のポインタしか許容しない、という意図ならスマポの参照でもいいだろうけど、汎用性は無いよね 生ポ受け取る場合暗黙のキャストも効かないし
447 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 20:17:38.39 ID:Ci+xhqlU0.net] >>442 むしろshared_ptr<T>でスレッド間共有オブジェクトを保持するのは 生ポに対するshared_ptr<T>のメリットが無い…… 可能な限りスレッド間共有なんてことはやめてconstオブジェクトのコピーにするのが正義…… >>439 自己参照ではないが前方宣言が必須の例、 class TreeNode; class TreeNode { std::shared_ptr<TreeNode> m_pLeft; std::shared_ptr<TreeNode> m_pRight; public: TreeNode(); ... };
448 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 20:21:44.33 ID:Ci+xhqlU0.net] んまー前方宣言が必須というのは言い杉やったかもしれんorz TreeNodeみたいなクラスはノード毎にヒープを確保するなんてことはやめて専用のアロケーターを設けて 専用の領域をまとめて確保して、 木全体がいらなくなったら木をトラバースすることなく一気に解放するのが本当やが その場合m_pLeftやm_pRightにあたるのはポインタではなくて専用の領域(配列)のindexとかにすれば 前方宣言は不要、
449 名前:デフォルトの名無しさん mailto:sage [2024/09/07(土) 21:38:34.24 ID:lSV8lU690.net] >>442 使わざるを得ないは言い過ぎじゃね 同期取るのにshared_ptrのアトミック保証に依存するしか方法が無いの? 競技プログラマか何かか?
450 名前:デフォルトの名無しさん mailto:sage [2024/09/08(日) 00:33:39.65 ID:vgBqrjWA0.net] shared_ptrの内部的な参照カウンタとかはともかく 保持しているオブジェクト自体はアトミックでもなんでもないでしょ ってなんか勘違いしてる?
451 名前:デフォルトの名無しさん mailto:sage [2024/09/08(日) 01:27:17.93 ID:6Lpw1aoe0.net] 持ってるポインタの指す先のオブジェクトがアトミックになるとか言ってると思ってんの?アホかw
452 名前:デフォルトの名無しさん mailto:sage [2024/09/08(日) 01:32:50.82 ID:TMvzCbR60.net] そこでRustですよ!
453 名前:デフォルトの名無しさん [2024/09/08(日) 12:52:42.06 ID:Lw7YNDXG0.net] でたw 布教マソw
454 名前:デフォルトの名無しさん mailto:sage [2024/09/10(火) 11:29:59.05 ID:v6KS9t6sM.net] >>447 お前の理解はshared_ptrの一面だけだな ようするにunique_ptrの延長でしか見てない shared_ptrがどうしても欲しくなるのは オブジェクトのリリースタイミングが非決定的であるとき これは一般的にマルチスレッド環境 お前のTreeNodeの例はそれこそ生ポで実装しても対して苦労しないが 例えば動的可変multi producerなqueueの場合確実に安全なqueueの解放タイミングを知るにはリファレンスカウントのような制御が必要となる 当然この場合コピーすれば安全なんて寝ぼけたことにはならない
455 名前:デフォルトの名無しさん [2024/09/10(火) 13:20:49.36 ID:KGjTz1X0a.net] x 対して
456 名前:デフォルトの名無しさん mailto:sage [2024/09/10(火) 15:36:50.97 ID:+l9ylb2n0.net] それで自己参照ってのは結局何のことを指して言っていたんだい
457 名前:デフォルトの名無しさん mailto:sage [2024/09/10(火) 15:39:03.70 ID:+l9ylb2n0.net] あ、相互参照が先か >>435 >>436 の言うところの
458 名前:デフォルトの名無しさん [2024/09/11(水) 12:14:54.12 ID:n6/LwjNL0.net] (*this) ↑ 自己参照
459 名前:デフォルトの名無しさん [2024/09/11(水) 12:19:01.05 ID:n6/LwjNL0.net] 木のノードはstd::vector<>で確保する と言われて、だよねってなる人はnewもほとんど必要ない
460 名前:デフォルトの名無しさん [2024/09/11(水) 12:22:29.60 ID:n6/LwjNL0.net] 木の巡回は、巡回方向別にアダプタとしてイテレータを用意することが出来る 良くある行きがかり順のイテレータはスタックを使って作る
461 名前:デフォルトの名無しさん mailto:sage [2024/09/11(水) 15:12:04.16 ID:1n/VD1trM.net] でvectorの拡張で破綻すんだろ?
462 名前:デフォルトの名無しさん [2024/09/13(金) 16:29:50.66 ID:bblj+c3pa.net] move禁止
463 名前:デフォルトの名無しさん mailto:sage [2024/09/13(金) 19:59:43.80 ID:2C9M8qgO0.net] move禁止したらvector使えないし
464 名前:デフォルトの名無しさん mailto:sage [2024/09/17(火) 12:59:42.12 ID:TMGdiCOOa.net] それならオブジェクトを保持するためのオブジェクトと moveためだけのインデックスを分けるかな
465 名前:デフォルトの名無しさん mailto:sage [2024/09/17(火) 16:24:30.60 ID:DN+X/Cyr0.net] 何がしたい あほでしょ
466 名前:447 mailto:sage [2024/09/21(土) 20:05:42.93 ID:FUSKAHoo0.net] 何やら集中砲火を浴びている>>442 やが マルチスレッド状況でshared_ptr<T>を超有効活用できる手が一つあったわ;;; スレッド間の共有オブジェクトをポインタpで保持する際の問題点は、 そのポインタを知っている複数スレッドの間でpが指すオブジェクト*pへのアクセスを悉く排他制御せなばならない点やが 逆にpを知っているスレッドが任意の時刻につき1つだけなら、オブジェクトのアクセスに対して排他の必要が無い それでいてスレッドへのデータの受け渡しに関してコピーの手間は減らせる 例: なんちゃらWorkerスレッドオブジェクトをshared_ptr<Worker>のキューで保持しておく スレッドfooが使うときWorker1をshared_ptr<Worker>としてpopする(←これは排他が要る スレッドbarが使うときWorker2をshared_ptr<Worker>としてpopする(←これは排他が要る ... (スレッドfooやbarはWorker1、2をそれぞれ独占的に使用できる) ←重要 ... スレッドfooが使い終わったWorker1をキューにpushする(←これは排他が要る スレッドbarが使い終わったWorker2をキューにpushする(←これは排他が要る
467 名前:447 mailto:sage [2024/09/21(土) 20:13:25.63 ID:FUSKAHoo0.net] ていうか2週間ぐらい前から作っていたやつが今さっき完動すた、
468 名前:デフォルトの名無しさん mailto:sage [2024/09/21(土) 20:35:47.52 ID:FUSKAHoo0.net] std::vector<TreeNode> nodes; ならnodesを拡張したとき破綻するかもしれんが(nodeをnodesのindexで管理するならその限りではない std::vector<std::shared_ptr<TreeNode> > apNodes; ならapNodesを拡張しても破綻しないYO!(要素の実アドレスは保たれる
469 名前:デフォルトの名無しさん mailto:sage [2024/09/22(日) 08:21:05.99 ID:e5FZYjui0.net] それ何のためのshared_ptrなの?unique_ptrでいいというか横からコピーされないようにそうすべきでは
470 名前:デフォルトの名無しさん mailto:sage [2024/09/25(水) 13:57:54.93 ID:N5yN4IuU0.net] >>466 >>442 を書いたのおれだけど、なんでおれが集中砲火浴びてることになってんだよ 生ポとか意味不明なこといってる>>447 は一見してわかるクソレスだろ おまえはそれ以上のクソレスにクソコード でもお前の勝ちだ クソコードに2週間かけた情熱に免じて親切におしえてやるわ shared_ptrはpに誰かがアクセスしている可能性がある間は決してdeleteされないことを保証できるのが肝 (pの先の排他ではこれは実現できない) もちろんこれも正しく使わないと保証できない よくあるミスは知ったかぶって参照カウントを操作しないようにshared_ptrを参照渡しとかにするやつな その間に絶対deleteされない保証がないならやってはいけない
471 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 03:21:09.01 ID:5BtHXQaO0.net] あーなるほど、一貫してshared_ptrの実体を渡してればそういう保証も出来るのか 自分の場合自前で排他処理や生存保証作ってたけど確かに大きなメリットだね (オブジェクト内部の排他は別に必要だとしても)
472 名前:デフォルトの名無しさん [2024/09/26(木) 10:52:52.31 ID:R5lWYvWFa.net] そんなあなたにRust
473 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 11:26:35.22 ID:r0pzUHiv0.net] >>472 c++コードと混在できるようになってからの話だな。 既存c++を捨てなきゃならんのなら要らん。
474 名前:デフォルトの名無しさん [2024/09/26(木) 11:37:49.48 ID:R5lWYvWFa.net] もちろんRustをやるにはC++を捨てる覚悟が必要 C++コード(特にテンプレやclass)とは相性最悪
475 名前:デフォルトの名無しさん [2024/09/26(木) 11:38:22.04 ID:R5lWYvWFa.net] >c++コードと混在できるようになって Rustについて言うなら おそらくそんな未来は永久に来ない
476 名前:デフォルトの名無しさん [2024/09/26(木) 11:39:08.38 ID:R5lWYvWFa.net] 誤解の無いように言っておくと (一部機能に限れば今でも混在出来るけど) 基本的にはC++とは相いれない
477 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 18:22:32.63 ID:sl+cfKHN0.net] ならc++にRustの機能が取り込まれるのを待つ。 Rustが大人気になったら、さすがに標準委員の連中も初心者・コーダー向けの"Safe c++"をやる気になるだろ。
478 名前:はちみつ餃子 mailto:sage [2024/09/26(木) 18:52:53.17 ID:B+Au+yIB0.net] >>477 もう Rust を使えばよくない……?
479 名前:デフォルトの名無しさん mailto:sage [2024/09/26(木) 19:43:24.82 ID:sl+cfKHN0.net] >>478 >>473 だっつうの。 Kotlinみたいなのが欲しいのであって、Clojureみたいなのは要らん。
480 名前:はちみつ餃子 mailto:sage [2024/09/26(木) 20:25:47.69 ID:B+Au+yIB0.net] >>165 C++ のコードを Rust から呼び出したりするくらいのことは簡単に出来るよ。 たぶん (Java に対する) Kotlin みたいなこととして思い浮かべているようなことは出来る。 Rust がやってるような安全性の保障を自動では受けられない。 当然だが安全ではない (安全性が検証されていない) C++ のコードが Rust から呼び出すことで安全になったりはしない。 大抵の場合に Rust の都合に合わせてラッパーを書くことになる。
481 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 10:23:27.00 ID:n6BA5joS0.net] >>480 KotlinとJavaみたいにソースコードを混在できるレベルの相互運用性てあったっけ? Rustとc++では無理だと思うけど。
482 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 10:44:00.51 ID:02Aq/BhWM.net] cxxとかあるけど個人的には中途半端だから使わない 普通に共有ライブラリにして呼び出す方が素直で汎用的で良い
483 名前:デフォルトの名無しさん [2024/09/27(金) 12:33:43.81 ID:6/1p1gGO0.net] スマートポインターを使うように強制できる機能とかなら必要ないなあ
484 名前:デフォルトの名無しさん [2024/09/27(金) 16:51:52.33 ID:pgg/4VuRa.net] >>473 のような未来は永遠に来ない
485 名前:デフォルトの名無しさん [2024/09/27(金) 16:54:13.57 ID:pgg/4VuRa.net] >>482 結局Cが正解なんよ C++のスレで言うのもなんだけど
486 名前:デフォルトの名無しさん [2024/09/27(金) 16:54:31.95 ID:pgg/4VuRa.net] >>481 同意
487 名前:デフォルトの名無しさん [2024/09/27(金) 16:54:58.40 ID:pgg/4VuRa.net] >>480 嘘つくな 出鱈目言うな
488 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 17:14:28.28 ID:n6BA5joS0.net] >>483 コーダー向けので考えるなら、スマポ強制は最優先だろ。 生ポインタを(コーダーが)保存できなくするだけでも随分安全になる。あと生ポインタdelete禁止とか。
489 名前:デフォルトの名無しさん (ワッチョイ 728c-rNKn) mailto:sage [2024/09/27(金) 18:24:18.27 ID:dg7IL8lg0.net] 極限のパフォーマンスは別に要らないから安全にしたいという要件なら GC が既に解決しているし 今更生ポインタを禁止したところで C# や Java と同じ方向性のナニカにしかならんじゃろ
490 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 18:46:28.46 ID:EoeiRCVP0.net] gcがあったらメモリリークしないなんて幻想未だに信じてるとはね
491 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 18:59:34.32 ID:RwmUzOsi0.net] リークの話なの?
492 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 19:07:06.62 ID:n6BA5joS0.net] >>489 ライブラリとかフレームワークを使う側のコーダーと作る側のライブラリアンは性能要件が全然別。 コーダーに対してライブラリアンが「コーダーのコードに極限のパフォーマンスは別に要らないから安全に「させたい」」というのはあるだろ。
493 名前:デフォルトの名無しさん mailto:sage [2024/09/27(金) 23:12:04.55 ID:cfj6fT7K0.net] >>492 それならライブラリ側でメモリ周りを隠蔽するような作り方も出来ると思うけど ユーザー(コーダー)にはインスタンス使わせるけど内部では参照カウントなりスマポなり使ってるみたいな それですら問題が起きるようならユーザーがクソ
494 名前:デフォルトの名無しさん mailto:sage [2024/09/28(土) 10:42:06.28 ID:swed/tX60.net] C++はどんな安全策敷いてもユーザー側がその気になればいくらでもぶち壊せるからね ライブラリがあんまりそこ頑張っても仕方ない
495 名前:デフォルトの名無しさん (アウアウエー Saaa-rNKn) [2024/09/28(土) 12:39:39.83 ID:gf2/NL3ha.net] Rustなら壊れないみたいな言い草だな
496 名前:デフォルトの名無しさん (ワッチョイ 77ba-vp5J) [2024/09/28(土) 13:06:22.71 ID:ZP4SxDa50.net] C++で書かれたChrome V8エンジンをRustから扱えるRusty V8というライブラリがリリースされたというニュースを見た メモリ安全性を確保して呼び出しオーバーヘッドもゼロなんだって ほんとかな? ただのラッパーじゃないの? C++側でメモリアクセス違反があれば落ちそうだけど
497 名前:デフォルトの名無しさん mailto:sage [2024/09/28(土) 14:26:57.72 ID:yW35cSECM.net] その手の話はMICROSOFTの新機能ぐらいい思っておけば 腹も立たない
498 名前:はちみつ餃子 mailto:sage [2024/09/30(月) 22:26:30.09 ID:JxqgGnHQ0.net] >>496 Rust の標準ライブラリだって内部は unsafe だらけだぞ。 unsafe は Rust のメモリ安全性検査の例外とする指定で、検査はされないが安全であることはプログラマが保証しないといけない。 ただ、 unsafe な部分を慎重に押し込めて (押し込めるのが正しく出来ていれば) あとは Rust のメモリ安全性検査に頼ることが出来る。 ずっと気を付けなきゃならない C++ よりは面倒ごとを基盤に押し込めたら後は機械が検査してくれるほうがマシという程度の話。 押し込めた中に問題があればそりゃ当然駄目だよ。
499 名前:デフォルトの名無しさん mailto:sage [2024/10/01(火) 02:05:59.60 ID:J7GPtKrz0.net] V8エンジンてCVE脆弱性で毎月アップデートの口実にされる迷惑なやつだからさっさとRustで書き直せよ
500 名前:デフォルトの名無しさん [2024/10/01(火) 15:19:57.32 ID:KXGxeTHwM.net] >>498 >押し込めた中に問題があればそりゃ当然駄目だよ。 当然分かっているだろうが、unsafeの中だけでなく、 それが外側に及ぼす影響にも問題が生じないように作らなければなら ないが、それにはunsafeとRustの両方に対する深い理解が 必要となるだろうな。
501 名前:デフォルトの名無しさん mailto:sage [2024/10/01(火) 18:36:21.46 ID:al1nAqGBM.net] >>500 unsafeの中を通過する時には問題ないが、 戻り値などや、連携する他のメソッドなどが 関係した結果、どこかで分かりにくいメモリーエラー になるようなことも避ける必要が有るが、 それにはかなりRustの内部構造(?)に対する深い知識 と理解が必要となりそうだ。
502 名前:デフォルトの名無しさん (ワッチョイ 1fb1-/QnX) mailto:sage [2024/10/17(木) 11:01:19.65 ID:P7X9/HPx0.net] >>422 これ、static_assertだけ修正してもしょうがない気がするんだけどなぁ 他にも実体化しないはずの分岐でチェックされてエラーにされることあるし まぁ条件式に無理矢理テンプレート入れて回避は出来るけど
503 名前:デフォルトの名無しさん mailto:sage [2024/10/19(土) 17:30:35.94 ID:vb3IsOJN0.net] >>491 Rustのオブジェクトの所有権管理の強制はコンパイラに従う限りリークしない (病的な反例があるかどうかは知らん からリークの話ではないが、GC付き言語で解決という香具師が現れたから
504 名前:デフォルトの名無しさん mailto:sage [2024/10/19(土) 17:31:10.99 ID:vb3IsOJN0.net] >>490 な発言になったんじゃないの 知らんけど
505 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 07:19:50.64 ID:ThoL8xQh0.net] >>503 RustはRcの循環参照解決できたの? 公式ソースある?
506 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 14:54:46.51 ID:WHCxApN50.net] C++派だが、Rustをもってしても、相互参照みたいなものは、人類には早いらしい (設計段階で)無理しないこったな。。
507 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 15:57:11.21 ID:Hhc6wfX80.net] そもそも静的解析で解決できる問題か?
508 名前:はちみつ餃子 mailto:sage [2024/10/21(月) 16:03:29.88 ID:6JU3cZPt0.net] 循環参照をしたいときに出来ないのも困るしな。 なるべくやらないに越したことはないが、やるなら後始末は人が考えないと仕方ないわ。
509 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 22:48:14.20 ID:XvJERuqr0.net] 食事する哲学者の問題…… Rustだと循環参照するコードを書きにくくなっているから 循環参照によるリークとか病的な反例のうちなんじゃないの 知らんけど ノードNode同士が論理的には循環参照し得るんだけど その所有権をスーパーバイザ的な配列superArray: Node[]が持っていて、
510 名前:デフォルトの名無しさん mailto:sage [2024/10/21(月) 22:53:33.76 ID:XvJERuqr0.net] Node間の参照はsuperArrayのindexで済ませるというのもRustではすんなり通してくれな いんだっけどうだっけ…… Node& node1 = superArray[0]; Node& node2 = superArray[1]; node1.next = 1; superArray[node1.next].value = 123; // node2.valueに書く node1.nextがsuperArray[]の添え字範囲内であることを機械的に保証するためにRustはどんな魔法を使ってくれる のか
511 名前:はちみつ餃子 mailto:sage [2024/10/22(火) 11:28:00.82 ID:UXnTPhGj0.net] >>510 Rust では実行時にチェックされて範囲から外れていたら panic (C/C++ で言うところの abort みたいなもの) する。 https://doc.rust-lang.org/std/ops/trait.Index.html#tymethod.index C/C++ のように配列がポインタになるということはなく、スライス (C++ で言うところの span みたいなもの) が基本型として組み込まれているので範囲チェック出来る。 コンパイル時に範囲内であることがわかる状況なら最適化で消えることもあるみたいだけど 実行時に外部から入ってくる値に依存することもあるので実行時にチェックしないとどうしようもない。
512 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 13:44:32.71 ID:A9ortPvu0.net] enum、 文字列への変換、 大変すぎて、ビックリした
513 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 14:06:10.17 ID:/lht/Ba/0.net] 俺はenumの機能を拡張するクラスを自分で定義してるな それで文字列変換も文字列からの変換も出来る
514 名前:デフォルトの名無しさん mailto:sage [2024/10/28(月) 15:41:01.09 ID:xcgYWtNU0.net] autogenerated.txt.c みたいなの使うのも手だぞ 急がば回れ そしてCよりはうまく書ける
515 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 08:22:28.04 ID:XRXAB2XQ0.net] >>514 うーん、どんなもの?それ
516 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 13:58:12.41 ID:WYOK+g300.net] 好きなように書いて、好きなように変換して、途中でincludeする 簡単に書くもよし、ガッチガチにチェックするもよし
517 名前:デフォルトの名無しさん mailto:sage [2024/10/30(水) 23:11:10.17 ID:x0G86HEF0.net] HAGE(CAUWA1) HAGE(CAUWA2) HAGE(CAUWA3) : みたいなテキスト作っといて 手コキストを#includeする手前でHAGEの意味を変えてやるとうまいこと一元化できる
518 名前: mailto:sage [2024/10/31(木) 00:43:29.18 ID:ET2RcGMR0.net] カウワ?
519 名前:デフォルトの名無しさん mailto:sage [2024/10/31(木) 01:08:33.55 ID:gisW4Gdb0.net] magic_enum教えてやれや じじいは感度低いから知らんか
520 名前:デフォルトの名無しさん mailto:sage [2024/10/31(木) 05:43:35.79 ID:J4xtBqBy0.net] みてきた それが人気の実装か やりたいこと次第だが、オーバスペック感はある ちょうどほしかったんなら止めないけどね
521 名前:デフォルトの名無しさん mailto:sage [2024/10/31(木) 10:56:16.92 ID:++2hP8JV0.net] 横からなるほどー! __PRETTY_FUNCTION__ / __FUNCSIG__
522 名前:デフォルトの名無しさん mailto:sage [2024/10/31(木) 15:32:14.58 ID:IcW65SaY0.net] あのー、アメリカグーグルで、検索すれば、良いのがでてきた 日本は、でてこない これは、やっぱり、レベルなんだろうね
523 名前:デフォルトの名無しさん [2024/11/01(金) 19:53:27.66 ID:TgBKHsuNa.net] >>518 あさひ奈央
524 名前:デフォルトの名無しさん mailto:sage [2024/11/02(土) 09:17:27.71 ID:KpOoS8wa0.net] >>522 アメリカグーグルって言い方からして頭悪そう
525 名前:デフォルトの名無しさん (ワッチョイ 5910-fVPo) mailto:sage [2024/11/05(火) 08:04:39.53 ID://VVBUiD0.net] magic_enumは個数制限がきついんだよな・・256くらいが限度じゃなかったっけ
526 名前:青木康善 mailto:sage [2024/11/06(水) 17:05:23.05 ID:vfgxFq1Ya.net] c plus plusとjava、電子音楽作成にどっちが向いてるかな?早いのは無論c plus plusだろうけど。
527 名前:デフォルトの名無しさん mailto:sage [2024/11/06(水) 17:09:08.31 ID:jrSvpMvx0.net] 作成というが、記述したいのか、波形合成したいのか、はたまた生成(AI等)したいのか。。
528 名前:デフォルトの名無しさん mailto:sage [2024/11/06(水) 17:14:36.09 ID:P7rcAaD30.net] なんでjava?
529 名前:デフォルトの名無しさん mailto:sage [2024/11/06(水) 20:06:37.45 ID:TrFjb6KE0.net] >>526 C++ね 記号の入れ方知らないのかな
530 名前:青木康善 mailto:sage [2024/11/06(水) 20:56:51.96 ID:XG1hV+N8a.net] C soundというのはかつてありましたが。javaでやろうかな。C++は自分にはハードル高すぎます。
531 名前:はちみつ餃子 mailto:sage [2024/11/06(水) 21:37:08.81 ID:O6Mhx+Gj0.net] 相談スレなんだから相談しなさいよ。 独り言を書きたいなら X で。
532 名前:デフォルトの名無しさん mailto:sage [2024/11/06(水) 22:48:47.88 ID:tlKINjNQr.net] 5ちゃん初めてなんでしょ。浮いてるのはほっとこう、じきに慣れてくれる コンパイラがCらしいね。でもjavaからも操作できる実績があるって こういうときは、「やってみて脳汁が出そうなほう」でいいとおもう 結局モチベなんで
533 名前:はちみつ餃子 mailto:sage [2024/11/07(木) 03:05:44.48 ID:LEgJ6Wm00.net] Csound は公式に Python や Java 用のラッパーは用意してるみたいだから得意なのでやればよさそう。 ところで固有名詞は正確に表記してくれないと探しにくいやで。
534 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 17:26:41.87 ID:k0cYSKPq0.net] g++とclang++が混ざった環境なのですが、g++でコンパイルしたバイナリはstd::stringとか 名前に__cx11というプレフィックスが付き、一方clang++の方は__1というものが付くようです とりあえず、clang++の方で__cx11が付くようなバイナリを生成するにはどうしたら いいでしょうか?
535 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 17:28:48.87 ID:k0cYSKPq0.net] すみません、__cx11じゃなくて__cxx11でした
536 名前:はちみつ餃子 mailto:sage [2024/11/08(金) 17:41:34.61 ID:Me1tPYCI0.net] 名前だけ合わせても具体的な実装方法が違えばどうせクラッシュするから意図的にマングルルールを違えている。 https://gcc.gnu.org/onlinedocs/gcc/Interoperation.html#Interoperation
537 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 17:52:36.03 ID:k0cYSKPq0.net] >>536 なるほど、要は「C++コンパイラ、混ぜるな危険」ということでしょうか?
538 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 18:12:15.75 ID:6Qfff3nN0.net] 例外とか互換性があるんかいな?
539 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 18:14:37.25 ID:6Qfff3nN0.net] C++コンパイラでコンパイルするにしても ソースコードをCの範囲に留めて 関数プロトタイプを extern "C" すれば大丈夫だよ
540 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 18:18:53.42 ID:k0cYSKPq0.net] >>539 なるほど、例えばこんな感じなら大丈夫なんですかね? g++でコンパイルされたバイナリのグループAとclang++でコンパイルされたバイナリの グループBがあったとき、AからB(またはその逆)を呼ぶときは必ずCリンケージの関数 経由にする、とか....
541 名前:はちみつ餃子 mailto:sage [2024/11/08(金) 18:25:46.25 ID:Evz7xgHe0.net] >>540 OK。 C インターフェイスの範囲ではどちらも同じ ABI (Application Binary Interface) に従ってるはず。
542 名前:デフォルトの名無しさん mailto:sage [2024/11/08(金) 18:35:59.90 ID:k0cYSKPq0.net] >>541 なるほど 皆さんどうもありがとうございます
543 名前:デフォルトの名無しさん mailto:sage [2024/11/09(土) 19:08:22.86 ID:djyKk80a0.net] 昔std::vector<T>とかstd::stringを前のコンパイラでビルドしたDLLに渡したら以下略 やっぱコンパイラを混ぜるときはextern "C" な関数にプリミティブな型のみを渡すインターフェース設計にするパティーンが安牌 文字列とか渡したかったらあくまでchar[]にすべき……
544 名前:デフォルトの名無しさん mailto:sage [2024/11/10(日) 16:10:22.46 ID:ck6aMoNGM.net] >>536 この場合は別々に標準ライブラリがリンクされる、つまり2つ動くのかな?
545 名前:デフォルトの名無しさん mailto:sage [2024/11/10(日) 17:48:03.99 ID:cLh8//6O0.net] 単にリンクするだけではどっちかのライブラリのスタートアップしか呼ばれないから 呼ばれてない方のライブラリの初期化がされなくてまともに動作しない問題が残ると思う
546 名前:はちみつ餃子 mailto:sage [2024/11/10(日) 18:18:05.60 ID:R/A45v0+0.net] 仮にどうにか辻褄合わせが出来てちゃんと動いたとしても将来の開発環境・実行環境でどうなるか予想しづらいというのもある。
547 名前:デフォルトの名無しさん mailto:sage [2024/11/10(日) 18:55:50.75 ID:g8WH2rn90.net] こういう感じの実装を見かけたんだけど、ptrって解放済みの領域を指してないよね? int *ptr = NULL; std::map<char, int> m; m.insert(std::make_pair('a', 30)); { std::map<char, int>::iterator itr = m.find('a'); if (itr != m.end()) ptr = &(itr->second); // ここでitrは解放される } if (ptr) printf("*ptr = %d\n", *ptr); // 大丈夫?
548 名前:はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cd32-bar5) mailto:sage [2024/11/10(日) 19:59:53.20 ID:a6nPaG4v0.net] >>547 itr が指してる先は m の一部なのでまだ生きてる。 問題ない。
549 名前:デフォルトの名無しさん mailto:sage [2024/11/10(日) 20:31:11.60 ID:g8WH2rn90.net] >>548 あざっす!なるほど、よかった〜
550 名前:デフォルトの名無しさん mailto:sage [2024/11/11(月) 00:36:44.76 ID:6qsu0cnY0.net] >>545 ヤヴァイやん>>539 しても全然OKじゃないやん……
551 名前:デフォルトの名無しさん mailto:sage [2024/11/11(月) 00:38:49.39 ID:6qsu0cnY0.net] ただしウィンドーズのDLLの呼び出し場合は>>539 に従っていれば問題無いはず…… ランタイムの初期化エントリはDLL毎に_DllMainCRTStartup が用意されてDLL初期化時に呼ばれる
552 名前:デフォルトの名無しさん (ワッチョイ 759b-NX7e) mailto:sage [2024/11/11(月) 16:46:00.51 ID:XlNa4SSE0.net] https://www.openwork.jp/company.php?m_id=a0910000000FrzY
553 名前:青木康善 mailto:sage [2024/11/12(火) 22:22:32.82 ID:svwbS+Oga.net] 独習C++を図書館で借りました。よく、こんな、難しく、エグい言語が出来ますねみなさん。
554 名前:デフォルトの名無しさん (ワッチョイ 1d1f-hYHe) mailto:sage [2024/11/12(火) 22:26:44.98 ID:r67kfyB40.net] 他に選択肢がなかったんや😭 あと最近はobjective-cとかいう悪魔合体に比べたらなんでもマシな言語に思えてきてる
555 名前:デフォルトの名無しさん mailto:sage [2024/11/13(水) 01:53:29.63 ID:CoujH3FQ0.net] Objective-C++もよろしく
556 名前:はちみつ餃子 mailto:sage [2024/11/13(水) 02:14:12.02 ID:Gj2zjD3b0.net] >>553 汚いが、必要なものはある。 綺麗に整理されてても必要なものがないよりは良い。
557 名前:デフォルトの名無しさん mailto:sage [2024/11/13(水) 03:47:19.43 ID:rKuXlBFV0.net] そーだそーだ C++は難しいからObject Pascalやろうぜ!
558 名前:デフォルトの名無しさん [2024/11/14(木) 07:49:57.71 ID:z8CYzrjO0.net] C++女学院の人々ってまだ読める所ある? 大好きだったんだけど。
559 名前:デフォルトの名無しさん (ワッチョイ a501-3n/g) mailto:sage [2024/11/14(木) 12:23:07.88 ID:DkukOutW0.net] >>554 C++と悪魔合体してObjective-C++とかなってるけど自分は実用的に感じた 全部それで書こうとは思わんけど、C++との共存のレベルが高くて鼻血出そうになったわ OSやその他Apple系APIとのやり取りはObjC++、それ以外のソースはC++のみ、とかも簡単だし
560 名前:デフォルトの名無しさん (アウアウエー Sa13-vkNS) [2024/11/14(木) 14:52:24.21 ID:a5xmyjQfa.net] >>553 若い人がCからC++の増築増築で可笑しくなって行った歴史をなぞるのは無意味ではない >>554-555 Objective-C や Objective-C++ の方がまし やる気は無いけどObjectPASCALはDelphiだっけ
561 名前:デフォルトの名無しさん [2024/11/19(火) 11:41:41.34 ID:1x1cv+pZH.net] 演算子のオーバーロードない言語はダメだ
562 名前:デフォルトの名無しさん mailto:sage [2024/11/19(火) 11:53:31.53 ID:5+FMYvHmM.net] 演算子オーバーロードがもたらす言語仕様の複雑性を理解してたら軽々しくそういうことは言えない
563 名前:デフォルトの名無しさん [2024/12/08(日) 01:45:50.04 ID:EhZF4lXKz] 5chの管理人がRustマンセー野郎でRustの悪口言ったらBBS規制になっちまった。 それでこっちに書いときます。eigenという行列演算、線形代数ライブラリが ありますが、これ列主順なんですね。なので、[]演算子のオーバーロードでは 行列Aのi行j列の要素にアクセスするときにA[j][i]という奇妙な順番でないと いけない。それでeigenでは行列に対してA[i][j]みたいなサポートはしていない。 だから[]ではなく[][]演算子みたいな拡張がほしいと思いました。
564 名前:デフォルトの名無しさん [2024/12/08(日) 02:15:01.21 ID:EhZF4lXKz] マトリックスクラスを宣言すると matrix_<double> a[3][3]; で何の対策もせずに、a[0][1][2][3]=1; みたいなアクセスは問題なくできるんですよ。 サイズ宣言時にa[3][3](3,3);というダサい形に。でもこれはstdsize(3,3);とでもして おけば解決します。でも、列主順のときにはa[j][i]がネックに。()演算子なら列主順 だろが行主順だろが問題なくオーバーロードで解決できるんですが、A(i,j)の添字が0 から始まるのはfortran使っていた自分には違和感があります。 それでA[i,j]? C言語のA[i][j]の伝統を捨てるんですか? 感性の問題ですけど。
565 名前:デフォルトの名無しさん [2024/12/08(日) 17:15:54.70 ID:EhZF4lXKz] なるほど。C#に引っ張られたわけですね。a[i][j]の ][ を , に置き換えるプログラム を作成すれば大きな影響もなく変換できそうですね。 でも、a[i][j]は残すんですよね?残さないと、ブーイングもしくはC++23もういいわ になりそう。