【初心者歓迎】C/C++室 Ver.103【環境依存OK】
■ このスレッドは過去ログ倉庫に格納されています
エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 http://codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.102【環境依存OK】 http://mevius.5ch.net/test/read.cgi/tech/1509780815/ >>154 そういうことなのですか? 分かりやすい説明でスッキリしました。 >>159 そうですね。それだとイメージ的にはthisのポインターリストですからメンバーを含めてcと同様の関数テーブルをつくるには PointerPareList[]={ {this1, メンバー関数のローカルポインター1}, {this2, メンバー関数のローカルポインター2}, {thisn, メンバー関数のローカルポインターn}, }; にすればよいのかな。でもローカルポインター(クラス内の相対アドレス)がとれない?でしょうね。それに実行方法も 問題ですね。 >>164 私もラムダを使う方法で実現しました。functionは知らなかったので使わずに関数ポインター配列でもできました。 ラムダ式を使うとすんなり動作しました。 入門書のコードなんですが http://codepad.org/IIJB22M5 これの11行目と12行目は何をする関数でこのプログラムで何の役割を担ってるんですか? typedef,ファイルの分割、参照辺りから駆け足になってきて本の説明だけじゃ中々理解できません(+_+) getter/setterはaccessorアクセサというもので、メンバ変数をやりとりするための関数 なぜこんなものが必要なのかはJavaにて議論されてる ttps://qiita.com/katolisa/items/6cfd1a2a87058678d646 ttp://d.hatena.ne.jp/Nagise/20141010/1412930502 ttps://geechs-magazine.com/tag/tech/20170215_2 ttps://teratail.com/questions/27789 ttps://www.deep-rain.com/programming/program/626 >>165 ラムダ式を関数ポインタに代入できるのは、キャプチャしてない場合だけ。 今回の場合、元のオブジェクトをキャプチャする必要があるので、 関数ポインタに代入することは出来ないはず。 実際、手元のclang++ではビルドできなかった。 処理系の独自拡張でたまたま動作しているだけじゃないかな? >>167 java知らないので一瞬わからなかったです; ドット演算子でメンバ関数表示出来ないからややこしいことしてたんですね 分かりました。ありがとうございます >>168 キャプチャしてません。(あまりよくわかってないが、、) オブジェクトをグローバルで定義してるからだろうか? 組み込みなので頭で定義してる。 fpfunc funclist[] = { [](bool tf ){ Seqif.ledon1( tf ) }, [](bool tf ){ Seqif.ledon12( tf ) }, [](bool tf ){ Seqif.ledon21( tf ) }, [](bool tf ){ Seqif.ledon35( tf ) } } >>165 > PointerPareList[]={ > {this1, メンバー関数のローカルポインター1}, > {this2, メンバー関数のローカルポインター2}, > {thisn, メンバー関数のローカルポインターn}, > }; そのメンバー関数って要素ごとに異なるの? 異なるならこんな感じでやればいい #include <stdio.h> class Abc { private: int n; public: Abc(int n_) : n(n_) {} int meas0() { return n + 0; } int meas1() { return n + 1; } }; int main() { Abc aa(10); Abc bb(20); struct { Abc& This; int (Abc::*Func)(); } list[] = { { aa, &Abc::meas0 }, { aa, &Abc::meas1 }, { bb, &Abc::meas0 }, { bb, &Abc::meas1 } }; for (auto x : list) { auto n = (x.This.*x.Func)(); printf("n = %d\n", n); } } >>170 メンバ変数に直接アクセス出来ないから値だけを返す関数作ってるのかな?って URL先見て理解したんですが間違えてますか; メンバ変数を外部から書き換えさせないためのprivate指定と、 書き換えさせないけど値の読み出しはさせてやるためのget〜関数、 と考えるのが宜しいかと。 >>172 凄い。そういうことができるんですね。 メンバー関数のタイプはすべて同じなのだがクラスのタイプがことなるものが混在するばあいはどうすればいいだろ。 Abc aa(10); Efg bb(20); こんな場合。 size_tを戻り値に使った関数が定義されてるんですけど、size_tはどういう型なんですか? この入門書で、何の説明もなく使われてるんですが… >>176 サイズを表すのに充分な unsigned な整数型 >>177 ありがとうございます。照らし合わせたら何とか理解できました; それとなんですが……ロベールってプログラミング初めてやるのに向いてる書籍ではないんでしょうか? 書籍スレで聞いたら噛みつかれたりしてまともじゃなかったので、、もしもっと簡単な本あれば教えてほしいです; >>179 入門者向けというのは内容が簡単という意味ではない。 入門的なことを根本的な理屈から説明している本は難しいかもしれないが入門者にとっては有用だし、 でもそういうのはモチベーションが続かないっていう人にとっては理屈はともかく動作するものを中心に した方が良いかもしれないし、学習のスタンスによるんじゃないの。 良いか悪いかというスカラ的な軸では評価できないよ。 俺はロベールの本とやらを読んだことが無いので具体的な評価はできないけども、 古いという点でややマイナス評価かな。 C++11 (C++ の仕様の 2011 の改定) が大きなターニングポイントなので、 それよりも古い仕様を想定した書籍は現代作法的にちょっと微妙な箇所があったりする。 >>180 C++11 or later をあからさまにターゲットにした和書は https://www.amazon.co.jp/dp/4774174084/ しか持っていない、これも辞典形式で右辺値参照とかは詳しくない、いまはもうちょっと増えているかと期待するが >>175 基本クラスを作って各々派生させるくらいしか思いつかなかった #include <stdio.h> class Base { public: iint n; Base(int n_) : n(n_) {} virtual int meas0() = 0; virtual int meas1() = 0; }; class Abc: public Base { public: Abc(int n) : Base(n) {} int meas0() override { return n + 0; } int meas1() override { return n + 1; } }; class Def : public Base { public: Def(int n) : Base(n) {} int meas0() override { return n + 10; } int meas1() override { return n + 20; } }; ... 続く int main() { Abc abc(100); Def def(200); struct { Base& This; int (Base::*Func)(); } list[] = { { abc, &Base::meas0 }, { abc, &Base::meas1 }, { def, &Base::meas0 }, { def, &Base::meas1 } }; for (auto x : list) { auto n = (x.This.*x.Func)(); printf("n = %d\n", n); } } >>180 いいお値段する本なので中々乗り換える決心が付きませんでしたが これを機にもっと簡単なコードが沢山載ってて手で動かしながら直感的に覚えられる新しい版の本探してみます。 スレチにも関わらずアドバイス頂きありがとうございます(´ω`) 入門書≠簡単ではないんですね…苦しんで覚えるCみたいにいい意味でタイトルに偽りある本があればいいんですが namespace Name1{ void func1(){} } namespace Name2{ void test{ Name1::func1(); //error になる。 } } vs2017でテストするとコンパイルOKなのだが、TIのccsコンパイラだとエラーになる。 TIの場合はNamespaceはクラスにたいしては有効だけれども、グローバル関数に関してはエラーになる。 これは正しい文法なのだろうか? pubgはUE4で作られてる そのUE4はC++ 銃弾の反動とかゲーム中にどんな計算されてるのか知りたいんだけどどうやったら知れますかね? >ロベールってプログラミング初めてやるのに まず、プログラミングの初心者が、C++ を学ぶには数年以上掛かる! Ruby など数言語を数年いじくりまわした人が、やっと、C++ を学ぶスタート地点に立てる 各言語の入門書は、決してプログラミング初心者向けではない! 数言語をいじくりまわした人が、その言語に関しては、知らないというだけ。 既に数年のコンピューターリテラシーを学んだ人が、各言語の入門書を学べる つまり、プログラミング初心者と、各言語の初心者は違う。 まず、Ruby, Python, JavaScript など、軽量言語を数年やるべき C++ は最難関! 20年以上、C で開発している中高年でも、ほとんどの人は出来ない! それでも、やりたいのなら、ロベールしかない。 他の本では、絶対に無理だから! 漏れらみたいに、10言語を何十年もやってれば、速習でも読めるけど。 初心者がC++ なんて、時間の無駄 そこまですごいもんでも無いと思うがな ストラウプスのネタ本を読んでからまったりと覚えれば良いと思うがな 例えれば、プログラミングの初心者は、小学生だろ。 一方、C++ は高校生 小学生が、高校生の教科書を理解するには、10年掛かる。 読んでも理解できない 小・中・高と、簡単なものから順序よく理解していかないといけない だから、プログラミングの初心者が、C++ から始めるのが根本的に間違い! それとも誰か、プログラミングの初心者は、C++ から始めろって勧めた奴でもいたか? >>188 > プログラミングの初心者が、C++ を学ぶには数年以上掛かる > Ruby など数言語を数年いじくりまわした人が、やっと、C++ を学ぶスタート地点に立てる こマ? > 20年以上、C で開発している中高年でも、ほとんどの人は出来ない! 新しいことを覚える気がないK&RかC89脳おじさんなだけじゃないの? > 各言語の入門書は、決してプログラミング初心者向けではない! > 既に数年のコンピューターリテラシーを学んだ人が、各言語の入門書を学べる > まず、Ruby, Python, JavaScript など、軽量言語を数年やるべき RubyやPythonやJavaScirpt の入門書も同様ではないの? そうしたら、RubyやらPythonの入門書の読み方、勉強の仕方を覚えるための 学習用擬似言語みたいなものが必要になってくるな C++も11より前とそれ以降じゃ随分話が違うと思うが… >>189 「ストラウプスのネタ本」とは具体的にはどんな本なの? 言葉だけ見るとハゲ先生がC++に関して面白おかしく書き綴った 軽く読める本に思えて興味をそそられるんだが。 ネット検索できる程度の情報(タイトルとか)を教えて下さいな。 禿の本は、小難しいだけ。 ロベールよりも遥かに難しいから、読んでも無駄 「苦しんで覚えるC」は、内容がない。 手順書だから、1〜2時間ぐらいで読める。 こう打ち込んだら、こう表示されるという内容 「たのしいRuby 第5版、2016」を3回読んだ方が、遥かにためになる。 Ruby は、C/C++ みたいに余計な儀式がない。 処理が、ソースコードそのままで表現される スクエニなど、社員が数千人いても、募集しているだろ。 C++ なんて、千人中1人も出来ない 20年開発していても、資格を取れないとか、そんな奴ばっかりだろ。 そういう連中がどうやって、C++ の本を理解できるのか?w 無理や Rubyの女神・女優の池澤あやかも言ってる。 初心者が大学で、Cから始めるから、皆プログラミングが嫌いになる。 Rubyから始めれば良いのにって でもCから始めるというのはそんなに間違っていないと思う。特に情報や電気、電子工学系など 本格的にプログラミングをやろうとする人に関しては正しい入門方法だと思う。 Cからの入門が適切な人にとっては、次はC++でもよいと思う。もともとC++はCを含んでいるので 初心者がC++から始めるというのはある意味正当な方法だろう。 具体的には、たとえばハードウエア割り込み信号を捉えるプログラミングは、他の言語では非常に 理解しずらいと思う。C++なら直接割り込みが起こったところをステップ動作で観測できる。 こんな言語は他にはないだろう。しかもそのデータをメモリーに蓄積して、適切に処理したのちに さらにデータベースに格納するなど。微細な部分から非常に大規模な部分までをトータルにカバー できるというダイナミックレンジにおいてもC++以外の言語はないのではないだろうか? とはいえ自分もC++は毛嫌いしていままで使ったことはなかったが、使ってみればかなり便利だ。 >>188 細かく道筋教えていただきありがとうございます 使いこなせるようになりたい言語はC++C#と決まってるので出来れば この2つを覚えるのに有用な言語がいいんですがruby,python,javascriptの3つのうちどれが有用ですか 出来れば実行環境を用意するのに手こずらない言語がいいです。一度何処かのスレでjava勧められて環境変数が云々で挫折してるので‥ この本を薦める。 たのしいRuby 第5版、2016 オブジェクト指向を学びたいなら、 スッキリわかる Java入門 第2版、2014 どの言語でも、環境構築が難しい。 だからプログラマではない、Excel エンジニアが多い どの企業でもプログラマ募集ではなく、 コンピューターリテラシーがある人を求めているのは、そういうこと 数十のLinux コマンド・PowerShell のコマンドを知っている人とか、 環境変数PATH を知っている人とか 1. Ruby, Python, JavaScript, 2. Java, Kotlin, C#, 3. C, C++ 言語の順番で言えば、C# は6番目。 5年後ぐらいw 1は軽量・動的言語、2は静的言語、3はポインターを扱う言語。 だから大学教育で、7番目のCから教えるのは、明らかな間違い ロベール1冊を読む時間よりも、以下の3冊の方が、 はるかに短時間で読めるし、身につく。 それぐらい、C++ は難しい・ややこしい。 C/C++ のようなポインタのある言語は、必要に迫られるまで避けるべし! たのしいRuby 第5版、2016 みんなのPython 第4版、2017 スッキリわかる Java入門 第2版、2014 >>200 Java は「pathを通す」―環境変数 path を設定するだけで使えるようになりますよ OS はなんですか? 私は Java を推薦します。 Ruby は癖があり、python はオブジェクト指向が徹底されず(private 変数を外から触れる)いまひとつ C++ を使えるようになりたいなら C++ を学ぶのが当たり前の道筋じゃん。 何言ってんの? C++はたくさん動画とかも上がってるし初心者にとっつきやすい言語と思ってたんですが そうでもないんですか… 綺麗なゲーム作りたいから早くC++C#やりたいんですが厳しいですか; >>スッキリわかる Java入門 第2版、2014 お薦めしてもらったスッキリjavaは買ったんですが前述の通りsdkが説明どおりにやってもインストール出来なくて… C++やるためにvisualstudioはインストールしたんですけど、visualstudioあればRubyとかpythonも出来るんですか? >>203 OSはwin10の64bitです。dokojava筆者の説明どおりにやってなんどもインストール・アンインストール繰り返しましたが駄目でした とことん相性が悪いようです;; >>206 https://techacademy.jp/magazine/8998 で Java インストールを試してみてください 以前トラブっているのを読んでいた限りでは、この方法が有効なはずです、Windows7, WindowsXP 時代からこうしてきました >>207 コマンドプロンプトでjavac10.0.2って出てきたんですがこれは成功いけてますか? 以前教えてもらった時はpowershellとか色々やっても 全然駄目だったのに……今回一発で出来たっぽいです なんと感謝していいのやら;ありがとうございます…! 脱線してスレ違いになってすいません。 >>199 ありがとう。『C++の設計と進化』はタイトルは知ってるけど 読んだことはない(お高いのでなかなか買う踏ん切りがつかない)。 『プログラミング言語C++』第4版の中でも何回か言及されてるから いつか読もうとは思ってる。 …とか言いつつ、先刻まで「進化と設計」と覚えていた。 確かに「設計と進化」、設計して作ってさらに進化、じゃないと 話が合わないね。 何故そうなっているか?を書いているから良書だよ 丸暗記以外はしない人には不要かも知れないけど noexceptについてなんですが、標準ライブラリのコンストラクタとかって 実装が勝手にnoexceptを付けたりできますか? cppreferenceによるとunordered_map()のデフォルトコンストラクタはnoexceptが付かないことになってますが noexcept(unordered_map<string, int>()) の値を見てみたら、ideone.comではtrueになっていました。 Visual C++だとfalseです。 安全側、制約の強い側になるので実装によって異なっていても問題ないということですか? >>207 のリンクにあるような、 ユーザー・システム環境変数の画面のPATH をわからない人は、プログラマーにはなれない。 プログラマーになれない、Excel エンジニアが多いのは、PATH の仕組みがわからないから 数十ある、基本コマンドを勉強していないから シェル(PowerShell・コマンドプロンプト)で、 「ruby 引数」のようなパス無しの「コマンド名 引数」でなぜ、 実行ファイルが探し出されるのか? ruby で起動される実行ファイルは、ruby.exe, ruby.dll, ruby.sh なのか? それらが同じフォルダにあれば、どれが起動されるのか? こういう質問に答えられない人は、何十年プログラミングしていても環境構築できない こういう人は、単なる土方プログラマーで、 コンピューターリテラシーがないから、企業が採用したくない人! 土方プログラマーはいらない! コンピューターリテラシー、つまりシステムの知識がある人が求められている 土方も重要だ BIOS, ドライバ, OSのカーネル, ... >>212 問題ない。 https://timsong-cpp.github.io/cppwp/n4659/res.on.exception.handling#5 > An implementation may strengthen the exception specification for > a non-virtual function by adding a non-throwing exception specification. 詳説 Cポインタ、2013、オライリー・ジャパン ポインタの仕組みだけで、1冊出てるぐらいに難しいw >>216 よく、スレで宗教戦争を起こしているでしょ C言語がポインタの表記について混乱しているから、難しい。 に一票かなぁ >C言語がポインタの表記について混乱しているから、難しい。 混乱してるようには思えないんだが、どう混乱してるの? まあ確かに関数のポインターの型表記 などは難しいといえば難しいな。それを言うならC#だってラムダの型表記などはautoしてみないと 分からないようなことがある。ラムダもポインターに似たようなものだからね。 Cは凄くいい言語だと思う。シンプルで綺麗で分かりやすい。ただC++は失敗作だ。しかし C11あたりからその駄目部分をカバーしてきている。つまり使い方を選んで使えばC++は 非常に便利に使えるようになってきている。 本を読んでもC++の作者が書いた本は混乱していて分かりずらい。物事を複雑に考え過ぎて 混乱している。こういう人には綺麗な言語を作るのは難しいだろうと思う。今のC++はC#やJava が作り出した成果を取り込んで、精神を叩き直されたC++だから元々のC++とは違うものだと思う。 >>215 ありがとうございます。 明示的に許されていたのですね。 今回はVisual C++でコンパイルできないコードをideone上でミニマムに 再現しようとしたところコンパイルできてしまって躓いていました。 >>221 >C11あたりからその駄目部分をカバーしてきている。 私は C++11 以降は「進んで追わない」と決心してしまった敗者ですが、 そういう敗者であっても、C++11 が以前の欠点をカバーしている、というのなら、それをおききしたいです C++11 later の改良点をひとことでいうと、何なんでしょうか? 【C++11の改良点のおさらい】 autoキーワードにより、イテレータの型名の指定を省略できるようになった。 std::map, std::setの高速版のstd::unordered_map, std::unordered_setが使えるようになった。 初期化リストにより、初期化が楽になった。 ムーヴにより、所有権の移動を高速化できる。 範囲for文が使えるようになった。 constexprキーワードにより、さらなるコンパイル時計算の最適化が可能になった。 例外の扱いが改善された。 noexceptがブロック単位で指定できると面白いかも。 noexcept { int f(int n) { return n + 1; } } Javaのsynchronizedみたいなキーワードが使えないかなあ。 C++11の改良点は、性能と使いやすさを両立させるものである。 例えば、初期化リストを使えば、要素をまとめて確保できるので高速化が期待できる。 ムーヴは、コピーよりも高速である。 >>226 素人考えだけど vector<int> vec = {1, 2, 3}; for (auto elem : vec) { cout << elem << endl; } みたいなことが出来るのは実用的にはものすごくありがたいよ 濫用して読みにくくなるのは問題だけど、決まりきった処理を簡潔に書きたい場合はむしろ読みやすくなるわけだし >>236 そういうところが凄く便利になったね。 でも過去の負の遺産も引きづっている。なかでもcoutは特に嫌いだ。 coutは使わないことにしている。コードが汚くなって台無しだ。 スレ頭なんだけど ルート2っていうのがそもそも代数的に定義されたもので、有理数の加減乗除で表すのは不可能 じゃあルート2が何で存在するかっていうと、その代数的性質を満たす仮の数(!)にどこまでも近づけるから どこまでも近づくっていうのは、好きなオーダーで誤差を小さくすることが出来ることを言う 結局ルート2っていうのは任意の誤差で二乗して2になるような性質に近づく手続きのこと 誤差のオーダーを与えればそれを満たす数をただひとつ返す関数があれば それはルート2 と数学的に同値 あんま役にたたないけど 要するに数表だろ 実用的なのはデータベースで100TBくらいじゃねえの 0.0から6.24...まで0.00000000000000000000000000000001刻みで計算しとくんだろ あとはルックアップテーブルに丸投げ 計算速度は、CPUが計算するか、 CPU近くの独自回路のハードウェアで計算させるか、 CPUが三角関数の値を欲しがって遥か遠方のDBに問いかけて遥か遠方のDBから数表の値が返ってくる莫大な時間か 6.24...てなんだ? ルートの計算なんて除算と同程度に速いんだから タイムクリティカルな場所じゃなければ 毎回計算すれば良いよ 少なくともわざわざ>>13 みたいにプログラマが計算しなくて良い const WCHAR* const p = L"aaaa"; というconst WCHAR*を指すポインタ定数があるとき、 typedef const WCHAR* LPCWSTR; と型宣言がされていると、 const LPCWSTR p = L"aaaa"; と書けるけど、このときなぜ後ろのconstが前に出てくるんでしょうか。 後ろでもいいはずだけど なぜ前に出て“これる”か、ということなら ポインタを修飾してることが明確だからかな typedefしてないと*の後にしか書けない >>248 これ後ろのままでもコンパイル通るんですか。 で、前でもコンパイラが理解できるからどっちでもOKと。 ただそれなら、 const const WCHAR* p = L"aaaa"; という記述も特別OKにしてもらいたかったです。 >>239 え? 一辺の長さが 1 の正方形を書けば、その対角線 √2 が静的に可視化されている、のですけれども >>249 それだと*が2つ以上の時に困る const const WCHAR** p が const WCHAR * const * p const WCHAR * * const p WCHAR * const * const p のどれになるか分からん。 >>250 スレチだしレスするの迷ったんだけど 1辺が1の正方形を本当にかけるのか、対角線を引いたときに本当にルート2なのか、可視というが何が見えてるのか って感じで、1を正確に測りとれるとか三平方の定理とか、対角線の長さを測りとれるとか いろんな仮定が入ってる 結局仮のルート2に収束する数列とか、>>244 の言う数表(ただし無限に続く)とかと同じ議論が起きちゃう おまいら何百年前にされ尽くしたような議論をはじめるつもりか? ルートなんて学校で習っただろ 1/3というのはどうなんだろう 正確に三等分なんて、分子レベル素粒子レベルまでたどり着いても不可能だってことにならない? コンピューターで扱う上では除算と非常に近い (一般的には)近似値しか計算出来ないのも同じ 実は計算方法までそっくり >>252 スレチも山の賑わい… 正方形も、その対角線も、静的に存在しており無限の過程を認識する必要はないでしょう? その対角線を、例えば 10 進法表記に対応させるときに、無限の過程が発生するだけで アキレスと亀の話と似ている気がします もちろんデータとして扱う時は十進対応させなきゃ行けないので、有理数の加減乗除の届く範囲で近似が必要になる ただ実数と有理数の間には実際にでかい隔絶があって、自然数からの加減乗除による拡大は有理数で止まる あと本物の正方形を誰が見たこともないように、正方形や円っていうのは仮定の上にあるもの 実数の存在を正方形や円(パイ)に求めるのは、結局その仮定を無意識のうちに使用しているだけ もちろんデータとして扱う時は十進対応させなきゃ行けないので、有理数の加減乗除の届く範囲で近似が必要になる ただ実数と有理数の間には実際にでかい隔絶があって、自然数からの加減乗除による拡大は有理数で止まる あと本物の正方形を誰が見たこともないように、正方形や円っていうのは仮定の上にあるもの 実数の存在を正方形や円(パイ)に求めるのは、結局その仮定を無意識のうちに使用しているだけ 脱線ついでに、 3次元の立方体はイメージ出来るけど、 4次元の立方体ってイメージ出来る物なのかな? 訓練を積んだ数学者なら出来るの? 例えば3次元立方体を2次元平面で切断したときに出来る図形と同様に 4次元立方体を3次元空間で切断wしたときに出来る立体をイメージ出来るの? >>261 イメージ出来るって言うのを、頭のなかで回転したり任意の方から光を当てて影を見たり切断面かいたり 出来ることだとすれば四次元は比較的いける。その辺が専門の大学院生ならイメージできる 正多胞体(多面体、多角形の四次元ばーじょん)も発見されてるし、だいぶ見えてると思う 五次元もいける数学者が数人いるという噂もある 高次元だとイメージよりアナロジーが先行するかな自分の場合 立方体より単体のほうがイメージしやすいが 立方体だと[0,1]^nに微分同相とかきっとそんなん >>262 やはりスゴイと言うしかない そういう人なら、ゴムボールを切らずに裏返しにする事も出来そうだ 勿論、頭の中でだけど ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる