24/08/23 00:25:52.73 Vi8prHau.net
はちみつ先生の中の人ってエピステーメー氏じゃないですか。
926:デフォルトの名無しさん
24/08/23 12:18:20.78 x07V73qD.net
そなの? 何で?
927:デフォルトの名無しさん
24/08/23 23:55:05.93 Vi8prHau.net
エピ氏はかつて標準化委員だったそうです。はちみつ先生は、規格書が完全に頭に入ってる感じですから委員経験者と見ても違和感ない。
スレ民に委員がいるという話もあります。
あと前に「~じゃろ」ってレスを一度だけ見たのですが、それがエピ氏風に思えました。
928:デフォルトの名無しさん
24/08/24 00:19:56.05 czb9YTjo.net
なるほどー
証拠としては足りないと思うけども矛盾はしない
はちみつ氏と対立する立場で議論したことがあるけども
エピ氏だとしたら感慨深い
STL標準講座で勉強した世代だし
929:デフォルトの名無しさん
24/08/25 00:23:17.55 zZ+WMAII.net
>>925
私は個人的なことは書かないようにしているし書いている場合でも嘘を混ぜているのだけれどプロのプログラマではないのは本当だと断言する。
肯定も否定もしたくないんだけど変に誰かと混同されるとその人に迷惑がかかるかもしれないからはっきりさせておく。
私はプログラムなりプログラミングの解説なりで金を貰ったことは全くない素人で、名の知られた人物ではない。
アマチュアなりになんらかの分野で有名だったりもしない。
>>927
規格が頭に入ってるわけないでしょ。 毎回調べてる。
プログラムの設計の妥当性などについては議論を戦わせればよいと思うけど今ある規格がどうなってるかは規格を調べるしかない。
それなのに空想で議論するような馬鹿馬鹿しいことがちょくちょく起こってるから話を先に進めたくて規格を持ち出してるだけ。
930:はちみつ餃子
24/08/25 00:54:19.91 zZ+WMAII.net
名前が抜けてた。 >>929 は私ね。
JaneXeno で書き込めなくてウェブブラウザから書き込んだらミスった。
931:デフォルトの名無しさん
24/08/25 18:28:51.25 uK1NQ0Uz.net
質問です。参考書に乗ってた例試してたんですが下のコードがどういう動作してるのかよくわかりません。実行したらif(argc !=2)のところのコメント表示しかされませんでした。
#include <iostream>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
{
if(argc !=2) {
cout <<"使い方: WRITE <ファイル名>\n";
return 1;
}
ofstream out(argv[1]);
if(!out) {
cout <<"出力ファイルが開けません\n";
return 1;
}
char str[80];
cout << "文字列をディスクに書き込み、$で停止します\n";
do {
cout << ": ";
cin >> str;
out << str << endl;
}while(*str !='$');
out.close();
return 0;
}
932:デフォルトの名無しさん
24/08/25 18:44:55.52 tzsbYjlF.net
>>931
URLリンク(www.google.com)
933:デフォルトの名無しさん
24/08/25 23:27:35.25 uK1NQ0Uz.net
>>932
返信ありがとうございます。
mainのところがコマンドライン実行用のものだとわかったのですがif(argc !=2)だけが実行されて
char str[80]の一行下のコメントまで行かないで実行終わってるのでそこがどうなってるのかよくわかってません。
934:934
24/08/26 00:51:12.62 Lf2Vflpz.net
参考書に載ってるからまさかと思ったんですが>>931のコードってif文のreturnで強制終了させられてるってことですよね?
ちょっと気になってif文のところコメントアウトして動かしてみたらdo while文のところまで動いてたからif(argc !=2)の説明文表示しておいてがreturn 1で返してmainのところが終了させてるのかというのであってますか?
しかも出力ファイル検出用のif文のところも絶対に入る形になっちゃってるみたいなので説明文はdo while文の入力で出力ファイル指定してね。みたいな文章ついているんですが例として出てるのに欠陥あるコードという認識でよろしいのでしょうか?
935:934
24/08/26 01:02:13.28 Lf2Vflpz.net
自己解決しました。
今回の例って実行時に一緒に書き込みファイル名入力するだけだったのを気付いてなかっただけでした。
936:デフォルトの名無しさん
24/08/26 09:03:23.80 Nzy9klFi.net
せっかく>>932がキーワードで検索してるのに「自己解決」かよ
937:デフォルトの名無しさん
24/08/26 09:15:40.09 y+gYSKWx.net
超初心者スレでそんな回りくどい指摘で理解しろというほうが厳しいのでは
938:デフォルトの名無しさん
24/08/26 09:42:05.98 B88aYAlq.net
>>931
「よくわかりません」というのは質問になっていません。
何がわからないのかが伝わるようにまとめてください。
結果からすると argc や argv がコマンドラインから渡されるものだということがわかっていなかったようですが、質問一般のやり方としては「こうなると理解している」「でも実際にはこうなった」という形にすると伝わりやすいと思います。
質問を整理する過程で答えが分かってしまうのもよくあることです。 (ラバーダック・デバッグ)
それと参考書を元にしている場合は参考書のタイトルを書くのが望ましいです。
もしその本を持っている人がいたら前後の文脈からより適切な回答をできますし、同じ疑問をもった人がウェブ検索でここにたどり着くことが出来るかもしれないからです。
と、超初心者スレらしく質問の仕方の基本を書いておきます。
939:デフォルトの名無しさん
24/08/26 10:49:37.17 3+7ACU+U.net
!=2 よりも < 2 派は少数派?
940:デフォルトの名無しさん
24/08/26 15:31:48.06 cZUTj8Xv.net
!=2のほうが安全よね
引数が2つ以上渡された場合、ユーザーが引数の意味を勘違いしている可能性があるので第1引数をファイル名として扱うのは危険かもしれない
941:デフォルトの名無しさん
24/08/26 18:34:12.28 vEMD05Dv.net
まんこまんこー まんこまんこー まんこまんこー 君にまんこまんこー
942:デフォルトの名無しさん
24/08/26 18:43:51.64 FhzwHLyM.net
萬恋次郎
よろずれんじろう
943:デフォルトの名無しさん
24/08/28 10:09:54.84 W2AehnGr.net
一つや無しでも許容するかしないかの違い
944:1
24/10/08 08:50:18.94 EX5jdZbuX
5ちゃんねるの方は削除されてるから、ここだけ生き延びてる。
ここ有効活用しようぜ。
945:デフォルトの名無しさん
24/10/29 09:32:10.21 Pp2f7Vup.net
すみません、std::atomic<bool> m_added = false; というインスタンス変数がある
クラスで bool isAdded() { return m_added; } というメンバ関数を作ると
error: use of deleted function 'std::atomic<bool>::atomic(const std::atomic<bool>&)'
というエラーになってしまいます。なぜこんなことに?
ググると return m_added.load(); とすればよさげで、実際エラーにはならなくなりますが
これで合っていますでしょうか?
946:デフォルトの名無しさん
24/10/29 10:21:38.62 G3xxa4mJ.net
>>945
それは std::atomic<bool> という型であって、bool型ではないから。
load()でboolに変換されているということだね。
947:はちみつ餃子
24/10/29 11:42:59.70 IsdOq2r9.net
>>945
インスタンス変数って何? 文脈から推測するとデータメンバのことかな?
だとするとこんな感じのことだと思って説明するよ。
class foo {
std::atomic<bool> m_added = false;
public:
bool isAdded() { return m_added; }
};
こういう書き方だと std::atomic<bool> m_added = false; はコピー初期化という扱いになる。
なのでコピーコンストラクタが必要だが std::atomic にはコピーコンストラクタが無いのでコピーコンストラクタがないという旨がエラーメッセージとして表示される。
解決方法としてはメンバ初期化子リストで初期化すればいい。 これなら直接初期化の扱いになる。
class foo {
std::atomic<bool> m_added;
public:
foo(void) : m_added(false) {}
bool isAdded() { return m_added.load(); }
};
C++17 以降だとコピー省略が保証される (かつコピーコンストラクタの存在を要求しない) 場面なので C++17 以降を使うのなら修正は必要ない。
std::atomic<T> には operator T() があるので std::atomic<bool> から bool へは変換できて、そのときの効果は std::atomic<bool>::load を呼び出すのと同じ。
暗黙に変換するのでこの部分は本来なら問題ないはず。
ここを修正してエラーが出なくなったというのは何か誤解してると思う。
948:949
24/10/29 21:08:49.76 DeRlzLOn.net
すみません、色々勘違いやら説明不足やらあるようです。あと用語もいろいろと。
まず std::atomic<bool> m_added = false; という初期化ですが、
自分の環境はC++17(のはず)なので、これは大丈夫だったようです
949:949
24/10/29 21:14:42.30 DeRlzLOn.net
で、本当の問題は、condition_variable::wait_for()の述語バージョンのコードでして
諸般の事情でネットから拾ってきたコードを一部変更して書きますと(たぶんインデントが
壊れますが、ご了承ください)
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <chrono>
#include <atomic>
std::mutex mtx;
std::condition_variable cv;
std::atomic<bool> ready = false;
void wait_for_event() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait_for(lock, std::chrono::seconds(3), []{ return ready; });
std::cout << "Event occurred or timeout reached" << std::endl;
}
int main(void) {
std::thread worker(wait_for_event);
worker.join();
return 0;
}
950:デフォルトの名無しさん
24/10/29 21:15:37.83 oxmgzCly.net
volatileが廃止されてatomicになったんだっけ?
951:949
24/10/29 21:19:59.00 DeRlzLOn.net
この、述語部分のラムダ式で return ready; とするとコピーが発生するのでatomic的に
まずい(それをコピーコンストラクタをdeleteすることで実現している)、という理解です
で、ではどうしたらいいかという話に
952:デフォルトの名無しさん
24/10/29 21:25:03.73 DeRlzLOn.net
うわ、名前の>>947は間違いです、>>945でした、ごめんなさい
953:デフォルトの名無しさん
24/10/29 21:37:22.02 vJbaxs/e.net
述語の戻り値型にboolを明示的に指定すればおk
954:はちみつ餃子
24/10/30 07:03:45.19 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:はちみつ餃子
24/10/30 15:17:53.47 o3z0lAnP.net
色々と書いたけど、この場合について言えば変換に頼るよりは load を呼んだほうが意図が読み取りやすくて良いと思う。
956:デフォルトの名無しさん
24/10/30 16:06:31.71 kddcnuFp.net
つーかこのコードだとreadyはatomicにする必要がない
957:デフォルトの名無しさん
24/11/03 07:07:35.61 LyKtE2MZ.net
>>945です。皆さんどうもありがとうございました
>>956 確かにそこは
実際、元のコードでも (>>949はサンプルコードがベース)
他の部分は適宜mutexを使ってあり、atomicを使わなくてもいいような、あるいは逆に
mutexを使わずにatomicでいけるのかも、とか思ったりもしたのですが、
今回は最小限の変更で済ますことにしました
958:デフォルトの名無しさん
24/11/23 23:49:52.60 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
24/11/24 12:09:51.87 3DfWckE7.net
>>958
「使えば」というのはどう使うという状況を言ってる?
具体的なコードを出して。
960:はちみつ餃子 ◆8X2XSCHEME
24/11/24 12:55:51.06 3DfWckE7.net
>>958
switch の case ラベルに hash_code を使うという意味なら不可能。
case ラベルは定数 (定数式) であることを要求していて std::type_info::hash_code は constexpr が付いていないので結果は定数にならない。
コンパイル時計算するなんらかのハッシュ関数を用意すれば一応はなんとかならんでもないが……。
余興の類であって普通のテクニックとは言い難い。
そもそも std::any が不格好な仕組みなので std::any を使う以上は不格好になることを受け入れないと仕方がないと思う。
961:1
24/12/14 02:53:40.88 Bddn5MUb.net
なに?プログラムって。むつかしそうだなー
ぜんぜん知らないんだけど、ちょっとやってみたいなー
ってな人も、入れてあげてね。
そういうスレなんだから。
962:デフォルトの名無しさん
24/12/14 14:30:51.75 TQJHLK8K.net
そうしたければお前がやるんだよ
他人に期待すんな
こっちは気が向いたら好きに回答するだけ
あと過度な自治厨は嫌われるからな
963:デフォルトの名無しさん
24/12/16 20:29:27.83 lHJTCZF8.net
人がいないからって、
お題を完全に無視して自分勝手
寄ってこようかとする何も知らない人は、
怖くて寄り付けないよ
964:デフォルトの名無しさん
24/12/26 15:20:00.18 Max/6hcg.net
独習でc++の勉強しているのですがそろそろ終わり見えて来たんで終わる前に次の参考書ほしいのですがどんなのがいいのでしょうか?
現在の作りたいソフトがチューナーボードを利用したチャンネルスキャンや復調前の搬送波の保存をwinやLinuxで使える規格で作ってみたいと思っています。最終的にはそこから番組表とか自動構築できるところまでやってタイムシフトできるようにしてみたいと思ってます。
965:デフォルトの名無しさん
24/12/26 15:41:38.20 NWZL3CyL.net
基本わかったら作り始めたらいい
チューナーボードのsdkのマニュアル読め
最初は出来損ないでいいから完成させろ
966:デフォルトの名無しさん
24/12/26 22:37:43.96 Bko97FmB.net
lower_bound x以上で最小
upper_bound xより上で最小
upper_bound - 1 x以下で最大
は記述がありましたが
lower_bound - 1をググってるのですが出てきません
多分x未満で最大だと思うのですがあってますか?
967:デフォルトの名無しさん
24/12/26 23:19:55.33 /ipDVGme.net
+
968:デフォルトの名無しさん
24/12/26 23:49:39.69 ijj1Fuin.net
>>966
サンプルコード書いて確かめなよ
969:デフォルトの名無しさん
24/12/27 09:37:21.60 O2xssw1P.net
>>965
sdkのマニュアルとかないボードみたいなんでテレビ視聴用のテストソフトコード見ながら自分が欲しいもの書いてみます。
ところでvisual studio使ったことないのでわからないのですがこのソフトの書き方、読み方しっかり学べる本ってないでしょうか?今までテキストエディタで書いてg++でやってたからビルドとテストがあるぐらいしかわかりません。
970:はちみつ餃子
24/12/27 10:42:45.43 sDceJMaF.net
>>969
マイクロソフトのサイトを見ながら学習するのがよいと思う。
細かな部分はバージョンによっても変わるし、本を買ってもすぐ時代遅れになるから。
971:デフォルトの名無しさん
25/02/25 14:39:59.78 hnV+oLEs.net
おちんちぇん
972:デフォルトの名無しさん
25/03/31 15:48:05.05 5n9vvRfi.net
だいぶ遅レスですまんが、VSはブレークポイント入れるとか実行とかの基本的な操作は昔から全く変わってないよ
自分は職場で教わった部分もあるからどの本がいいとかはわからん
973:デフォルトの名無しさん
25/04/11 08:37:40.21 DDyd6LX4.net
え?お前らに聞くけどな人殺しとか前科者とかナマポとか精神障碍者とか
そういう社会的に終わってる奴が1日中何してるか考えたことある?
ない?ある?ない?どっち?え?ない?教えたるわ。ここや。こういう掲示板。
ありあまる時間を使って24時間悪口書いて文句垂れて世の中終わった終わった言うてる。
すでに終わってる奴が世の中終わってほしいから終わってる終わってる言うてるだけ。
気づけよ?お前ら。そろそろ。もう5ちゃんの平均年齢65歳ぐらいやぞ。
気付いてないのは団塊ジュニア。若者だらけと思ってるのは氷河期。
ゆとり以下は5ちゃんなんて見てないでもう。
しかも自分?もう文末にwとかwwwとか書くの古いで?
それ20年前の電車男の時代に流行ってた書き方な。
うはwwwおkとか、ちょっwwwとか、おまwwwとか
気でも狂ってるんかってぐらいに書かれてた暗黒時代な。
こんなんいまだに使ってるのお前だけやで。もう一回言うぞ?お前だけや。
気付けよ?いい加減。な!
あ?なに?このコピペ長文長い?お前が5ちゃんの2行3行レスしか読まない
人生を四半世紀(25年のことな)送ってて普通の文章読めんようになってるだけや!
わかったか?じゃあの!
974:デフォルトの名無しさん
25/04/11 13:09:16.48 /8vt7NNX.net
っ鏡
975:デフォルトの名無しさん
25/04/18 21:33:04.53 2tfOuRHs.net
C++なんてやめとけ
仕事で仕方なく触るならお気の毒だが
趣味ならもっとモダンな言語にしとけ
976:デフォルトの名無しさん
25/04/19 00:29:20.64 DSrU4IgO.net
cppのあとc#やってみて思ったのは、cppはとにかくたくさん書く必要があるってこと。
977:はちみつ餃子
25/04/19 10:45:36.30 cJmAkIgz.net
cpp は C preprocessor の略だよ。
978:デフォルトの名無しさん
25/04/19 12:22:27.38 MUEmr0y1.net
初代のC++はpreprocessorだったんですねわかります
979:
25/04/19 17:31:17.09 FLUMnkWw.net
プリプロセッサというか、Cへのトランスレータだったみたいよ
980:はちみつ餃子 ◆8X2XSCHEME
25/04/19 18:46:21.80 cJmAkIgz.net
>>979
いや、 C++ の前身である C with Classes の最初の処理系は Cpre と名付けられていて、明らかにプリプロセッサを指向してる。
このことじゃない?
981:
25/04/19 19:59:57.03 nvjdNFmD.net
>>980
かもしれません
30年以上前のうろ覚えなので
982:はちみつ餃子
25/04/19 20:26:59.32 cJmAkIgz.net
C++ と呼ぶようになってからの処理系 CFront もそれはそれで思想としては C コンパイラをジェネレータとして使う (移植性が高いから) というものであって言語としての解釈は CFront がやるし C は中間表現にすぎないからトランスレータと呼ぶのが適切かどうかは微妙なところ。
Clang のことを LLVM-IR へのトランスレータとは普通は言わないみたいな感じ。
いや、変換してるからトランスレータには違いないんだろうけどさ。
983:デフォルトの名無しさん
25/04/19 20:34:02.90 Rs10e6Jw.net
つまりNim最強ですねわかります
984:デフォルトの名無しさん
25/04/28 09:51:37.89 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:デフォルトの名無しさん
25/04/28 10:00:18.82 +jC2JIL+.net
匿名クラスってCで言う構造体やん
986:デフォルトの名無しさん
25/04/28 10:12:11.66 RRBAM2hD.net
>>984
newの後にクラス定義は書けない
匿名インラインでなんちゃらしたい場合はラムダを使う
987:はちみつ餃子
25/04/28 12:35:00.60 clGXfLYj.net
>>984
簡潔な回答としては「できない」ということになる。
関数ひとつで終わるような簡単なコールバックならラムダ式で渡せるように設計する。
もう少し複雑なものになると……式の中に定義を書けるのは見通しが悪いし、出来てしまう Java のほうが良くなさそう。
別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。
質問の本筋ではないが気になる点として、
new で生成したものはどこかで delete しなきゃならないからそのコードだけから判断できる範囲ではなんだか筋が悪そうに見える。
つまりそもそも new する意味がないんじゃない? と思う。
988:デフォルトの名無しさん
25/04/28 13:12:28.38 PR6E6U1X.net
>>986 >>987 なるほど、ありがとうございます
>>987
>別の場所 (といっても直前で良いけれど) で定義すれば何も困らないよ。
はい、それで行ってみようかとおもいます
>new で生成したものはどこかで delete しなきゃならないから
はい、そういうわけでshared_ptrで... そのためにも型の名前はあった方がいいですね
諸般の事情でJavaとC++のコードを間接的に共有しようとしていまして、
ならばコードのスタイルもできるだけ似せようかなと、思ったのでした
989:デフォルトの名無しさん
25/05/02 09:24:43.58 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:はちみつ餃子
25/05/02 09:54:10.74 LUc36ySD.net
>>989
どこでどのように型が合わないのか説明して。
991:はちみつ餃子
25/05/02 11:40:02.44 n0wyIh3y.net
>>989
for 文の括弧の中はセミコロンで区切られた三つの節を持つ形式である必要があるが、二つの節しかないのが根本的な間違い。
そんでそれを脇に置くとして、ループカウンタ i が unsigned であるときに --i >= 0 という式で判定しようとするのが間違い。
0 以下になることはありえないのだから判定の意味がない。 (無限ループを意図したのでない限りは。)
整数を別の整数型に型変換したときに型変換後の型で表現可能な範囲の値であるならば同じ数値のままであることは保証されて何も問題はない。
逆に言えば扱う値の範囲次第では違う数値に変わったり未定義になったりすることがある。
hoge.count() が返す型が size_t なら最後まで size_t で扱うのが基本的には好ましい。
値が取りうる範囲を把握しているなら問題を起こさない範囲で適切に型変換するのはプログラマの裁量による。
状況によって判断するしかない。
992:デフォルトの名無しさん
25/05/02 12:05:12.81 b7t9YOim.net
我慢できなくなって説明しちゃうはちみつさん
993:デフォルトの名無しさん
25/05/02 19:42:35.68 rPO248eK.net
for(long long i = (long long)hoge.count(); --i >= 0; ){...}
994:デフォルトの名無しさん
25/05/04 09:19:50.28 RkNPiBO2.net
Rust使えばもっと楽になるかと思いきや
面倒が増えただけだったでござる
995:デフォルトの名無しさん
25/05/04 10:01:55.29 CPTw2I9A.net
>size_t を返す hoge.count() みたいなのがあって
>for(int i = hoge.count(); --i >= 0){...}
Rustなら単に (0..hoge.count()).rev()
996:はちみつ餃子
25/05/04 11:51:46.75 w7r9Yiaa.net
全体としては Rust のほうがだいぶん楽だと思うけどなぁ。
好みや慣れの要素があるから単純には比較できないのだけれど。
997:デフォルトの名無しさん
25/05/04 11:59:34.01 RkNPiBO2.net
はちみつさんもRust使ってるんだね
998:デフォルトの名無しさん
25/05/04 11:59:44.18 RkNPiBO2.net
かわいい
999:1001
Over 1000 Thread.net
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 2364日 21時間 4分 32秒