1 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 18:49:18.44 ID:I69rZ/Of.net] 前スレ C++相談室 part157 https://mevius.5ch.net/test/read.cgi/tech/1628474251/
651 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:43:03.78 ID:jU2WrI4n.net] 老眼なので Hantei が Hentai に見えた。
652 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:49:59.30 ID:jU2WrI4n.net] >>643 静的な型を判定するならこういうのでいけると思うが、 RTTI が出てくるってことは状況が違うのかな? #include <iostream> #include <type_traits> class base{}; class driv : public base{}; class foo{}; template<class T> bool exHantei(const T&){ return std::is_base_of<base, T>::value; } int main(void) { driv hoge; foo huga; std::cout << exHantei(hoge) << std::endl; std::cout << exHantei(huga) << std::endl; }
653 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:3
] [ここ壊れてます]
654 名前:6:31.89 ID:PMmhhAT1.net mailto: dynamic_cast<base*>(hoge)がnullptrかどうかを見ろ [] [ここ壊れてます]
655 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:47:22.64 ID:6BYLlYWJ.net] >>643 bool exHentai(){ return std::is_base_of_v<base, std::remove_reference_t<decltype(hoge)>>; }
656 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:49:09.31 ID:AdXHrviP.net] >>645 ありがとうございます。 ただ今これで動作確認はしました。 が本来は基底クラスのポインタに格納されているのです…… 書き込む時に蛇足と思って省いてしまったのですが、実際は class base{}; class driv:public base{}; class WantToFind:public driv{} std::vector<base*> VecBasePtr; void pusbak() { WantToFind f1; VecBasePtr.push_back(&f1); } というようにベースポインタに押し込んで使っていて、exHantei()を使用する時にはベースとこのポインタを比較することになります。 今はちみつ餃子様のコードで動作確認をした後、自分のコード用に書き直したところ、ポインタから型を取得させる動作ができません(泣) てっきりtypeidと同じ様に、exHantei(*VecBasePtr[0]);と*を付けてポインタの中身を外に出せば生のWantToFind型が出てくるかと思ったのですが…… 思い通りの動作が出来ませんでした。 どうしてなんですかね、、、 デバッグモードで確認してもわからない もちろんbaseに仮想関数は置いてあるので、RTTIで動作してくれるものと思っていましたが。 Templateの機序が違うのかな……?
657 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:03:17.46 ID:PMmhhAT1.net] だからdynamic_castで調べろって そのための機能だから
658 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:36:21.92 ID:AdXHrviP.net] >>649 ありがとうございます!!! 確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆ こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。 レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。 返信をくださった方々には重ね重ねお礼申し上
659 名前:げます。 まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。 皆さんありがとうございます! [] [ここ壊れてます]
660 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 21:36:54.84 ID:jU2WrI4n.net] >>648 動的型で継承関係を確かめるなら >>646 が述べている通り dynamic_cast で実際に変換してみるのは手っ取り早い方法だと思う。 > 生のWantToFind型が出てくるかと思ったのですが…… 「生の」ってなんやねん。 その場合の *VecBasePtr[0] の静的型はあくまで base だよ。 オブジェクトの base である部分 (サブオブジェクト) が取り出される。 いわゆるスライシング。
661 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:37:50.95 ID:AdXHrviP.net] dynamic_castは知ってたはずなのに思い出さなかったというか思いつかなかった……
662 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:46:56.12 ID:AdXHrviP.net] >>651 ありがとうございます。 自分はスライシングもちゃんと理解してないですね…… ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる) 悪魔でも基底型なのですね? キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。 type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。
663 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:55:40.15 ID:h5bglXe3.net] dynamic_castって仮想関数テーブル必要じゃなかったっけ? まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う 多分
664 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 17:29:06.73 ID:u/w202Yd.net] スライシングとか知らない単語使わないで
665 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 18:16:17.94 ID:oZ05fVjC.net] 用語って大事だよな 言葉遣いがおかしいの指摘されると逆ギレする DQN気質なやつが残念ながら後を経たない
666 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 05:34:44.25 ID:tJtJ60TC.net] https://cpplover.blogspot.com/2018/07/c20.html?m=1 汎用エイリアス宣言の提案ってどうなったんだろう
667 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:07:39.69 ID:PFfSIkf2.net] #include <cctype> //#include <string> template <typename F> void test(F&& f){} int main(){ test(std::isprint); } これ<string>を有効にするとcouldn't deduceになるんだけど なんで? コンパイラはMSYS2 g++ 10.3.0
668 名前:デフォルトの名無しさん [2022/01/20(木) 09:24:47.83 ID:MuVW7weO.net] 名前衝突してんじゃないの?
669 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:37:40.24 ID:PFfSIkf2.net] <locale>のテンプレートが干渉してるっぽいことはわかった これ、俺の落ち度なの?
670 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 13:32:22.34 ID:NzUGMacM.net] >>660 オーバーロードやデフォルト引数が追加される可能性があるから、 一般的に標準ライブラリ関数のアドレスは取れないと思ったほうがいい。 https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility
671 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 18:29:19.36 ID:PFfSIkf2.net] ぐぶー・・・
672 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 22:37:24.73 ID:Df2OyNH0.net] ランタイムサポートが必要なC++言語機能ってRTTIやdynamic_cast、例外くらい?
673 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 23:29:32.85 ID:a5eQ4sV9.net] そもそもランタイムサポートの定義をちゃんとしないとな・・・
674 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 00:00:01.47 ID:/d5tBos9.net] RTTIも例外も標準C++の一部 それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない
675 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 01:04:31.52 ID:VVQk5y8F.net] アホすぎるw
676 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:18:18.80 ID:j/G12RQ8.net] dynamic initializationも裏で色々やってるね
677 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:28:47.34 ID:VVQk5y8F.net] とりあえずOSないところか、簡単な仕組みしかないところでC++で何か書いてみればいいよ 処理系が何をしてくれているのか分かる
678 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:43:11.40 ID:j/G12RQ8.net] ベアメタルはオモロイ
679 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:59:33.55 ID:j/G12RQ8.net] 658だけど、自己解決の報告。 テンプレートにしないで void test(int(*f)(int)){} にしたら<locale>のisprintが干渉しなくなった 最初の発想がいかんかった
680 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:26:30.46 ID:VVQk5y8F.net] isprintのテンプレート引数が決まらないからだろ test(std::isprint<int>); とかなら通ると思う
681 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:32:03.82 ID:VVQk5y8F.net] compiler explorerのarm g++ 10.3で確認した。ヘッダはlocaleにした。 #include <locale> template <typename F> void test(F&& f){} int main(){ //test(std::isprint); test(std::isprint<int>); }
682 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:47:07.93 ID:VVQk5y8F.net] 元のコードをなるべく変えずにだと #include <string> #include <cctype> template <typename F> void test(F&& f){} int main(){ test(static_cast<int (*)(int)>(std::isprint)); } ※オーバーロードを選択させるべくキャストする
683 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 09:54:53.25 ID:j/G12RQ8.net] conceptでテンプレートテンプレート引数を弾いたりできないかとも思ったけど SFINAEは関数の除外なので引数の候補を絞るのは無理だった
684 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:28:58.52 ID:om6KWGu4.net] class A { static inline struct SubStruct { int value; } Field1; } //通常の構造体のスタティックメンバ変数はヘッダファイル、cppファイル共に実体は同じ class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる この挙動は仕様なのでしょうか?
685 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:57:07.60 ID:OQdcFc3P.net] 名前書き忘れて0点取ったことないのか
686 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:38:04.16 ID:+VFNw8nk.net] 今だと仮想関数とvariantとどっち使うのが主流ですか?
687 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:49:22.43 ID:XNgWTOyh.net] >>675 名前のない構造体には実体がなく外部リンケージを持たないのでそこに対するinline指定は無視されるってことでは? 分かりにくいけど仕様として矛盾してはいないと思う
688 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:06:33.51 ID:BllOBQpy.net] >>675 「ヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」という状態をどうやって観測しているの? そんな挙動しないと思うんで、観測方法に間違いがありそう。 >>678 名前のない構造体もクラス型としては存在するし、それとは別に変数 A::Field1 は外部リンケージを持つよ。 https://timsong-cpp.github.io/cppwp/n4861/basic.link#5 > In addition, a member function, static data member, ..., has the same linkage, if any, as the name of the class of which it is a member.
689 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:08:52.36 ID:BllOBQpy.net] >>678 あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。
690 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:59:06.18 ID:0LC8SyT+.net] >>599 アーハン? doubleで表現可能な最小の数と1e-14の大小関係もわかんない人なんですかね、、、
691 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:05:40.45 ID:0LC8SyT+.net] >>593 その2π周期というのが厳密に2*M_PI周期であることの根拠は? >>560 の時点ではそれは示されていなかった >>588 で2*M_PI周期と言う実験結果がデタ
692 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:11:22.71 ID:0LC8SyT+.net] >>596 万能の一般論は無い(キリ なぜなら、f(x)が0かどうかの判定をしたいとして、±|處を0とみなすべきなのかは f(x)の精度に依存するから ただし、>>560 式に f(x1) と f(x2) の等値判定なら >>560 式にやりうる これは f(x1) - f(x2) のゼロ判定として>>560 式にやればよろっし
693 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:15:01.32 ID:0LC8SyT+.net] アンカーミスった;;;orz s/>>560 />>588 /g
694 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:12:55.51 ID:13b+4FON.net] >>681 O(1) の数値を使って計算してたら例えば 1e-15 以下の数値をゼロと見なすとかするより他ないでしょ バカ?
695 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:30:03.25 ID:OQdcFc3P.net] sedかよ
696 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:59:40.11 ID:gWLf+Bka.net] 知らなくて驚くかもしれないけどdoubleは1e-324も表せちまうんだ
697 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:34:26.32 ID:UJcbhjLZ.net] >>681-687 まだやってたのか小学生・・・ID変えてご苦労様 何度も言ってるが>>560 でこの話は終了している
698 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:48:02.61 ID:vZsc1PCZ.net] >>687 そこまで拗らせてる事に驚いたわw
699 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 19:34:50.12 ID:DSkywrpw.net] >>560 >100万をsin()しても、sin()は2π周期 >doubleの精度15桁中の5桁以上を無駄にしている これよくわからん。
700 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:03:51.19 ID:0LC8SyT+.net] 言ってる当人もわかってないんだろJK
701 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:37:14.45 ID:0LC8SyT+.net] double sin(double x)の精度が±10E-10程度らしいことは>>588 の結果が示しているが こっれはxが100万かどうかによらないことも結果が示してゐる 実装を見ないとわからんが、多分マクローリン展開の打ち切りによる誤差とみるべき
702 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:05:23.18 ID:yfbq4hUz.net] >>692 実装見てから言った方がいいよ。マクローリン展開というが、0を基準にマクローリン展開してるわけないだろ。
703 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:18:55.93 ID:0LC8SyT+.net] >>685 その方法は等値判定として一貫性が無いからNG double x = 2.0; double y = 2.0 + (10E-15) / 2.0; assert(fabs(x - y) <= 10E-15); // pass. 10E-15基準で x == y とみなされる assert(fabs(100 * x - 100.0 * y) <= 10E-15); // fail。 10E-15基準の下で 100 * x と 100.0 * y はイコールにならにあ
704 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:22:04.30 ID:0LC8SyT+.net] >>693 sin(x)の場合は|x|<<1においてsin(x) ≒ xなのでsin(x+a)を展開をする際のaを0にするのが妥当に思えまっする、
705 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 04:16:28.14 ID:QgynSmAQ.net] >>689-695 まだやってたのか小学生・・・ID変えてご苦労様 何度も言ってるが>>560 でこの話は終了している
706 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:39:04.54 ID:CWW/bMN0.net] >>678 挙動としては正にそんな感じですね >>679 test.hにあるinline void 内でprintf("%p\n", Field1)、test.cppのvoid Func1内で同様の事をして確認しました 出力のみならず、そもそもヘッダのinline void内でField1に値をセットしたはずなのにソース内ではデフォルト値のままで動作が狂ったので上記のテストをして発覚した次第です structを名前付きにするかしないかの一点だけで上記の結果が変わります
707 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:40:35.92 ID:CWW/bMN0.net] >>697 printf("%p\n", Field1)はレス間違いでprintf("%p\n", &Field1)で実験しています
708 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:41:30.96 ID:QgynSmAQ.net] #include<iostream> struct A{static struct SubStruct{int value;} Field1;}; A::SubStruct A::Field1; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; } 無名で実体の定義なんてできんのか?
709 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:43:19.72 ID:vZkrAotW.net] キャストやconst&でできるな
710 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:47:03.39 ID:QgynSmAQ.net] >>700 どうやんの?上の例でやってみてよ
711 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:48:14.26 ID:QgynSmAQ.net] ちなみに上の例は無名でない構造体で、実体の定義は A::SubStruct A::Field1; な
712 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:00.92 ID:CWW/bMN0.net] >>699 C++20だか17だかからはinlineをつける事で出来ます
713 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:47.13 ID:QgynSmAQ.net] #include<iostream> struct A{static struct {int value;} Field1;}; decltype(A::Field1) A::Field1; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; } 意外とやってみたら出来たw
714 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:55:02.08 ID:vZkrAotW.net] >>700 A::SubStruct{} で実体の「定義」ができる &A::SubStruct{} は実体がprvalueという理由でエラーだが 実体を定義できるか否かとは別問題だ
715 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:57:42.35 ID:QgynSmAQ.net] >>705 根本的に意思疎通できてないみたいだな staticメンバA::Field1の実体定義だって
716 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:59:48.93 ID:vZkrAotW.net] >>706 そのようだな なぜstaticメンバが出てくるのか不明だ
717 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:04:13.16 ID:QgynSmAQ.net] >>703 確かに出来た -std=c++17 付けたら実体定義なくても通った
718 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:05:12.08 ID:QgynSmAQ.net] コードはこんなのね(with -std=c++17) #include<iostream> struct A{static inline struct {int value;} Field1;}; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; }
719 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:25:38.49 ID:QgynSmAQ.net] 実体は同じのを指すようで再現しなかったな。MakefileはちゃんとTAB入れてな。 cat >Makefile <<EOF CXXFLAGS += -std=c++17 sample: main.o sub1.o sub2.o \$(LINK.cc) \$? -o \$@ EOF cat >main.cpp <<EOF void sub1(); void sub2(); int main() { sub1(); sub2(); return 0; } EOF cat >sub1.cpp <<EOF #include<iostream> struct A{static inline struct {int value;} Field1;}; void sub1() { std::cout << std::hex << &A::Field1 << std::endl; } EOF cat >sub2.cpp <<EOF #include<iostream> struct A{static inline struct {int value;} Field1;}; void sub2() { std::cout << std::hex << &A::Field1 << std::endl; } EOF make
720 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:40:28.67 ID:K/S7vg9Z.net] >>697-698 wandbox の gcc 11.1.0 でもやってみたけど、再現せず同じアドレスが出た。 https://wandbox.org/permlink/SSg6OZD97wmgR8kq コンパイラやバージョンやコンパイルオプションを合わせれば再現するのかね?
721 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:53:41.49 ID:QgynSmAQ.net] >>711 複数のオブジェクトファイルにしないと検証できないと思うよ
722 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:09:46.74 ID:K/S7vg9Z.net] >>712 >>697 の説明にあるtest.cppはtest.hをインクルードしてるんだろうからこの形でいいだろうと思った。 まぁやってみたけど、変わらないね。 https://wandbox.org/permlink/hfbakWmCF1i5stqr
723 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:31:20.27 ID:QgynSmAQ.net] >>713 流石にヘッダファイルから何かが生成されることはないw wandboxで複数オブジェクトファイルって処理系内部の作り次第になるし、>>710 でもやってみようかと思ったけど、3つは無理そうだね
724 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:20:50.76 ID:hHkcGLX7.net] ヘッダに実装書くと管理が楽だよね
725 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:32:20.44 ID:CWW/bMN0.net] >>711 検証頂いてるところ環境を明記しておらず申し訳ありません Visual Studio 2022、C++20で発生している現象です #include "test.h" int main() //main.cpp { A::Initialize(); //printf("%p\n", &A::Field1);をするだけのstatic inline関数 A::Func1(); //printf("%p\n", &A::Field1);をするだけのstatic関数(__declspec(noinline)をし実装はtest.cpp) } struct名をつければInitializeの出力とFunc1の出力は一致、無名structにしたら不一致 本当に他は一切いじらずに名前の有無だけで変わります
726 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:54:11.09 ID:QgynSmAQ.net] 現象を再現させる最小限のコードを全セット載せないと先には進まんて 始めからそうしてればこんなにいろいろ書かずに済んでいる
727 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:17:03.90 ID:K/S7vg9Z.net] >>714 wandbox でも -v 追加で as が2つ test.cpp と prog.cc と別で走ってるのまでは見た。
728 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:18:38.46 ID:K/S7vg9Z.net] >>716 MSVC のバグっぽいね。おとなしく名前つけて回避しつつ、できればバグ報告しとくのがいいんじゃない。
729 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:02:54.49 ID:QgynSmAQ.net] >>715 >>675 で「無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」 と書いてあるが、ヘッダファイルから直接実体は生成されないよってこと .cppなどのソースファイルからincludeされないとコンパイルしないから (もちろんただのファイル名なのでコンパイラに
730 名前:直接ヘッダファイルをコンパイルせよと指定する事はできる) つまりA::Field1に該当するシンボルが複数の.objに含まれた場合、同じになっているか=アドレスが同じになるか? の検証でないと意味がない [] [ここ壊れてます]
731 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:09:37.28 ID:QgynSmAQ.net] >>718 それは昔からgccを使ってる人は知ってるけど、そういう話じゃない 明らかに不自然な位置にソースファイルを指定して無理矢理2個同時にコンパイルする上に、引用されて3個はできない つまり想定された使い方ではないということ おまけに処理系やそのバージョンを複数変えられることが比較的便利なwandboxで、処理系を変えると確認が必要になるやり方はどうかと言っただけ まあ、分かってるとは思うんだが
732 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:03.88 ID:QgynSmAQ.net] とりあえず、710のコードでVS2019を調べた結果、再現は確認できた。 ただし、コンパイルオプション次第で現象が出たり出なかったりする。 VS2022でもないし、VSはコンパイルリンクオプションがデフォルトで大量に指定されてて確認が面倒なのでそれ以上は放棄した。 以下のコードではpermissive-オプションの有無で現象が再現したりしなかったりするが、デフォルト時だとその切替えで現象は変わらないので、一次原因ではないと思う。
733 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:36.31 ID:hHkcGLX7.net] 保守できないような書き方して自分の仕事を守る。PGの当然の権利ですよね。
734 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:25:06.27 ID:QgynSmAQ.net] > main.cpp ( @echo void sub1^(^); @echo void sub2^(^); @echo int main^(^) { @echo sub1^(^); @echo sub2^(^); @echo return 0; @echo } ) > sub1.cpp ( @echo #include^<iostream^> @echo struct A { static inline struct { int value; } Field1; }; @echo void sub1^(^) { @echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl; @echo } ) > sub2.cpp ( @echo #include^<iostream^> @echo struct A { static inline struct { int value; } Field1; }; @echo void sub2^(^) { @echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl; @echo } ) > sample.mak ( @echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive- @echo .cpp.obj: @echo $^(CXX^) $^(CXXFLAGS^) /c $^< @echo sample.exe: main.obj sub1.obj sub2.obj @echo link /OUT:$@ $^*^* ) nmake /f sample.mak rem バッチファイルもnmakeもよく知りません。
735 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:34:19.55 ID:K/S7vg9Z.net] >>721 ソース3つ以上もできるよ。 https://wandbox.org/permlink/UgIc9mFrs59059jq
736 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:40:05.18 ID:QgynSmAQ.net] >>723 そういうのはプロジェクトの方針だと思うので、ここで話す内容ではないと思うよ
737 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:45:20.80 ID:QgynSmAQ.net] >>725 改行と空白で違うのかよw b烽、知るかってャ激xルだけど、bりがと bニりあえず>>710 を載っけとく https://wandbox.org/permlink/e8khwggKe00rtekJ
738 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:49:22.51 ID:QgynSmAQ.net] >>723 >>727 は何故だか文字が化けてたので一応書き直しとく。 改行と空白で違うのかよw もう知るかってレベルだけど、ありがと とりあえず>>710 を載っけとく https://wandbox.org/permlink/e8khwggKe00rtekJ
739 名前:デフォルトの名無しさん [2022/01/24(月) 19:27:55.24 ID:WxnVLAIm.net] C++11から、C++20までの変更点を解説した入門書を年末に買ったのだが(C++は書けるよ)、まだ読む気になれないw 「今更C++か、pythonでいいだろ」と悪魔が囁くw
740 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 19:42:15.63 ID:nLfFXIoN.net] c++cliについてネットに解説している情報あまり無いですが、まとまってるサイトとかないですかね。
741 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 20:29:40.39 ID:kghIRcG8.net] https://docs.microsoft.com/ja-jp/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170
742 名前:デフォルトの名無しさん mailto:sage [2022/01/25(火) 08:07:34.25 ID:m+e4/QVD.net] めずらしい 変態に興味あるとは VisualJ++とかワケ
743 名前:ワカだったぜw [] [ここ壊れてます]
744 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 05:15:43.56 ID:DGJ/MazB.net] 1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: OnPaint(hWnd); break; case WM_CREATE: SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義 break; case WM_TIMER: //タイマー { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); tmDraw(hdc); //これを呼んで描画 EndPaint(hWnd, &ps); } break; return 0; } static VOID tmDraw(HDC hDC) { SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認 SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00)); Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画 } 最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。 呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。 windowサイズを手動で変えていくと四角は右に伸びていき更新されます。 タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
745 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 06:35:00.77 ID:R08bxH5q.net] WM_TIMERでBeginPaintはおかしいぞ WM_PAINT専用なんだから 無効領域ないのにBeginPaintしたらあかん [誘導] 続きはこっちでな Win32API質問箱 Build127 https://mevius.5ch.net/test/read.cgi/tech/1639053176/
746 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:17:52.16 ID:T9eKedNN.net] InvalidateRectとかGetDC〜ReleaseDCだっけ?
747 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:50:18.18 ID:td9ayUMw.net] アップデートはマイクロソフトがやりたい時にやる という基本理念を理解していないようだね
748 名前:デフォルトの名無しさん [2022/01/26(水) 09:14:18.23 ID:m89Xdimf.net] WM_TIMERでInvalidateRectしておくとWindowsがWM_PAINT呼んでくれるからそこで描画するんだっけ
749 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:17:55.57 ID:qvNTvCwo.net] そもそもこれCだろ… WinMainから書く超基礎的コードをここで聞く頭がもうね
750 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:26:13.12 ID:WR8doP3S.net] べつにアイドルループで描画してもいいんだよ メッセージの処理さえ忘れずにピークしてこなせば
751 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:32:54.79 ID:g/1zEXcm.net] >>738 スレチなのは確かだが、いちいち見下して何がしたいんだお前