1 名前:デフォルトの名無しさん mailto:sage [2020/07/13(月) 13:51:48.09 ID:WBkWHxcT.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.105【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1556142878/
343 名前:デフォルトの名無しさん [2020/10/31(土) 23:18:42.13 ID:3iDylFBH.net] offsetofで距離の値をメタ取得しメンバアクセスでなく剥いでchar*にすればいいと思うよ
344 名前:デフォルトの名無しさん [2020/11/01(日) 10:32:39.62 ID:6FKS57jf.net] >>331 テンプレート関数を使って、コードの上では一つの関数に見せかけておくようにする 前準備の箇所も同様 hsgAWF - Online C++0x Compiler & Debugging Tool - Ideone.com https://ideone.com/hsgAWF
345 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 11:12:58.96 ID:tm2facI/.net] >>301 >>294 どうあがいても無理ポ codepad.org/WgHKMHuJ codepad.org/GYWccmnL
346 名前:331 mailto:sage [2020/11/01(日) 11:33:12.85 ID:caGW9eb5.net] >>334 関数にp_aaa->strを渡して値の書き換えを考えたのですが、関数内のreallocでアドレス変わるからその値を変えてもだめだ。 って思っていました。 ご提案の通りアドレス変わったものを戻り値で返してあげればいいですね。 その考えが抜けていました。 >>335 すみません、剥いでchar*にすればいいってところがよくわかりませんでした。。 >>336 今回以外のケースでも使いみちありそうなのでテンプレートについて調べてみました。 関数やclassを定義する先頭に<typename T, typename HOGE>のように可変できる独自の型を作れる。 関数、クラス使用時に関数名のあとに<unsigned char*, int>のように型を指定する。 という理解であってますか?
347 名前:デフォルトの名無しさん mailto:337 [2020/11/01(日) 11:33:14.25 ID:tm2facI/.net] 呪縛から逃れられないでござる codepad.org/jA1YoG7E
348 名前:デフォルトの名無しさん [2020/11/01(日) 11:40:17.79 ID:6FKS57jf.net] >>338 テンプレートはだいたいそのようなもの
349 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 13:11:03.10 ID:BdB3gM+x.net] こんな感じで定義したいときどうすればいい? template <X> class X { public: X() {} ~X() {} };
350 名前:はちみつ餃子 mailto:sage [2020/11/01(日) 13:51:26.82 ID:JHJcVuLz.net] >>341 それで定義したとして、どのように使えるものが出来上がればいいの?
351 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 14:07:18.93 ID:BdB3gM+x.net] >>342 template <class X> class A { X *x; public: A(X *a) : x(a) {} ~A(){} }; int x = 1; A<int> a(&x); A<A> b(new A<int>(&x)); ←ここエラー こういうときに class A { A *x; public: A(A *a) : x(a) {} ~A(){} }; みたいな
352 名前:A とよく似た B C D ... があるとき template <class X> class X { X *x; public: X(X *a) : x(a) {} ~X(){} }; って描けると便利かなと思いました [] [ここ壊れてます]
353 名前:はちみつ餃子 mailto:sage [2020/11/01(日) 14:14:48.71 ID:JHJcVuLz.net] >>343 その説明を見てもイマイチ要求がわからんのやが……。 全く同じ内容で別の型にしたいということなら幽霊型 (phantom type) を使うという手法はあるけど。
354 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 14:15:42.25 ID:22aX9WTF.net] >>343 > A<A> b(new A<int>(&x)); ←ここエラー その記述(特に A<A> という型)でどんな結果を期待していたのかわからない。 > みたいな A とよく似た B C D ... があるとき A と B は何が違うのか(なぜ A ひとつではダメなのか)わからない。
355 名前:デフォルトの名無しさん [2020/11/01(日) 14:28:09.77 ID:BdB3gM+x.net] >>345 >その記述(特に A<A> という型)でどんな結果を期待していたのかわからない。 class A { A *x; public: A(A *a) : x(a) {} ~A(){} }; です >A と B は何が違うのか(なぜ A ひとつではダメなのか)わからない。 上の例だと最小限にしたつもりなので差が無くなってしまってますが 実際は template <class X, class Y> みたいにして Y が違う感じです
356 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 15:25:26.50 ID:QwbHyU2z.net] 幼女が身振り手振り一生懸命しつもんしてると思うと萌えてくるな
357 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 15:35:14.35 ID:CKi2+wqr.net] 母娘丼が好きです
358 名前:デフォルトの名無しさん mailto:sage [2020/11/01(日) 16:29:24.33 ID:22aX9WTF.net] >>346 ごめんさっぱり見えてこないや。「最小限にしたつもり」で情報削りすぎてるんだろうな。 質問の基本として、望む結果、そのために書いたコード、実際の(望ましくない)結果、あたりはそろえてもらわないと うまくお話しできない。
359 名前:331 mailto:sage [2020/11/01(日) 19:17:22.75 ID:tQIBnCrw.net] >>340 ありがとうございます。勉強になりました。 ついでに追加で質問があります。 最初に投稿したコード →https://ideone.com/o3N4x1 の36〜37行目で値と0x00を入れるのに2行使ってますが、これ以上簡素化はできないですよね? 36: memcpy(p_bbb->str, bbb_str_temp, 9); 37: p_bbb->str[9] = 0x00; あと54〜56行では3行に分けて1バイトづつセットしてますが、ここを一気に入れる方法はありませんか? イメージは21行目のcharを初期化するときのように {0x41, 0x41, 0x00} みたいな書き方ができないかなと思っているのですが。 54: p_aaa->str[9] = 0x41; 55: p_aaa->str[10] = 0x41; 56: p_aaa->str[11] = 0x00;
360 名前:デフォルトの名無しさん [2020/11/01(日) 21:33:20.20 ID:6FKS57jf.net] >>350 こんなんになるんだろうか lnDOFG - Online C++0x Compiler & Debugging Tool - Ideone.com https://ideone.com/lnDOFG Cプログラミング診断室/珠玉の力作/文字列処理 www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.9.3.html
361 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 16:50:10.64 ID:P+uwjz0Z.net] >>346 が言ってるのは多分、テンプレート引数によって異なる識別子のクラスを定義したいってことじゃね? それは型の次元じゃなくて識別子の次元だからプリプロセッサでやるしかないと思うが
362 名前:デフォルトの名無しさん mailto:sage [2020/11/02(月) 17:19:37.51 ID:gwxuwnSp.net] と思ったけどよく読むとなんか違うっぽいな・・すまん
363 名前:331 mailto:sage [2020/11/02(月) 21:24:08.49 ID:HalV34XN.net] >>351 charにキャストして書き込みですか。なるほどですね。 ありがとうございます。
364 名前:デフォルトの名無しさん mailto:sage [2020/11/05(木) 02:53:59.36 ID:CsR+UXSo.net] c++14のconstexpr変数について質問です constexpr変数は内部リンケージですので、グローバル定数をconstexpr変数で作ろうとすると複数の翻訳単位で実態が作成されてしまうと思います c++17ではinline変数とすることでただ一つの実態を指すようにできますが、c++14ではどのようにすればよいのでしょうか? コンパイラがよしなにしてくれますか?
365 名前:デフォルトの名無しさん mailto:sage [2020/11/05(木) 13:17:18.71 ID:gh/oj34p.net] static constexpr で後は良きに計らってもらえ。
366 名前:デフォルトの名無しさん mailto:sage [2020/11/07(土) 10:44:01.28 ID:PF2b8VJJ.net] >>350 ちょい亀だが、興味あったんで調べてみた。 自分の趣味的には可変引数テンプレートを使ってバイト列にダラダラ書き足していく 感じかな?対応関数増やせばいろんな型をバイト列に展開しやすい。 my_append(&p_aaa->str[9], &p_aaa->str[12], 0x41, 0x42, 0x00); もう一つは std::initializer_list を使ったもの。リストの1つ目は unsigned char* の 書き出し位置を指定して、あとは int 値の羅列。 参照: ttps://stackoverflow.com/questions/25721869/initializer-list-combined-with-other-parameters my_append_helper() = { &p_bbb->str[9], 0x41, 0x42, 0 }; ttps://ideone.com/OdbRew
367 名前:350 mailto:sage [2020/11/07(土) 22:29:19.80 ID:CR7v1mZc.net] >>357 サンプルコードありがとうございます。 引数を可変で受け取ることができるんですね。 これ色んなところで使えそうですが、ぱっと見た感じちょっとクセがあって難しいですね。 思考が追いつかない。。 じっくり考えて理解してみます。
368 名前:デフォルトの名無しさん [2020/11/08(日) 13:25:53.56 ID:M0llHupc.net] float a = 1.234; float b = 1.234f; double c = 1.234; double d = 1.234f; これらの違いを教えてください double に 1.234f を使って float に 1.234 を使うのが正しいんでしょうか?
369 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 14:18:47.54 ID:ahbNcVL+.net] ゥー
370 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 15:36:43.95 ID:8e1Utdpy.net] >>359 何も付けなければ整数リテラルはint 小数リテラルははdoubleとなる。 つまり float a = 1.234; doubleをfloatに変換して代入 float b = 1.234f; floatをfloatに代入 double c = 1.234; doubleをdoubleに代入 double d = 1.234f; floatをdoubleに変換して代入 でfloatの値を指定したい時だけfを付ける。
371 名前:デフォルトの名無しさん [2020/11/08(日) 15:48:25.65 ID:M0llHupc.net] ありがとうございます float a = 1.234; これで警告が出ないのは不思議ですね
372 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 16:04:26.00 ID:l+XTZ4Mk.net] コンパイラの警告レベルの設定によるんじゃないの
373 名前:はちみつ餃子 mailto:sage [2020/11/08(日) 16:07:03.84 ID:jznHieWa.net] >>362 暗黙の型変換で処理される。
374 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 16:32:11.23 ID:E458/dQk.net] 以下のコンストラクタの書き方は正しいのでしょうか? Duration(int data) : data_(data), negative_(false) { // メンバ初期化 if (data < 0) { // 条件を満たすとき上書き data_ *= -1; negative_ = true; } }
375 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 16:42:03.14 ID:1+QGrERy.net] >>365 まずどこが正しくないと思ってるのか言えよ。
376 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 17:28:50.68 ID:E458/dQk.net] Duration(int data) : data_{data < 0 ? -data : data} , negative_{data < 0} {} と書けるのを発見しました。お目汚し失礼しました。
377 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 18:41:53.30 ID:p8PLYZoN.net] 下記のようにfor文の外で構造体を参照できるようにするにはどうすればよいですか? newで生成するとmallocのように寿命が無いオブジェクトを生成できるとネットで見たのですが、そうなりませんでした。。 std::unordered_map<std::string, XXX*> unmap; for(){ xxx = new XXX ←構造体 map["key"] = xxx; ←構造体のポインタを代入 } map["key"] ←for文の外でxxxを参照できるようにしたい。
378 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 19:17:29.56 ID:p8PLYZoN.net] 変数名を間違えてるところがあったので訂正します。 std::unordered_map<std::string, XXX*> unmap; for(){ xxx = new XXX ←構造体 unmap[key] = xxx; ←構造体のポインタを代入 } unmap[key] ←for文の外でxxxを参照できるようにしたい。
379 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 19:27:41.20 ID:1+QGrERy.net] >>368-369 書かれたコードを見る限り参照はできそうなので、何を見て参照できないと言っているのかがわからない。
380 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 19:43:01.36 ID:p8PLYZoN.net] >>370 そうなんですね。 もうちょっと複雑な条件があるのかな。
381 名前:。 ちなみに変数unmapはclassのpublicで定義していますがそれは関係ないですかね。 [] [ここ壊れてます]
382 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 19:45:23.99 ID:p8PLYZoN.net] あと、newで構造体を生成したときにdelete関数を使わずに勝手に消えてしまうケースなどはないでしょうか?
383 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 19:53:46.34 ID:JilxLgos.net] >>369 https://ideone.com/12gcqw 参照できた
384 名前: mailto:sage [2020/11/08(日) 19:54:55.43 ID:H3a4zXqH.net] コンパイルできるコードを https://ideone.com に貼ってください
385 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 20:39:41.26 ID:DU8jO1r3.net] そもそも何かの勘違いか間違いでfor文のループに入ってないとエスパーしてみる
386 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 21:09:27.08 ID:p8PLYZoN.net] >>373 ありがとうございます。参照できてますね。 となると別の問題のようです。 for文内でprintf()すると出力されるのでループ内には入ってるようなのですが。。 どこかで変なことをやらかしてるんだと思います。 すみません、ちょっと考え方を変えようと思います。 >>373 の下記で変数mを定義していますが、このmから m.***() のようにしてXXXを生成できないでしょうか? これであればmが生きている限りXXXは残ると思うので。 std::unordered_map<std::string, XXX*> m;
387 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 21:13:14.38 ID:p8PLYZoN.net] イメージは下記のようなものです。 これで作成したXXXはfor文を抜けても生きているのでこの方法なら解決するかなと思いました。 std::vector<XXX> xxx_vector; xxx.vector.emplace_back(); XXX* xxx = xxx.back();
388 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 21:19:07.78 ID:ejbE12Pn.net] 変なことしなくてもnewしたものはdeleteするまで生きてる そこじゃないとこがbugってるだけ 普通にbugを潰せ
389 名前:はちみつ餃子 mailto:sage [2020/11/08(日) 21:51:50.35 ID:jznHieWa.net] 理解しないままで偶然に動くまで弄るってのは悪い手癖になるぞ。
390 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 22:35:52.18 ID:ygVNfudb.net] newの戻り値はブロック内だけ有効って思ってるとか? 何が変なのかさっぱり
391 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 23:06:02.66 ID:JilxLgos.net] >>377 forのあとで XXX* xxx = m["0"]; をすればmからXXXを取り出せるけど そういうことでもなく?
392 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 23:19:38.79 ID:p8PLYZoN.net] すみません、色々調べていたら思いっきり勘違いしていました。 結論としてはnewできちんと保持されていて、 >>373 のコードで言うと、XXX.cの値を設定し忘れていて、forを抜けたあとでXXX.cを見て何もセットされてない!ってなってました。 この修正をすることになったきっかけが、最初 xxx = new XXX; ではなく struct XXX xxx; でやったり、forを抜ける前とあとで printf(%p\n"); でポインタが変わったり、とかを調査していてそれらとごっちゃになり、newでやっても消えてしまう。 と思い込んでいました。 newに修正したときもちゃんとポインタで調べればよかったのですが、xxx.cの値で確認していたため起きた勘違いでした。 お騒がせしてすみませんでした。
393 名前:デフォルトの名無しさん mailto:sage [2020/11/08(日) 23:53:41.46 ID:1+QGrERy.net] >>382 次からは問題をちゃんと再現できるコードを作って相談しなよ。 そうすればその手の勘違いには自分で気付ける。
394 名前:デフォルトの名無しさん [2020/11/09(月) 12:58:48.22 ID:TXQrani0.net] >>382 プログラム書く前に最低でも入門書読むなり入門サイト見るなりして 基本的知識は持ってないとでたらめコード量産するだけ お前向いてない 過去にも同じような指摘どっかでされてないか?
395 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 17:08:26.08 ID:8vkBTKks.net] みんな似たようなことを通ってきてると思うけどね忘れてるだけで
396 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 17:30:55.44 ID:DrhUvdcE.net] 実務で書いてるコードで問題あって そこから問題が再現するエッセンスとなる最小部分を抽出してテストしてみるかー 抽出の過程でポカ発見は割とある (最適化無しだと期待通り動いて最適化maxにするとセグ
397 名前:フォしやがるタイプの追跡が辛い) [] [ここ壊れてます]
398 名前:デフォルトの名無しさん [2020/11/09(月) 17:42:31.26 ID:TXQrani0.net] >>385 失敗や勘違いは誰にでもあるし そのことは否定していない
399 名前:デフォルトの名無しさん mailto:sage [2020/11/09(月) 17:44:27.05 ID:rzgY+aYD.net] 最初の最初はセーブデータとかもexeファイルの後ろの方に付け足す感じなのかと思ってた
400 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 02:30:44.84 ID:0GoplVzE.net] 向いてないのは>>384 だと思う
401 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 11:40:07.24 ID:08CevRpc.net] atan2(y, x) を多項式近似で高速化しようとしたけど 場合分けが多くて結局遠回りしてるような気がする 本当に高速化出来たんだろうか
402 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 12:00:36.98 ID:yqt88s80.net] 推測するな、計測せよ
403 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 12:27:53.72 ID:OiV4Kgv1.net] 標準ライブラリもテイラー展開で実装されているだろうから、相当小さい次数で打ち切らないと太刀打ちできないと思われ。 入力される値が有限個なら予め計算しておくのも手。 いずれにしても先に計測だね
404 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 13:47:10.62 ID:emhcDKaA.net] 必要とする精度によるけど予め飛び飛びに計算しといて間は線形補間とかした方がいいかも
405 名前:デフォルトの名無しさん [2020/11/10(火) 13:47:50.52 ID:3xGJBleZ.net] ttps://github.com/gcc-mirror/gcc/blob/master/libquadmath/math/atan2q.c 2qが何かは知らんがおそらく倍クオリティーのatan2 詳細はさらに不明 有り難すぎて目がつぶれる
406 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 15:50:28.36 ID:zbbW2u8o.net] quickならいいのに
407 名前:デフォルトの名無しさん mailto:sage [2020/11/10(火) 17:03:04.32 ID:WZfCMWiE.net] どうしても高速化が必要なら、あらかじめ値域を限定して情報量減らすなりしかないよな。 線形補間で必要精度が達成できる最小限のテーブル実装…て数学か。
408 名前:デフォルトの名無しさん [2020/11/10(火) 21:54:38.23 ID:HXXQLae8.net] 後で高額請求されそう
409 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 01:13:37.04 ID:410+hQkP.net] 普通にquadのqやね
410 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 09:57:31.25 ID:tAzuyT8U.net] floatもdoubleも使わずに atan2iみたいなの造れば速いかな
411 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 10:34:02.34 ID:w2fotzxY.net] 作って計測せよ
412 名前:デフォルトの名無しさん mailto:sage [2020/11/11(水) 10:49:05.19 ID:RBRHVwv/.net] qiitaで聴かれてもいないのに発表ですね判ります
413 名前:デフォルトの名無しさん mailto:sage [2020/11/13(金) 07:12:15.37 ID:0Q6l6RCm.net] このソースとか目がつぶれそうなんだがw https://github.com/lattera/glibc/blob/master/sysdeps/ieee754/dbl-64/e_atan2.c
414 名前:デフォルトの名無しさん [2020/12/03(木) 01:52:23.80 ID:3onLW5ry.net] https://linuxjm.osdn.jp/html/LDP_man-pages/man3/iconv.3.html iconv()関数は…回る仕様なの?つまり…十分なバッファーを取っていても…回っちゃうか?って事…。 回って徐々に変換していくのか…1回で変換するのか…いまいち仕様が…把握できない…。
415 名前:デフォルトの名無しさん [2020/12/03(木) 02:49:09.70 ID:3onLW5ry.net] readで回すケースがあるのか?…僕は…C++なので…std::ifstreamのgetlineで一行づつやるので… う”ーん…1回でいいんだけど…これ…どうなんでしょうねぇ…。
416 名前:デフォルトの名無しさん mailto:sage [2020/12/03(木) 23:10:04.95 ID:re3CBOUT.net] 改行扱いたくないんだろ 関数レベルで
417 名前:デフォルトの名無しさん [2020/12/03(木) 23:48:30.98 ID:3onLW5ry.net] 結局…1行分のバッファをINとOUT両方取って…回しました…SJIS→UTF-8だとOUTのバッファが足りなくなるので… 回した
418 名前:ら…いい感じにできた…。余分にバッファ取らなくてもいい…これがいいね…。 [] [ここ壊れてます]
419 名前:デフォルトの名無しさん [2020/12/04(金) 23:59:23.75 ID:4kKR6ux4.net] 文字列終端の'/0'…ヌル文字…改行コードの\rや\nや\r\nって…文字コードによって…バイト数って変わってくるの? 変わるんだったら…非常に面倒なんだけど…。特に…'/0'は…長さを測れない…。誰か…。
420 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 00:16:37.69 ID:7NPUSOnt.net] もうちょっと普通にしゃべれないのか?
421 名前:デフォルトの名無しさん [2020/12/05(土) 00:26:38.45 ID:WkfwE68o.net] '\0'用に配列のBUFFERは多めに取るか…\rや\nや\r\nは…findで切ろう…。面倒だ…。
422 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 01:00:34.45 ID:wvE+eMYt.net] よしなにやってくれるライブラリあるやろ(適当)
423 名前:デフォルトの名無しさん [2020/12/05(土) 01:18:55.72 ID:WkfwE68o.net] 改行コードは簡単だけど…char配列の最後の'\0'意外に理解に苦しむ…。 2バイトになるケースがあるのかと…。
424 名前:デフォルトの名無しさん [2020/12/05(土) 01:52:56.87 ID:WkfwE68o.net] proger.blog10.fc2.com/blog-entry-67.html ↑だそうだ…UTF-32まで想定して…'\0\0\0\0'にでもしておこうかなぁ…。かなり…馬鹿げてるけど…。
425 名前:デフォルトの名無しさん [2020/12/05(土) 02:01:53.70 ID:WkfwE68o.net] かなりショックだね…これじゃ…辛い…UTF-16のLinuxの場合に問題が出てくるのか…。 UTF-8端末であれば…'\0'で問題ないだろうね…。UTF-16のLinuxってある?
426 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 02:02:11.31 ID:JCVQKVIe.net] 文字列使え
427 名前:デフォルトの名無しさん [2020/12/05(土) 02:08:20.29 ID:WkfwE68o.net] この話の流れだと…UTF-16のLinuxはぶっ壊れるよね…。
428 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 02:16:14.30 ID:Opj7igsw.net] 僕は…C++なので…文字列は使いたくないだろうね…。
429 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 02:35:12.49 ID:I2yh8xfr.net] 文字処理なんか相当面倒&複雑な割に得られるメリットが少ないので手を出すこと自体が間違い 外部ライブラリに頼るべき典型例
430 名前:デフォルトの名無しさん [2020/12/05(土) 05:47:06.50 ID:WkfwE68o.net] 悲惨だ…文字「A」…UTF-16で文字コード「0x0041」を…iconvすると…EINVAL…これもナル文字の影響なのか…。 ちょっと…今日は…ショックを隠しきれない…C++に挑戦してるが…引退が頭をかすめる…。 とりあえず…海外のStackOverFlowで聞いてみようか…。
431 名前:デフォルトの名無しさん [2020/12/05(土) 06:21:37.08 ID:WkfwE68o.net] ライブラリのバージョンが違うのかもしれないiconvctlで制御できそう…。 今使ってるのは…iconvctlがない…。明日は…そのあたりの環境構築から…。
432 名前:デフォルトの名無しさん [2020/12/05(土) 07:23:57.84 ID:f0cq7ZxN.net] そこら辺はRubyのほうが使いやすいだろうな。
433 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 11:41:58.40 ID:7yX6qRkD.net] char使えるのはマルチバイト文字だけだぞ UTF-16や32使うならwchar_tかchat16_tとかchar32_t使え
434 名前:デフォルトの名無しさん [2020/12/05(土) 11:47:00.16 ID:f0cq7ZxN.net] WHATWG、Encoding仕様は、注意深く実装すればプッシュ型に出来るぞ。 プッシュ型の設計は、柔軟な利用法を可能とする。 弱点は、キャッシュに乗りにくく関数呼び出しが増え、実行効率が落ちること。 とはいえ、そろそろプッシュ型の時代が来ても良いのではないか?と思う。 なぜなら、Enter押した瞬間に実行が終わるから。
435 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 11:47:58.11 ID:pZ+vMW1v.net] 独り言やめてください ・このコードをコンパイル実行し(ようとし)ました ・結果こうなることを期待していました ・実際にはこうなりました こんな感じでお願いします
436 名前:デフォルトの名無しさん [2020/12/05(土) 11:56:37.74 ID:f0cq7ZxN.net] Enter押した瞬間に実行が終わるとはどういうことかわかるか? ときどき、あれ?いま押す
437 名前:前に結果が表示されたよな??と思うときがあるって事ですよ。 そのくらい速いって事ですよ。 最近のパソコンは。 [] [ここ壊れてます]
438 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 14:00:25.14 ID:3OUqO/Qz.net] 近頃のRuby on Rails の未経験者なんて、10年やってるプログラマーよりも、レベルが高いぞ。 ポートフォリオに学校で作った、Twitter・メルカリクローンとか AWS, Linux, Docker, Rails, CircleCI, Terraform, Chef, Itamae とか
439 名前:デフォルトの名無しさん mailto:sage [2020/12/05(土) 14:45:40.77 ID:pZ+vMW1v.net] 何の話ですか?
440 名前:デフォルトの名無しさん mailto:sage [2020/12/06(日) 11:49:41.53 ID:XVsVhGnz.net] C++の入門書を一通り終わらせました。 次にCUDAでのGPU処理を勉強しようと思います。 試しに行列演算するclassを作ったのですが classのoperatorをCUDAで処理って出来ないのですか?
441 名前:デフォルトの名無しさん mailto:sage [2020/12/06(日) 13:45:07.78 ID:htfQpy13.net] できないことないでしょ。 でも必要になるまで結果を取得しないfutureみたいなオブジェクトを返却するほうが良さげな気がする
442 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 00:35:13.10 ID:cOibJfw/.net] C++何も分からないので教えてください。 コンパイルすら1度もしたことがないレベルの初心者です。 他言語の経験は多少あります。 https://github.com/EpicGames/UnrealEngine/blob/2bf1a5b83a7076a0fd275887b373f8ec9e99d431/Engine/Plugins/Runtime/AR/AppleAR/AppleARKitFaceSupport/Source/AppleARKitFaceSupport/Private/AppleARKitLiveLinkSource.cpp 上記のURLのFAppleARKitLiveLinkRemotePublisher::PublishBlendShapesという関数(?)で 以下のようなコードがあるのですが、これは変数の中に変数を加算(?)しているような処理に見えるのですが正しいでしょうか? SendBuffer.Reset(); SendBuffer << BLEND_SHAPE_PACKET_VER; SendBuffer << DeviceId; SendBuffer << SubjectName; SendBuffer << FrameTime; この加算のような処理が、C言語系のポインタ等を扱うレベルの言語を使ったことがないため感覚的によく分かりません。 文字列でも配列でもないような、型の違う変数を、足し合わせていくというような概念がよく分からないのですが この加算結果はバイナリのようなデータになるのでしょうか?
443 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 01:19:36.99 ID:SQmix3uJ.net] 演算子のオーバーロードで検索
444 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 06:51:59.24 ID:P0Jam5CX.net] >>429 もともとビットシフトの演算子だったが、標準ライブラリなんかで、 std::cout << ”こんにちわ、仕事" << std::endl; みたいな使い方がされて、それに倣って、データを流し込むという 意味合いでこの演算子がよく使われる。 送信バッファーの末尾にどんどんデータを追記してるんだろうが、 これはライブラリ製作者が決めたことだ。 こういった元の演算子から大きく意味を変える演算子の再定義は 悪しとする批判的な意見もある。他人が読むことガン無視で 俺様仕様に調教していくのも趣味的で否定はせんけど。
445 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 10:28:36.80 ID:cOibJfw/.net] >>430 >>431 ありがとうございます。 このような演算子でオーバーロードされたデータをUDP経由で受け取って各データを取り出す場合、どのようにして取り出すのでしょうか? 左から何バイトずつ取り出して変数に格納するみたいなことをやる感じになるのでしょうか?
446 名前:はちみつ餃子 mailto:sage [2020/12/12(土) 10:46:31.85 ID:UUApGKPR.net] >>432 演算子のオーバーロードとそのクラス内でどのようにデータが保持されているかは直
447 名前:接の関係はない。 クラスのデザインによる。 よう知らんけど >>429 の URL を踏んでも 404 なんやが。 [] [ここ壊れてます]
448 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 11:55:20.31 ID:cOibJfw/.net] >>433 すみません、UnrealEngineのコードは、GitHubのアカウントとUnrealEngineのアカウントと紐づけないと404になるようです。 紐づけ自体は無料です。 該当箇所のコードは以下のようになっています。ちょっと全体をキャプチャするのは難しいですが... https://dotup.org/uploda/dotup.org2331244.jpg
449 名前:はちみつ餃子 mailto:sage [2020/12/12(土) 12:21:47.83 ID:UUApGKPR.net] >>434 その SendBuffer とやらがどう定義されているかによるので 使われている箇所だけを見てもわからんという話をしてる。 この場合はバッファと名前が付いてるから蓄積はされるんだろうけど、 たとえばネットを抽象化したクラスだったら すぐさま送信してしまって手元にはデータは残ってないみたいなことだってあるかもしれない。
450 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 12:52:05.75 ID:cOibJfw/.net] SendBufferを含む行は以下のようになっています。 これが定義になっているのかは分かりません… const uint8 BLEND_SHAPE_PACKET_VER = 6; // FrameTime BlendShapeCount Blendshapes SubjectName DeviceID const uint32 MAX_BLEND_SHAPE_PACKET_SIZE = sizeof(BLEND_SHAPE_PACKET_VER) + sizeof(FQualifiedFrameTime) + sizeof(uint8) + (sizeof(float) * (uint64)EARFaceBlendShape::MAX) + (sizeof(TCHAR) * 256) + (sizeof(TCHAR) * 256); const uint32 MIN_BLEND_SHAPE_PACKET_SIZE = sizeof(BLEND_SHAPE_PACKET_VER) + sizeof(FQualifiedFrameTime) + sizeof(uint8) + (sizeof(float) * (uint64)EARFaceBlendShape::MAX) + sizeof(TCHAR) + sizeof(TCHAR); FAppleARKitLiveLinkRemotePublisher::FAppleARKitLiveLinkRemotePublisher(const FString& InRemoteIp) : RemoteIp(InRemoteIp), SendSocket(nullptr), SendBuffer(MAX_BLEND_SHAPE_PACKET_SIZE) { } FAppleARKitLiveLinkRemotePublisher::FAppleARKitLiveLinkRemotePublisher() : SendSocket(nullptr), SendBuffer(MAX_BLEND_SHAPE_PACKET_SIZE) { }
451 名前:はちみつ餃子 mailto:sage [2020/12/12(土) 13:27:24.85 ID:UUApGKPR.net] >>436 それは FAppleARKitLiveLinkRemotePublisher のコンストラクタの定義。 FAppleARKitLiveLinkRemotePublisher 型のコンストラクタは データメンバの SendBuffer を MAX_BLEND_SHAPE_PACKET_SIZE で初期化するという意味。 ようするに SendBuffer が何者かはわからん。 > これが定義になっているのかは分かりません さすがにそれはあまりにも基礎知識すぎてそこから解説する気にはならないな。 どうして入門書を読むことすら一切せずにいきなり質問に突入するのかわからん。
452 名前:デフォルトの名無しさん mailto:sage [2020/12/12(土) 19:18:17.66 ID:cOibJfw/.net] >>437 そうですね… 定義になっていないだろうなとは思ったんですが、これ以外にSendBuffer変数がどこにも見当たらなかったので もしかしてこれで定義になってるのか…?という疑問の余地があったからそう書いてしまいました Unrealのコード全体から調べてみると、TArray<uint8> SendBuffer;というのがあったりするので、もしかしてこれかなと思ったりするのですが、違う可能性は高そうです…。 そもそもUnrealの質問をC++のスレで聞くのが間違っていたかもしれないですが、Unrealのスレでもあまりプログラミングの話題は出ないので… 勉強して出直してきます… ありがとうございました!
453 名前:デフォルトの名無しさん mailto:sage [2020/12/13(日) 10:04:55.76 ID:FpioPUML.net] >>429 多分SendBufferに突っ込まれてるデータを横取りしたいんだろうけど、 SendBufferに<<で突っ込まれてるデータを一つ一つ自分が用意した配列とかに保存すりゃ出来ると思うが UEが受信したデータを取り出して使いたいのなら、それはSendじゃないとおも
454 名前:デフォルトの名無しさん mailto:sage [2020/12/23(水) 19:05:44.31 ID:LkSVqc8p.net] 2D-arrayを初期化する際、 arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; とすべき所を、ついPythonの癖で間違えて arr[][3] = {(1, 2, 3), (4, 5, 6), (7, 8, 9)}; と書いても、g++でコンパイルは通ってしまいます。当然、値はメチャクチャです。 C/C++ で、配列初期化の中に()を書くと、コンパイラーは何だと思って解釈してるのでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2020/12/23(水) 19:49:35.40 ID:LqKFMslD.net] https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9E%E6%BC%94%E7
456 名前:%AE%97%E5%AD%90 [] [ここ壊れてます]
457 名前:デフォルトの名無しさん mailto:sage [2020/12/23(水) 20:52:00.77 ID:LkSVqc8p.net] >>441 どうも有難うございました。
458 名前:デフォルトの名無しさん mailto:sage [2021/01/04(月) 09:14:20.49 ID:QYpZPDPd.net] >>390 cスレで言うのもなんだけど、ループで総和計算にcは全く向いてないよ pc上のgccでさえ、ccとfortranで10-100倍の差がある(-O1で比較) cからの呼び出しオーバーヘッドも一回なんで気にする必要はない 再帰でたらい回しするようなコードは値渡しのcに多少分がある
459 名前:デフォルトの名無しさん mailto:sage [2021/01/17(日) 18:29:02.52 ID:wAwMcmVw.net] C++にも,pythonのsympyやnumpyのようなライブラリってあるのでしょうか?基本,自作しなければならないのでしょうか
460 名前:デフォルトの名無しさん [2021/01/17(日) 19:47:55.61 ID:bWGlwscd.net] numpy/numpy/core/src/multiarray at master · numpy/numpy · GitHub https://github.com/numpy/numpy/tree/master/numpy/core/src/multiarray これをCに移植すりゃいいんでねえの
461 名前:デフォルトの名無しさん [2021/01/17(日) 20:18:40.26 ID:vSdpivaf.net] >>444 eigen3とかではダメかな
462 名前:デフォルトの名無しさん mailto:sage [2021/01/17(日) 20:33:13.40 ID:wAwMcmVw.net] >>446 おお!参考になります! 当方,ずっとpythonを使ってたんですが,ちょっと処理が重くなりそうなツールを作ってみたくなり,c++に興味持ち始めました 文法理解以外に,ちょっとした数式計算やグラフ化に手こずる予感がしていたのですが,eigen3使えばなんとかなりそうな気がしてきた次第です
463 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 09:48:11.37 ID:iMz5nc0d.net] struct A{const int a; A(const int a):a(a){} }; struct B{ A as[4]; B(const int a):####{}}; 上記####の部分は文法的にどのように書くべきでしょうか? as({a,a,a,a}) みたいに書きたいのですがGNU拡張がどうの言われました
464 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 09:52:20.63 ID:iMz5nc0d.net] as{a,a,a,a} で通りました(C++11) お騒がせしました
465 名前:デフォルトの名無しさん [2021/01/18(月) 16:21:02.12 ID:0ToZeY7a.net] >>444 PythonNN.dll 経由すれば C++ からも numpy sympy 使い放題
466 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 16:59:17.15 ID:9EUWE6k9.net] class Hoge; があるとして Hoge *funcA() { return new Hoge; } Hoge funcB() { Hoge hoge; return hoge; } Hoge &funcC() { Hoge hoge; return hoge; } Hoge funcD() { Hoge *hoge = new Hoge; return *hoge; } の違いって何ですか?
467 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 17:10:54.88 ID:O88gzKMG.net] 戻り値のインスタンスがなんなのか考えれば判るんじゃね
468 名前:デフォルトの名無しさん [2021/01/18(月) 21:16:59.14 ID:DX7cypHC.net] ちょっと疑問に思ったんだけど、PythonはC/C++の10倍速くないのか?
469 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 21:21:18.08 ID:WCGHfsAo.net] 処理系やライブラリがC系で作られてるのだからそれはない まあバリバリ最適化、場合によってはfortranとかも使ってたりもするから下手な組み方より速かったりするかも知れないが
470 名前:デフォルトの名無しさん [2021/01/18(月) 21:37:02.89 ID:DX7cypHC.net] たいていの言語はC/C++比何倍速いと言うのを売り文句にしてるけどな。
471 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 22:08:09.63 ID:jmv5waIw.net] >>455 具体的に挙げてみな
472 名前:デフォルトの名無しさん [2021/01/18(月) 23:35:24.09 ID:DX7cypHC.net] Javaは20倍速いという有名なベンチマークがあったな。
473 名前:デフォルトの名無しさん mailto:sage [2021/01/18(月) 23:36:54.32 ID:I5iO9HnU.net] >>451 funcA: 呼び出し元で delete しないとメモリリーク funcB: あまり問題ない funcC: 戻り値にアクセスすると未定義動作 funcD: 呼び出すたびにメモリリーク new の負荷や Hoge のコピーの負荷が気になったり気にならなかったりするかもしれない。
474 名前:デフォルトの名無しさん [2021/01/18(月) 23:47:52.23 ID:DX7cypHC.net] 倍速い プログラミング で検索して見たら、一等賞はRubyだった。 日本人として誇らしい。
475 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 11:42:40.51 ID:5vi2qmX/.net] >>459 お前朝鮮人やろ
476 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 12:12:48.98 ID:zeQTcQ2d.net] プログラムが速いのとプログラミングが早いのは別やろ
477 名前:デフォルトの名無しさん [2021/01/19(火) 12:20:14.02 ID:aQNqCNMI.net] >>458 funcBってコピーコンストラクタが呼ばれる? 効率悪くない?
478 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 13:00:12.23 ID:Ts6buLnF.net] funcCのやったら駄目コード funcDの確実に漏れるコード と比較すると些細に見える
479 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 13:10:52.29 ID:WOVrJxAW.net] >462 保証はないけど、コンパイラが頑張ってくれる場合があるんじゃなかったっけね?
480 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 13:23:41.08 ID:NMZAA88j.net] >>451 >>464 Hogeのデストラクタでリソース解放するようなパターンで 2回解放されると困る場合があるな もちろんブロックしてあったとしても解放一回でも問題ある訳だが
481 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 13:53:53.51 ID:/3F2YDse.net] 未定義動作はどういう処理されるかわからないので所詮メモリリークするだけとわかっているfuncDのほうが些細に見える 大抵の環境でこの手の未定義でメモリリークよりひどい状態にならないので、そういう環境であるならfuncCのほうが些細であると言える
482 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 14:11:35.68 ID:Ie5v0U2S.net] >>466 debug中は動作するけどrelease版にすると落ちるとか
483 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 17:24:37.17 ID:sWXnNJkW.net] >>465 the rule of five
484 名前:デフォルトの名無しさん [2021/01/19(火) 17:27:42.28 ID:HFbnFcCb.net] 馬鹿がCのCGIモジュールで地方自治体のサービスを書いたせいでメモリリークしまくりの 複雑怪奇なコードが多量にある。対処が高価でメモリー潤沢なマシン、アホアホ大手のN
485 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 17:39:33.97 ID:KGVX5wki.net] 歴史的経緯で仕方がなかったんじゃないの? 全部作り直しますからお金くださいなんて提案はなかなか通らないからね
486 名前:デフォルトの名無しさん [2021/01/19(火) 19:17:03.09 ID:AfTAIlvJ.net] CGIの場合、確保したメモリーを解放しないのは、十分妥当な戦略なので、メモリーリークではないかもしれない。 高価なマシンは、アクセス数の対価では?
487 名前:はちみつ餃子 mailto:sage [2021/01/19(火) 20:50:10.62 ID:Zp03eKCw.net] さっと実行してそのまま終わるコマンドラインツールなんかだと メモリの free はしなくて良いという論はあるね。 つっても、プログラムは改修されることもあるし、 一部を部品として切り出して転用したいこともある。 駄目だったらまた最初から作り直せばいいじゃんと言えるような 規模でもない限りはやっぱりそれなりに作法に 則っておかないとグダグダになると思うんだよな。
488 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 21:01:57.59 ID:JdenwtD2.net] exit on free ・・・・・・・
489 名前:デフォルトの名無しさん [2021/01/19(火) 21:55:42.74 ID:AfTAIlvJ.net] 記憶域確保のコストは議論されるのに、なぜか解放のコストは議論されない。
490 名前:はちみつ餃子 mailto:sage [2021/01/19(火) 22:18:11.76 ID:Zp03eKCw.net] >>474 何を言ってるんだ? されてるだろ? だから最後の free をすべきかどうかとかいう論が出てくるんじゃないか。
491 名前:デフォルトの名無しさん mailto:sage [2021/01/19(火) 22:58:48.04 ID:9v9GfH+o.net] >>450 こういうのもあるんですね ぜひ参考にさせていただきます!
492 名前:デフォルトの名無しさん mailto:sage [2021/01/20(水) 11:08:03.53 ID:QYX8nqqa.net] >>468 GodJob
493 名前:デフォルトの名無しさん mailto:sage [2021/01/21(木) 01:43:06.87 ID:Idvi/rDV.net] Hoge funcB2() { return Hoge{}; } C++17以降はこれが正解 他に対してデメリットしかない
494 名前:デフォルトの名無しさん mailto:sage [2021/01/21(木) 10:32:06.28 ID:uTJ86sk/.net] デメリットしかないんじゃダメじゃん
495 名前:デフォルトの名無しさん mailto:sage [2021/01/21(木) 14:04:53.08 ID:8mOSdfp6.net] move constructor と copy constructor があるのは理解したが どちらがどういうタイミング(条件)で使い分けられるのか 詳しく正しく解説してるサイトはありませんか?
496 名前:デフォルトの名無しさん mailto:sage [2021/01/21(木) 19:08:01.09 ID:9K5m0BUg.net] >>480 std::move() あと氏ね
497 名前:デフォルトの名無しさん mailto:sage [2021/01/21(木) 19:38:07.97 ID:QF6BlJBZ.net] >>481 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
498 名前:はちみつ餃子 mailto:sage [2021/01/21(木) 21:13:38.93 ID:ooF1treM.net] rvalue を受け取れるところに rvalue を渡したらムーブになるという単純な規則なので詳しい説明を見るまでもないよ。 (一定の条件を満たすとコピーもムーブも省略して直接オブジェクトを構築するといったような例外はある。 いわゆる RVO) でも何が rvalue なのかとか右辺値参照の仕組みだとかいった前提知識は必要なので、 そこらへんも含めた総合的な説明となると「江添亮の C++ 入門」を一通り読めばいいと思う。 https://ezoeryou.github.io/cpp-intro/
499 名前:デフォルトの名無しさん mailto:sage [2021/01/22(金) 15:56:45.94 ID:8dGlMjdy.net] rvoはあくまでコピーの省略であってムーブの省略ではないぞ あと江添本ゴリ押しするくらいならこっちにしろ ttps://cpplover.blogspot.com/2009/11/rvalue-reference_23.html?m=1
500 名前:はちみつ餃子 mailto:sage [2021/01/22(金) 16:11:48.09 ID:gbaM/AZn.net] >>484 ムーブも省略の対象になるよ。 https://timsong-cpp.github.io/cppwp/n3337/class.copy#31 RVO という言葉がそれを含むかどうかは場合によると思うけど。
501 名前:デフォルトの名無しさん [2021/01/22(金) 17:23:58.50 ID:tN/hhIBk.net] string Hoge(){ return string("HOGE"); } があって string s = Hoge(); char *p = s.c_str(); で p を使用する側があるとき const char *Fuga(){ return string("HOGE").c_str(); } を代わりに使おうとすると const char *q = Fuga(); までは正常(に観える)ですがその後 q の中身が消えてしまいます。 理由は判るのですが Fuga みたいな関数を作りたいときどのように描くのが普通ですか?
502 名前:デフォルトの名無しさん mailto:sage [2021/01/22(金) 17:37:13.27 ID:Zh6FWeVu.net] >>486 最初の3行で書いているやり方でいいんじゃないの
503 名前:デフォルトの名無しさん mailto:sage [2021/01/22(金) 17:39:39.87 ID:3IahkNr8.net] 例を満たすだけなら const char* Fugo() { return "HOGE"; } が一番楽だと思うけど、もうちょっとやりたいことを具体的に
504 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 12:00:41.77 ID:55szcPbX.net] ふと思ったのですが、 文字の配列(文字列)を char * で表すとき、最後の要素をヌル文字にすることで、文字列の長さを 別に指定しなくて済んでますよね。 同様に、任意のデータ(例えば構造体とか)の配列をポインタで表すとき、終端に何か特別な 値をセットして、配列の要素数を指定せずに済ませられますかね?
505 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 12:05:50.09 ID:ptYOaHFL.net] 番兵値とかnullオブジェクトパターンとかでググれ
506 名前:デフォルトの名無しさん [2021/01/25(月) 14:11:32.50 ID:83sbARL7.net] 番兵を知らないってことはアルゴリズムの教科書を買った方がいい
507 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 14:51:09.66 ID:/FcSLyrh.net] ただのnull終端を番兵と呼んでるんなら、 それこそまともなアルゴリズムの本をちゃんと読んだほうがいい。
508 名前:デフォルトの名無しさん [2021/01/25(月) 15:21:22.55 ID:g2C+jwSi.net] strlen()はあるのにobjlen()とかlistlen()とかstructlen()が無いね
509 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 15:22:51.03 ID:ptYOaHFL.net] つsizeof
510 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 15:30:44.92 ID:ptYOaHFL.net] listはお決まりのイディオムで sizeof(list)/sizeof(list[0])
511 名前:デフォルトの名無しさん mailto:sage [2021/01/25(月) 15:59:40.42 ID:IR169uBT.net] 確保した大きさと使用してるサイズを同一視ならば
512 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 01:42:28.90 ID:uwBeeshc.net] 配列をポインタで関数に渡すとき、番兵を使ってる例って少ない(無い?)ですよね? たいていはポインタと、サイズの入った変数、ですよね。 番兵を使った方が関数の引数が減ってシンプルじゃないですかね? sizeof()は上記目的には使えないですよね。あと配列をmallocで割り当てた場合も。
513 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 02:09:38.03 ID:QPIgjXP4.net] そもそもC++スレなんだからコンテナでrange based forとかイテレータとかsize使ってるやつの方が多いんじゃねーの
514 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 02:10:14.56 ID:QPIgjXP4.net] いやCスレでもあったな…
515 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 03:09:22.29 ID:I774IjRX.net] 番兵はユニークな値でないと困るけど 一般の配列で絶対に使わない値 が存在しうるかはわからない 文字列は \0 を番兵として使うからなと値域を制限してるから成立してる
516 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 07:44:27.25 ID:JepoiCxq.net] >>497 番兵の値がいくつかということはコメントとかに書くくらいしかできないからサイズを使う場合よりも保守性が低いとか、サイズが分からないと直接終端にアクセスする必要のあるアルゴリズムを使う際にいったん末尾まで余計な探索しないといけないとか、デメリットも多いな。ケースバイケースだが、番兵よりサイズの方が扱いやすいことが多いと思う。
517 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 08:13:19.70 ID:lSE67wwF.net] >>497 自分は、C++でよく見る先頭ポインタと末尾+1ポインタのペアが落ち着く。
518 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 09:28:05.96 ID:Gs93uoQt.net] >>497 ポインタの配列とかならまれに見るよ Win32APIのStartServiceCtrlDispatcherAとか 逆に言うとポインタぐらいしか番兵としてみんなが認める値がない ポインタならNULLを番兵にするのはだいたい同意するだろうし
519 名前:はちみつ餃子 mailto:sage [2021/01/26(火) 10:58:58.35 ID:xZCVqJnF.net] Go や Rust でスライスが基本的な型として入っているのは 大きさのわからん配列 (の参照) が 問題を生みやすいことを学んだ故だと思う。 C++20 に std::span が入ったのもその必要性・有用性を認めてのことだろうから、 std::span そのものは使えない状況であったとしても 番兵より大きさ (もしくは終端の位置) で管理するスタイルが基本になっていく流れはあるんじゃないかな。
520 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 14:04:56.83 ID:dpeKzEhO.net] たとえばある配列をわたされてインデクスiを参照したいとするじゃん 番兵しかなかったら、とりあえずインデクスiまでずーっと舐めないと 途中で番兵でてきたらアウトオブレンジでえらいこっちゃ 配列とサイズで管理しないとランダムアクセスがごっつうおそなってお話にならない
521 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 14:07:28.72 ID:J69Hx8rV.net] で、まあ実際ヌル終端文字列の処理ってこんなのばっかりで、文字列をやたらと きったりはったりする場合は結局文字数とセットにしたほうがいいよね、ってなって 最近のモダン言語はだいたい文字数とセットで管理するほうが主流だよね
522 名前:デフォルトの名無しさん mailto:sage [2021/01/26(火) 14:16:08.72 ID:9ppDXCHm.net] C言語に前にあったPascalとかも知らないんだろうな…
523 名前:デフォルトの名無しさん [2021/01/26(火) 14:53:45.91 ID:m9QEFa1v.net] 最近のモダン言語は文字数とバイト数が
524 名前:バラバラだけどランダムアクセスできてんの? [] [ここ壊れてます]
525 名前:はちみつ餃子 mailto:sage [2021/01/26(火) 16:04:26.82 ID:xZCVqJnF.net] >>508 文字列をランダムアクセスする必要とかあるの? ないよね? っていうのがモダン言語の解じゃないかな。 どうしても必要なら事前に 32 ビット整数 (に相当する文字型) の配列にするし。
526 名前:デフォルトの名無しさん [2021/01/27(水) 11:38:43.30 ID:cJSBZXf9.net] >>500 char * なのに "hoge\0fuga\0hage\0\0" みたいな内容期待してるAPIとかあるからな
527 名前:デフォルトの名無しさん [2021/01/27(水) 11:40:55.88 ID:cJSBZXf9.net] >>497 malloc とか new とか ポインタ - 1 のアドレスにサイズが書き込まれてたりするな
528 名前:デフォルトの名無しさん mailto:sage [2021/01/27(水) 19:33:34.87 ID:V9ay2W5A.net] C++17のvariantというものを初めて使おうとしていますが 自分のコードでは、variantの中身にはすべてset(int i)というメソッド(iの値をセットする)があるので visit([=](auto& v) { v.set(hoge); }, value); としたら、「const ...をset()のthisに渡すのはクオリファイアーを無視してる...」的なエラーに。 あれ、自分の元のコードではvalueはconstじゃないはずなんですが.... もしかしてvisit()の変数って強制的にconst扱いですか? constじゃないやり方とかあります?
529 名前:デフォルトの名無しさん mailto:sage [2021/01/28(木) 02:35:10.89 ID:RFgYTk8i.net] >>512 きっと省略したところに問題があるんでしょう。 オンラインコンパイラにエラーを再現させるコードを貼って示してもらえば、何か見えてくると思います。
530 名前:デフォルトの名無しさん mailto:sage [2021/01/28(木) 17:23:11.37 ID:ZyxBbWt0.net] ヌル文字は文字列処理してセパレータが被った時の最終手段なので勘弁して欲しい
531 名前:デフォルトの名無しさん mailto:sage [2021/02/02(火) 16:38:37.97 ID:eercxEg/.net] >>497 そういう時、自分は構造体に配列のポインタとサイズを書き込んで、構造体のポインタを渡している。 実務経験ゼロのアラフィフ日曜プログラマなので、この方法が良いのかどうかはしらない。 理工学部出身なので、学生時代はプログラムしてたよ。 コロナ禍で外出する頻度も減ったので、久々にプログラミングを再開してみた。
532 名前:497 mailto:sage [2021/02/03(水) 19:53:19.07 ID:RKwHr67Q.net] >>515 あ、実は既にその方法にしていたりします。 配列のポインタ+サイズの引数だと若干うるさくなることのほかに、構造体でデータ型をネストしたい (構造体の要素に配列を持たせ、その配列の要素も似たような構造体...)部分などもあり、そうするのが 自然(というか必須?)な感じがしました。
533 名前:デフォルトの名無しさん [2021/02/04(木) 00:19:59.58 ID:+sPXCpt8.net] C標準ライブラリのソースコードを眺めていると、実装した関数をエイリアスで別名をつけていることがあります C言語のことがよくわかっていない為か、最初からエイリアスの名前で関数を書いた方がいいのではないか?と思えてしまいます 一体、なんのために実装関数名とエイリアス名を分けているのですか?
534 名前:デフォルトの名無しさん mailto:sage [2021/02/04(木) 02:01:32.78 ID:RCSvvL+5.net] 昔の6文字までしか名前を解決できないボロリンカの名残だろ
535 名前:デフォルトの名無しさん [2021/02/04(木) 05:05:52.26 ID:YUi6sdWi.net] 初心者だけど目的がないから勉強できん どうすればええんや
536 名前:デフォルトの名無しさん mailto:sage [2021/02/04(木) 09:29:01.10 ID:sXvBu/Db.net] なにか作ればいい
537 名前:デフォルトの名無しさん [2021/02/04(木) 11:36:18.55 ID:ZzRKCYY/.net] >>515-516 APIだとそもそも構造体の先頭数byteにその構造体のサイズが入ってるって普通
538 名前:デフォルトの名無しさん [2021/02/12(金) 15:44:52.65 ID:VS77AOFk.net] Visual C++のアプリ作れって言われたんやけど アプリ作成の段階でワイ詰んだから質問しに来たンゴ アホみたいな初心者やけど助けてほしいンゴ 【使用環境】 Visual Studio 2008 【やりたいこと】 VB.netとかで言う「Buttun1_Click」で 「MessageBox.Show("HELLO")」がやりたい 【わからないこと】 @本とかで「Managed C++ アプリケーション」で作れって書いてあるが テンプレートにそんなものはない A「Dialog」をなんか作れることはできたが ビルドしたら「error LNK2019: 未解決の外部シンボル _WinMain@16 が関数 ___tmainCRTStartup で参照されました。」 が出てくる。 定義すれば解決!らしいけど定義のやり方がわかんない Bmain関数をどこに書けばいいかわからない(ファイルが多すぎて)
539 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 15:54:15.89 ID:7cf88jb8.net] int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
540 名前:デフォルトの名無しさん [2021/02/12(金) 16:19:00.28 ID:IzjdsqjH.net] 勘違いしたふりしてC#で作っちゃえよ
541 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 16:32:05.70 ID:NMXs/4Zz.net] 本を使う場合はその本のバージョンに全部合わせないと無い項目とかあってしんどいよ 慣れれば無くなってても代わりはこれだろ、って当たりつけられることもあるけど 学習目的で参考する本があるならバージョンは合わせたほうがいい そのバージョンの入手が難しくなっている場合もあるからその場合は本を変えるしか無い 出版された後にバージョンが変わってしまいそのとおりに学習ができないというケースが多発するので本よりググったほうが楽という面が大きい
542 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 16:50:26.27 ID:7cf88jb8.net] 環境たる Visual Studio の使い方が バージョンで全然違うからねぇ それを使えた上で 何かの言語とAPIやフレームワーク駆使して実行ファイルを作るから ド頭でつまずくと先進むのは難しくなるわな
543 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 16:59:13.12 ID:jxDcSv/l.net] >>522 > @本とかで「Managed C++ アプリケーション」で作れって書いてあるが そんな本は今すぐ捨てろ 今時Managed C++なんてやっても意味ない あと、できればVisual Studio 2019買ってもらえ 準備ができたらここに書いてあるとおりに実行すればいい https://docs.microsoft.com/ja-jp/cpp/windows/walkthrough-creating-windows-desktop-applications-cpp?view=msvc-160
544 名前:デフォルトの名無しさん [2021/02/12(金) 18:01:31.31 ID:VS77AOFk.net] 個人的には前例になっとるプログラム(機能は違うが、処理内容はほぼ同じ) がVC++で作られとったからそれを参考にしようと思ったんやが 何せプログラムではなく「プロジェクトの作成」で詰んでしまってなあ・・・ まさに「何していいかわからん」状態ですわ・・・
545 名前:はちみつ餃子 mailto:sage [2021/02/12(金) 18:35:40.44 ID:2OOQ6m86.net] >>522 Windows の GUI アプリのエントリーポイントは (main ではなく) WinMain なので、 スタートアップルーチンは WinMain があるものだと思って呼び出そうとする。 それがないからエラーって言ってる。 WinMain がどういうものかはここに公式な説明がある。 https://docs.microsoft.com/ja-jp/windows/win32/api/winbase/nf-winbase-winmain それと他の人も書いてるが Managed C++ はやめたほうがいい。 .NET Framework を基盤にするアプリケーションを書くときにネイティブコードとの間で仲立ちする のが主な目的のもので、普通のアプリケーションをそれで書くのは適してないし、 仲立ち用に使うにしても今では C++/CLI のほうがマシというのが一般的な評価だと思う。 俺自身は使ったことないから聞きかじりの評判しか知らんけど。 >>528 Windows のデスクトップアプリを一から書くなら C# のほうが楽だと思うから C# スレへ行けと言いたいところなんだが、下手に前例があるのはしんどいな……。
546 名前:蟻人間 mailto:sage [2021/02/12(金) 18:39:18.35 ID:fTOQtm+W.net] いちいち説明するのも面倒なので貼っとくよ。 https://ja.m.wikipedia.org/wiki/C%2B%2B%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E6%8B%A1%E5%BC%B5 Managed C++は現在ではC++/CLIに相当する。
547 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 18:43:42.13 ID:Ir0s84kv.net] 処理の主体がOSに近い所(GUIで窓の操の面倒をみるのがほとんど)なら 先例をもってくるほうが手近だけど、データ処理ならエッセンスだけ抜き出して C#でGOするのもアリかもしれん 仕事で言語指定までされてる話ならがんばれ
548 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 18:55:05.22 ID:RpqVOpxf.net] C++ で、DLL を作るプロジェクトじゃないの? 漏れなら、Ubuntu 18.04, mruby で、C/Ruby ごちゃ混ぜで書くけどw
549 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 19:03:16.62 ID:RpqVOpxf.net] そもそも、Windows で、C/C++ の仕事があるのか? 想像できない すべてのサーバーが、Linux なのに
550 名前:蟻人間 mailto:sage [2021/02/12(金) 19:50:54.67 ID:WC9JZZt5.net] >>533 仕事はサーバーだけではない。 サーバーはLinuxだけではない。
551 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 20:39:41.87 ID:jxDcSv/l.net] >>528 それ、Managed C++なの? マジでそうならC++じゃなくてC#にした方がまだマシだぞ
552 名前:デフォルトの名無しさん mailto:sage [2021/02/12(金) 21:45:27.24 ID:nVBqnbvZ.net] このスレにまでRubyキチガイが現れるようになったか
553 名前: mailto:sage [2021/02/13(土) 01:09:45.11 ID:HkWfV2pE.net] >>522 私ははるか昔に visual c++ にほとほとあきれ返ってしまったので、それいらい cygwin の中にある mingw32 を使って win32api だけを使って書いていた時期がありました 最近は c++11 以降ではスレッドも簡単に書けるようになったので、まあ、しばらくお休みはしてはいるのですが、いつか、c++11 主体で、ときどき win32api を呼ぶ、という感じの混在させたようなものを書いてみようか、などと、鬱々と考えています、考えているだけですけど‥‥
554 名前:デフォルトの名無しさん [2021/02/13(土) 08:57:57.49 ID:cPvPYeD3.net] 奥が深いというか複雑なんやなこれ とりまvs2008なのは会社の環境やから許してくれや vc++もほとんどいじってなかったしなぁ あれからとりあえず「空のc++アプリケーション」つくって 「dialog」1つ作って「ボタン」1個置いて あとは「サブシステム」はちゃんと「windowsアプリケーション」にしたで ダブルクリックしたらイベント書けるらしいけど 何かいたらいいか分らんかったから とりあえずMessagebox::show(""); だけ書いた 結局出てきたエラーが fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afx.h なんやけど
555 名前:ワイはここで詰んだ 前任者マジでこのツールどうやって使ってたんや・・・? アホやけどほんま教えてほしいやつこれ [] [ここ壊れてます]
556 名前:デフォルトの名無しさん mailto:sage [2021/02/13(土) 09:59:44.52 ID:KpUslkW7.net] プロジェクトのプロパティで/MD[d]とか書いてあるところを血なまこになって探す 見つかったらそこを/MDに変える
557 名前:デフォルトの名無しさん mailto:sage [2021/02/13(土) 13:40:09.63 ID:2KIaYprT.net] >>538 それ多分.NETじゃなくなってない? 余計遠ざかってるんじゃね
558 名前:デフォルトの名無しさん mailto:sage [2021/02/13(土) 13:49:12.60 ID:W+in9Pd4.net] 元の司令は >>522 「Visual C++のアプリ作れ」だから正解
559 名前:デフォルトの名無しさん [2021/02/14(日) 02:10:49.62 ID:UasGJ1Yn.net] Linuxって…テキストファイルの最後には…必ず'\n'が入るって仕様なの? なんか…GTK系は全部…そんな感じ…。最後に'\n'が入ると想定して最後は改行してない…。 気持ち悪いんだけど…。'\n'なしで終わってもいいよね?…どうしよう仕様合わせようか… '\n'なしで終わったらいいじゃない…。カルチャーショック…。どう思います?
560 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 03:19:57.80 ID:5UNrDy8Z.net] >>542 やたらと...を使うのに比べたら、最後に¥nが無いことくらい気持ち悪くもなんともない
561 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 03:47:05.07 ID:WdUd6MIw.net] ファイルの最後で改行して終わるってのはコーディング規約とかでも結構あると思うが
562 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 09:03:18.32 ID:BvP4KASJ.net] ケツカンマみたいなものだよな
563 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 12:32:42.26 ID:PhDiV4m5.net] C++のイディオムでwhile(std::getline(…, …))ってあるけど、 あれもファイル終端にLF無いと破綻するよ
564 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 12:44:08.40 ID:PhDiV4m5.net] https://stackoverflow.com/questions/ 729692/ POSIXの仕様です
565 名前:はちみつ餃子 mailto:sage [2021/02/14(日) 14:02:31.79 ID:kyN0kqqg.net] Vim で勝手に改行を付け加える仕様がどうこうで揉めたことがあったような。 テキストはどことやりとりするかわからんし、 POSIX の中だけで完結できるわけでもないからなぁ。 どっちも想定しておくに越したことは無いよね。 ちなみに C や C++ のソースコードも昔の仕様だと最後が改行ってのは要求されてたよ。 いつ削除されたんだったか覚えてないけど。
566 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 14:11:50.05 ID:8wuPGef8.net] >>546 え、マジで?たった今タイプしたとこなんだけど
567 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 14:28:22.15 ID:PhDiV4m5.net] >>549 ごめんうろ覚えでした 元の文字列に改行があったかがeof()でチェックしないと分からなくなる 前にそれでwhile条件節から外してブロック内でbreakしたほうが便利なことがあった……ってだけでしためんご
568 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 15:46:09.44 ID:7CeYpqGj.net] C++は最強ですか?
569 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 16:01:28.24 ID:NtTyPWVG.net] 最恐ですね。たまにスクリプト言語を触ると心が和む
570 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 16:19:38.70 ID:7CeYpqGj.net] ありがとうございました!
571 名前:デフォルトの名無しさん mailto:sage [2021/02/14(日) 18:37:42.96 ID:RmY9fsVU.net] getline や fgets 入力ストリームの最終行が改行を含まずのに閉じられてる場合 バッファの末端に \nが居ないだけで最終行は取り込まれるよね?
572 名前:デフォルトの名無しさん [2021/02/15(月) 16:32:22.61 ID:g92MWppk.net] https://stackoverflow.com/questions/55970169/getline-vs-fgets-control-memory-allocation
573 名前:デフォルトの名無しさん mailto:sage [2021/02/15(月) 19:30:11.12 ID:BmI3IhrJ.net] そういえば他人のコード変更をレビューするとたまに最終行に改行が追加されているのがあって、 「あーこの人が勝手に改行を追加したのかな、まプログラム的には同じだしいっか」とか思って 無視し続けていたが、あれはその人が使っているエディターによって自動的に変更されてた のかな? 例えば最初にコードを書いた人のエディターは最終文字が改行でなくても構わなかったが 2番目に直した人のは改行を要求するとか... clang-format あたりでそこら辺は統一できるのかな?
574 名前:デフォルトの名無しさん mailto:sage [2021/02/15(月) 22:19:21.80 ID:aLBeV9m+.net] 最近まで、Ruby の1-liner に、バグがあった 末尾の改行コードを削除するために、chomp を使うべき所で、 文字列の末尾の1文字を削除する、chop を使っていた 最終行に改行が無くて、abc なら、ab になっていたw
575 名前:デフォルトの名無しさん [2021/02/16(火) 14:01:37.31 ID:kKLrubPe.net] >>554 fgets はバッファの長さ次第
576 名前:デフォルトの名無しさん [2021/02/16(火) 14:15:32.56 ID:kKLrubPe.net] >>554 getline はデフォルトのデリミタだと ' ' と 改行で切られる (ファイル終端の改行はあってもなくても同じ結果) また fgets と違って取得した文字列にデリミタは含まれない ちなみに ifs >> s も getline と似た使い方が出来るが こっちはデフォルトのデリミタは改行のみ ( ' ' ) は取得される また取得した文字列にデリミタは含まれない つまり ifs >> s と getline(ifs, s) は同じではない
577 名前:デフォルトの名無しさん [2021/02/16(火) 14:20:32.47 ID:kKLrubPe.net] >>554 おまけ https://ideone.com/rM6lgl
578 名前:デフォルトの名無しさん mailto:sage [2021/02/16(火) 18:35:37.29 ID:7otM+IWb.net] googleのv8がc++で書かれてるってきいて興味もったんですが最強?
579 名前: mailto:sage [2021/02/16(火) 21:12:19.85 ID:I98rHtI/.net] >>561 そういうインフラ用途には C/C++ しかないかと‥‥
580 名前:デフォルトの名無しさん [2021/02/17(水) 18:17:22.87 ID:8Df3qLX7.net] v8 って node.js やん
581 名前:デフォルトの名無しさん mailto:sage [2021/02/17(水) 18:40:43.14 ID:ZNwah53O.net] v8みたいに飛躍的に処理速度伸びたエンジンって他になにかあるんですか?
582 名前:デフォルトの名無しさん mailto:sage [2021/02/17(水) 19:16:52.88 ID:Pg4t51og.net] sourcetrail入れてみた
583 名前:デフォルトの名無しさん mailto:sage [2021/02/23(火) 08:35:11.77 ID:qdsH3SX7.net] すみません、C++で0以上の整数の範囲を表す型を使いたいのですが、どうするのがおすすめですかね? struct { unsigned begin; unsigned end; }; ま、基本的にこれでいいんですが、もしより良い方法があれば... - もしかして std::pair の方がいいんですかね? ただの struct よりメリットがあったりします? - 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが... 最近 std::optinal というのを 知ったのですが、大げさ? 上記 begin と end を signed にして負のときは無効、とかでもいいんですが。 - 2つの範囲に対して各種集合演算的なものもできるとさらに。
584 名前:デフォルトの名無しさん mailto:sage [2021/02/23(火) 12:05:47.24 ID:EYNng8zF.net] lowerbound+offsetの方が融通が効くのでは 範囲としては倍表せるわけだし wrap around しても2周はしないわけだから、範囲に入ってるかの判定には問題は無い
585 名前:デフォルトの名無しさん mailto:sage [2021/02/23(火) 13:18:31.42 ID:iu17pC6m.net] >>566 > - 一応、「有効な範囲を指してない」という状態が明確化できたらいいんですが... end < begin なら有効でないってやればいいだけじゃね?
586 名前:はちみつ餃子 mailto:sage [2021/02/23(火) 14:15:26.47 ID:ZvemQ+Fv.net] >>566 std::ranges::views::iota
587 名前:デフォルトの名無しさん mailto:sage [2021/03/06(土) 08:41:51.96 ID:QrSKtEDt.net] 変な質問ですが std::vector<int, std::allocator<double> > を定義しようとしたら static_assertでタイプが違うと指摘されました じゃあなんでテンプレート変数分けてるんですかね...?
588 名前:デフォルトの名無しさん [2021/03/06(土) 10:56:56.05 ID:DM5zd16W.net] 自作のアロケータを使う時に使う、 型が違うのはお約束に反する
589 名前:デフォルトの名無しさん mailto:sage [2021/03/06(土) 11:39:26.93 ID:8MIrd+yZ.net] テンプレートテンプレートパラメータにしなかったのは何故なんだろうな
590 名前:デフォルトの名無しさん mailto:sage [2021/03/06(土) 12:39:02.65 ID:QrSKtEDt.net] >>571 そう言われてみれば当たり前の話な気がしますね・・・
591 名前:デフォルトの名無しさん mailto:sage [2021/03/06(土) 12:45:22.81 ID:4A7TIztL.net] ああそうか、Allocatorだけ受け取る方法もあるのか
592 名前:デフォルトの名無しさん mailto:sage [2021/03/12(金) 20:55:45.62 ID:ZDqlVx3B.net] すみません。C/C++自体というよりは、その学習方法についてですけど、教えて下さい。 ネット上で無料で公開されているC++の学習コンテンツで一番良いもしくは定番のものはどれでしょうか? 私はC, Java, C#の経験があります。しかしながら、Cはほとんど忘れてしまいました。 その状態の人間がC++をネット上の無料のコンテンツのみで学習したいのですが、どのページが良いでしょうか? 開発環境は既に準備しました。 よろしくお願いいたします。
593 名前:デフォルトの名無しさん mailto:sage [2021/03/13(土) 11:40:09.75 ID:g/wAdnDh.net] とりあえずwebのロベールとかでも良いとは思うけど・・ 独習とかの本は何か持っといた方がいいと思う
594 名前:はちみつ餃子 mailto:sage [2021/03/13(土) 14:13:55.98 ID:aUdFS8U8.net] ウェブのロベール本ってこれのこと? www7b.biglobe.ne.jp/~robe/cpphtml/ いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。 どの箇所だったか忘れたけど const の扱いで現行の仕様に合わない部分について Taratail だったか Qiita だったかで見た記憶もあるし。 個別に見ればささいなことだけど、 入門者はそのささいなこともわかってないから入門者なわけで、 細かい引っ掛かりが多いとしんどいんじゃないか?
595 名前: mailto:sage [2021/03/13(土) 14:52:13.00 ID:o3uThhpf.net] >>575 本を買った方がいいでしょう、それも複数買う前提で、この世界では「一冊で完結」は無理です 最初の一冊なら私なら旧独習をお勧めします(私がそうでしたから)、が、新独習の評判は聞いてみたいとは思っています
596 名前:デフォルトの名無しさん mailto:sage [2021/03/13(土) 15:28:12.06 ID:iXgnaDGC.net] >>577 お前がゴリ押ししてる江添本よりはマシだと思うよ
597 名前:はちみつ餃子 mailto:sage [2021/03/13(土) 15:50:23.66 ID:aUdFS8U8.net] >>579 俺は江添本を (全体を通しては) 読んだことがないのでごり押しするほど強い関心無いんだけど。 ただ C++ は C++11 が大きなターニングポイントになってるので、それより古い前提の説明は論外という立場。 ましてや C++03 にすら合致しないのは論外も論外。 論外のものを除いて入門向けにマシそうな、 しかも無料で読めるものというと江添本以外に実質的に選択肢がないからよく挙げるだけだよ。
598 名前:デフォルトの名無しさん mailto:sage [2021/03/13(土) 16:12:25.33 ID:g/wAdnDh.net] QZも言ってるが独習の新版はC++17らしいぞ
599 名前:はちみつ餃子 mailto:sage [2021/03/13(土) 16:33:14.60 ID:aUdFS8U8.net] >>575 話題に上がったから紹介しておくけど、江添本ってのはこれのことね。 https://ezoeryou.github.io/cpp-intro/ 入門書であまり取り上げられないけど入門者が躓きがちなコンパイラのコマンドの話や makefile とかいった周辺事情も 取り上げているかわりに、ヘッダファイルを使い分けしなかったり、継承を扱わなかったりで、 網羅的に C++ を理解するための本ではない。 入門者が入門するための本。 それ以上のことは他の本を読めという投げっぱなしだが、 とりあえず無料で基礎をおさえられる (しかも日本語!) という意味では他に紹介できるほどのものはない。 C++ ではありがたいことに無料で利用できるリファレンスは意欲的に整備している方々がいて、 https://ja.cppreference.com/w/ https://cpprefjp.github.io/ あたりを見れば細かいことも書いてるんだけど……。 まあ当たり前だが入門書をひとつも読んでないレベルだとみてもわけわからんと思う。 本気で取り組むなら本の数冊くらいは買ったほうがいいと私も思う。
600 名前:デフォルトの名無しさん mailto:sage [2021/03/13(土) 16:48:52.40 ID:g/wAdnDh.net] そら今時コマンドラインツール使っててソース1つだけで書いてるようなC++オタクには合ってるかもしれんけどな・・
601 名前:はちみつ餃子 mailto:sage [2021/03/13(土) 17:11:08.84 ID:aUdFS8U8.net] 他に存在するなら紹介するんだけど、 無料でという制約の中で (個別のブログ記事とかじゃなく) それなりに筋道をつけた入門書で古すぎないものとなると無いだろ。 英語でいいならあったりするかな?
602 名前:デフォルトの名無しさん mailto:sage [2021/03/13(土) 17:54:16.06 ID:pYfy5bp8.net] >>581 自分は半月ほど前に最新版の独習を買って、半分ぐらい(p370あたり)読み進めているんだが、「本書について」によると、C++14とC++17をメインのターゲットにしてるって書いてますね
603 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 08:22:46.92 ID:Zb/GuQ+J.net] アドバイスありがとうございます。 とりあえず、教えていただいたロベールさんのページを見たのですが、網羅的に書かれているようなのでまずはこれを読もうと思います。 > いまどき #include <iostream.h> とか書いてあるのはちょっと微妙だと思うぞ。 すみません。これ、何が悪いのでしょうか。。。 あと、教えていただいて気がついたのですが、C++も結構色々なバージョンがあるのですね。 私が今回触らなければならないコードはかなり前のコードなので、もしかすると古いバージョンのC++かもしれません。 その辺も意識して勉強しなくては駄目ですね。
604 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 10:23:48.46 ID:FJEdpMO0.net] 今はもう標準ライブラリに.hがついてるのは無いからそもそも実行できない可能性ある
605 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 10:49:48.45 ID:8Ki8FhWw.net] 実行?
606 名前: [2021/03/14(日) 14:53:49.63 ID:uaeFGveg.net] >>585 旧独習には「std::stringを自分で実装せよ」という初級者には眩暈がするほどの崇高な課題が採用されていましたが、新独習には「〜を独力で実装せよ」系のお題は採用されていますか? すくなくとも「〜を独力で実装する」系お題が可能になるだけの基礎知識をつけてくれる本ですか?
607 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 17:03:20.15 ID:ERa14GlL.net] >>589 全13章605ページのうち7章380ページまで進んでいますが、そのようなお題にはお目にかかっておりませんな。 練習問題やその章の理解度チェックで色々な問題が出されていますが、何れも本をよく読めば解ける問題ばかりです。 さらっと先まで目を通してみましたが、そのような課題は見当たらないようです。 旧版のどの箇所あたりで出題されたものですか? もしかして、全く別の本のことなのでしょうかねえ。 ↓の「おまけ」にあるような解答を求める問題でしょうか? std::stringの実装に学ぶC++入門 - Qiita https://qiita.com/YSRKEN/items/dd3b11e4670bb2b829a5 自分はまだ独習中で、C++は未だ*や&、&&、で頭の中がグルグル回ってしまうレベルなもので、理解できそうですが いきなり自力で作れそうにありませんわw
608 名前:はちみつ餃子 mailto:sage [2021/03/14(日) 18:12:48.12 ID:aW+jce3e.net] >>586 > これ、何が悪いのでしょうか。。。 1998 年に国際規格 (ISO) になって以来、規格に iostream.h というものが有ったことはない。 .h は不要。 諸々の事情から iostream.h も用意している開発環境が多かったせいか 古い書籍では iostream.h としている場合は少なからずあるのだけれど、 主要な処理系の標準への準拠が急速に進んだこともあって、 資料も規格に寄せた書き
609 名前:方が今では普通。 iostream.h は古い本の象徴みたいな感じになってる。 そんでもって規格にない以上は iostream.h が存在しない開発環境も普通にあるってのが問題。 https://wandbox.org/permlink/kwpJf5BumkarYWYD 規格になくてもデファクトスタンダードとしてどこにでもあるってのならまあいいかと思わないでもないけど、 無いこともあるんだ。 そういう環境だともちろんエラーになる。 初心者が入門書の最初に載ってるコードを入力してみてエラーになるってのは良くはないだろ。 そんでもって問題がそれだけとは限らなさそうという……と思わせるサインなんだよ、 iostream.h は……。 [] [ここ壊れてます]
610 名前: [2021/03/14(日) 20:04:14.75 ID:uaeFGveg.net] >>590 手元の旧独習4版(ハーバード・シルト著)6章末「総合理解度チェック」 ・次の演算ができるような strtype クラスを作成しなさい ・+ 演算子による文字列連結 ・= 演算子による文字列代入 ・<>==による文字列比較 固定長文字列を使ってもかまいません。難問ですが、よく考えていろいろと試してみてください。 必ずできるはずです。
611 名前: [2021/03/14(日) 20:13:24.03 ID:uaeFGveg.net] >>590 >C++は未だ*や&、&&、で頭の中がグルグル回ってしまう これらの「記号」は習得に順序があります。 まず * をしっかり理解します。C/C++ はなんといってもポインタが基本です。 次に参照 & を理解します。参照& を使う場面が出てきたら、これを * を使った書き方に書き直す、という機械的な訓練がいい練習になるでしょう 参照 で返す、という場面でも、@参照返しが出来る場合と、A参照返しはできずせいぜい RVO に期待するしかない場合、の@A二つの違いを明確に即答できるようになるべきでしょう(最近まで私はそれができなかった……)参照& の表現は新しい表現( ranged-for とか) でよく目にしますし、@Aは結構重要だと思います && は多分最後でしょうね、私も && は良く分かっておらず、というか、分からないから使わないという態度に留まっていますが、まあそれでもなんとかなる気がします
612 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 20:26:39.87 ID:ERa14GlL.net] >>592 やはり「独習」の違う本でしたわw 自分はC++関係の5ちゃんスレすら最近になって見てるんで、知らなかったけど その本が「独習」のスタンダードなんですねw 独習C++ 第4版 https://poland-it-blog.com/c_plus_books/ 自分のは、↓の9位に入ってる本です。(しかも同じ出版社) https://freelifetech.com/cplusplus-books/ ご紹介の独習はやり応えありそうなので、今の本を2回ほどやってから、次のステップでそちらを検討してみますわ
613 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 20:28:56.28 ID:EFkbulbJ.net] QZ案外初心者やなw でも言ってることは全面的に賛成 ポインタや参照、クラス等の基本を抑えてからでないとスマポや、C++11からの要素(右辺値参照含む)の使い方もわからんと思う
614 名前:デフォルトの名無しさん mailto:sage [2021/03/14(日) 20:35:47.41 ID:ERa14GlL.net] >>593 大変勉強になります 今後もよろしく
615 名前:デフォルトの名無しさん [2021/03/14(日) 20:46:24.30 ID:uaeFGveg.net] >>595 >でも言ってることは全面的に賛成 ありがとうございます! >QZ案外初心者やなw もう永遠の初心者のままだと思っていますが、それならそれで「初心者の気持ちが分かる視点からの意見の表明」という形でコントリビュートするのもありかな…、と。
616 名前: mailto:sage [2021/03/14(日) 22:01:53.26 ID:uaeFGveg.net] >>594 >>592 は歯ごたえがありそうでしょう?私もこの課題を最初に見たときは眩暈がしました… それから 10 年くらいかな??それくらいたってから https://mevius.5ch.net/test/read.cgi/tech/143407997
617 名前:2/37 を書き、なんとか卒業できたような気がします なおこれは、これでも例外方面に配慮が行き届いていない、とさらに書き直した気がしますが、その書き直しは失くしてしまいました…… [] [ここ壊れてます]
618 名前:はちみつ餃子 mailto:sage [2021/03/14(日) 23:21:43.64 ID:aW+jce3e.net] 個別の機能を理解してからそれの組み立て方を学習するのがまどろっこしく感じる人もいると思う。 抽象度の高いほう (スマートポインタなど) から解体していく形での 学習のアプローチもそれはそれでありかもしれん。 個人的には個別の機能を先に学んだほうがいいとは思うんだけどね。 実例から学ぶと使い方のパターンとして頭に入ってしまって正確な理屈を きちんと習得できない気がするから。 そうは言っても途中で学習を諦めてしまうようだと正確さもくそもないから、 人によってわかりやすさは違うし学習にはいろんなアプローチがあるということは 覚えておいてほしい。
619 名前: mailto:sage [2021/03/14(日) 23:51:21.81 ID:uaeFGveg.net] 確かに、私が理解している狭い範囲においても、イテレータが先かポインタが先か、とか C++11 / std::thread から入門したけど posix-thread なんか知らん!とか そんな人から補強説が来るのが楽しみです
620 名前:デフォルトの名無しさん mailto:sage [2021/03/15(月) 07:36:02.64 ID:PXZ12KYt.net] >>591 ご回答ありがとうございます。 理解しました。 その辺も調査しながらやります。
621 名前:デフォルトの名無しさん mailto:sage [2021/03/15(月) 13:58:23.84 ID:RVKfnS+W.net] QZが意外と素直で好印象度アップ 逆に高飛車な餃子の高感度ダウン
622 名前:デフォルトの名無しさん mailto:sage [2021/03/15(月) 21:47:16.57 ID:pqfQRyG1.net] Qちゃんは昔からいるけど態度は変わらんね ときどき自前のコード上げてるあたりは好ましい プロへのリスペクトは持ってるし謙虚ではある 餃子ちゃんはマジメというか いちいち規格に沿って発言してくれるんで好ましい ただコード上げてるのはみたことないんで実力は不明 アマチュアなのにときどき調子乗っちゃってるのも微笑ましい
623 名前:デフォルトの名無しさん mailto:sage [2021/03/15(月) 23:09:56.95 ID:kCaDVUc0.net] はちみつのコードたまーに見るけどすごい変な癖があるよ 意味があるなしに関わらず固執するタイプなんだろうな
624 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 13:45:10.41 ID:A61zCves.net] 参照を返す関数の質問です。 オブジェクトの複数のパラメータを設定するときに、obj.param1(...).param2(...).param3(...); みたいに呼ぶ パターンがあるじゃないですか(ちなみにこれって名前はあります?) これをやりたいときは Obj& param1(int val) { mParam1 = val; return *this; } みたいに参照を返すように宣言しないとダメですよね? Obj param1(int val) { mParam1 = val; return *this; } だと、obj.param1(...) は動くけどリターン用にオブジェクトの(余計な)コピーが発生する、 obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、 結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。 こんな理解で正しいでしょうか? 実は参照を使う判断にイマイチ迷っているんですが、もしかして毎回(オブジェクトの宣言、引数、戻り値等)、 「このときはここでオブジェクトのコピーが発生するから...」とかイメージすべきなんですかね? 例えば関数の戻り値、関数を出るときに戻り値が臨時で複製されて呼び出し元に渡されるイメージを持って、 「ああこれだと余計なオブジェクトが生成されるよな、じゃあ参照だ。」的な判断?
625 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 16:13:51.30 ID:xnFU2goU.net] builderパターンやね
626 名前:はちみつ餃子 mailto:sage [2021/03/16(火) 16:40:47.45 ID:AqAKN3jJ.net] クラス構成を見ればビルダーパターンにあてはまりそうだけど、 メンバ関数を連鎖していく表記法のことはメソッドチェインと言ったり、 目的から言うと名前付き引数イディオムということもある。 https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Parameter (要するに考え方のレイヤによる。)
627 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 17:00:51.56 ID:7emEuadh.net] obj + a + b + c operator + () は obj そのものを書き換えず、新たな実体を戻す obj += a operator += () は obj そのものを書き換えるついでに、自分自身の参照を戻す これのどっちに合致したほうが都合がいいかで 複製を戻すか、自分自身の参照を戻すかを分けてる感じ
628 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 20:32:04.07 ID:VN15UowM.net] >>605 > (ちなみにこれって名前はあります?) 大きく言うとFluent interface https://en.wikipedia.org/wiki/Fluent_interface
629 名前: mailto:sage [2021/03/16(火) 21:25:10.58 ID:EIvloTfy.net] >>609 その wikipedia の C++ サンプルは int main() が二箇所に現れていますが、これってどう読むのですか?
630 名前:デフォルトの名無しさん mailto:sage [2021/03/16(火) 22:36:52.42 ID:ne+I3KBD.net] すみません。 仮に、本を買って勉強する場合は独習C++というのがいいのですか? 独習C++はCの知識がなくても大丈夫ですか??
631 名前:はちみつ餃子 mailto:sage [2021/03/16(火) 23:10:25.95 ID:AqAKN3jJ.net] >>610 単に使い方のサンプルを便宜的に main で書いてあるだけでふたつあるのは特に意味ない。
632 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 18:04:58.78 ID:KYeguKkE.net] >>611
633 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 18:05:52.45 ID:KYeguKkE.net] >>611 江添本一択
634 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 18:59:10.35 ID:OslqqG1Q.net] >>611 C関係無しで覚えるのもいいんじゃね?
635 名前:デフォルトの名無しさん mailto:sage [2021/03/18(木) 19:00:25.69 ID:OIk6P4WM.net] >>611 独習C++はCの知識が前提だったはず
636 名前: mailto:sage [2021/03/18(木) 23:28:58.79 ID:QiBLMBVe.net] >>605 >これをやりたいときは >みたいに参照を返すように宣言しないとダメですよね? >obj.param1(...).param1(...) みたいに呼んだ場合はオブジェクトのコピーに2番目の呼び出しが行われ、 >結局破棄されてしまうので、objに2番目のparam1()の呼び出しが反映されない。 確かに、メソッドチェインを繰り返すたびにコピーコンストラクタが呼び出されるのは、イマイチ、という感覚を私も同様に持ちます だからメソッドチェインを書くときには私も参照を返すように書きます、結局のところ「参照を返す」というのは「ポインタを返す」ことですから、コンストラクタの走りようがない しかし「参照を返す『必要がある』」と言い切れるかどうか? 「結局破棄される」というのは最後のメンバ関数が返す実体を回収していないからであり、「参照を返すから」破棄されるわけではないと感じました。 実際、この実体を回収すれば、それはそれで 2 番目以降の呼び出しが意味を持つように書けると思います https://ideone.com/skVFOr https://ideone.com/LAKqIj 参照でよくわからなくなったときに私がよくやる「参照返しを全く使わずポインタで押し通す」とすると次のようになるかと思います https://ideone.com/R82zEE
637 名前:デフォルトの名無しさん mailto:sage [2021/03/19(金) 03:28:58.86 ID:mbZVOQ2F.net] だからムーブコンストラクタとムーブ代入演算子があるんだろうが・・
638 名前:デフォルトの名無しさん mailto:sage [2021/03/19(金) 03:37:37.65 ID:0CmLwf9e.net] >>617-618 てかそもそもコンストラクタ走っていいのかよこの場合に
639 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 12:21:23.57 ID:dUyySPje.net] クラスFooのメンバ関数fの型ってどう書くの? 戻り値void、引数intです。
640 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 12:52:45.71 ID:N6zWukcq.net] >>620 f の型は void (int) だけど f へのポインタの型は void (Foo::*)(int)
641 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 18:45:41.35 ID:WYvZUx+H.net] >>621 それはメンバ関数へのポインタでしょ 聞いてるのは関数の型でもなく、メンバ関数の型です
642 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 20:18:08.96 ID:DC3guaga.net] 言われてみれば関数の型ってなんだ?
643 名前:はちみつ餃子 mailto:sage [2021/04/09(金) 21:13:09.06 ID:foJJo5gI.net] C だと関数指示子 (Function Designator) で説明されたりするんだが、 C++ の仕様を Designator で検索しても出てこないな。 シグネチャもまたちょっと違う概念だし、 このあたりのきちんとした解説がまとまったものがあればぜひ読みたい。
644 名前:デフォルトの名無しさん mailto:sage [2021/04/09(金) 21:39:18.43 ID:MYEEijki.net] 「メンバ関数の型」が必要になるケースって何じゃろ?
645 名前:デフォルトの名無しさん mailto:sage [2021/04/10(土) 01:44:53.83 ID:4ITkpFPM.net] >>622 だから「f の型は void (int)」って書いたのに、なんでそれが答えじゃないと思うの? typedef void ftype(int); struct Foo { ftype f; }; void Foo::f(int) {} int main() { Foo x; x.f(0); }
646 名前:デフォルトの名無しさん mailto:sage [2021/04/10(土) 08:44:20.64 ID:gtw6CEDD.net] 関数ポインタを考える以前は関数の型と言えばイコール評価した値の型だったな。
647 名前:デフォルトの名無しさん mailto:sage [2021/04/13(火) 16:10:43.48 ID:uVvL/txB.net] 今は関数の型とかもうどうでもよくて 一周回り帰えりキャプチャとかダイナミックスコープとかの有用性や整合性が中心よね
648 名前:デフォルトの名無しさん mailto:sage [2021/04/15(木) 15:55:01.75 ID:6RtJrvVe.net] pod的な意味でなく論理的整合性的な型付けの恩恵受けたいなら、別に包む必要無くても常に即席structで返しててやんでい
649 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:11:28.54 ID:LUJ0Utr0.net] C++/CLIで、スタティックライブラリからマネージドクラスを公開するのは無理なんでしょうか? ヘッダファイルに全部実装書けば出来る、ってところまでは調べたんですが、ソースコードをプロジェクト外に置いてるのと変わらないので…。 ダイナミックライブラリでできるならそれでも構わないです。
650 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:19:46.15 ID:nPKzA798.net] >>630 .NETでstatic libraryなんて作れたっけ? 最終的に.exeと.dllができるのが邪魔だからstatic libraryにしたいというだけなら、 いったんDLLとして作ってILmergeするのが一般的だと思う
651 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 08:36:31.23 ID:LUJ0Utr0.net] >>631 Lib自体は作れるし、アンマネージクラスなら公開もできるんですが、マネージクラスだと参照側でメンバーが参照できず、LNK2020が発生してしまうんですよね。 ビルドオプションでなんとかできるものなのかな、と。
652 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 09:53:24.75 ID:K4uxnQki.net] LNK2020ってそれnativeのC++からリンクしようとしてる?
653 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 14:56:57.93 ID:LUJ0Utr0.net] >>633 libなのでクライアントはC++です
654 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:16:56.42 ID:K4uxnQki.net] そりゃ無理。その仲立ちをするためにC++/CLIがあるのに。 一応nativeのC++からでも自分でCLRを立ち上げたりしてマネージドクラスにアクセスする方法は あるらしいが、リンクしてそのまま呼ぶという形にはならない。
655 名前:デフォルトの名無しさん [2021/04/24(土) 15:41:46.62 ID:at4cvaWV.net] 自作のプログラム、起動時の読み込み処理の前に以下を入れると for(int i = 0; i < 100; ++i){ OutputDebugString("dummy!!!!\n"); } 起動時に行っている外部データの読み込みが凄く速くて これを無くすと凄く遅くなるんですが怖い… 3分くらい違いが出るので明らかにおかしい どっかでメモリでもぶっ壊れてますかね? どういう理由が考えられるでしょうか?
656 名前:636 mailto:sage [2021/04/24(土) 15:43:36.70 ID:at4cvaWV.net] さっきのダミーを入れなくても 普通にコードを追加したりしてても遅くなったり速くなったりする 別に読み込み処理の部分とは関係ないところでも。 なんでだろう?
657 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 15:54:20.61 ID:hc4SaSPr.net] >>637 それは、本当に native の C++? もしかして、C#のC++/CLI とか
658 名前:H [] [ここ壊れてます]
659 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 16:03:17.28 ID:lkpB631F.net] コンパイラはほんと何してるのか分からんから、問題の部分だけ切り出したのを.sへ吐かせて読みなさい 10行程度のcコードなら、edxとか変な名前のは取り敢えず変数だなって思って追えば、アセンブリ知らずとも大体分かるよ
660 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 20:39:49.92 ID:LUJ0Utr0.net] >>635 いや、 C++ライブラリ内にマネージクラスを作って マネージのC++プロジェクトから 呼び出したいだけ DLLだったら、C#のDLLからマネージクラスを呼び出すのと 理屈上同じだからできそうな気がするのだけれど 以前実装した時はInterfaceだけ公開して 呼び出されるとそのインスタンスを返す、みたいなことをしたんだけれど
661 名前:デフォルトの名無しさん mailto:sage [2021/04/24(土) 21:31:19.65 ID:+v1plSJo.net] >>640 .NETはstatic libraryをサポートしていない 出来上がった.libにはそのマネージドクラスのメタデータとか入ってないんじゃない?
662 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 00:05:51.07 ID:Oojm0ZzH.net] >>641 結局そういうことだよね なんか普通にlibのクラスを呼び出せますみたいなのをサンプル付きで出してた記事があってさ…。 まあstaticメソッドしかないクラスばかりだから、アンマネージクラスで公開するか、namespaceでまとめます。 ありがとうございました。
663 名前:636 [2021/04/25(日) 00:07:18.69 ID:sRfn5IZk.net] >>638 C++とWin32APIのプログラムです >>639 これは自分へのレスですか? 特に遅くなる以外は止まったりする事もないので 困ることはないですがなんか気持ち悪い…
664 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:40:15.50 ID:vJWG11Gh.net] >>643 外部データの読み込みは、fopen, _open, CreateFile、CFile のどの系統を使 ってる?
665 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:43:25.25 ID:vJWG11Gh.net] >>643 関係ないかもしれないが、HDDが寿命で故障寸前の時にHDDの読み込みが 時々極端に遅くなったりする現象を経験したことがある。 その場合は、そのプログラム以外でも同様の現象が起きるが。
666 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 03:49:56.55 ID:vJWG11Gh.net] >>645 もし、他のアプリやファイルマネージャーも遅くなることがあるなら、 CrystalDiskInfoなどで診断してみて欲しい。 そのアプリだけ遅くなるが、アプリの動作は正常、というなら、 メモリーやスレッドやOSリソースの使いすぎなども考えられなくは無いが。 何か極端に変わったことしてたりしない?
667 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 09:07:00.47 ID:x26Nnfhp.net] OutPutDegugなんちゃらの関数がファイル出力してるなら、単純にそのドライブのアクセス準備が整ってないとか。 以前、SSDに同じファイル名で一時ファイルの作成と削除を繰り返したら、SSDの仕組み上めっちゃ遅くなったことがある。
668 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 09:59:46.07 ID:j6IXZwA/.net] >>642 どこの記事? ちょっと気になった
669 名前:636 mailto:sage [2021/04/25(日) 10:38:16.68 ID:sRfn5IZk.net] >>645-647 遅くなる原因の個所が分かった! 画像を読み込む時にメモリを操作して 16bitで読み込む部分があるんだけど これを32bitで読み込むようにすると どんなコードでもまったく遅くならない。 メモリの操作の部分がおかしかったみたい。 自分で書いたコードじゃないのでよくわからない。 32bitのやつと16bitのやつを載せるのでおかしい所あったら教えて。
670 名前:636 mailto:sage [2021/04/25(日) 10:39:18.00 ID:sRfn5IZk.net] これは遅くならないコード int X = 0; for(int y = ImageHeight - 1; y >= 0; --y){ X = 0; for(int x = 0; x < ImageWidth; ++x){ pPx[X] = ((DWORD*)pSrcBuf)[x + (y * ImageWidth)]; ++X; } pPx += Pitch; }
671 名前:636 mailto:sage [2021/04/25(日) 10:42:37.48 ID:sRfn5IZk.net] これが遅くなる場合があるコード
672 名前:WORD px, tmp; BYTE b; int X = 0; for(int y = ImageHeight - 1; y >= 0; --y){ X = 0; for(int x = 0; x < ImageWidth; ++x){ px = 0x00000000; pPx[X] = px; b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0xff000000) >> 24); //A tmp = 15 * (b / 255.f); px |= tmp << 12; b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x00ff0000) >> 16); //R tmp = 15 * (b / 255.f); px |= tmp << 8; b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x0000ff00) >> 8); //G tmp = 15 * (b / 255.f); px |= tmp << 4; b = (BYTE)((((DWORD*)pSrcBuf)[x + (y * ImageWidth)] & 0x000000ff)); //B tmp = 15 * (b / 255.f); px |= tmp; pPx[X] = px; ++X; } pPx += Pitch; } [] [ここ壊れてます]
673 名前:636 mailto:sage [2021/04/25(日) 10:46:22.20 ID:sRfn5IZk.net] pPxは、32bitの時はDWORD*で、16bitの時はWORD*になってた。 全て載せると長くなるので変更すると速度が変わる部分だけ載せたよ。 16bitの方でも>>636 のダミーを入れれば遅くならないんだよね。 やっぱメモリが壊れてるのかな?
674 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:02:40.44 ID:vJWG11Gh.net] >>651 pSrcBuf, pPx, Pitch の型、及び、それらを初期化しているコードが重要。 そこに問題があるとバッファオーバーランしている可能性が捨てきれない。
675 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:04:39.40 ID:vJWG11Gh.net] >>653 「初期化しているコード」を載せる際、ImageWidth, ImageHeightとの 値の関係が分かるようにしてほしい。 要は、ちゃんとバッファの範囲内に読み書きが収まっているかどうかが知りたい。
676 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:19:47.09 ID:vJWG11Gh.net] >>652 例えば、pPxの指しているメモリーブロックのバイトサイズが、 Pitch * ImageHeight * (pPx の 1 要素当りのバイト数) 以上に、pSrcBufの指しているメモリーブロックのバイトサイズが、 ImageWidth * ImageHeight * 4 以上になっていることが重要。
677 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 11:46:51.84 ID:vJWG11Gh.net] そういえば、pSrcBufを((DWORD *)pSrcBuf)のようにキャストしてから使っている ことも気になる。 pSrcBuf = new DWORD [ImageWidth * ImageHeight] ではなく、 pSrcBuf = new BYTE [ImageWidth * ImageHeight * 4] などとしているのだろうか。
678 名前:636 mailto:sage [2021/04/25(日) 12:16:02.68 ID:sRfn5IZk.net] >>653-656 void *pSrcBuf; LONG Pitch; pPxは、16bitの時がWORD*で32bitの時がDWORD* という感じになってた。 初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね… でも思うのは初期化は、16bitと32bit大体同じで違うのはpPxの型くらいで それで>>650 の32bitのコードだと全然遅くならないから >>651 の16bitのコードの部分自体が何か変だったのかなと思ったんだけど ここ自体は大丈夫なのかな?
679 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:26:15.86 ID:QOuShU0Z.net] そもそも遅くなるって何分が何分になるん? 100分が103分ならそんなもんじゃね? としか思えないし
680 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 13:48:46.76 ID:sRfn5IZk.net] >>658 それが30秒が2分とか3分とかになっちゃって。
681 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:01:13.96 ID:9Nm1id/y.net] >>659 それだとせいぜい6倍くらいだね。 >>650 と >>651 だと 6倍くらいの差が出るのは当然だよ。
682 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:37:31.77 ID:sRfn5IZk.net] >>660 いやそうじゃなくて、>>636 のダミーコードを入れると 何故か速い速度になって、それを取り除くと遅くなってしまう感じ。 普通にコード書いてても関係ない部分を追加したりすると遅くなったり 速くなったりするからおかしいなと思ってて。
683 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:41:04.92 ID:9Nm1id/y.net] >>661 なるほど。では、 >初期化の部分がかなり複雑で結構辿って調べる必要があるんだよね… であったとしても、原因を特定するには、少なくともまずそこを丹念に 調べる必要がある。
684 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:41:34.25 ID:QOuShU0Z.net] >>661 とりあえず遅いコードと速いコードを晒してよ バッファーオーバーランで制御変数壊してるとかあるかも知れんし
685 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:45:29.68 ID:9Nm1id/y.net] >>661 そういえば、速い時でも30秒もかかっていることはとても気になる。 >>650 のコードだとどれくらいの時間になるの? 経験と勘で言えば、そのような平易なコードで30秒も掛かって、 時と場合により3分もかかるという現象が起きる場合、キャッシュ が乱れている可能性がある。 もしかして、どこかで極端にメモリーをランダムアクセスしてない? 巨大なメモリーの中を、極端に不連続な場所をあっちこっちアクセスする
686 名前:と キャッシュが聞きにくくなって、急激に遅くなることがある。 [] [ここ壊れてます]
687 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 14:57:01.28 ID:sRfn5IZk.net] >>662 確かにそこは念入りに調べる必要がありますね。 >>663 それが本当に>>636 をまったく関係ない部分に入れるだけで 速くなったりしてて。普通にコード書いてまったく関係ないところ追加したりすると 速くなったり遅くなったりするんだよね。一旦速くなったら弄らない限り遅くなる事はなくて 逆に一旦遅くなったら弄らない限り速くなったりする事はない感じ。 >>664 読み込んでメモリ操作する部分自体はかなり多い数をやってるので 20〜30秒くらいかかる時もある感じ。 読み込みとメモリ操作の部分で細かくメモリ確保と解放をやってるので それのせいもあるのかな?
688 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:04:55.13 ID:9Nm1id/y.net] >>665 >読み込んでメモリ操作する部分自体はかなり多い数をやってるので >20〜30秒くらいかかる時もある感じ。 話を総合すると、 >>650 のコードが、「20〜30秒くらいかかる」が、 >>651 のコードが、速い時には「30秒」 ということになるが、コードを見る限り、651のコードは650の コードの10倍以上かかっても不思議ではないコードになっているので、 この速度差はむしろ、少な過ぎる。 むしろ、>>651 のコードは「3分」かかっている方が、 長年の経験と勘では正常に思える。
689 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:13:30.56 ID:CFgRAQQ/.net] 読込とか細かいメモリー確保とかコードに無いこと言われてもエスパーじゃないのでどうしょうもないな 悪いけど情報出せないなら他でやってくれ
690 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:19:48.04 ID:sRfn5IZk.net] >>666 今チェックしたら650の方が少し速かったですw 650が12秒くらいで、651が22秒くらいでした これが速い場合で、651が遅い場合は2分くらいでした。 650は遅くなることがないです。 >>667 ほんとうにそうですね。 とりあえず晒した所が大丈夫なら 他の部分は自分で調べてみようと思います。
691 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 15:45:51.96 ID:S2tV53BX.net] >>668 >今チェックしたら650の方が少し速かったですw >650が12秒くらいで、651が22秒くらいでした >これが速い場合で、651が遅い場合は2分くらいでした。 >650は遅くなることがないです。 これだけでも重要なことが分かる。以後は、処理時間に関する(数学的な)定量的な話になる。 まず、650と651の速度差が1.8倍程度しかないことからすると、 pSrcBuf と pPx の読み書きに相当時間が掛かっていることを示唆している。 650と651のソースを比較した時、計算部分の処理がとても増加しているが、 読み書きはキャッシュまで考慮すると、650と651で差が出ない。 651では、pSrcBufからは何度も読み込まれているが、最初に一回読み込まれた後はキャッシュに乗っているため、 複数回読んだからといって時間増大の原因にはなりにくい。 651では割り算や掛け算の計算量が物凄く増えているのにそれが比率にして 0.8 にしかなっていない。 (割り算や掛け算は本質的に遅いことはこの議論に置いて重要である。) 大量の割り算、掛け算に掛かっている時間が 0.8しかないのに、高々1回ずつのメモリーへの読み書きが 1.0 の時間 かかっていることに着目すると、1ピクセルあたり、データバス-CPU間の転送の観点で言って、 pSrcBufからの「一回の」読み込みとpPxへの一回の書き込みに、かなり時間が掛かっていることを意味する。 データがキャッシュに乗っていれば、ここまでの時間が掛からないので、 長年の経験と勘によれば、このような事態が起きたとき、CPUの中のすべてのキャッシュを一掃してしまっていることが多い。 だから、例えば、バックグラウンドで他のアプリが動いていたりすると、キャッシュを 復活させるために物凄く時間が掛かることがある。 それで、他のアプリがメモリーを復活させようとしたかしていないかによって、 OS全体としての処理時間が如実に変わる現象が起きることがある。 これが、今回の奇妙な現象が起きている原因かも知れない。
692 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 16:25:58.61 ID:sRfn5IZk.net] >>669 細かい分析ありがとう。 だとしたら>>636 のダミーを入れると速くなるのも そのキャッシュの原因に何か関係してるのかな? でも今まで>>665 でも書いたように一旦遅くなったら 遅くなったままで、速くなったら速くなったままなんだよね… コード弄らない限り。 もしかすると何か条件が重なればコードを弄らなくても遅くなったり 速くなったりすることもあるのかもしれないけど。今のところは確認出来てない感じ。
693 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 16:32:43.41 ID:S2tV53BX.net] >>670 それより、650のコードで12秒も掛かっていることにかなり違和感を覚える。 ImageWidth が、ImageHeight が 2000 位までなら、4*10^6 ピクセルくらいで、 32BIT RGBカラーだとしても16MB位。 いまのCPUだと、>>650 のコードくらいで12秒も掛かるはずは無い。 大雑多な予測だと、3.0GHzのCPUで、10(ms)くらいまでのはず。 ImageWidth や ImageHeight の値はいくらくらいになってる?
694 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 17:04:17.68 ID:/0G3TNx0.net] 650は最適化で X も x も同じ値で遷移していくし内側のループは memcpy 相当のブロック転送におきかわりそうだけど
695 名前:デフォルトの名無しさん mailto:sage [2021/04/25(日) 20:18:48.31 ID:j6IXZwA/.net] 650使えば遅くならないならいったん解決?
696 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 01:18:20.13 ID:0cli3R6k.net] >>671 大きな画像(2048*2048)とかを結構読み込んでて。 読み込み処理自体は他の部分もあるのでそのくらいになってしまってる感じ。 >>672-673 一応は650にすれば何の異常もなくとても速く動作はするんだけど 出来れば原因が知りたいと思ってて。難しいならもうあきらめるけど。
697 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 01:51:09.48 ID:u7NjNSbC.net] >>674 ファイルから読み込んでるらしいけど、fseek をループの中で多数回使うと 使わない場合と比べて劇的に遅くなるけど、seek 系の関数は使ってない?
698 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:03:22.38 ID:+l9LtKe6.net] ファイル読み込みの部分でHDDキャッシュがかかってるかどうかだったり よくある話
699 名前:636 mailto:sage [2021/04/26(月) 02:36:05.57 ID:0cli3R6k.net] 色々と試行錯誤してたら >>651 のコードのこの部分を for(int x = 0; x < ImageWidth; ++x){ このように書き換えたら普通に速くなったw for(int x = 0; x < ImageWidth / 1.0f; ++x){ なんか最適化が効いたり効かなかったりみたいな差に感じてしまう。 そういう原因なのかな?
700 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:37:06.08 ID:u7NjNSbC.net] >>674 2048 * 2048 ドットの画像だとベタデータにしたとき16MBになってしまうので、 それを沢山読み込むとメモリー不足になり仮想記憶が働いてしまっている可能性も 有るかも知れない。どれくらいの枚数読んでいるか知らないのでなんとも 言えないけど。
701 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:39:54.17 ID:u7NjNSbC.net] >>677 使ってるのはVisualStudioのようだけど、速度を測定する時には、ちゃんと Release版にして最適化は有効にしてる? DebugPrintを使っているなら最適化はOFFになってるのでは?
702 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:43:34.12 ID:0cli3R6k.net] >>678 でも>>677 の修正で速度が劇的に変化するのはなんでなんだろう? >>679 Releaseで調べてるよ。OutputDebugStringはReleaseモードでも使えるので。
703 名前:デフォルトの名無しさん mailto:sage [2021/04/26(月) 02:46:30.17 ID:0cli3R6k.net] >>677 の修正をしたあと、>>636 のダミーコードを 追加したらなんと今度は遅くなったwwなんでだ?w >>636 のダミーコードだけ追加したら速くなって ダミーコードを削除すると遅くなる その遅くなった状態で>>677 の修正をすると速くなる その速くなった状態で>>636 のダミーコードを入れると 今度は遅くなるww
704 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 02:43:12.80 ID:qV+SOSDm.net] 状況から察するに、おそらく君が見ている部分じゃない どこかに根本的な問題がある、という気がする なんとなくだけど、バッファオーバラン系のような気がする
705 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 05:25:14.56 ID:Vf/GSwOl.net] >>682 どこかに問題がありそうですよね。 バッファオーバラン系は問題あっても動いてしまう事があるから怖いですね。 地道に調べて行くことにします。
706 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 11:47:32.64 ID:V9b4VlmB.net] それより、12秒間も大量のメモリーを使う状態でCPUがフル
707 名前:パワー状態になっている とすれば、フル・キャッシュ汚染してる可能性がある。 フル・キャッシュ汚染すると、その後しばらくの間、キャッシュを取り戻すために 速度が不安定になるから、説明可能。 [] [ここ壊れてます]
708 名前:デフォルトの名無しさん mailto:sage [2021/04/27(火) 12:52:21.01 ID:cPrICHbO.net] Meltdowm や Spector 対策のパッチの影響とか? 特定のパターンのメモリアクセスに対して例えばなんかのトラップが働いてキャッシュをクリアし、ダミーコード入れるとそのパターンが崩れてそういう処理が入らないとか。
709 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 02:54:54.42 ID:XgRH6ChF.net] >>684-685 みなさんありがとうございます。 色々な問題が考えられそうですね。参考になります。 もう少しコード弄りながら挙動を調べて行きたいと思います。
710 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 04:32:07.96 ID:v8E9sca8.net] >>686 なお、y方向に関して、メモリーを上下逆さまに読んでいっているところがあるが、 本当はそういうのはDDR-Memoryやキャッシュと余り相性が良くない。 しょうがないけれども。 それでも、x方向には「順方向」に読んでいるからまだなんとかなっている。 完全にメモリーを逆方向に読んだりすると、低速化の原因になる。 この場合には難しいが、なるべくならメモリーは順方向にアクセスした方が 速くなる。DDR-MemoryはBurst転送が基本なので。 キャッシュに乗っていれば、逆方向でもなんとかなるが、キャッシュから 外れると、DDR-MemoryのBurst転送とは逆方向にアクセスするのは 速度低下の原因になる可能性が出てくる。絶対ではないが。
711 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 10:42:03.12 ID:XgRH6ChF.net] >>687 そういう問題もあるんですね。とても詳しくて勉強になります。 ありがとうございます!
712 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 11:32:29.48 ID:oswWyFbg.net] >>687 読み書き方向が逆になるなら、読む方を順方向にすると良さそうだと思うけどどう思う?
713 名前:デフォルトの名無しさん [2021/04/28(水) 13:14:16.90 ID:WdoV9Bq9.net] >>689 コンパイラのくせに生意気だぞ
714 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 13:16:59.82 ID:jQpDsyge.net] >>689 実は昨日の夜から、俺もそう思ってた。 今は、 読む方が逆方向で、書く方が順方向になってしまっているが 読む方を順方向に、書く方を逆方向にした方が DDR-SDRAM や キャッシュの 仕組みから行って速くなる可能性が高い。
715 名前:デフォルトの名無しさん mailto:sage [2021/04/28(水) 14:04:09.00 ID:4fcF+gv5.net] Windows の bitmap で ファイル中の配置や CreateDIBSection() で戻ってくるメモリの配置だな デフォで bottom - up の方向 カメラのフレームとかは top - down な方向 ん?メモリ操作なコードだけど実はメモリマップドファイルだったりして
716 名前:デフォルトの名無しさん [2021/04/28(水) 15:30:36.23 ID:WdoV9Bq9.net] 走査線と描画が重なったらチラツキが激しくなるから下から描いていくんだよ
717 名前:デフォルトの名無しさん [2021/06/14(月) 15:32:51.34 ID:TE2ntQhj.net] for(int a=0; ...; ...){...} とかはループ内だけのスコープで int a が使えるのに int a; while(a){...} とか int a; do{...}while(a); とかは while(int a=...){...} ←これだけはOK? とか do{...}while(int a=...); とか do{int a; ...}while(a); みたいに書けないのはなぜ?
718 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 15:40:36.46 ID:peg/OyGg.net] do{...}while(int a=...); 宣言より前に変数を使用する do{int a; ...}while(a); スコープの外に変数を持ち出す
719 名前:はちみつ餃子 mailto:sage [2021/06/14(月) 17:56:57.54 ID:fvxG9/iR.net] >>694 C/C++ の理屈では波括弧の部分は繰り返しの構文 (do や while) の一部ではない。 たとえば while の文法は while ( expression ) statement というように定義されていて、 statement ってのは要するに文をひとつ書けるってことね。 で、 statement として複文 (波括弧によって複数の文をひとつにまとめたブロック) もありうるってことになってる。 そんでもってブロックの先頭で宣言された変数のスコープに関するルールはブロックのほうに書かれていて、 繰り返しの構文のときだけ特別扱いということは出来んのだわ。 > while(int a=...){...} ←これだけはOK? これは C++ では良いけど C では駄目
720 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 18:58:23.47 ID:HtMoZ8Hn.net] 小さいスコープの中だけで使う自動変数だってんで 特に if や for 等なく いきなりカラス括弧開いて変数宣言することがままある
721 名前:デフォルトの名無しさん [2021/06/14(月) 21:48:16.36 ID:OzvaLd6A.net] C++ってOSレイヤで差異が有るファイルシステムの事を考慮せずにプログラムを書ける済む仕組みって組み込まれてるの?
722 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 21:53:52.73 ID:VOy4fGQR.net] 標準ライブラリに含まれるファイルシステムライブラリでできる範囲の操作なら差異は出にくいと思うけど
723 名前:デフォルトの名無しさん mailto:sage [2021/06/14(月) 22:00:33.63 ID:eQ9/Z+Eb.net] >>694 ,696 C++でもwhileの判定式中の宣言は毎回新しくなるんで、使いみち思いつかん。 while(int i=10) { i--; } は、無限ループになる。 できるとしたら、処理が終わったらすぐに始末したいobjに対して、 { myclass obj(); while(obj) { obj.some_op(); } } (obj は operator bool() とか実装してる前提) が、 while(auto obj = myclass()) { obj.some_op(); } こんな風にかけてちょっと{}がスッキリするくらい?(実際はobjが毎度構築される)
724 名前:デフォルトの名無しさん [2021/06/14(月) 23:04:55.36 ID:wv1U8ajF.net] カラス括弧! 初めて見た!
725 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 08:13:38.32 ID:4rRZmg7L.net] >>700 まあ while(...){} は for(; ...;){} で書けるしメリットないかな ただ do{ int a = …; }while(a); の方は書けたら嬉しいな 使用頻度は低いけど
726 名前:デフォルトの名無しさん mailto:sage [2021/06/15(火) 10:57:08.11 ID:5dh+WKsO.net] do は do .. while(0) のパターンしか使わないな。
727 名前:デフォルトの名無しさん mailto:sage [2021/06/17(木) 23:23:03.28 ID:Gx3mnqFH.net] break用なら switch(0)default:{...} っしょ?
728 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 08:43:02.57 ID:R4m5mk7U.net] それdoよりどういうメリットある? わざわざdefault:書かないとならないしインデント深くなりそうだし。
729 名前:デフォルトの名無しさん [2021/06/18(金) 11:21:27.64 ID:FZUuAAIq.net] マクロで展開するならインデントは無視できる
730 名前:デフォルトの名無しさん [2021/06/18(金) 11:50:10.76 ID:7Huy+AZL.net] do{}while(0) は最後に ; 書く前提だし矛盾ないけど switch(0)default:{...} は ; の扱いの困らない?
731 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 11:55:35.37 ID:AVf6Ht59.net] for (int i = 0; i < 1; i++)
732 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 12:32:57.03 ID:6AzE04jr.net] { } 内スコープからの脱出で break; 使いたいってのと マクロで見た目関数向けな #define foo(arg) do { なんちゃらかんちゃら } while(0) do { } while(0) は両立できるけど switch(0)default:{} で後者は怪しげ if (<condition>) foo(arg); else <elsecase>; とかが
733 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 13:25:48.49 ID:7Huy+AZL.net] while(1){ ... break; // } の直前 } で良いと思う
734 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:27:23.16 ID:tn5JYHw4.net] それどういう意図があんの? 処理は結局1回 スコープだけじゃダメなん?
735 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 14:44:41.04 ID:tzOvIsZE.net] >>710 お前が良いと思うなら使えばいいと思うが俺には無駄なbreakが必要なのはダ
736 名前:Tいと思うから do { ... } while(0); にするわ [] [ここ壊れてます]
737 名前:デフォルトの名無しさん mailto:sage [2021/06/18(金) 20:29:59.97 ID:R4m5mk7U.net] >>706 マクロはフォーマッタでの扱いが定まらんから制御構造では使いたくないのよな。 セミコロンで終端しておかないとインデントがおかしくなるとか、後続に開きブレースを置くと やっぱりインデントが変になるとか。
738 名前:デフォルトの名無しさん [2021/06/19(土) 12:53:56.96 ID:EDF+B3Dq.net] #define breakblock switch(0)defalut: でいいやん できないとか怪しげとか意味不明 マクロ化する必然性がそもそもわかんないけど
739 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 13:08:34.87 ID:AhXAE8oj.net] そこまでして switch(0) 使う理由がよくわからん。 do while(0) と比べてどういうところが良いの?
740 名前:デフォルトの名無しさん [2021/06/19(土) 13:21:09.67 ID:ylfkd6bV.net] マクロの例でもわかるように波括弧を単独で使える 変な処理が始まってんの一目瞭然 continueもgotoで(goto使わない別ルーチン探せよw 等 #define breakblock(a) uniqelonglongprefix##a:switch(0)default: #define bbcontinue(a) goto uniqlonglongprefix##a
741 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 14:04:38.18 ID:AhXAE8oj.net] >マクロの例でもわかるように波括弧を単独で使える ようは末尾に while(0); を書かなきゃならないのが嫌ってことかな。 わからんでもないが、自分はマクロや default: より気にならないからいいや。
742 名前:デフォルトの名無しさん mailto:sage [2021/06/19(土) 16:30:22.52 ID:8gjebq3e.net] #define foo(arg) switch(0)default:{ なんとかかんとか } これはキモイ
743 名前:デフォルトの名無しさん [2021/06/20(日) 18:26:02.94 ID:3hmKhJNO.net] でもその構文はdefineで置き換え前提で使ってるとしか思えない
744 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 19:15:11.97 ID:XoXh1cqB.net] goto書くと死んじゃう人は大変だなぁ Dijkstraもそこまでは言ってないらしいぞ
745 名前:デフォルトの名無しさん mailto:sage [2021/06/20(日) 22:56:11.58 ID:R7oo70Ox.net] ナンチャラカンチャラの人のdefine使用意図が無意味すぎてどうもc言語エアプなんじゃないかと疑う
746 名前:デフォルトの名無しさん mailto:sage [2021/06/21(月) 16:42:57.66 ID:iJjBc6fp.net] switchのやつは最後にbreakかfall throughってコメント書いとかないと文句言うチェッカとかありそう
747 名前:デフォルトの名無しさん mailto:sage [2021/06/29(火) 11:07:55.25 ID:HA4DrIsJ.net] do { int a; : } while(a); ↓ for(int a;;) { : if(!a) break; } でいいんじゃない?
748 名前:デフォルトの名無しさん mailto:sage [2021/07/05(月) 16:13:31.07 ID:3/iVgePD.net] 別のところで質問したのですが、初心者歓迎スレのほうがいいと思いこちらで質問し直します。 Macのclang++でコンパイルしています。 cstdlibをインクルードしなくてもrand()が使えてしまうのですが、これはなぜでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2021/07/06(火) 01:49:57.37 ID:w3zU8vH7.net] >>724 手元のM1のでやったら普通にエラーになるけど? printf("%d",rand()); だけ書いたやつ。 clangでもデフォはエラーだったような。C言語の方はコンパイルオプションで通せる。暗黙の関数宣言。 すまん、役に立てなくて。
750 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 05:58:16.49 ID:kwaneL8R.net] >>724 ヘッダファイルが他のヘッダファイルを内部で include している場合は有りうる。 たとえば iostream を include したら自動的に ios や istream なども include されることは保証された動作。 ただ、 cstdlib を (間接的に) include すると仕様で明言している標準ヘッダはないと思うので rand がどこかで勝手に宣言されているのだとしたら処理系の固有の動作だと思う。 -M オプションで (間接的に include されているものも含めて) 依存関係があるヘッダファイルを 抽出できるからそれで確認できるよ。
751 名前:724 mailto:sage [2021/07/06(火) 08:23:42.
] [ここ壊れてます]
752 名前:24 ID:9fUGxcs8.net mailto: >>725 ありがとうございます。M1のclangではエラーが返るのですか…。コンパイラのバージョンの問題ですかね? >>726 ありがとうございます。-M試してみました。 インクルードはiostreamだけにしていたのですが、ぞろぞろヘッダーファイル出てきまして、その中にcstdlibもstdlib.hもありました。 iostreamのインクルードを外すと当たり前でしょうが、それらのヘッダーファイルは表示されなくなりました。 つまり、iostream以下のヘッダファイルの依存関係にcstdlibがいたということですよね? これは処理系依存なのでしょうか? [] [ここ壊れてます]
753 名前:はちみつ餃子 mailto:sage [2021/07/06(火) 08:56:08.30 ID:kwaneL8R.net] >>727 処理系依存だと思う。 iostream が暗黙に include すると仕様に明記しているのは ios, streambuf, istream, ostream の 4 つ。 https://timsong-cpp.github.io/cppwp/n3337/iostream.objects.overview あえていうなら cstdio の機能と結び付けるのが役割であるようにほのめかされている ので普通の実装なら cstdio も include することになると考えてもいいと思うけど、 それ以上のことについてはっきりしたことは書かれてない。 rand が必要なら (たとえ実態として間接的に cstdlib が include されていても) プログラマは明示的に cstdlib を include するほうがいい。 というか、そもそも論としてはいまどき rand を使うのは避けるほうが賢明な考えだと思うけどね。
754 名前:724 mailto:sage [2021/07/07(水) 08:49:49.95 ID:O+5oUfAp.net] >>728 なるほど、そもそも論まで含めてよくわかりました! ありがとうございました!
755 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:37:14.99 ID:We+HIKc2.net] C言語にpthreadを使ってマルチスレッドにするときの初歩的な質問をしたいのですが、 大域変数を複数のスレッドが読み書きする部分はミューテックスでロックしないとマズい、という 説明はわかった気がします。 では読むだけの部分はどうでしょうか。単にスレッドが変数の値を読みに行った瞬間の値を 知りたいだけならば、別にロックはしなくても害はないような気もしますが.... プログラム内の 別の箇所で書き込む部分はロックして、おかしなことが起こらないようにするとして。 それとも読むだけの場合もロック(書き込む場合に使うじミューテックスでロック)は必要でしょうか。
756 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 19:46:28.14 ID:TIX9j1Dy.net] 必要ないぞ
757 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:27:55.69 ID:wrMb4YqN.net] 必要だぞ
758 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 21:31:49.00 ID:RRTM5Oms.net] >>730 スレッド実行中に書き換わる可能性があるなら必要。 変数を読むといってもCPUは一度内部のレジスタに読み込まないと処理できないので、 スレッド1でレジスタに読み込む→スレッド2で変数を書き換える→スレッド1に結果が反映されない という事態が発生する可能性がある。
759 名前:デフォルトの名無しさん mailto:sage [2021/07/09(金) 22:32:02.32 ID:eGF9BJZ0.net] >>733 それ反映する必要ないだろ 単にスレッド1が先に読んだだけだし それより読み書きがアトミックでないなら読み出し時にも排他しないと書き換え中の変な値を読んじゃうかと
760 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 01:06:02.19 ID:iVyIfxP9.net] 書き換え後に古い値を取得してもええの?
761 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 04:35:16.68 ID:jD2ZKaD3.net] ええ場合もある 「単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ」はそれでええ場合のように聞こえるな
762 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:28:04.15 ID:TJHT9gxK.net] ええ場合も何も読んだ後で書き換えられたのをどうやって反映させるつもりなんだよ…
763 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:33:10.76 ID:Tru2G6zE.net] 関連する操作すべてを優先順付きキュー経由にし 巻き戻し必要な操作にはジャーナル機能も入れ やり直し再キューすんのよ
764 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 05:36:14.97 ID:N1Z7W
] [ここ壊れてます]
765 名前:Bqy.net mailto: 別スレッドからflgをいじって停止できるように while (flg) {...} と書いても、{...}の内部でflgをいじってないなら、 最適化で単なる無限ループに書き換えられて、flg変えても止まらない、 みたいな話なかったっけ。 [] [ここ壊れてます]
766 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 06:47:09.06 ID:TJHT9gxK.net] >>739 それはまた違う話 volatile c言語 とかでぐぐれ
767 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 07:11:18.51 ID:JKFXuD7+.net] スレッドAが 16bit長の整数を書き換える スレッドBが 同じ16bit長の整数を読み込もうとしたとき 8bit長でしかアトミックな操作が保証されてないシステムだと 初期状態 0x0000 で スレッドA が 0xFFFF と書き換える A書き込み 上位FF (スイッチ) B読み込み 上位FF B読み込み 下位00 (スイッチ) A書き込み 下位FF こういうことが起き得るという話でいいんかな
768 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:27:22.56 ID:N9R+gZBb.net] >>734 いや、先に読んだだけっていっても、例えば i f (v==1) みたいな条件式を評価した段階では1だったけど、その先で急に2に変わった、とかだったらまずいだろw
769 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:34:33.02 ID:EesV0O7a.net] 質問者の文言が >単にスレッドが変数の値を読みに行った瞬間の値を知りたいだけ >読みに行った瞬間の値を知りたいだけ なので必要なし 以上
770 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:39:13.41 ID:fOJ6OsHP.net] >>742 何もまずくないだろ…
771 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 08:48:41.36 ID:N9R+gZBb.net] >>744 ifの中ではもう一度vの値を読んだときには2になってたりするわけよ vが1の前提で書いたコードの中に2を突っ込んだらまずいよ
772 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:11:07.28 ID:16vz6VAu.net] >もう一度vの値を読んだとき まずいのはこっちであって>>742 のifや>>733 自体は問題ないんでは。
773 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:15:23.13 ID:nctQkkF+.net] 質問者が言ってないことに加えて勝手に仮定を追加してまずいとか言ってる>>745 はもう黙ってほしい
774 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 09:51:11.89 ID:6bm+w6Lu.net] まずいのは>>745 の頭だったというオチw
775 名前:はちみつ餃子 mailto:sage [2021/07/10(土) 09:56:52.21 ID:11oc3t46.net] >>730 結論から言うとロックは必要。 同一のメモリに対するアクセスの少なくとも一方が書き込みである場合には衝突すると定義されている。 https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#4 その場合にはデータ競合が発生する。 https://timsong-cpp.github.io/cppwp/n3337/intro.multithread#21 同時に起こりうるアクセスの内でひとつでも書き込みが存在したらそれはデータ競合の可能性があるってこと。 ミューテックスはミューテックスの所有権を取り合うことで競合を阻止する仕組み。 ロックというのは「ミューテックスをロックする (ロックしている間は自分がミューテックスの所有権を持っている)」 ということであって、対象となるデータそのもののアクセスを直接的に制御してるわけじゃないので、 書き込み側でロックするだけでは意味がない。
776 名前:デフォルトの名無しさん mailto:sage [2021/07/10(土) 10:17:52.46 ID:fOJ6OsHP.net] >>749 at least one of which is not atomic の意味ぐらいは理解してからレスしなよ
777 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 08:43:59.78 ID:Y3qBMERg.net] >>749 質問者は衝突しても問題ないケースで排他は必要かどうかを聞きたいんだろ
778 名前:デフォルトの名無しさん mailto:sage [2021/07/12(月) 12:14:53.15 ID:uJpO0uZ2.net] 「衝突しても問題ない」&atomicも使わない=「データ競合となっても問題ない」=「動作が未定義でも問題ない」なら 確かにロックは不要だけど。
779 名前:730 mailto:sage [2021/07/12(月) 15:19:59.68 ID:VxiBn2TN.net] 730です、どうもお騒が
780 名前:ウせしております。 どうやら読み出しだけのときも基本的にはミューテックスを使うべきのようですね。 私の場合は域変数をカウンタとして使っていてその値をログ出力する、というような状況で、 なんとなくミューテックなしでもいいかと思ったのですが、ミューテックスを使わない場合は 気持ち悪い値がプリントされている感じですかね。 一般的な状況では、ミューテックスを使わなくても実害がないかを考えるよりはちゃんと ミューテックスを使った方がよさそうですね... [] [ここ壊れてます]
781 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 17:41:58.36 ID:DZW75fJj.net] 「今値を書いてるから 書き終わるまで待て」と待たす相手は 次にそこへ書き込むヤツだけじゃなく そこを読込もうとしたヤツも対象にしとけば ちゃんと書き終わった値が読込める 中途半端に書いてる最中であっても意図的に抜き出したいのなら 書き終わるまで待たずに読む そしてみゅーてっくすの激しい握り合い
782 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 19:15:08.97 ID:Cs3wNevb.net] >>753 単純なカウンタみたいなアトミックに読み書きできるような変数なら排他は不要だよ
783 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:10:22.43 ID:+UxqO86S.net] >>755 なんでそんな嘘を教えようとするの?
784 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 20:55:03.74 ID:Cs3wNevb.net] >>756 >>749 のリンク先読めばわかると思うけど競合が発生して結果が未定義になるのは > at least one of which is not atomic のケースね
785 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:33:13.25 ID:+UxqO86S.net] >>757 そこで言ってる "atomic" の意味は std::atomic<int> ならOKで int はダメという話なんだけど、 「単純なカウンタみたいなアトミックに読み書きできるような変数」って言い換えちゃったらどっちもOKに読めちゃうでしょ。
786 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 21:39:13.87 ID:Cs3wNevb.net] >>758 intがダメなのは>>741 みたいなケースね > 「単純なカウンタみたいなアトミックに読み書きできるような変数」 でだめだと言うなら実例教えて
787 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:40:14.76 ID:31Jksjnm.net] 単純なカウンタがアトミックに読み書きできるかは 基本型の宣言だけではわからんから アトミック化の指示ができるならやっとけ ということでいいんでないの?
788 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 22:49:59.37 ID:Cs3wNevb.net] >>760 そのスタンスでいいと思うよ 俺はアトミックに読み書きできるケースなのに嘘とか言ってる>>756 がなんか特殊なケースを知ってるのかな?って思ってるだけ
789 名前:デフォルトの名無しさん mailto:sage [2021/07/13(火) 23:59:32.08 ID:31Jksjnm.net] 指示ができない場合にはアトミックに操作できる保証なんてないから 排他したほうがいいぜって立場
790 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 00:44:44.53 ID:pCGEFvrX.net] >>759 生の int に複数スレッドから排他なしでアクセスしてたらその時点で未定義動作=ダメなんだってば。 未定義動作となる場合に必ず期待に反するコードが生成されるわけでもないんで、実例を出せというのも意味が無い。 (実例が無いからといって「敢えて」未定義動作に誘導するというのは意味が無いどころか有害。) ・・・スレッドサニタイザで引っかかってウザい、とか言えば「実例」として納得してくれるの?
791 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 01:04:57.94 ID:b90ql0x3.net] 生のintへのアクセスがアトミックに行えるかって処理系が保証したりしないのけ
792 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 05:39:14.15 ID:dtsN+T48.net] https://stackoverflow.com/questions/35226128/are-c-c-fundamental-types-atomic
793 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 06:51:23.81 ID:3FmZNcD6.net] >>764 保証してる処理系なら std::atomic<int> でオーバーヘッドは生じない、つまり排他は要らんってことでしょ >>756 がなんか実例知ってるかと思ってたけど単なる規格厨だったなw
794 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 12:49:26.09 ID:pCGEFvrX.net] >>766 オーバーヘッドが生じるかどうかで考えてるなら(それもおかしいんだけど)、こんな例を見れば考えを改めてくれたり
795 名前:するの? https://godbolt.org/z/6oM5oevsY #include <atomic> int load(std::atomic<int> const& x) { return x; } int load(int const& x) { return x; } ↓ARM64 gcc 11.1 -O2 load(std::atomic<int> const&): ldar w0, [x0] ret load(int const&): ldr w0, [x0] ret [] [ここ壊れてます]
796 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 18:54:32.14 ID:VBWUb4q7.net] >>767 それメモリーバリアの話で排他の話じゃないけど、何を言いたいの?w
797 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:20:02.20 ID:pCGEFvrX.net] >>768 766 が「オーバーヘッドは生じない」ならば「排他は要らん」という論理らしいので 「オーバーヘッドは生じない」を否定すれば「排他は要らん」とかいう嘘を言わなくなってくれるかなと思って書いてみた。 オーバヘッドの発生と排他の要・不要とが 766 の頭の中でどう繋がってるのかは知らない。
798 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 19:25:42.08 ID:VBWUb4q7.net] >>769 まあメモリーバリアも一種のオーバーヘッドと言えなくもないがそういう話でないことぐらいはわかりそうなもんだけどねw で、排他が必要な例は見つかったの?
799 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:14:07.80 ID:pCGEFvrX.net] >>770 ごめんよ。元から意味が分からなかったところ「オーバーヘッド」の意味が何か文字通りの意味じゃなかった みたいだし、もうどういう話なのかさっぱりだわ。 767 の「オーバーヘッド」が何を指すのか、それと排他の要・不要との繋がりがわかるようだったら解説よろしく。 「排他が必要な例」と言われても、こっちとしては複数スレッドで生の int を読み書きするなら 常に排他が必要という認識なんで文字通り「排他が必要な例」なら無数にあるんだよね。 そういうのを挙げても謎理論で「不要だろ」とか「コレジャナイ」って言うだけで話は進まなさそう。 ここまでの流れを読めば >>755 をうっかり信じちゃう人もいないだろうし、もう放置でいいかなという気になってる。
800 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:22:20.00 ID:cMMfM4oH.net] >>771 あえて指摘しなかったけどstd::atomicでは既定のメモリーオーダーがseq_cstであることを知らんのか? 自分で「あんたの言うオーバーヘッド」かかる書き方してオーバーヘッドかかるから排他ガーとか意味不明なんですけど?w そもそもstd::atomicは必ず排他かかるわけでもないし人を嘘つき呼ばわりするならもう少し勉強した方が恥をかかなくて済むと思うよ
801 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 20:35:16.14 ID:pCGEFvrX.net] >>772 ごめんそれは知ってるよ。でもそれを知ってる知識レベルの人が >755 のような主張をしてるとは思わなかったんだ。 あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。意味不明なのには同意する。 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。
802 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 22:17:32.53 ID:cMMfM4oH.net] >>773 > ごめんそれは知ってるよ。 えっ? 知ってて>>767 ってそれこそ意味不明なんですけどw 結局何を言いたかったの? > あと繰り返しだけど「オーバーヘッドかかるから排他ガー」とか言ってるのは >766 だけね。 ああマジで日本語の理解力がないのね (もちろん環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない って話ね 念の為に言っておくけど>>764 が言うようなハード上の排他制御は別の話ね > 意味不明なのには同意する。 同意なんていらんから>>767 を書いた意味を説明してよ > 「std::atomicは必ず排他かかるわけでもない」は正しいけど、それと >755 が嘘であることに関係は無い。 嘘だと言うなら根拠を示したほうが良いと思うよ まあ示せないからグダグダ言うとか関係の無いメモリーオーダーの話とかにそらそうとしてるんだろうけど…
803 名前:デフォルトの名無しさん mailto:sage [2021/07/14(水) 23:08:12.27 ID:pCGEFvrX.net] >>774 「767を書いた意味」なら>>769 で説明した。 「環境によるけど)std::atomic使っても生のintと同じようにアクセスできる = 排他なんてしてない」これは正しい。 でもそれは生の int でデータ競合を避けられる理由にはならない。 >>755 が嘘だという根拠は >>749 に挙げられた規定による。その条件 "at least one of which is not atomic" について、生の int へのアクセスは "not atomic" に該当するから排他なしのアクセスでは未定義動作となりダメだと言っている。 規格文面の "atomic" は、規格が規定する C++ 抽象機械上の概念という認識。 対して 755 は、規格文面の "atomic" は各処理系でのメモリアクセスが実際にアトミックかどうかに依ると考えてそう。 残念ながら規格の文面で明確にその解釈を否定できないんだけど (https://cplusplus.github.io/LWG/issue2506) 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。
804 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 05:14:12.89 ID:oWQENBCT.net] >>775 > 「767を書いた意味」なら>>769 で説明した。 あああのメモリーバリアと排他の区別もついてないアホ丸出しの説明ねw > 少なくとも現メモリモデル策定当時から Web 上に積み上げられている多くの記事(標準化委員会の↑含む)や > 現行コンパイラ(最適化、スレッドサニタイザなど)での扱いと合致しない。 百歩譲ってstd::atomic使えと言うのはいいけど、排他は必須じゃないだろ
805 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 06:52:54.80 ID:DRiXJTFv.net] charはatomicなの?規格にどれがatomicだってあるの? どれがatomicかなんて、CPU毎に違って当然だと思ってたわ
806 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 07:50:32.57 ID:oWQENBCT.net] >>777 CPU毎と言うかシステム毎に違うだろ
807 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 08:52:46.15 ID:JIUDKEB4.net] >>776 うん。データ競合を回避するにあたって std::atomic を使えば排他は必須じゃなくなるよ。 ミューテックスを使うなどの排他(順序付け)でも回避できて、どっちかでもいいし両方でもいい。 >>755 が嘘だという点には異論なくなったみたいだね。よかったよかった。
808 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 09:20:51.24 ID:oWQENBCT.net] >>775 排他は要らんケースがあると言うだけの話 ちなみに>>755 では生intなんて一言も書いてないけどね std::atomic<int>でも多くの環境では > 単純なカウンタみたいなアトミックに読み書きできるような変数になるしな まあ結局規格ガーって言うしかないレベルの低い規格厨が関係のないメモリーバリアーとか出してきて恥を晒しただけだったなw
809 名前:デフォルトの名無しさん mailto:sage [2021/07/15(木) 10:06:00.17 ID:ux6gJq+a.net] お前ら暇すぎやろ
810 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:50:56.40 ID:VEABT8DF.net] C++ のバイナリ互換性についてお聞きしたいのですが。C++ のライブラリの中に以下のようなものが あったとします。 class A { char *p1; }; class B { /* 略 */ }; class C { A a; B b; }; で、class A に新たな要素を追加して class A { char *p1; char *p2; }; としてからライブラリを再ビルドし、以前のアプリのバイナリと混在させると、class C 内で a のサイズ が変わる結果 b へのオフセットが変わりクラッシュするようです。 そこでふと思ったのですが、class A に最初から class A { char *p1; char *p2; char *p3; char *p4; }; 等と最初からある程度要素を確保しておき、必要に応じ上の方から使っていく、みたいなやり方は アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?)
811 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 19:57:58.75 ID:SwFfvD28.net] pimpl使え
812 名前:デフォルトの名無しさん mailto:sage [2021/07/30(金) 21:01:43.73 ID:y9Kee4rz.net] >>782 素直にC.aやC.bをポインタにすりゃいいだけちゃう?
813 名前:まあ俺が言うのもなんだがw mailto:sage [2021/07/31(土) 22:17:00.01 ID:m7lSxL/B.net] >>782 クラス定義が変わったのにそれを使う一部のコードを再ビルドしないってこと? > そこでふと思ったのですが > (中略) > アリでしょうか? (b へアクセスするときのクラッシュを防げるでしょうか?) ありかも知れんが、なんでそんな前近代的なやり方しないといけないのかを考えたほうがいいと思う
814 名前:デフォルトの名無しさん mailto:sage [2021/08/01(日) 03:13:38.20 ID:/oR3uo3Y.net] C++ポケットリファレンス読んだ方いらっしゃいますか? 独習C++ 詳説 C++ 第2版の次に読もうかと思ってるのですが
815 名前:デフォルトの名無しさん [2021/08/02(月) 10:21:16.05 ID:WSe94FPO.net] 近年の現場と言うか、 大手の製品開発や比較的規模の大きい案件とかで使われてるC++のバージョンってどの辺ですか? 未だにC++03ってわけないですよね?
816 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:29:43.05 ID:WSe94FPO.net] >>786 C++プログラミング言語自体の研究という訳ではないのなら、 入門書以降は何か作る系の書籍のほうが良いのではないでしょうか? 物理シミュレーションだったりゲームだったり 人工知能だったりOSだったり様々あると思うので、 興味のある分野を極めていくのが良いと思います。 作りたいものがあるが何から手を付けて良いか分からないのなら 設計理論系の書籍等も良いと思います。 OOPを極めたいという考えであるならデザインパターン等も良いと思います。
817 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 10:37:42.71 ID:dQnVwxld.net] どの道、 class C { A* a; }; と、ポインターに変えても、 class A { char *p1; char *p2; }; と、新しいメンバーp2 には、C を再コンパイルしないとアクセスできない
818 名前:デフォルトの名無しさん mailto:sage [2021/08/02(月) 11:23:37.60 ID:lIzbW3kq.net] class A; class C { A* a; }; だけで完結してるなら まぁ問題をおこしにくそうではあるけど そこまでして C に関わるコンパイルを止めたい理由がわからん
819 名前:デフォルトの名無しさん [2021/08/03(火) 10:56:52.82 ID:Ljn/RAt1.net] >>787 最低でも C++11 それでも古いと思う
820 名前:デフォルトの名無しさん [2021/08/09(月) 22:11:24.65 ID:PKIz3Xw3.net] C++って競プロ以外に何に向いてるの?なんで競プロに使われるの?
821 名前:はちみつ餃子 mailto:sage [2021/08/10(火) 01:15:34.32 ID:7+xjomdk.net] >>792 実行速度が速いことが多いから速度が評価の一部である以上は有利になる。 (速ければ速いほど良いというわけではないが、上限が設定されているのが普通)
822 名前:デフォルトの名無しさん [2021/08/11(水) 12:58:25.34 ID:MU7UJMps.net] std::map<std::pair<const char *, int> > hoge; のように const char * を key とするとき hoge.insert(std::make_pair("A", 41)); hoge.insert(std::make_pair("C", 43)); hoge.insert(std::make_pair("B", 42)); と追加すると hoge["C"] で 43 が得られると期待できますが このとき make_pair したときの "C" と hoge["C"] の "C" のポインタは値が違ってても 同一 key とみなされますか?(ポインタの値ではなく文字の中身の一致を見てくれますか?) あるいは char * だとまた変わりますか?
823 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:12:29.99 ID:Z6PNV5dP.net] ポインターは先頭アドレス 2つのオブジェクトの内容が同じでも、 別々のオブジェクトなら、ポインターも異なる ポインターが同じとは、同一のオブジェクトを指している場合だけ
824 名前:デフォルトの名無しさん [2021/08/11(水) 13:28:06.66 ID:MU7UJMps.net] 追伸 一つの fuga.cpp 内で 二か所以上で "C" が使用されていたとき 同じアドレスにしてくれる機能もあるみたいですが fuga.cpp と hage.cpp みたいに別のソースで それぞれ "C" を使ってたりすると 勝手に同じアドレスにしてくれたりはないみたいで いろいろトラブルのもとになりそうです (どっちみち変数になってると手も足も出ませんし) key は std::string にしておくか あるいは std::hash<> と std::equal_to<> を定義して自分で比較する方が安全な模様
825 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 13:42:41.83 ID:EWMgwFeS.net] >>796 「あるいは」以降ってunordered_mapの話じゃないかい mapならstd::less<>を定義する……というかデフォルトのstd::less<>が使われないようにユーザ定義比較関数をコンストラクタで渡す 俺もこういう場合はキーにstd::string使うからいいけども
826 名前:デフォルトの名無しさん [2021/08/11(水) 14:06:43.19 ID:MU7UJMps.net] 今回の問題は >一つの fuga.cpp 内で二か所以上で "C" が使用されていたとき同じアドレスにしてくれる機能もあるみたいですが >fuga.cpp と hage.cpp みたいに別のソースでそれぞれ "C" を使ってたりすると勝手に同じアドレスにしてくれたりはないみたいで これでした stringにしたら解決です ほんとうにありがとうございました
827 名前:デフォルトの名無しさん mailto:sage [2021/08/11(水) 14:27:08.48 ID:01hIEDa4.net] >>798 別のソースでも同じアドレスにしてくれることあるよ。
828 名前:はちみつ餃子 mailto:sage [2021/08/11(水) 14:56:20.07 ID:QcAq7ivU.net] 言語仕様上は内容が同じ文字列リテラルを統合するかどうかは処理系定義。 https://timsong-cpp.github.io/cppwp/n3337/lex.string#12
829 名前:デフォルトの名無しさん mailto:sage [2021/08/12(木) 23:28:31.22 ID:sg4QisCT.net] >>ってどのように言えばいい? だいなり、だいなり ???
830 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 00:46:25.67 ID:BE9FMbqU.net] >>801 トークンとしての名前は無いと思う。 演算子としての名前なら右シフト演算子とか、 iostream 的な用途の場合は抽出演算子とも言う。
831 名前:デフォルトの名無しさん mailto:sage [2021/08/13(金) 15:49:32.03 ID:ZZGdeLtF.net] insertion/extraction operatorっていうのか。 stream operatorだと思ってたわ
832 名前:はちみつ餃子 mailto:sage [2021/08/13(金) 16:31:09.36 ID:BE9FMbqU.net] >>802-803 念のために仕様書を見直して見たら抽出子 (extractor) だったわ。
833 名前:デフォルトの名無しさん [2021/08/21(土) 20:09:51.28 ID:7GAoG1Iq.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しでView types参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、Cのソースコードを吐き出せるのでC言語でリモートワークされ ている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
834 名前:デフォルトの名無しさん [2021/08/22(日) 10:20:28.75 ID:0Cz6ueFz.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 著者: アンドレアス・ルンプ バージョン: 1.5.1 nim-lang.github.io/Nim/manual_experimental.html Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
835 名前:デフォルトの名無しさん [2021/08/22(日) 10:29:54.67 ID:0Cz6ueFz.net] Rustのメモリ安全性はボローチェッカーによって担保されているが、 Nimと比較してRustはタイプ量が多い事により限りなく低い生産性と C++のような高い難読性、超巨大なバイナリ生成性能を兼ね備えています Nimはバージョン1.5.1でRustのボローチェッカーに似た「View types」が実装されれば、 GC無しのView typesで参照の有効性を検証することによってメモリ安全性を保証しつつ 限りなく抑え込まれたタイプ量で高速化したCのソースコードを吐き出せます Nimソースコード ==nimコンパイラ==> Cソースコード ==Cコンパイラ==> バイナリ なので、nimコンパイラが通った時点でメモリ安全性が担保されませんか? Nimの実験的特徴 バージョン1.5.1 nim-lang.github.io/Nim/manual_experimental.html 第二プログラミング言語として Rust はオススメしません Nim をやるのです https://wolfbash.hateblo.jp/entry/2017/07/30/193412 Nimは限りなく抑え込まれたタイプ量で高い生産性とPythonのような高い可読性を実現し ているにもかかわらず、高速なCのソースコードを吐き出せるのでC言語でリモートワーク されている方は割り振られた仕事が早く終わっても終わってないふりをして怠けることができる 「怠け者とはこうあるべきだ!」と言うとても大事な事を Nim は我々に教えてくれます
836 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 12:34:32.34 ID:m1rLE8Mc.net] 怠け者が一生懸命2回書き込んじゃうのか
837 名前:デフォルトの名無しさん [2021/08/22(日) 13:21:27.56 ID:cx6/dnxW.net] unordered_map で erase(key) を実行した場合 要素のデストラクタは呼ばれるのでしょうか? 必ず自分で呼ばないとだめ? あるいは勝手に呼んでくれるオプションとかある?
838 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:38:27.67 ID:m4vhMo04.net] 呼ばれるよ。そうじゃないと危なすぎるでしょ。
839 名前:デフォルトの名無しさん [2021/08/22(日) 13:51:18.62 ID:cx6/dnxW.net] つまり unordered_map<hoge, fuga *>
840 名前:ンたいなときって fuga *f があるとすると delete f されるっていう認識で OK? [] [ここ壊れてます]
841 名前:デフォルトの名無しさん mailto:sage [2021/08/22(日) 13:56:28.38 ID:M38WAZ3o.net] ポインタ型のデストラクタは基本的に何もしない。 デストラクタで破棄したいならunique_ptrなどスマポを使う。
842 名前:ハノン mailto:sage [2021/08/22(日) 15:55:44.42 .net] >>809 つ https://ideone.com/zKMtPs
843 名前:ハノン mailto:sage [2021/08/22(日) 16:00:15.54 .net] >>811 つ https://ideone.com/AIykVF
844 名前:ハノン mailto:sage [2021/08/22(日) 18:24:32.36 .net] >>813 >>809 ユーザー定義のハッシュ関数を std 名前空間に押し込むのはお行儀が悪いよね…‥ https://ideone.com/J5JYnG
845 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 21:31:04.10 ID:YcQtKocs.net] >>815 文字列リテラルを char* にキャストするほうがだいぶん行儀が悪いと思うよ。
846 名前:ハノン mailto:sage [2021/08/22(日) 22:10:22.39 .net] >>816 しかし、MyStr のコンストラクタの引数が std::string とか、もう何やっているのかわからなくなる‥‥
847 名前:はちみつ餃子 mailto:sage [2021/08/22(日) 22:21:02.88 ID:YcQtKocs.net] >>817 ??? const char* で受ければいいだけでしょ? なんでそこで std::string が出てくるの?
848 名前:ハノン mailto:sage [2021/08/22(日) 22:23:59.15 .net] >>818 そういう意味でしたか、const に対する注意力がまだ足りないのは私の課題ですね
849 名前:デフォルトの名無しさん [2021/08/23(月) 11:12:35.74 ID:PZenUrJ/.net] linuxのg++8.3でstd::stringのメンバ関数の insert(const_iterator, char)を使うとコンパイルが通らないのですが、バグでしょうか? -std=gnu++1zつけてます。
850 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 12:30:44.70 ID:gvYYeNdp.net] >>820 具体的に問題を再現するコードとエラーメッセージを書いて。
851 名前:デフォルトの名無しさん mailto:sage [2021/08/23(月) 14:00:01.42 ID:BEPpIG+d.net] >>819 草生えたw
852 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 09:47:42.50 ID:HAU1OEWW.net] >>821 こんな感じです。 g++のバージョンは8.3で-std=gnu++1z でコンパイルしています。 -- ソースファイル #include <string> int main(int argc, char** argv) { std::string str="abcd"; std::string::const_iterator it = str.cend(); str.insert(it, 'a'); return 0; } -- エラーメッセージ testinsert.cpp: In function ‘int main(int, char**)’: testinsert.cpp:6:21: error: no matching function for call to ‘std::basic_string<char>::insert(std::basic_string<char>::const_iterator&, char)’ str.insert(it, 'a'); ^ In file included from /opt/rh/devtoolset-8/root/usr/include/c++/8/string:52, from testinsert.cpp:1: /opt/rh/devtoolset-8/root/usr/include/c++/8/bits/basic_string.h:4419:7: note: candidate: ‘void std::basic_string<_CharT, _Traits, _Alloc>::insert(std::basic_string<_CharT, _Traits, _Alloc>::iterator, std::basic_string<_CharT, _Traits, _Alloc>::size_type, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; typename _Alloc::rebind<_CharT>::other::pointer = char*; std::basic_string<_CharT, _Traits, _Alloc>::size_type = long unsigned int]’ insert(iterator __p, size_type __n, _CharT __c) ^~~~~~
853 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 12:50:48.93 ID:MkJE9y3A.net] >>823 コンパイルできないのはバグだが終端イテレータの扱いについては 変遷があって有効なイテレータと見做されない時期もあった。 最後に文字をくっつけるのであれば push_back か append を使ったほうが無難。
854 名前:デフォルトの名無しさん mailto:sage [2021/08/24(火) 14:09:58.40 ID:+43Lnt
] [ここ壊れてます]
855 名前:iD.net mailto: >>824 > 終端イテレータの扱いについては > 変遷があって有効なイテレータと見做されない時期もあった。 要出典 [] [ここ壊れてます]
856 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 14:20:52.77 ID:cqt8yWy6.net] >>824 アドバイスありがとうございます。 やっぱり規格的におかしいと思って調べてみたところコンパイラがc++11に対応していないだけでした。 ありがとうございました
857 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 15:38:43.16 ID:9jFaPzYS.net] コンパイラはver.4.8で対応してるよ gnu++1zてのがないんじゃないの?
858 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 17:29:41.65 ID:+rMtuhpY.net] const_iteratorだとダメでiteratorだと通るぽい ↓のコード、手持ちのg++ (GCC) 7.3.1で-std=gnu++1zでコンパイル、実行できたが https://cpprefjp.github.io/reference/string/basic_string/insert.html 「(6) 指定したイテレータが指す要素の前に、文字を挿入する」の s.insert(s.begin(), 'b'); を s.insert(s.cbegin(), 'b'); にするとコンパイルエラーになる
859 名前:デフォルトの名無しさん [2021/08/25(水) 19:02:32.36 ID:s4ke0ECA.net] C++を勉強しているんだけど難しすぎる。 目標は研究に使う数値計算ライブラリを作ることでそのために、 オブジェクト指向とテンプレートプログラミングとSTLを勉強しているんだけど量が多すぎて発狂しそう。 本当にC++を仕事で使っている人はこの量の仕様を覚えて使いこなしてるのか・・・
860 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 19:16:48.44 ID:I0Do+yHA.net] 基本的に自分がよく使う範囲だけ覚えて 必要があればそれ以外の範囲を調べて使う 膨大なようで、所詮言語だから使ってれば覚える
861 名前:デフォルトの名無しさん [2021/08/25(水) 19:55:14.87 ID:s4bO6YKI.net] 生半可に上辺だけ触って判った気になって コード描けますとかいうやつと仕事したくないわ
862 名前:デフォルトの名無しさん [2021/08/25(水) 21:53:18.83 ID:gHVAu5z0.net] >>827 >>828 言葉足らずですみません。 CentOS7のdevtoolのg++はABI互換性の関係から古いlibstdc++としかリンクできないようにされていて つまるところC++11の機能はほとんど使えなくなっている、ということでした。 本来ver8.3ならC++17にも対応しているはずなのにほとんど意味ないわけです…。 だったら-std=c++11とかつけたときに警告してくれとでも思わないわけもないですが。
863 名前:デフォルトの名無しさん mailto:sage [2021/08/25(水) 23:11:46.20 ID:3/bOIe3o.net] >>829 もしEigenとかみたいなメタプログラミング使った数値計算ライブラリを考えてるならやめとけ 無駄に開発期間が数倍から10倍程度に膨れ上がるだけ とりあえずテンプレートとか使わずに(あるいはメタじゃないレベルにおさえて)普通に書いたら?
864 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 06:13:02.19 ID:H9rsGF96.net] >>829 仕事をすると言っても、他の人がこさえたライブラリを使う場合はそこまでは求められんだろう。 反対に根っこ部分のライブラリとか、チーム内でのルールに関わると知識と経験がいるんじゃないかな? よく理解できている方法でしっかり組み立てられるようになってから、徐々に細かい話に手を出したらいいと思う。 他の方法は解ってるし悪いわけでもないが、記述が気に入らないので延々とtemplate弄り倒す沼もあるから注意してね。
865 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:00:20.61 ID:b62pz5ME.net] 数値計算に使うのならまずはSTL抑えておくだけでいいんじゃね? C++言語自体の習得より、GPGPU、分散処理、SIMD、メモリ管理とかのノウハウ習得にまずは時間を割り当てるほうがよいと思う
866 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 09:28:17.30 ID:eI1EN0aq.net] 物理の計算とか、いろんな数学的な量が出てくる
867 名前:ッど、そういうのの演算がすべて プログラム上では同じ形で書ければかっこいいなあと思ったり。 例えば、(スカラー)積なら、オペランドが実数、虚数、ベクトル、行列、テンソル....等々どれでも 乗算オペレーターで扱えるとか。 「普通」の数値ライブラリだとオペランド毎に積を扱う関数がうんざりするほどあってそれを適切に 選ばないといけなかったりするので。 [] [ここ壊れてます]
868 名前:デフォルトの名無しさん [2021/08/26(木) 12:08:14.60 ID:p2DPtxMk.net] 829です。 皆さんいろいろとアドバイスありがとうございます。 自分が作ろうと思っているのは、Eigenを用いた金融系の数値計算ライブラリなのですが、テンプレートを用いたらいろいろな型を代入できて便利かな〜くらいの感じで作ろうとしていました。 templateの使い方自体は少し勉強してみましたが、メタプログラミングの概念自体もよくわかっていないので、ひとまずtemplateは後回しにしようかと思います。 オブジェクト指向で書くかどうかは実際にコードを書いてみてから考えてみたいと思います。
869 名前:デフォルトの名無しさん mailto:sage [2021/08/26(木) 16:35:43.38 ID:9wBQWoih.net] Eigen利用するだけか それならまぁ無駄に時間かかるということも無いと思う(変なとこに拘らなければ
870 名前:デフォルトの名無しさん [2021/08/26(木) 16:43:57.74 ID:WPRv8+9f.net] >>836 コンピューターというか主要な高級プログラミング言語が出来て50年以上経つが だれもそういうことをやってないのは何故だと思う?
871 名前:デフォルトの名無しさん [2021/08/26(木) 16:45:12.60 ID:WPRv8+9f.net] ちなみに SciPy とか SymPy は良く出来てる方
872 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 14:40:33.39 ID:RrJjtAzF.net] >>839 template使ったらもう型にとらわれなくていいんじゃね?はC++学習者の必ず通る道やからしゃーない
873 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 15:05:57.44 ID:nK81wxcE.net] で、結局なんでできないの? C APIのほうが汎用性が高いから? 行列やテンソルは乗算方法が複数あるから? 結果の表現形式も有理数とか複数あるから? 結果をエレベーションする必要があるから?
874 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:44:56.54 ID:LFMqkLz6.net] extern "C" 使ってる?
875 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 17:53:48.43 ID:nK81wxcE.net] >>843 Cで開発するときに、常にヘッダファイルに書いておく必要があるかどうかって話なら、将来c++から呼び出す可能性があるなら書いておけば? 最悪なくてもインクルードする側でどうにかなる
876 名前:デフォルトの名無しさん mailto:sage [2021/08/27(金) 19:22:59.35 ID:ghUXxVcH.net] >>843 32bitとはいえマイコンで-std=gnu++17とか指定するのは微妙な背徳感を感じてしまうチキンだが、 Cのライブラリも一緒に使うから、普通に使ってるな。基本ヘッダファイルでほとんど事足りるんだけど、 weak指定のCの割り込みハンドラとか再定義するときは混乱しないように明示的にextern "C"付けてる。
877 名前:デフォルトの名無しさん [2021/08/29(日) 01:50:34.33 ID:TPHdi4yb.net] >>841 operator置き換えまくりとかな
878 名前:デフォルトの名無しさん mailto:sage [2021/08/29(日) 10:17:41.53 ID:sPGAkNt4.net] >>841 設定読み込みの部分でお世話になったわ
879 名前:デフォルトの名無しさん [2021/08/30(月) 14:54:09.69 ID:a7szkEqk.net] C++17は甘え
880 名前:デフォルトの名無しさん mailto:sage [2021/08/30(月) 20:54:03.52 ID:i7moqIxZ.net] 甘えてもいいぜ
881 名前:デフォルトの名無しさん mailto:sage [2021/09/08(水) 21:07:44.76 ID:QZMwNs5W.net] C99で良いです……
882 名前:デフォルトの名無しさん [2021/11/24(水) 18:53:15.36 ID:ONXwk6fD.net] void *q = (void*)p; void *r = reinterpert_cast<void *>(p); void *s = static_cast<void *>(p); どっちが良い?
883 名前:デフォルトの名無しさん mailto:sage [2021/11/24(水) 22:24:01.60 ID:7YsOMgZx.net] p の型によるんじゃね?
884 名前:デフォルトの名無しさん mailto:sage [2021/11/25(木) 14:45:18.21 ID:Ts2h3uwp.net] >>838 Eigen の MatrixXtype と Matrix<type, Dynamic, Dynamic> が便利なのは判ったが 自分でそいつらを引数に持つテンプレート関数書こうとして template <typename T, int R, int C> void func(Matrix<T, R, C>&m){ ... } で定義したら a が Matrix3d a; とか RC 固定されてるときは func(a) で問題無いが a が Matrix<type, Dynamic, Dynamic> a(3, 3); だと 実際に func(a) とかで呼ばれるときに Matrix<type, -1, -1> で呼ばれてて Row 数も Column 数も判らないので 結局呼ぶときに func<type, 3, 3>(a) みたいに確定して呼ぶことになるんだが そういうもの?
885 名前:デフォルトの名無しさん mailto:sage [2021/11/26(金) 19:09:15.51 ID:ZkEvf+9l.net] Eigen使ったことないけど、それ多分動的なサイズ指定だよね コンパイル時にサイズ分かってない奴じゃね
886 名前:デフォルトの名無しさん [2021/11/27(土) 15:14:48.94 ID:dxTMcmeT.net] fstream で open するオプションで ios:in ios:out ios:binary とかと ios_base:in ios_base:out ios_base:binary とかと 何が違うのでしょう?
887 名前:デフォルトの名無しさん mailto:sage [2021/11/29(月) 16:58:44.62 ID:Afxc3rI9.net] おなじ :: だろうけど
888 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:19:18.78 ID:aQJDsz9k.net] 一般的にプリプロセッサのビットシフトに制限てありますか? #define HOGE (1<<27) だとダメで #define HOGE (0x8000000) だとOKだとかありますかね?
889 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 10:50:06.54 ID:7ju/18KI.net] >>857 プリプロセッサはその define値をその記述通りの文字列(というか文)としか見てなくて、単にその定義名の所へはめ込むだけじゃない? あとは嵌め込まれた後の文脈でコンパイラが解釈するんじゃないかな。
890 名前:デフォルトの名無しさん mailto:sage [2021/12/06(月) 12:49:27.90 ID:T2nrofKv.net] >>858 そう言われてみればそうですよね トンチンカンな質問失礼しました
891 名前:はちみつ餃子 mailto:sage [2021/12/06(月) 13:31:07.92 ID:Fu08U5Ef.net] >>857 定義での制限はないが、マクロの制御定数式として表れる場合、 つまり #if HOGE > 0 みたいな前処理指令があった場合に全ての符号付整数型が intmax_t 、 全ての符号無し整数型が uintmax_t と同じ表現を持つというルールがあるので 通常の式とは解釈が違う。 (大抵の場合に intmax_t は long long int と同じ大きさだと思う。) つまり普通の式としてならオーバーフローする場合でもプリプロセッサではオーバーフローしないこともあるので、 制限としてはむしろ緩い。 https://wandbox.org/permlink/Ns4Qt2xG3wj1WVBH
892 名前:デフォルトの名無しさん [2021/12/08(水) 17:56:15.71 ID:ouf8qdPn.net] std::listのsortを使ってるのですが 同値だった場合の順序が維持されず困ってます。 何かよい手はないですか? 比較関数を渡してるのですがその中で何とかならないでしょうか?
893 名前:はちみつ餃子 mailto:sage [2021/12/08(水) 18:22:21.80 ID:cTje1973.net] >>861 言語仕様上は std::list::sort は安定ソートなので そうなってないなら標準ライブラリの実装が間違っているか使い方が間違っている。
894 名前:デフォルトの名無しさん mailto:sage [2021/12/08(水) 18:28:56.67 ID:ouf8qdPn.net] >>862 そうなんですね。ありがとうございます。 調べてみます。
895 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 05:48:07.42 ID:4Thv0Igk.net] 純粋仮想関数の通知メソッドの中から他所のアドレスを知りたい時C++だとどう書くのが一般的ですか?
896 名前:デフォルトの名無しさん mailto:sage [2021/12/09(木) 07:40:39.36 ID:bGgqEdHH.net] 日本語でおけ
897 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:24:10.27 ID:pHnakqcn.net] 私の同僚のプログラマがC++で、あるソフトのプラグインをdll形式で作成しており そのdllファイルは6割くらいの環境では問題なく動作しています。 しかし、ユーザーの環境次第で動かないことがあり dllをインストールした状態でソフトウェアを起動しようとすると、ソフトウェア自体が起動しないというバグを抱えており この問題の解決方法は数か月以上、見つかっていません。 そのdllはWindowsのみで動作するものであり、MacやLinuxには対応していません。 Windowsの何らかの設定に関係するバグなのでしょうか…? バグの原因が一切分からず、彼の作業が進まないので私の作業も進まず、困っています。 私自身はC++でそのソフトのプラグインを作成したこともないですし、彼に何のアドバイスもできないので このスレッドのお力をお借りしたいです。 dllを作成する際にユーザー環境でデバッグしてログを取得する方法など 何でも良いのでアドバイスがあったら教えてください。 エスパーを求めています。
898 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 05:56:13.12 ID:6fha5luI.net] printfデバッグをファイルに書くとか
899 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 06:41:07.66 ID:9Wj0xfjq.net] 64bitと32bitの違い・・・ではないか それかintel/amdどちらかにしかない命令使ってるとか、何か依存する部分があるとか??
900 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 08:10:32.07 ID:o0cf+I8x.net] まずはエラーメッセージをだな でもランタイムライブラリのオプションがMTじゃなくてMDになってると予想
901 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 08:23:33.51 ID:T7uEaOwT.net] >>866 例外で落ちたりもせず、ただ起動しないの? 起動しない環境の特徴も分からない? なにかしらのセキュリティソフトが入ってるとか。
902 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 10:16:08.28 ID:e0HER7LA.net] >>866 >6割くらいの環境では問題なく動作 落ちる環境のPCで開発させてみるといいんじゃね
903 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:09:39.54 ID:RuQEsKMi.net] そのプラグイン dll が vcのランタイムを要求してて 実行環境にvcのランタイムが入っていない プラグインdllの性質上 ソフトが自前で LoadLibary するが、そこで失敗する この際何が主因なのかわからないまま 静的なリンクなら ○○が見つかりませんdialog がでてすぐわかる プラグインdll を Dependency Walker なりで そのDLLが必要としてる DLL を確認してみたら?
904 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:37:46.60 ID:zJGtuVBB.net] >>872 ソフトの仕様や実装次第だけど、プラグイン読み込みに失敗して起動しないアプリもちょっと手抜き過ぎだよね
905 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:41:07.01 ID:RuQEsKMi.net] >>873 わかったとしても、「モジュール <プラグイン>.dll が見つからない」 としか書きようがなくてややこしい ※ 本当に見当たらないのは <プラグイン>.dll がさらにロードしようとしてる MSVCR○○.dll とかだから
906 名前:デフォルトの名無しさん mailto:sage [2021/12/14(火) 11:43:56.15 ID:RuQEsKMi.net] プラグインのロード失敗で 即exit するのも不親切かもね
907 名前:デフォルトの名無しさん mailto:sage [2021/12/18(土) 10:46:11.74 ID:RFbyER+p.net] グローバル変数かstatic変数使ってないか? 昔他所のモジュールと変数の書き換え合戦が起きて正常に動作しない事があった
908 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 15:15:53.34 ID:bLFtEsOT.net] >>876 static なら他所と競合しないんじゃない? あとグローバル変数が仮に extern だったとしても、意図的にエクスポートしてなければ他所の DLL と競合はしないような。
909 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 17:40:07.63 ID:150MzqYw.net] 拡張子dllでも独自の実装してるホストプログラムあるからなぁ… それこそホストの開発者に
910 名前:キくしかない [] [ここ壊れてます]
911 名前:デフォルトの名無しさん mailto:sage [2021/12/19(日) 23:17:52.32 ID:mIjShW6/.net] 自前でできることは 1) DllMain の DLL_PROCESS_ATTACH、 DLL_PROCESS_DETACH に printf を仕込んで 最低限 load がなされてるかを確認 2) load されてるのなら 最初に呼ばれるであろうexportしてる関数にがんがん printf を仕込んで 何処で死んでるかを確認
912 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 03:18:25.98 ID:pnvTuQZD.net] 規格厨ほど仕事ができなくね どうでもいいようなことにこだわってないで さっさと仕事終わらせろよ
913 名前:デフォルトの名無しさん mailto:sage [2021/12/24(金) 10:00:30.81 ID:YmgFPSRd.net] またお前か 何年立ったらルール覚えられるんだよ つかえねーな
914 名前:デフォルトの名無しさん [2022/01/17(月) 19:13:47.29 ID:Xn5FtFWo.net] メンバ関数へのポインタで質問なのですが class MyClass { public: void (MyClass::*p)(); void func(); }; int main() { MyClass obj; このようなクラスがあったとして main関数でobjのメンバの関数ポインタpへfuncのアドレスを入れる書き方と pを使ってfuncを呼ぶ書き方を教えて下さい
915 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 19:29:52.39 ID:pwXKfNQA.net] >>882 obj.p = &MyClass::func; (obj.*(obj.p))();
916 名前:デフォルトの名無しさん [2022/01/17(月) 20:40:50.75 ID:iHDNpEw/.net] C++でオブジェクト指向を学びたいなと思ってるのですが、みなさんはどのように学びましたか? 既存のゲームの機能追加などをサークルでやっていて、C++自体には慣れてきて次のステップに進みたいと思いました.
917 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:47:51.30 ID:h5bglXe3.net] ただただ自分でクラス設計考えて実際に書いて、さらにそれをあちこちで使ってみるだけ 実際に書く、利用する、をサボると机上の空論しか語れない頭でっかちになる
918 名前:デフォルトの名無しさん [2022/01/17(月) 20:50:24.57 ID:Xn5FtFWo.net] >>883 ありがとうございます
919 名前:デフォルトの名無しさん [2022/01/26(水) 21:23:31.72 ID:HoA8G4VO.net] 初心者です。 自作クラスをVector型に押し込めようとしたのですが、そこで発生したエラーの解決方法を2時間くらい調べたのですが分かりませんでした。 class myClass { myClass(int A){num = A;} void show() { cout << "" << "="<<num<<endl;} ~myClass(){} int num; }; int main() { myClass a1(1), a2(2), a3(3), a4(4), a5(5); vector<myClass> myClassList; myClassList.push_back(a1); //中略 //削除するオブジェのインデックス番号を記録 vector<int> delList; for (int i = 0; i < myClassList.size(); ++i) { if (myClassList[i].num == 2 || myClassList[i].num == 4) { cout << "i" << "=" << i << endl; delList.push_back(i); } } cout << "削除開始" << endl; for (int i = 0; i < delList.size(); ++i) { std::erase(myClassList, delList[i]);//コイツでエラー } return 0; } 二項演算子 '==': 'myClass' は、この演算子または定義済の演算子に適切な型への変換の定義を行いません。
920 名前:蟻人間 mailto:sage [2022/01/26(水) 21:34:31.80 ID:bGQQ0+uk.net] >>887 myClass::operator==を定義してみ。
921 名前:デフォルトの名無しさん [2022/01/26(水) 22:43:54.69 ID:HoA8G4VO.net] >>888 オペレータに何を定義すれば良いか分かりません
922 名前:蟻人間 mailto:sage [2022/01/26(水) 22:53:20.32 ID:bGQQ0+uk.net] >>889 eraseの仕様を見れば内部で要素を比較していることがわかる。 そこでmyClassとintの比較を定義する必要がある。 bool operator==(int n) const { return n == num; }
923 名前:蟻人間 mailto:sage [2022/01/26(水) 22:55:52.03 ID:bGQQ0+uk.net] あるいは friend bool operator==(const myClass& my, int n) { return my.num == n; }
924 名前:デフォルトの名無しさん [2022/01/26(水) 23:02:17.85 ID:HoA8G4VO.net] 蟻人間さん、ご丁寧に教えてくださり、本当にありがとうございます。 無事問題が解決しました
925 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 07:58:45.49 ID:Fon8EKoL.net] delListはインデックスだからvector::eraseではなかろーか https://ideone.com/jnELhK
926 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 15:24:34.96 ID:HENDwGdD.net] msvcのコンパイルが遅いのとメモリ大量に使うのとで大変辛いのですが、コンパイルだけ別の端末で出来たりしませんか?
927 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 15:33:38.19 ID:hT9TavA0.net] >>894 GitHub Actions
928 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 16:19:19.11 ID:gre2uKRK.net] VARIANT型をログ出力したいときはどうしたらよいでしょうか?
929 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 16:23:28.54 ID:hT9TavA0.net] >>896 std::variant (C++17 以降) のこと? それとも COM で使う VARIANT のこと? それとも特定の実装 (または規約) ではなく動的型一般のこと?
930 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 16:59:31.61 ID:gre2uKRK.net] >>897 Comのです
931 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 17:44:30.90 ID:hT9TavA0.net] 何がわからないの? 基本的な数値型や配列以外の場合にどう文字列化すればいいかわからないってこと?
932 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 17:57:24.82 ID:gre2uKRK.net] VARIANT.ToString的なのないかな?的な みんな自分で作ってるの?
933 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 23:10:21.87 ID:hT9TavA0.net] >>900 VARIANT は基本的な型だけでなく COM のオブジェクト (を指すポインタ) を含むこともある。 COM におけるオブジェクトは「少なくとも IUnknown インターフェイスは実装されている」という保証 (規約) があるだけで、 それをどのように表示できるのかは汎用的には決めようがない。 基本的な型だけでも簡易的に文字列化するものがあるとちょっとしたデバッグ用途などでありがたいというのはわからんでもないけど。
934 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 23:24:19.57 ID:A8Zj7Ozq.net] >>901 オブジェクトはそのポインタ値を表示とかよくある
935 名前:はちみつ餃子 mailto:sage [2022/01/28(金) 23:39:29.92 ID:hT9TavA0.net] ログ用途だとアドレスだけでは意味が薄そうに思うけど…… (実行のたびに値は変わるだろうし、検証に使えない。) 少なくとも整数などではないという区別が出来れば十分ということはあり得るかな。 タイプライブラリがちゃんと用意されているなら型名などが取得できる場合もあるので可能ならそういう情報も欲しいけど、 いずれにしても「文字列にする」という要求はユースケースが多用すぎて標準的な機能として決め打ちはしづらい。
936 名前:デフォルトの名無しさん mailto:sage [2022/01/28(金) 23:47:34.07 ID:Bry4gZCu.net] >>903 Aのルーチンで使ってるオブジェクトとBのルーチンで使ってるオブジェクトが同じかどうかはわかる それ以上のことを知りたいなら個別に表示ルーチンを組むしかない
937 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:18:19.62 ID:F6gMvu/h.net] ガチガチの初心者です #include<iostream> double func(double x){ if (x>0) return x; else return 0; } double dfunc(double x){ if (x>0) return 1; else return 0; } int main(){ for (double x=-1.0; x<1; x+=0.1){ std::cout << std::scientific; std::cout << x << ","; std::cout << func(x) << ","; std::cout << dfunc(x) << std::endl; } return 0; } を分割コンパイルするためにmain.cpp、func.cpp、func.fにソース分割したいのですがどのようにすればよいでしょうか
938 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:41:33.39 ID:LNIGuTho.net] >>905 その3つファイル作って切り貼りして保存すればいいんじゃね。
939 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:44:31.98 ID:F6gMvu/h.net] >>906 すみません、書き方が悪かったです。分割の仕方?切り貼りして保存する3つのファイルの中身の書き方が知りたいです。
940 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:47:36.64 ID:3ZSK4aSw.net] >>907 なぜ調べもしない? 「C言語 分割コンパイル」でググりゃ
941 名前:あ出てくるっしょ [] [ここ壊れてます]
942 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 16:48:20.54 ID:LNIGuTho.net] >>907 自分でやった結果を見せてもらわないと何に困ってるのかわからない。
943 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:08:03.21 ID:fQ9LbNHB.net] >>905 とりあえず func.f はやめとけ
944 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:27:29.71 ID:54L0j00R.net] ふぉーとらんらんらん
945 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 17:27:47.66 ID:CzloZbS7.net] >>905 どんな入門書にも書いてあるようなことを質問するのは嫌がられる。 学ぶ気がなく代わりにやらせようとしているように見えるので。 そんで関連する事柄が多いので質問が具体的でないと単純に情報量的にとてもここには書けない。 細々としたところで引っかかるのは当然あることだしそういうのは喜んで回答するから 何がわからずに引っかかってるのかもうちょっと具体的にして欲しい。 わからないことをまとめられないなら とりあえず自分なりにやってみたらどうなったのか見せれば、 何がわかってないかこっちで推測できる可能性がある。
946 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 00:03:59.30 ID:9peRckoc.net] if (fp = fopen("file.txt", "W+")) って書くと↓が出るんだけど? warning: suggest parentheses around assignment used as truth value
947 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 00:50:39.94 ID:5Jw8HjAD.net] まあ気に食わないが括弧でくくってやってる
948 名前:蟻人間 mailto:sage [2022/02/02(水) 00:57:41.77 ID:gV8dH/Sr.net] if文では、代入と比較の混乱が深刻で、警告を出さなければいけなかったと聞いてるが。
949 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 08:17:16.11 ID:BmWHIg0d.net] 論理型を省略した代償は高くつきすぎたな。
950 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 10:18:30.37 ID:l1cc3wPX.net] 0とヌルの違いも曖昧な部分があったな
951 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 11:07:29.08 ID:5i7w7V2o.net] >>913 強めの警告オプションを付けてたら言語仕様上の問題がないものでも良くない作法に対しては警告が出ることはある。 a && b || c とかいう式でも (人間が) 優先度を勘違いしやすいから括弧を付けることを勧められるし、 インデントの付け方がずれてる場合とかも警告は出る。 余計なお世話だと思うなら大抵はオプションで抑制できるよ。
952 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 16:52:47.21 ID:Os1L/Ifx.net] 括弧でくくっただけじゃ文句いわれたこともあるので二重否定しとく if (!!(fp = fopen("file.txt", "W+")))
953 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 17:18:37.99 ID:5i7w7V2o.net] C++17 以降では if 文の括弧の中に初期化を書けるようになった。 初期化の内容と判断に使う式をセミコロンで区切って書ける。 if (fp = fopen("file.txt", "W+"); fp) このとき変数の宣言を書いてもよく、 if (FILE* fp = fopen("file.txt", "W+"); fp) というようにすると、この変数のスコープを if 文の内側だけに制限できるので便利。 便利だから C にも導入して欲しい。
954 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 17:39:51.00 ID:il4bRKm2.net] if括弧中で初期化なんて前からやってたことだし 今じゃ代入も初期化になったのか
955 名前:はちみつ餃子 mailto:sage [2022/02/02(水) 18:18:35.55 ID:5i7w7V2o.net] >>921 以前は「条件が宣言でもよい」だったところに あらたに「初期化文と条件のふたつを書ける」「初期化文は式、もしくは単純宣言である」というルールが追加された形。
956 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 08:24:13.76 ID:vXrgdSa9.net] デストラクタだけ書いてあってムーブできないクラスをメンバ変数にすると色んな所でコンパイルエラーが出て困りました 値ではなくポインタで持つか、自分のクラスででムーブコンストラクタを書いたらとりあえずはエラーが出なくなったのですが、 こういうクラスは一体どう使われるのを想定して実装したんでしょうか?
957 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 18:34:16.03 ID:SQWxHGFm.net] 基底クラスからたくさん派生クラスを作りました。 基底クラスの1つのvirtualメソッドを、各派生クラスでoverrideしました。 基底クラスを指す箱から、派生クラスのメソッドを呼ぶ方法を教えてください。 多少スタイルを変えても実現する方法があればお願いします。 ただし、場合分けやインデックスで対応するのは(派生クラスが増えたときに修正箇所が分散するので)厳しいです。 コンパイラは最近のvisual studioのC++を使っています。 struct Basic{ virtual void work(){cout<<"Basic";} }; struct B1:public Basic{ void work()override{cout<<"B1";} }b1; struct B30:public Basic{ void work()override{cout<<"B30";} }b30; void main(){ Basic basic_array[9]; basic_array[0]=b30; basic_array[0].work();//基底クラスのメソッドが呼ばれて Basic と表示されてしまう。 }
958 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 19:25:55.42 ID:WarIH046.net] Basicの配列にはBasicのオブジェクトしか入らないから、b30もコピーしたときにBasicになってしまったからだよ Basic*の配列にするかvector<uniq_ptr<Basic>>を使えば
959 名前:デフォルトの名無しさん mailto:sage [2022/02/08(火) 19:56:37.56 ID:SQWxHGFm.net] >>925 ポリモーフィズム成功しました。基底クラスのポインタを使って解決しました。 また、基底クラスの変数にコピーすると派生クラス独自のメンバが全て無くなることが理解できました。 ありがとうございました。 void main(){ Basic*basic_array[9]; basic_array[0]=&b30; basic_array[0]->work();//B30のメソッドが呼ばれた。 }
960 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 14:30:39.44 ID:/nAwqwYv.net] >>925 > vector<uniq_ptr<Basic>>を使え 動的にインスタンスを作り始めた途端に、コンテナとスマートポインタが必要になりました。 見事すぎる回答に改めて感謝します。
961 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 10:16:19.82 ID:+V9f8lU9.net] 例外で飛んじゃうと後始末ができなくてメモリリークしちゃうんだけど クラスでラップしてデストラクタっていちいちやる感じ?
962 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 10:30:02.61 ID:+V9f8lU9.net] try~catchで囲えば処理できるけど すべての例外が出る可能性のあるコード全部try~catchしちゃっていい?
963 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 11:08:23.85 ID:v7utSHD9.net] >>928 「いちいちやる」っていうか、同種のリソースを扱うときはいつも必要になる対応だからデストラクタでいいんだよ。 大抵はunique_ptrとか標準にあるもので済むし。
964 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 11:40:56.58 ID:fowo2HBL.net] >>928 いちいち個別対応したくないからクラス定義に押し込めるんだよ。
965 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:17:15.52 ID:+V9f8lU9.net] >>931 今回のとこちょっとなんだけどなぁ 例外発生するとこ全部でやらなあかんやんコレ クソ杉ちゃう?
966 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:21:15.24 ID:mVeDXtSU.net] なにいってんの
967 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:27:42.18 ID:+V9f8lU9.net] えー、わからんのー? つまり例外が発生しうるとこすべてで 尻切れトンボされる可能性があって 以前のようにmalloc-freeのコードが混じってるとそいつらは問答無用でメモリリークしちゃうって話よ
968 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 12:47:42.19 ID:YFQd7auv.net] malloc/freeなら検出できるやん
969 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 12:48:02.74 ID:fowo2HBL.net] >>932 対処する必要があるところで catch して解放するだけだろう。 それがどうして出来ないんだ?
970 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:19:45.68 ID:+V9f8lU9.net] まあ、それよ そういう対応が必要になるって話よ 追加するやつ全部trycatchで包むか mallocfreeをクラスで包むか 入れたのは20行程度なのにルーチンの流れまで変える必要があったりなかったりで(# ゚Д゚) イラッ!
971 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:39:34.12 ID:v7utSHD9.net] >>934 malloc-freeしてる既存コードに例外発生する処理
972 名前:混ぜるなんて特殊状況ならしょうがない。 面倒な状況なのはわかる。あきらめて心を殺してtry catchするか小さいRAII用クラスを作るか。 あるいはmalloc-freeしてるところも標準コンテナやunique_ptrに置き換えていけばすっきりするかもね。 [] [ここ壊れてます]
973 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:00:24.16 ID:AlOKsuc0.net] >>932 クソすぎかもしれないが、それは必要だし普通だろ
974 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:43:55.59 ID:MFjncly/.net] メモリ解放以外にデストラクタでやることはあるわけだしな 集約して定義しとけよという
975 名前:デフォルトの名無しさん mailto:sage [2022/03/09(水) 22:51:16.35 ID:wIy/pNxS.net] LinuxでyyyyMMddhhmmss.fffを出力する 一番簡単な方法を教えて下さい
976 名前:デフォルトの名無しさん mailto:sage [2022/03/09(水) 23:05:24.02 ID:w9Xuob20.net] printf("yyyyMMddhhmmss.fff");
977 名前:蟻人間 mailto:sage [2022/03/09(水) 23:58:24.65 ID:ptoc1SJJ.net] GNU/Linuxを仮定 system("date +%Y%m%d%H%M%S.%3N\");
978 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 00:03:44.70 ID:IfzvyEOT.net] 日付のフォーマットなんて都度調べるもんな 覚えてる変なやつもいるんだろうね
979 名前:蟻人間 mailto:sage [2022/03/10(木) 00:11:23.45 ID:3vn8A8hZ.net] https://shino-tec.com/2019/06/08/time-to-string-on-linux/
980 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 07:16:50.83 ID:ZtFzrJEF.net] >>945 これやったら秒とミリ秒を別で取得してるので 秒が59.999(ミリ秒はイメージ)のときに ミリ秒は00.002ってなるときに前回の値が59.857ぐらいだったとすると 59.002ってなってしまうので逆転が起きたときは前回の値と比較して 逆転してたらミリ秒を強制的に999にするとかダサイことやってるんですけど マジでこんな方法しかないでしょうか?
981 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 07:48:07.93 ID:E/Z/b8gJ.net] >>946 そのダサいことをやってるのは何行目? 見つからないよ
982 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 08:52:39.45 ID:pPpJXJXf.net] localtimeが時刻取得だと思ったんじゃろうね
983 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 18:51:28.19 ID:xl0leRXC.net] >>947 timespecで取得できるのがミリ秒だけだと思ってました 自分のプログラムでtime_tで取得できる関数と複合してたのが原因でした
984 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:18:24.41 ID:udY9aSDo.net] あー、だめだ localtime_rがないって言われる
985 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:21:17.65 ID:udY9aSDo.net] localtime_sもないって言われる しばらくクソ方法で保留で
986 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 20:46:05.68 ID:xH/r/VUj.net] >>950 環境は?
987 名前:デフォルトの名無しさん mailto:sage [2022/03/10(木) 23:26:58.80 ID:udY9aSDo.net] >>952 ubuntu
988 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 00:11:00.88 ID:3xV59ngV.net] rはあるやろ
989 名前:デフォルトの名無しさん mailto:sage [2022/03/11(金) 13:08:09.69 ID:2pJSEvK3.net] ビルドの設定いじってもらって通りました ありがとう御座いました
990 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:34:53.41 ID:qJRouQ9M.net] 【質問】 switch constexpr って無いんですか? 【背景】 if constexpr(false){ } if constexpr(false){ } if constexpr(true){ } if constexpr(false){ } という記法に疲れました。 switch(定数) で実現可能ですが、コンパイラがwarningを出すので避けたいところです。
991 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:40:14.61 ID:Y2OAtTnf.net] 無いけど俺も欲しい
992 名前:デフォルトの名無しさん mailto:sage [2022/03/17(木) 11:44:52.12 ID:qJRouQ9M.net] >>957 早速の回答ありがとうございます。 否定的な解決で残念ですが、前向きに生きていきます!
993 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 13:40:31.67 ID:nPptgbtB.net] クロスプラットフォーム対応のキーボードイベント入力・マウスイベント入力があるライブラリで、規模がそこまで大きくないものって何かありますか?
994 名前:デフォルトの名無しさん mailto:sage [2022/03/19(土) 14:54:00.91 ID:Q/NZ1
] [ここ壊れてます]
995 名前:iFj.net mailto: ncurses [] [ここ壊れてます]
996 名前:デフォルトの名無しさん mailto:sage [2022/03/21(月) 11:06:17.41 ID:Prmlj1K5.net] >>960 情報ありがとうございます ncursesだとWindowsで動かしにくいみたいなんでフォークのpdcursesでやってみます
997 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 22:10:06.23 ID:U9Dry82x.net] >>908 ググって出てこないようなことをおまえら答えれるのか?
998 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 23:30:57.78 ID:po6dvxnc.net] 日本語で記述された問題や目的から有用なページを紹介するのはグーグル先生は苦手なんだよ。 核心的なキーワード抜きだと特に。
999 名前:デフォルトの名無しさん mailto:sage [2022/03/26(土) 23:42:52.67 ID:as/ML4Ec.net] >>962 軽く調べた結果: https://el.mml.tuis.ac.jp/moodle/mod/page/view.php?id=913 www.cc.kyoto-su.ac.jp/~hxm/cstext/prog06.html https://programming.pc-note.net/c/header.html どこだったか忘れたけど俺は検索して学んだ記憶がある 記憶違いかもしれないけど
1000 名前:デフォルトの名無しさん mailto:sage [2022/03/29(火) 22:17:14.91 ID:JBheGd8b.net] スマホが普及しきった2015年くらいからGoogle検索の難易度一気に上がったな 昔はガバガバキーワードでもGoogle先生が忖度してくれていた
1001 名前:デフォルトの名無しさん mailto:sage [2022/03/30(水) 08:00:47.76 ID:NklUKb3w.net] 忖度の意味知らなそう
1002 名前:デフォルトの名無しさん mailto:sage [2022/03/30(水) 10:53:25.40 ID:2Q6y3di6.net] Google ADの顧客は優遇致します
1003 名前:デフォルトの名無しさん [2022/03/30(水) 12:23:34.00 ID:eoFMqmT7.net] 広告出してくれるインチキ医療サイトや適当プログラミングスクール優遇しまーす!! 無能
1004 名前:デフォルトの名無しさん [2022/03/31(木) 16:42:12.47 ID:Pfu/lGwO.net] 初心者歓迎ということで、ちょっと聞いてみたいのですが、c++の世界ではboostというライブラリは有名なのでしょうか? c++で勤怠管理できるwebシステムを作るんだといってコンストラクタがなんだかわからないまま boostを読んでヘッダファイルをいくつか読んだあたりで英語読めなくて投げ出したことがあります。
1005 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 16:48:44.96 ID:R4GrqV7T.net] >>969 有名だけど、使わんほうがいいよ 標準で十分だよ
1006 名前:デフォルトの名無しさん [2022/03/31(木) 17:01:55.62 ID:Pfu/lGwO.net] >>970 ありがとうございます!! それに、あなた有識者の方ですね? もしよければ少しだけ詳しく評判を教えていただければ幸いです。
1007 名前:はちみつ餃子 mailto:sage [2022/03/31(木) 17:23:59.00 ID:Dq8nC8PK.net] >>969 かなり有名で活発。 最初から標準化委員会の人がかかわってるし、 Boost が出自の機能が標準入りしたこともある。 ただ、実験的な要素も多分にある。 急に仕様がかわることもある。 適切な場面では適切だし適切でない場面では適切でないというごく普通の話なんで、 評判がどうこうというより何をしたくて Boost に関心を持ってるのか説明したほうがいいよ。
1008 名前:デフォルトの名無しさん [2022/03/31(木) 17:31:25.58 ID:Pfu/lGwO.net] >>972 ありがとうございます。 boostは今はそんなに興味は持っていないんですが、今ちょうどMIMEタイプらへんのところを読んでいて、 そういえばboostにMIMEタイプって書いてあったなぁ、boostって業界だとどんな感じなんだろ?という感じです。 何となくなのですが、仕様が良く変わるから使いにくいと言う感じなのかな?と理解しました。
1009 名前:はちみつ餃子 mailto:sage [2022/03/31(木) 17:51:26.52 ID:Dq8nC8PK.net] >>973 標準ライブラリほどには互換性は意識されないってだけで、 特に実験的な部分を除いては頻繁に変わるというほどでもないけど。 アップストリームでの変更の影響を避けるために 必要な部分だけ抜き出して自分のプロジェクトツリーに入れておくという運用もよくあるし。 (そのためのツールも用意されている。) https://www.boost.org/doc/libs/1_78_0/tools/bcp/doc/html/index.html
1010 名前:デフォルトの名無しさん [2022/03/31(木) 18:00:17.34 ID:Pfu/lGwO.net] >>974 更に詳しく有難うございます。確かに抜き出しちゃえば変わらないですもんね。 他でも応用できそう。
1011 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 18:34:15.90 ID:YOGNRVrk.net] boost自体は使う必要はないけど、boostのドキュメントを読めないやつも不要だよな ドキュメントもしっかりしてるから、使うだけなら簡単に使えるし
1012 名前:デフォルトの名無しさん [2022/03/31(木) 19:04:21.70 ID:Pfu/lGwO.net] >>976 ありがとうございます。 boostくらい軽く読めないならエンジニアになるなと言うことですね。 初めて3か月くらいなもんでポートフォリオの一つもないですけれど、 本当に読んでおきますね。
1013 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 19:25:23.71 ID:R4GrqV7T.net] これから年単位でトレーニングが続くのに初心者がいちいちポートフォリョーポートフォリョー言うのは大変めんどくせえ感
1014 名前:デフォルトの名無しさん mailto:sage [2022/03/31(木) 23:41:57.85 ID:Sxv2nhUu.net] boost有用性は分かっていてもコンパイル時間やらなんやらで本チャンに適用しにくいんだよなぁ
1015 名前:デフォルトの名無しさん mailto:sage [2022/04/01(金) 01:53:53.30 ID:46G1puQR.net] boostなんてtemplateで悪ふざけしてるだけだから 普通のアプリには使えない
1016 名前:デフォルトの名無しさん [2022/04/09(土) 01:43:32.41 ID:fJGplIUn.net] VC++である動画を再生するのにコーデックのDLLが必要なのですが 予めレジストリにDLL情報を登録して、実行ファイルと同じディレクトリにDLLを置けば動きます。 でも他の環境でレジストリに登録するのが大変なので(権限がらみで面倒)、登録なしでどうにか動かす事が出来ないでしょうか? DLLを参照とかしても無理でしょうか?
1017 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 09:41:01.85 ID:nJhutFId.net] レジストリで何を登録してるんだろう? 関数をexportするだけのsusieプラグイン なんかはレジストリ登録不要で利用できるけど
1018 名前:デフォルトの名無しさん [2022/04/09(土) 13:44:11.76 ID:unOoTfDz.net] COMだろ 仕様が公開されてればLoadLibrary()して使えるんじゃね?
1019 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 14:04:17.62 ID:ehpYMGIZ.net] DirectShowやMediaFoundationのcodecなら自分で呼ぶわけにもいかんだろうな
1020 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 17:06:35.88 ID:fJGplIUn.net] みなさんレスありがとう。 >>984 たぶんこれなんですよね… やっぱ無理ですかね。
1021 名前:985 [2022/04/09(土) 18:31:18.53 ID:fJGplIUn.net] 今見たら、Video For Windowsの機能を利用してるみたいでした。 こんな古いのを使ってるから専用のコーデックを使わないといけないのか。 コーデックはH.264用のDLLみたいですね。どうにかならないかな。 HKEY_LOCAL_MACHINEにプログラムから簡単に登録出来ればいいんだけど。 なんか良い案はないでしょうか。
1022 名前:蟻人間 mailto:sage [2022/04/09(土) 19:04:00.95 ID:3yKii3E5.net] 権限が必要ならプログラムのマニフェストで権限を要求。 自動化が必要なら、必要なコマンドラインを調べてバッチプログラム化する。
1023 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 19:39:38.43 ID:fJGplIUn.net] >>987 ありがとうございます。調べてやってみます。
1024 名前:デフォルトの名無しさん mailto:sage [2022/04/09(土) 19:45:37.96 ID:s5Ocn4sk.net] 一般的な動画再生ソフトでもコーデックをインストールしないと見れないのがあるが 一方、コーデック内臓もあるので技術的にはインストール不要だとおもうが やり方はしらん、どっちも
1025 名前:985 mailto:sage [2022/04/10(日) 14:43:33.45 ID:pRTmUSXM.net] とりあえずはマニフェストの設定変更で、起動した時に権限要求するようにしました。 調べて更に良い方法あればまた変更するつもりです。みなさんレスありがとうございました。
1026 名前:デフォルトの名無しさん [2022/04/14(木) 15:42:21.39 ID:VkbtJkFZ.net] SIMDの勉強中で、下のようなことをしたいのですが、コンストラクタでエラーになります。 プリミティブ型をアライメント指定してnew,deleteするにはどうすればいいですか? class MyClass { public: MyClass() : member(new (std::align_val_t{32}) int[1000]) {} ~MyClass() { delete[] member; } int* member; };
1027 名前:デフォルトの名無しさん mailto:sage [2022/04/14(木) 16:34:45 ID:4tVKG4Xu.net] コンパイラの吐き出すエラーは見た? std::align_val_t を使えるのは C++17以降みたいだけど そこらへんは大丈夫? (※ ideone は C++14までやよね?)
1028 名前:991 [2022/04/14(木) 16:56:57.03 ID:VkbtJkFZ.net] >>992 C++20です。 visual studio 2022でエラーC2956が出ます。 エラーのリンク先には構造体をnewしたい場合の対処法が書かれてます。 対処法:構造体の宣言時にalignas()でアライメント指定する。 プリミティブ型を宣言することができない(?)ので、この対処法では解決できませんでした。
1029 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:32 ID:KM+JgYPL.net] うめ
1030 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:44 ID:KM+JgYPL.net] 埋め
1031 名前:デフォルトの名無しさん [2022/04/15(金) 15:16:54 ID:KM+JgYPL.net] ume
1032 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:03 ID:KM+JgYPL.net] 梅
1033 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:12 ID:KM+JgYPL.net] ウメ
1034 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:37 ID:KM+JgYPL.net] 生め
1035 名前:デフォルトの名無しさん [2022/04/15(金) 15:17:46 ID:KM+JgYPL.net] 産め
1036 名前:1001 [Over 1000 Thread .net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 641日 1時間 25分 58秒
1037 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています