1 名前:デフォルトの名無しさん [2018/11/12(月) 14:55:13.35 ID:Tf74ZWQr.net] 何にも知らない0からの出発、超初心者のためのC++相談室
950 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:15:37.83 ID:oxmgzCly.net] volatileが廃止されてatomicになったんだっけ?
951 名前:949 mailto:sage [2024/10/29(火) 21:19:59.00 ID:DeRlzLOn.net] この、述語部分のラムダ式で return ready; とするとコピーが発生するのでatomic的に まずい(それをコピーコンストラクタをdeleteすることで実現している)、という理解です で、ではどうしたらいいかという話に
952 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:25:03.73 ID:DeRlzLOn.net] うわ、名前の>>947 は間違いです、>>945 でした、ごめんなさい
953 名前:デフォルトの名無しさん mailto:sage [2024/10/29(火) 21:37:22.02 ID:vJbaxs/e.net] 述語の戻り値型にboolを明示的に指定すればおk
954 名前:はちみつ餃子 mailto:sage [2024/10/30(水) 07:03:45.19 ID:o3z0lAnP.net] >>949 ラムダ式の返却値の型は省略すると return に与えた式から推論され、推論結果は参照にはならない。 つまり []{ return ready; } は []->std::atomic<bool>{ return ready; } と書いたのと同じということ。 これだと値を返すときにコピーが発生するのでコピーコンストラクタが必要 (だけど実際には無い) ということになってしまう。 解決方法としては load を呼ぶというのは妥当な方法のひとつだけど、 返却値として bool を明示する、つまり []->bool { return ready; } とするのでもよいし、 キャストを書いて [] { return static_cast<bool>(ready); } というようにするのでも良い。 見栄えからすると [] { return bool(ready); } のほうが綺麗かな?
955 名前:はちみつ餃子 mailto:sage [2024/10/30(水) 15:17:53.47 ID:o3z0lAnP.net] 色々と書いたけど、この場合について言えば変換に頼るよりは load を呼んだほうが意図が読み取りやすくて良いと思う。
956 名前:デフォルトの名無しさん mailto:sage [2024/10/30(水) 16:06:31.71 ID:kddcnuFp.net] つーかこのコードだとreadyはatomicにする必要がない
957 名前:デフォルトの名無しさん mailto:sage [2024/11/03(日) 07:07:35.61 ID:LyKtE2MZ.net] >>945 です。皆さんどうもありがとうございました >>956 確かにそこは 実際、元のコードでも (>>949 はサンプルコードがベース) 他の部分は適宜mutexを使ってあり、atomicを使わなくてもいいような、あるいは逆に mutexを使わずにatomicでいけるのかも、とか思ったりもしたのですが、 今回は最小限の変更で済ますことにしました
958 名前:デフォルトの名無しさん mailto:sage [2024/11/23(土) 23:49:52.60 ID:thI1occS.net] std::anyを使っていて、type()の返す形によって処理を変えたいのですが、 今はこれを typeid(形) と比較するif-else文の繰り返しを書いています ググったら、hash_code()を使えばswitch文で書けるというのがあったのですが... 書けます? エラーでコンパイルできないんですが error: call to non-'constexpr' function 'std::size_t std::type_info::hash_code() const'
959 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/11/24(日) 12:09:51.87 ID:3DfWckE7.net] >>958 「使えば」というのはどう使うという状況を言ってる? 具体的なコードを出して。
960 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2024/11/24(日) 12:55:51.06 ID:3DfWckE7.net] >>958 switch の case ラベルに hash_code を使うという意味なら不可能。 case ラベルは定数 (定数式) であることを要求していて std::type_info::hash_code は constexpr が付いていないので結果は定数にならない。 コンパイル時計算するなんらかのハッシュ関数を用意すれば一応はなんとかならんでもないが……。 余興の類であって普通のテクニックとは言い難い。 そもそも std::any が不格好な仕組みなので std::any を使う以上は不格好になることを受け入れないと仕方がないと思う。
961 名前:1 [2024/12/14(土) 02:53:40.88 ID:Bddn5MUb.net] なに?プログラムって。むつかしそうだなー ぜんぜん知らないんだけど、ちょっとやってみたいなー ってな人も、入れてあげてね。 そういうスレなんだから。
962 名前:デフォルトの名無しさん mailto:sage [2024/12/14(土) 14:30:51.75 ID:TQJHLK8K.net] そうしたければお前がやるんだよ 他人に期待すんな こっちは気が向いたら好きに回答するだけ あと過度な自治厨は嫌われるからな
963 名前:デフォルトの名無しさん mailto:sage [2024/12/16(月) 20:29:27.83 ID:lHJTCZF8.net] 人がいないからって、 お題を完全に無視して自分勝手 寄ってこようかとする何も知らない人は、 怖くて寄り付けないよ
964 名前:デフォルトの名無しさん [2024/12/26(木) 15:20:00.18 ID:Max/6hcg.net] 独習でc++の勉強しているのですがそろそろ終わり見えて来たんで終わる前に次の参考書ほしいのですがどんなのがいいのでしょうか? 現在の作りたいソフトがチューナーボードを利用したチャンネルスキャンや復調前の搬送波の保存をwinやLinuxで使える規格で作ってみたいと思っています。最終的にはそこから番組表とか自動構築できるところまでやってタイムシフトできるようにしてみたいと思ってます。
965 名前:デフォルトの名無しさん mailto:sage [2024/12/26(木) 15:41:38.20 ID:NWZL3CyL.net] 基本わかったら作り始めたらいい チューナーボードのsdkのマニュアル読め 最初は出来損ないでいいから完成させろ
966 名前:デフォルトの名無しさん mailto:sage [2024/12/26(木) 22:37:43.96 ID:Bko97FmB.net] lower_bound x以上で最小 upper_bound xより上で最小 upper_bound - 1 x以下で最大 は記述がありましたが lower_bound - 1をググってるのですが出てきません 多分x未満で最大だと思うのですがあってますか?
967 名前:デフォルトの名無しさん mailto:sage [2024/12/26(木) 23:19:55.33 ID:/ipDVGme.net] +
968 名前:デフォルトの名無しさん mailto:sage [2024/12/26(木) 23:49:39.69 ID:ijj1Fuin.net] >>966 サンプルコード書いて確かめなよ
969 名前:デフォルトの名無しさん [2024/12/27(金) 09:37:21.60 ID:O2xssw1P.net] >>965 sdkのマニュアルとかないボードみたいなんでテレビ視聴用のテストソフトコード見ながら自分が欲しいもの書いてみます。 ところでvisual studio使ったことないのでわからないのですがこのソフトの書き方、読み方しっかり学べる本ってないでしょうか?今までテキストエディタで書いてg++でやってたからビルドとテストがあるぐらいしかわかりません。
970 名前:はちみつ餃子 mailto:sage [2024/12/27(金) 10:42:45.43 ID:sDceJMaF.net] >>969 マイクロソフトのサイトを見ながら学習するのがよいと思う。 細かな部分はバージョンによっても変わるし、本を買ってもすぐ時代遅れになるから。
971 名前:デフォルトの名無しさん mailto:sage [2025/02/25(火) 14:39:59.78 ID:hnV+oLEs.net] おちんちぇん
972 名前:デフォルトの名無しさん mailto:sage [2025/03/31(月) 15:48:05.05 ID:5n9vvRfi.net] だいぶ遅レスですまんが、VSはブレークポイント入れるとか実行とかの基本的な操作は昔から全く変わってないよ 自分は職場で教わった部分もあるからどの本がいいとかはわからん
973 名前:デフォルトの名無しさん [2025/04/11(金) 08:37:40.21 ID:DDyd6LX4.net] え?お前らに聞くけどな人殺しとか前科者とかナマポとか精神障碍者とか そういう社会的に終わってる奴が1日中何してるか考えたことある? ない?ある?ない?どっち?え?ない?教えたるわ。ここや。こういう掲示板。 ありあまる時間を使って24時間悪口書いて文句垂れて世の中終わった終わった言うてる。 すでに終わってる奴が世の中終わってほしいから終わってる終わってる言うてるだけ。 気づけよ?お前ら。そろそろ。もう5ちゃんの平均年齢65歳ぐらいやぞ。 気付いてないのは団塊ジュニア。若者だらけと思ってるのは氷河期。 ゆとり以下は5ちゃんなんて見てないでもう。 しかも自分?もう文末にwとかwwwとか書くの古いで? それ20年前の電車男の時代に流行ってた書き方な。 うはwwwおkとか、ちょっwwwとか、おまwwwとか 気でも狂ってるんかってぐらいに書かれてた暗黒時代な。 こんなんいまだに使ってるのお前だけやで。もう一回言うぞ?お前だけや。 気付けよ?いい加減。な! あ?なに?このコピペ長文長い?お前が5ちゃんの2行3行レスしか読まない 人生を四半世紀(25年のことな)送ってて普通の文章読めんようになってるだけや! わかったか?じゃあの!
974 名前:デフォルトの名無しさん mailto:sage [2025/04/11(金) 13:09:16.48 ID:/8vt7NNX.net] っ鏡
975 名前:デフォルトの名無しさん mailto:sage [2025/04/18(金) 21:33:04.53 ID:2tfOuRHs.net] C++なんてやめとけ 仕事で仕方なく触るならお気の毒だが 趣味ならもっとモダンな言語にしとけ
976 名前:デフォルトの名無しさん mailto:sage [2025/04/19(土) 00:29:20.64 ID:DSrU4IgO.net] cppのあとc#やってみて思ったのは、cppはとにかくたくさん書く必要があるってこと。
977 名前:はちみつ餃子 mailto:sage [2025/04/19(土) 10:45:36.30 ID:cJmAkIgz.net] cpp は C preprocessor の略だよ。
978 名前:デフォルトの名無しさん [2025/04/19(土) 12:22:27.38 ID:MUEmr0y1.net] 初代のC++はpreprocessorだったんですねわかります
979 名前: mailto:sage [2025/04/19(土) 17:31:17.09 ID:FLUMnkWw.net] プリプロセッサというか、Cへのトランスレータだったみたいよ
980 名前:はちみつ餃子 ◆8X2XSCHEME mailto:sage [2025/04/19(土) 18:46:21.80 ID:cJmAkIgz.net] >>979 いや、 C++ の前身である C with Classes の最初の処理系は Cpre と名付けられていて、明らかにプリプロセッサを指向してる。 このことじゃない?
981 名前: mailto:sage [2025/04/19(土) 19:59:57.03 ID:nvjdNFmD.net] >>980 かもしれません 30年以上前のうろ覚えなので
982 名前:はちみつ餃子 mailto:sage [2025/04/19(土) 20:26:59.32 ID:cJmAkIgz.net] C++ と呼ぶようになってからの処理系 CFront もそれはそれで思想としては C コンパイラをジェネレータとして使う (移植性が高いから) というものであって言語としての解釈は CFront がやるし C は中間表現にすぎないからトランスレータと呼ぶのが適切かどうかは微妙なところ。 Clang のことを LLVM-IR へのトランスレータとは普通は言わないみたいな感じ。 いや、変換してるからトランスレータには違いないんだろうけどさ。
983 名前:デフォルトの名無しさん [2025/04/19(土) 20:34:02.90 ID:Rs10e6Jw.net] つまりNim最強ですねわかります
984 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 09:51:37.89 ID:PR6E6U1X.net] C++で匿名クラスを使ってみたいのですが、試したところ class { public: void print() { std::cout << "Hello!\n"; } } obj; obj.print() は動きました。それならば auto objp = new class { public: void print() { std::cout << "Hello!\n"; } } (); objp->print(); あたりが動くのかな、と思いましたがコンパイルでエラーになってしまいます anon_class_test.cpp:4:19: error: declaration of anonymous class must be a definition 4 | auto objp = new class { | ^ anon_class_test.cpp:7:7: error: expected a type 7 | } (); | ^ 正しい書き方があれば教えていただけないでしょうか? ちなみに、Java (Android)でのコールバックの登録であるような、インラインで無名の クラスのオブジェクトを定義・生成して渡すような書き方がC++でもできるのかな、 という疑問があり、それの第一歩的な感じなのですが
985 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 10:00:18.82 ID:+jC2JIL+.net] 匿名クラスってCで言う構造体やん
986 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 10:12:11.66 ID:RRBAM2hD.net] >>984 newの後にクラス定義は書けない 匿名インラインでなんちゃらしたい場合はラムダを使う
987 名前:はちみつ餃子 mailto:sage [2025/04/28(月) 12:35:00.60 ID:clGXfLYj.net] >>984 簡潔な回答としては「できない」ということになる。 関数ひとつで終わるような簡単なコールバックならラムダ式で渡せるように設計する。 もう少し複雑なものになると……式の中に定義を書けるのは見通しが悪いし、出来てしまう Java のほうが良くなさそう。 別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。 質問の本筋ではないが気になる点として、 new で生成したものはどこかで delete しなきゃならないからそのコードだけから判断できる範囲ではなんだか筋が悪そうに見える。 つまりそもそも new する意味がないんじゃない? と思う。
988 名前:デフォルトの名無しさん mailto:sage [2025/04/28(月) 13:12:28.38 ID:PR6E6U1X.net] >>986 >>987 なるほど、ありがとうございます >>987 >別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。 はい、それで行ってみようかとおもいます >new で生成したものはどこかで delete しなきゃならないから はい、そういうわけでshared_ptrで... そのためにも型の名前はあった方がいいですね 諸般の事情でJavaとC++のコードを間接的に共有しようとしていまして、 ならばコードのスタイルもできるだけ似せようかなと、思ったのでした
989 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 09:24:43.58 ID:k5bGwZZ0.net] size_t を返す hoge.count() みたいなのがあって for(int i = hoge.count(); --i >= 0){...} と描くと 型が違うって怒られるのですが for(int i = (int)hoge.count(); --i >= 0){...} for(unsigned long i = (unsigned long)hoge.count(); --i >= 0){...} for(size_t i = hoge.count(); --i >= 0){...} どれが正解?
990 名前:はちみつ餃子 mailto:sage [2025/05/02(金) 09:54:10.74 ID:LUc36ySD.net] >>989 どこでどのように型が合わないのか説明して。
991 名前:はちみつ餃子 mailto:sage [2025/05/02(金) 11:40:02.44 ID:n0wyIh3y.net] >>989 for 文の括弧の中はセミコロンで区切られた三つの節を持つ形式である必要があるが、二つの節しかないのが根本的な間違い。 そんでそれを脇に置くとして、ループカウンタ i が unsigned であるときに --i >= 0 という式で判定しようとするのが間違い。 0 以下になることはありえないのだから判定の意味がない。 (無限ループを意図したのでない限りは。) 整数を別の整数型に型変換したときに型変換後の型で表現可能な範囲の値であるならば同じ数値のままであることは保証されて何も問題はない。 逆に言えば扱う値の範囲次第では違う数値に変わったり未定義になったりすることがある。 hoge.count() が返す型が size_t なら最後まで size_t で扱うのが基本的には好ましい。 値が取りうる範囲を把握しているなら問題を起こさない範囲で適切に型変換するのはプログラマの裁量による。 状況によって判断するしかない。
992 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 12:05:12.81 ID:b7t9YOim.net] 我慢できなくなって説明しちゃうはちみつさん
993 名前:デフォルトの名無しさん mailto:sage [2025/05/02(金) 19:42:35.68 ID:rPO248eK.net] for(long long i = (long long)hoge.count(); --i >= 0; ){...}
994 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 09:19:50.28 ID:RkNPiBO2.net] Rust使えばもっと楽になるかと思いきや 面倒が増えただけだったでござる
995 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 10:01:55.29 ID:CPTw2I9A.net] >size_t を返す hoge.count() みたいなのがあって >for(int i = hoge.count(); --i >= 0){...} Rustなら単に (0..hoge.count()).rev()
996 名前:はちみつ餃子 mailto:sage [2025/05/04(日) 11:51:46.75 ID:w7r9Yiaa.net] 全体としては Rust のほうがだいぶん楽だと思うけどなぁ。 好みや慣れの要素があるから単純には比較できないのだけれど。
997 名前:デフォルトの名無しさん mailto:sage [2025/05/04(日) 11:59:34.01 ID:RkNPiBO2.net] はちみつさんもRust使ってるんだね
998 名前:デフォルトの名無しさん [2025/05/04(日) 11:59:44.18 ID:RkNPiBO2.net] かわいい
999 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 2364日 21時間 4分 32秒