1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい。 !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part137 https://mevius.5ch.net/test/read.cgi/tech/1531558382/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.103【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1530384293/ ■長いソースを貼るときはここへ。■ codepad.org/ https://ideone.com/ [C++ FAQ] https://isocpp.org/wiki/faq/ www.bohyoh.com/CandCPP/FAQ/ (日本語) ----- テンプレ ここまで ----- VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
856 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 18:56:52.23 ID:oWn9MzvpM.net] move元のオブジェクトに対するアクセスがコンパイルエラーになるんならわかるけど、そうじゃないんなら 大層な仕組みを入れなくても単に unique_ptr を言語組み込みで実装すれば済む話だったのでは?
857 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 19:32:03.30 ID:YVfD+mv1M.net] お前ら江添に負けて恥ずかしくないの?
858 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 20:26:30.14 ID:1/46iTAZM.net] 全然?
859 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 21:00:53.02 ID:vc6gAAuZd.net] >>838 それ何が嬉しいんだ? vector とかどうすんだよ
860 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 22:03:09.07 ID:oWn9MzvpM.net] >>841 moveするのが分かってるんなら最初からvectorごとヒープに作って unique_ptr で持てばいいでしょ 中途半端にガワだけスタックに置く意味がない
861 名前:デフォルトの名無しさん mailto:sage [2018/09/29(土) 23:45:25.50 ID:OLOWa9QF0.net] move後の元オブジェクトを破壊っていうか破棄しようって提案もあったよ。ちょっと早くなるのだとさ。
862 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 00:04:13.06 ID:kBo12DYt0.net] >>842 ポインターならそもそも copy のコスト安いから move 要らないじゃん
863 名前:デフォルトの名無しさん [2018/09/30(日) 00:20:38.65 ID:aYXyCrkn0.net] それだったら最初から普通にポインタでかけよ
864 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 00:57:02.37 ID:GfZkWSkk0.net] この3冊が、神の書! Linux プログラミング・インタフェース、Michael Kerrisk、2012 C++11/14 コア言語、江添 亮、2015 組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド、MISRA‐C研究会、2006
865 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 01:40:28.47 ID:CKZYWlYLa.net] >>844 だからmoveいらないって話でしょ C++のムーブセマンティクスがああなったのは中途半端にスタックを使うスタイルが定着してしまっていて今更ポインタ使えというのは無理があるからで、 本来は所有権の管理さえ適切に行えるようになってさえいればムーブなんか要らんよ
866 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:43:45.01 ID:C9oWPEnUr.net] C++ Coding Standards って新品で買えないけど代わりになる書籍ありますか?
867 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:48:23.20 ID:d4gXl3Bi0.net] >>847 ポインタ使え思想はすでにC#とかなクラスが参照型な言語で実現されているが オブジェクトの解放にガベージコレクタが要る言語になった これはガベージコレクタ無し・所有権の無条件移動だけだと、次のようなケースで早速話が破綻するから仕方が無い void bar(int n) { std::unique_ptr<Foo> a(new Foo()); for (int i = 0; i < n; i++) { func1(a, i); // func1(a, 0);で所有権がgone 以降のfunc(a, i)はaの不正アクセス } } 不正アクセスにならないように、実際にはこのようなfunc1()にはa.get()でポインタを渡す書き方をする するとfunc1()以下の呼び出しは全部>>845 になる 人類に逃げ場は無い
868 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 06:53:57.08 ID:d4gXl3Bi0.net] それにポインタ使え思想だと次のようなケースでBaz::m_c[i]のBar:m_b[j]の:Foo::m_aのアクセスに藻前らどんだけ間接参照するんですかと、 class Foo { SomeClass m_a; }; class Bar { Foo m_b[100]; }; class Baz { Bar m_c[100]; };
869 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 07:13:40.02 ID:d4gXl3Bi0.net] ちな>>850 はm_bやm_cが配列であるため、配列アクセス時の添え字が定数なシチュでもない限り、JITでも間接参照回数を3以下にはできん
870 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:10:22.74 ID:3yGUdTqFM.net] >>849 よくわからんな 848の問題はそれmoveでも一緒だよね 単にデフォルトの挙動がmoveかborrowかだけの話で、unique_ptrがたまたま前者なだけ スマポ使えば間接参照はどうしても増えるけど、実際>>850 のようなケースで特定の要素だけ所有権捨てたりしないでしょ 所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、その場合に限ってスマポを使えばよい コーナーケースのために全てを複雑にする必要はない
871 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:21:04.80 ID:d4gXl3Bi0.net] >>852 >所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、 有り得ない仮定すぐる… >>849 なケースにおいて、オブジェクトaの生成時点というのは、 ライブラリー制作者がfunc1()を設計してビルドまで完了した後やがな…
872 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:39:54.40 ID:3yGUdTqFM.net] >>853 自分でも分かってて揚げ足取ろうとしてるんだろうけど、コーディング時に、プログラマがオブジェクトを生成することを意図したコードを記述した時点で、な
873 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:46:24.24 ID:d4gXl3Bi0.net] >>854 いやスマン言い方がまずかったそういう意味ではない 確かに >所有権を移動するかどうかはほぼ例外なくオブジェクト生成時点で予め分かってるんだから、 というのは真だが、ライブラリのインターフェースに解放が必要なオブジェクトのmoveなど認めたら有り得ないコストが生じるという話 func1()の制作者が所有権を寄越すことを強制した(そういうインターフェース仕様にしてしまった)場合、 func1()を使う人はfunc1()に所有権を渡さねばならない。この結果、 1. 呼び出し元(func1()を使う人)がaをコピーしてコピーをfunc1()に渡さねばならない 2. func1()は呼び出しの度に、aを解放する というのが>>849 のコードでn回無駄に繰り返される これを避ける方法はあるっていやーあるが、結局func1()以下の呼び出しは全部>>845 になる(か、ガベージコレクタの出番となる 人類に逃げ場は無い
874 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 09:52:25.65 ID:CKZYWlYLa.net] >>855 だからそれmoveでも同じことだよね? ユニバーサル参照のことを言ってるんだとしたら、あれただの型推論だぞ
875 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:03:48.10 ID:d4gXl3Bi0.net] >>856 解放が不要なオブジェクトのmoveは話がちげう この場合、単に生ポインタ(オブジェクトのアドレス)をfunc1()に渡すのと変わらん これはライブラリのインターフェースに現れてもコスト的には問題は無い 元レスのアンカー先>>847 は>>855 のコストが避けられない主張
876 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:07:31.97 ID:d4gXl3Bi0.net] いやすまん解放が不要なオブジェクトでも、所有権を移動した場合は>>855 の1のコストは避けられないorz ここは訂正
877 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:11:13.08 ID:CKZYWlYLa.net] >>857 スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって言ってるんだけど、そんなに難しい話かなあ
878 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 10:45:39.58 ID:d4gXl3Bi0.net] >>859 >>849 、>>850 は、現行C++におけるスマポのmoveと本体のmoveの優劣は問題にしていない 848を現行C++のコード風に書いたから誤解を招いたのかもしれないが、比較はあくまで現行C++と846思想の比較であって、 846の次の思想を実行に移したら>>855 のコストが避けられませんよという話 1. スタックを使うスタイルはやめるべき(全部スマポであるべき) 2. 所有権の管理さえ適切に行えるようになってさえいれば(現行C++のムーブセマンティクスみたいな)ムーブなんか要らん 1は現行C++との比較において、間接参照回数に響く 2は現行C++との比較において、現行C++では避けられるコスト(>>855 またはガベージコレクション)を無駄に背負い込むことになる
879 名前:はちみつ餃子 mailto:sage [2018/09/30(日) 10:52:02.74 ID:56zUhffF0.net] >>859 本体のムーブも、ムーブ出来るように書いたらカスタムなスマートポインタみたいになるから、 間接参照が入っちゃうので、なおさら同じではあると思う。 でもまあ、ムーブは抽象化の方法であって、 最終的に実行されることが同じだからなくても良いってのは暴論よね。
880 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:10:34.99 ID:f0zM7Hcdr.net] アンダースコアとドットをこの順で必ず含む string があったとして、アンダースコアからドットまでの部分文字列を切り出す処理って一行で書ける? substr と find_first_of と find_last_of を組み合わせる方法を考えたんだが、 アンダースコアの前を削る; ドットの後を削る; という2行に渡るやり方しか思い付かない
881 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:15:56.30 ID:d4gXl3Bi0.net] ちな >スマポのmoveも本体のmoveも一段間接参照が入る以外は何も変わらないって これは現行C++においても違う違いがワカル男ならワカル func1()からfunc2()にfunc1()の自動変数aをmoveするとして、かつfunc2()はインライン展開されるとすると、 func2()におけるaのメンバへのアクセスはfunc1()呼び出し時点でのスタックポインタ相対で一発でやれる 一方、aがスマポだったりすると、aのメンバへのアクセスの前に、func1()呼び出しの都度1回はスタックポインタ相対でaのアドレスを得なければならない
882 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:27:40.54 ID:fM5IaZg4M.net] オブジェクト本体のメモリのコピーにかかるコストを考慮すればどっちもどっち
883 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 11:54:22.15 ID:u5/6mv7u0.net] >>862 substr じゃなくて、コンストラクタ使えばいいんじゃね string t(s.begin() + s.find_first_of('_') + 1, s.begin() + s.find_last_of('.'));
884 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 12:29:37.73 ID:f0zM7Hcdr.net] >>865 なるほど、ためになります
885 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 12:35:17.89 ID:f0zM7Hcdr.net] >>865 ふと気になったのですが、このコンストラクタの挙動って他の名前の関数で実装されてないんでしょうか?
886 名前:さまよえる蟻人間 mailto:sage [2018/09/30(日) 12:48:58.63 ID:Eso9UeUod.net] >>867 assign
887 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 13:18:31.87 ID:f0zM7Hcdr.net] >>868 何から何までありがとうございます
888 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 14:15:51.90 ID:QSRvujde0.net] 「rustにもあるし俺らも入れなきゃ」くらいの感覚で 今までのシステムとの統合性の難しさなんかほぼ考えないで入れちゃった機能だから。 c++らしいといえばらしい感覚だけど。
889 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 14:22:42.56 ID:d4gXl3Bi0.net] std::basic_string::find()もイテレータを返すように他のコレクションとの統合性を尊重して欲しいよな
890 名前:デフォルトの名無しさん mailto:sage [2018/09/30(日) 22:56:12.57 ID:SdlFi6Ao0.net] findを実行した対象とは別のstringの同じ位置に何かしたいとき イテレータで返されるとちょっとだけ面倒 まあ大した問題でもないんだけど
891 名前:デフォルトの名無しさん [2018/10/01(月) 17:20:37.02 ID:mKeAnbBU0.net] moveセマンテックが必要になった理由を理解してないのが多くて驚くばかりだな 破壊して良い中間オブジェクトとそうじゃないのとを区別するために必要なのだよ ポインタ使えばmove必要ないとかそういう問題じゃない
892 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 17:40:58.61 ID:qsdLJDx40.net] 元はといえば禿が左辺値参照でもconstつければ右辺値を指せるという曲がった話を始めたのが 評判悪くてC++11でやっとやっとやっとやっとメスが入ったのが本当の理由
893 名前:はちみつ餃子 mailto:sage [2018/10/01(月) 18:05:01.87 ID:hbafP85H0.net] >>873 色んな話題が出てるので混乱してるが、ムーブ不要論を出してる側の *元々の* 主張は >>847 の通り 「ちゃんとした所有権の管理 (たぶん Rust みたいなやつのこと?) が有りさえすれば」 であって、でもそれは C++ ではもはや無理でしょということもわかった上だと思う。
894 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:05:54.55 ID:Gge6W+rt0.net] Cにも欲しいわ Cは参照ないから右辺値指示ポインタで
895 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:09:04.02 ID:qsdLJDx40.net] それを言うなら、右辺値の概念を撤廃すべきでしょ どんな値もポインタで指すことができ、 ポインタで指すことでregister指定を解除されるという変更
896 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:12:32.93 ID:UY4lJdAP0.net] テンポラリーオブジェクトなくすと、一回必ず厳密に生成してから仕様になるので、手間増えると思う。
897 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:40:21.84 ID:Gge6W+rt0.net] 右辺値がないと int i = 0; すら書けなくなるんだが
898 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:50:50.76 ID:qsdLJDx40.net] なんで? int j; j ^= j; int i = j; 左辺値でも問題ないじゃん
899 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 18:54:00.22 ID:xwh6ZD/vM.net] >>880 苦しいねーw
900 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:00:24.21 ID:Yquio+NL0.net] 0 以外はどうすんの。
901 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:02:25.38 ID:Gge6W+rt0.net] > j ^= j; はい未初期化値を使ったから未定義動作で鼻から悪魔
902 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:04:34.50 ID:Yquio+NL0.net] char buf[1]; int i = (int)(buf[10] - buf[0]); で、i = 10 に初期化される。
903 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:05:56.72 ID:xwh6ZD/vM.net] NaNのときはxorは未定義か、そこまで考えなかったな
904 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:06:32.55 ID:uXaVofwo0.net] >>884 間違った。正しくは: char buf[1]; int i = (int)(&buf[10] - &buf[0]); // i = 10 と等価。
905 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:11:01.98 ID:rJND5eoS0.net] そもそも=の無理やりなオーバーロードや引数に対する暗黙的なattainが問題なんだろう。 しかし元々のcのシンタックスを引き継ぎつつ、上記の問題を解決するのは不可能。
906 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:14:47.64 ID:Gge6W+rt0.net] >>886 10 0 &buf[10] &buf[0] &buf[10] - &buf[0] (int)(&buf[10] - &buf[0]) 右辺値だらけ やりなおし
907 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:19:47.07 ID:qsdLJDx40.net] >>882 別に? int *j; j = &10; int i = *j; てだけじゃん 10が左辺値だったらって話ね char *j; j = "\n"; int i = *j; て話と何か違うの?
908 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 19:23:45.27 ID:Gge6W+rt0.net] 10が左辺値ならこれ認めるの? 10 = 42;
909 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 21:57:05.81 ID:92NEoPQV0.net] お前らがC++で作ったことあるものリスト化して
910 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 22:37:33.40 ID:qsdLJDx40.net] >>890 全然かまわん int a = 10; int b = 10; a = 42; こう言っているに過ぎない
911 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 22:42:30.92 ID:qsdLJDx40.net] >>879 そろそろ答えてもらおうか なぜ右辺値がないと int i = 0; が書けないのか
912 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:15:35.29 ID:2m3Ms8fl0.net] >>875 ていうか所有権などという中途半端な概念にオブジェクトの解放を担わせるのは危険か無意味かのどっちかにしかならない 最後までオブジェクトを使いたい人と、そのオブジェクトを所有する人を コードに所有権を明示するスタイルで一致させられるケースは少ない 希ガス
913 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:21:45.86 ID:2m3Ms8fl0.net] しかしながら右辺値参照を使うとコードを書く人がオブジェクトの所有権を意識せざるを得ない これを抽象化といわれるとかなり違和感 ※ 個人の感想です
914 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:31:19.12 ID:rJND5eoS0.net] 結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。 同期と効率と安全性を全て容易にするってのは不可能なんじゃないかね。
915 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:41:31.83 ID:2m3Ms8fl0.net] >>896 >結局ネストしたオブジェクトってのはどう扱おうと楽な扱いなんてできんってことなんだわ。 いや? オブジェクトの所有権は最初のcallerががっちり掴んでオブジェクトを使うcallee以下は生ポでおk 全てが調和する
916 名前:デフォルトの名無しさん [2018/10/01(月) 23:46:11.02 ID:zfKNS/F/0.net] アホどもはやっと気付いたか。。。 コタエ:最初から普通にポインタで書きなさい unique_ptr、shared_ptr、weak_ptrなんか使ってるヤツラは クルクルパーしかいない
917 名前:デフォルトの名無しさん mailto:sage [2018/10/01(月) 23:49:34.85 ID:aHxMqUX30.net] >>895 右辺値参照周りを抽象化とか言ってるアホははちみつだけだろ
918 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 00:39:52.22 ID:YrRJAaFSa.net] https://ideone.com/BBhHn8 上のコードで教えて欲しい。 templateでデフォルト引数で関数を指定する場合、わざわざテンプレートパラメーターFuncにdecltype(...)しなきゃいけないのは何故?
919 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 01:21:04.00 ID:HQVsIoxF0.net] https://ideone.com/JKTYpf testは関数名だから型じゃない
920 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 02:10:18.78 ID:wuORmtyC0.net] >>895 ムーブだのなんだの言ってても、 C++ の言語機能として直接的に有るのは rvalue 参照を区別して受け取れるってだけで、 所有権の管理をキッチリやってくれるわけではない C++ の限界なんだよね。 だけど、なるべくクラス・関数の実装の中に区別を押し込めて隠す道具のひとつにはなるって話。 でも、中途半端にやるなら隠さないで見せた方がマシという論はわかる。
921 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 05:46:40.59 ID:wuORmtyC0.net] 受取る関数の側を上手く作っておけば それを使う側では所有権の移動とかそんなに気にしなくない? rvalue だったら勝手にちょっと効率的になる (こともある) ねってだけで。 使うときに気にしなくて良いように押し込められるならやっぱり抽象化の道具って言えると思うよ。
922 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 06:04:33.19 ID:YrRJAaFSa.net] >>901 ありがとう。 template<typename Func = int (int)> を template<typename Func> にするとエラーになるのは何故?
923 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 06:50:19.11 ID:wuORmtyC0.net] >>904 デフォルト引数からはテンプレート引数を推定できない制限がある。
924 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 07:00:39.49 ID:YrRJAaFSa.net] なるほどです。
925 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 07:46:51.87 ID:kk/2dA0Y0.net] 時々、イラつかされる制限だ
926 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 08:15:45.67 ID:Tcj3k2lbM.net] >>891 C++が得意なことを教えてください
927 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 10:26:10.74 ID:giBEQZ0BM.net] >>903 いや呼び出す側に意識させるのが右辺値参照の目的だろ 意識しなくていいようなケースならconst参照で十分
928 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 10:31:03.15 ID:kk/2dA0Y0.net] 冗談は顔だけにしろよ たとえばstd::threadの右辺値参照なんぞ意識してるか?
929 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 13:13:32.45 ID:8CvSI5wK0.net] 一行目に何の意味があるのかわからん
930 名前:デフォルトの名無しさん [2018/10/02(火) 15:51:55.37 ID:Xh7D/bbnH.net] 割と昔からあるプログラムを見てるんですけど一つのメソッド内で for(int i = 0; ……){……} for(i = 0;……){……} って書き方してるのをちらほら見ます 要は宣言してるんだから使い回せるだろみたいな理屈なんでしょうがビルドしようとすると当然未定義だとエラーが出ます 昔のC++だとこれがオッケーだったりしたんでしょうか?
931 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 15:56:06.09 ID:kk/2dA0Y0.net] そうだよ
932 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 16:33:18.83 ID:Tcj3k2lbM.net] c++で初心者が作れるものを教えてください
933 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 16:37:39.73 ID:kk/2dA0Y0.net] rogueとか作って見てはどうよ SetConsoleCursorPositionとGetKeyStateがあれば何とかなるだろ
934 名前:はちみつ餃子 mailto:sage [2018/10/02(火) 16:39:28.61 ID:wuORmtyC0.net] >>912 むしろ古い仕様だと後者の i を宣言しようとすると、 ひとつのスコープ内で同じ名前の変数を定義しようとした扱いになってエラーになったりした。
935 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 17:18:00.03 ID:kk/2dA0Y0.net] 今のコンパイラでも当時の仕様に合わせるオプションはある
936 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 18:04:17.03 ID:Tcj3k2lbM.net] >>915 ありがとう
937 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:05:29.79 ID:Tcj3k2lbM.net] C++.でバッチ処理やbashのsedの様な機能はありますか?
938 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 19:11:57.50 ID:kk/2dA0Y0.net] システムコマンドを実行したいのならsystem関数 正規表現ならstd::regexクラス ファイル名に関する様々なことはstd::filesystem::pathクラス
939 名前:デフォルトの名無しさん mailto:sage [2018/10/02(火) 20:37:48.16 ID:YnEH1wx10.net] >>920 ありがとうございます とても便利です
940 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:07:54.12 ID:S2BN/gu+r.net] std::array を自作関数の引数に渡したいときって、サイズはハードコードしないとダメなの?
941 名前:さまよえる蟻人間 mailto:sage [2018/10/03(水) 01:11:26.75 ID:gXNqr2Qf0.net] >>922 template <size_t t_n> void my_func(std::array<data_t, t_n>& a) { ... }
942 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:18:33.15 ID:S2BN/gu+r.net] >>923 なるほ ありがとうございます
943 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 01:18:50.70 ID:S2BN/gu+r.net] >>923 なるほ ありがとうございます
944 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 03:04:58.67 ID:plRFOjxw0.net] >>913 >>916 ありがとうございました。やっぱそうだったんですね しかし検索しても全然出てこないというかどう検索したら良いものか。C++98とかの時代になるんですかねぇ
945 名前:はちみつ餃子 mailto:sage [2018/10/03(水) 05:02:16.81 ID:jiQInXAP0.net] >>926 たぶんそれより更に前の話だったと思う。 「c++ for文 宣言 スコープ」でググったらこういうのとかヒットした。 www.ksky.ne.jp/~seahorse/cpp/loopvar.html D&E でも言及があって、 if 文でのルールと合わせる形で修正したという話が載ってる。
946 名前:デフォルトの名無しさん mailto:sage [2018/10/03(
] [ここ壊れてます]
947 名前:水) 05:31:10.20 ID:F+YgKz680.net mailto: >>917 VC++ですら廃止予定だけど https://msdn.microsoft.com/ja-jp/library/84wcsx8x.aspx [] [ここ壊れてます]
948 名前:はちみつ餃子 mailto:sage [2018/10/03(水) 05:33:04.20 ID:jiQInXAP0.net] ARM (The Annotated C++ Reference Manual; amzn.asia/d/53K2HrA ) を確認してみたら、 「初期設定文が宣言ならば、宣言された変数のスコープは for 文を囲むブロックの終わりまでである」 というような記述がある。 (要するに古い仕様) このあたりから C++98 になるまでの間に修正したってことなんじゃないかと。
949 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 07:01:52.10 ID:IEc6BJqm0.net] >>927 キーワードと完全に同じ綴りのマクロがあると 標準ヘッダが動作保証外になる ISO/IEC9899:2011 7.1.2 Standard headers の段落4
950 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 11:00:28.82 ID:e50Rb7+yd.net] >>926 最初期の処理系、AT&T cfront の頃からの仕様だから 1980年台だと思う ちなみに有名な Annotated C++ Reference Manual (ARM) は この cfront のリファレンスマニュアルに注を付けたもの。 Mac II が出た頃の Mac のソフト開発者は Apple の MPW という開発環境の上で AT&T のリファレンスマニュアル見ながら cfront で開発していた。
951 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 11:03:08.53 ID:e50Rb7+yd.net] >>926 >しかし検索しても全然出てこないというかどう検索したら良いものか。 当時まだ処理系と独立して言語仕様を策定/記述したものは存在していなくて、 上記の
952 名前: cfront のリファレンスマニュアルと cfront の実際の動作が c++ の仕様でした。 [] [ここ壊れてます]
953 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 12:23:08.82 ID:eWsEWXO50.net] >>930 そんなもん古い環境で使うなら標準ヘッダのインクルード後に定義するに決まってるだろ 現行の標準に合わせたいけど仕方なく古い環境でも動くようにしたい場合のテクニックなんだから
954 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:10:09.63 ID:IEc6BJqm0.net] >>933 俺だったらこう書くぜ { for(int i = 0; i < 1; i++) ; } { for(int i = 0; i < 1; i++) ; } 前提にしている環境を誤解させかねない変態コードには反対だ
955 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 13:21:21.77 ID:2zzoZNSm0.net] ヘタレな俺は c 同様直近のブロックの頭で宣言してました
956 名前:はちみつ餃子 mailto:sage [2018/10/03(水) 17:25:53.30 ID:jiQInXAP0.net] >>935 今では C でもブロックの頭という縛りは無いやで。
957 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 22:30:16.11 ID:T5RLH7Axr.net] std::array ってコンパイル時にサイズが決まっていることを想定して作られてるんだよね? だったら、「可変長ではないがサイズは実行時に決まる」というメモリが連続な配列がほしいなら生配列を使え、というのが C++ を作った人の気持ちなの?
958 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 23:04:38.92 ID:p3pJJViFa.net] それこそvectorじゃないの
959 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 23:19:51.08 ID:frDsf1q90.net] >>937 いや、昔はイニシャライザーリストがなかったので、初期化式が使えるオブジェクトの立ち位置だった。 イニシャライザーリストが入ったのでほぼ産廃。constexprの対応もなく死んでいる。 基本的に配列っぽいものがほしかったらベクター使ってっていう趣旨だったと思う。
960 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 23:26:50.16 ID:T5RLH7Axr.net] >>938-939 vector ってメモリ空間連続ですか? だったら迷わずこれ使うんですが
961 名前:デフォルトの名無しさん mailto:sage [2018/10/03(水) 23:29:56.10 ID:frDsf1q90.net] >>940 &V[0]すると一本のメモリの先頭が取れると規格書に書いてあると聞いた。 これは、サイズを拡張するなどのメモリ変更があるまで同じものを指してると思う。
962 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:07:58.65 ID:zm1AtLvQ0.net] >>940 迷わず使っていいですよ
963 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:35:06.85 ID:b1qTAw9u0.net] C++11からvectorのメモリ空間は連続でなければならないと規格で決められた 安心していいよ
964 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:40:31.88 ID:bav+IDITr.net] >>941-943 ありがとうございます しかしメモリが連続じゃないといけない外部ライブラリに vector 渡すの結構緊張しますね 少し飛躍するのですが、vector の入れ子は流石に連続とは限りませんよね?
965 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 00:58:43.11 ID:s35zoLCpa.net] メモリ連続させたいならvectorの入れ子はよして。 最初arrayで考えてたなら画像とか行列とかそんな感じかな?
966 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 01:32:01.20 ID:ezH2Wklod.net] >>943 太古から実際には連続だし規格として明記されたのは C++03 から。 C++11 で連続と規格化されたのは string (basic_string) の方。
967 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 01:57:52.21 ID:CYtCz8O/r.net] >>945 いえ、もともとは生の一次元配列を使ってて、array の方が取り回しが良いのかなと考えただけです 実際は vector が最強ということですね 入れ子云々は本当に気になっただけです 多次元配列は、色々諦めて Boost を使っています
968 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 03:00:41.82 ID:SxiNReMs0.net] 変数名とかクラス名にめちゃくちゃ毎回悩む 従業員の名前、社員番号、階級みたいなクラスを作るときのクラス名とかって普段どうしてる? Employeeだけで良いのだろうか DataとかInfoとか意味のあるようでないような命名が頭をよぎってしまう 仮に従業員をEmployeeとしたときに会社名と従業員リストのDictionary<string, List<Employee>>の変数名とかどうすりゃええねんってなる CompanyではないしCompanyDataだとそれっぽいが的確でもなさそうだし...
969 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 03:38:58.82 ID:ezH2Wklod.net] emproyees でいいだろ for (consy auto& emproyee : emproyees["Microsoft"]) ...
970 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 03:39:14.21 ID:ezH2Wklod.net] rじゃなくてlか
971 名前:さまよえる蟻人間 mailto:sage [2018/10/04(木) 04:00:10.87 ID:MLculXgyd.net] MapCompanyNameToEmployees
972 名前:はちみつ餃子 mailto:sage [2018/10/04(木) 04:12:55.17 ID:1wg41Y300.net] >>940 vector が連続と明記されたのは C++03 だが、 C++ 標準の体制としては仕様の「欠陥」と認められた項目については過去の版にさかのぼって適用されることがあり、 vector が連続であるというのもそのひとつのはず。 つまり、 C++98 を名乗る処理系でも vector は連続であるべきで、実際にほとんどそうなっていると思う。
973 名前:デフォルトの名無しさん mailto:sage [2018/10/04(木) 04:54:31.87 ID:MQvrn7bB0.net] >>948 クラス名・変数名に迷ったら書き込むスレ。Part28 [無断転載禁止]©2ch.net https://mevius.2ch.net/test/read.cgi/tech/1494147712/
974 名前:デフォルトの名無しさん [2018/10/04(木) 19:12:35.69 ID:Ohr0xwue0.net] >>948 素直に日本語使えばええやんけ。
975 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 00:43:30.52 ID:SgefIaql0.net] 英語の複数形は便利すぐる emproyee_list[]の代わりにemproyees[]で済む 大文字小文字でキャメルケースも使えるしほんと出来過ぎ
976 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 01:05:30.84 ID:lAZe+Hwv0.net] 単独かコンテナで意味が大きくかわるのに 字面の違いがsのありなしは微妙すぎていまいちだと思ってる
977 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 06:55:01.43 ID:226EunUa0.net] しかしそこまでメモリに直触りするならvectorでない方がいい気がするんだが。
978 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 07:56:42.65 ID:Zg//fZBj0.net] だよな 生メモリがいるなら生メモリ使えってこと
979 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 08:13:10.92 ID:8YBbWag1r.net] >>957-958 サイズの取得とかオシャレにできないじゃん
980 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 12:49:05.99 ID:cQzHZ22n0.net] 生メモリのサイズの管理の仕方さえ忘れたか
981 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 18:47:04.93 ID:4ThlZrTR0.net] >>948 g_dictCompanyInfo
982 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 18:49:08.38 ID:4ThlZrTR0.net] >>961 もし、今後絶対、employee の情報しか入れないと言い切れるのなら、 g_dictCompanyEmploees でもいい。何か追加する予定なら、>>961 のように「g_dictCompanyInfo」
983 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 18:51:17.31 ID:4ThlZrTR0.net] >>948 最初の従業員のデータについては、 EmployeeInfo 二番目の dictionary の方は、 g_dictCompanyEmploeeInfo_s
984 名前:デフォルトの名無しさん [2018/10/05(金) 20:18:06.35 ID:2Vgho4wC0.net] g_とか_sとかなんなんだそれ
985 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:02:11.53 ID:eXLBKWdN0.net] 秘密の呪文
986 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:42:38.07 ID:s/+stmcD0.net] ハンガリアン記法とかいうMSが編み出した負の遺産
987 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 21:54:51.59 ID:wRA0FWgN0.net] 型付けるハンガリアンは糞だけど、グローバル変数にg_付けるのは普通でしょ 付けないの?
988 名前:デフォルトの名無しさん [2018/10/05(金) 21:56:47.70 ID:zW6/2yxd0.net] グローバル変数使わないしg_つけてもなんの役にも立たないし
989 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 22:29:36.85 ID:dsZIcecxM.net] スコープを示すハンガリアンは変数のスコープを不必要に広げることに対する心理的抵抗を低減するという点で害悪
990 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 22:48:31.92 ID:qdFd1sVz0.net] あの複雑怪奇な名前解決ルールを受け入れているC++使いからしてみれば、変数が ローカルかグローバルかなんてわざわざ目印付けるほどのことじゃないのかも
991 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 22:49:02.31 ID:SgefIaql0.net] パブロフの犬カヨ グローバル変数の先頭に「g_」を付け続けると そのうち先頭に「g_」とつけただけで
992 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:02:57.02 ID:SgefIaql0.net] しかしいかにクラスFooに関連するオブジェクトは全部Fooのコンストラクタかsetterで渡すか一時オブジェク トとしてメソッドの引数として都度渡すのがオブジェクト指向設計としての理想とはいえ実際には対数表のカ スタマイズ版みたいにかなり普遍的な意味を持つテーブルTが存在する前提でいっぱいクラスを定義したい ときもあるわけでそういうときはテーブルTをグローバル変数とした方がスマートに書けるTがこの世に1つし かないのにいちいちインスタンス毎にTへのポインタを持たせるのですかみたいな、 で、そうするとグローバルであることの目立つ標識が欲しいところだがオリジナルの規則を考えるのもアホら しいので使用人口が多そうな「g_」を使う
993 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:05:20.25 ID:cQzHZ22n0.net] 60億人がシステムハンガリアンの良さを発見できなかった そういうことだ
994 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:06:16.17 ID:cQzHZ22n0.net] せっかく自動化したものを蒸し返す愚行 機械に使われる人間に自ら志願するようなことでしかない
995 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:14:36.32 ID:MM5jcfpFM.net] ハンガリアン記法が滅亡した時にgとかsとかのスコーププレフィックスも一緒に絶滅したと思うの。
996 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:19:28.57 ID:SgefIaql0.net] もうそういうのは見飽きたからハンガリアン無差別否定派とアプリケーションハンガリアン推進派が頃しあって消滅してくれたらいいのに…
997 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:22:01.95 ID:4ThlZrTR0.net] 「ハンガリアン記法を使うと、コードの断片からでも何かを発見できる。」
998 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:25:38.27 ID:4ThlZrTR0.net] C#では、メンバ変数 aaa をアクセスする時には、必ず、 「this.aaa」 とするらしい。これは、C++で、ハンガリアン記法を使った場合の、 「m_aaa」 に該当する。this. と m_ では、後者のほうが短く便利。 m_ も、this. も付けない場合、たとえば、コンストラクタで 同じ意味の仮引数を使いたい場合に、何らかの別の名前を 考えなければならなくなる。
999 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:26:32.77 ID:eEmdo3hB0.net] サイズ変更してキャパシティ変更になったらデリートかかる可能性が高いのでそういうことを一応管理しないといけない。
1000 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:28:00.34 ID:SgefIaql0.net] >C#では、メンバ変数 aaa をアクセスする時には、必ず、 >「this.aaa」 >とするらしい。 mjd? いつから?次の元号から??
1001 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:29:24.93 ID:3VgmxBOW0.net] 一般的に言われているシステムハンガリアンのデメリットはg、s、mには当てはまらない。 iとかdwとかlpszみたいな糞接頭辞とは分けて考えたほうがいいと思うよ。
1002 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:31:13.38 ID:4ThlZrTR0.net] 個人的には、以下のような命名規則は大いに役立っており、 コード全体を見ずにコードの断片を見るだけで、何も考えずに コーディングが出来ることが多くなる。おかげでずいぶん楽になった。 char *pszText; char szText[256]; CString strText; char **ppszText; 「sz」は、0終端文字列。s = string、z = zero。 p は、ポインタ、str は、CString。 pp は、ポインタへのポインタ。
1003 名前:デフォルトの名無しさん [2018/10/05(金) 23:36:17.35 ID:zW6/2yxd0.net] m_がついててもそれがメンバである保証が何もないからなあ。無駄なだけ
1004 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:39:57.45 ID:4ThlZrTR0.net] >>981 個人的には、i や dw は滅多に使わない。 lpszは、自分では使わない。pszは使う。 なぜなら、lpsz の「l」 は、16BIT時代から32BIT 時代へ移行したときの産物だから、 今は時代遅れなので。 ところで、dwRead と書くと、宣言を見返さなくても、読み込みバイト数を表す DWORD 値だと 分かって便利。dwWrite だと、その書き込み版となる。変数名が規則変化するのでとっても便利。 たとえば、「text」という変数名だと、CString 型なのか、0終端文字列なのか、 0終端が付いてないような特殊な文字列なのかが分からない。 ところが、ハンガリアン記法を使うとそれらが明確に区別できる。 0終端文字列を配列で持っているのか、それとも、そのアドレスをポインタで 持っているのかも、sz か、psz かで区別できる。 このことはバグの少ないコーディングにとても役立つ、。 頭を使わなくても機械的にコーディングできてしまうことが多くなるから。
1005 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:46:52.35 ID:SgefIaql0.net] 命名のプレフィックスに関する個人的な熱い想いはカプセルの内側に隠蔽すると良い そういう意味で「m_」は比較的どうでも良い
1006 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:50:11.62 ID:3VgmxBOW0.net] >>983 それを言うならあらゆるシンボル名が正しくそれを示している保証なんてないと思うよ。 >>984 そういうのはoopやtmpと相性が悪いんで…
1007 名前:デフォルトの名無しさん [2018/10/05(金) 23:51:01.17 ID:elz6X2140.net] こういう話だけは食い付きがいい さすがドカタ
1008 名前:デフォルトの名無しさん [2018/10/05(金) 23:52:25.87 ID:zW6/2yxd0.net] そうだよ。だから最低限にしないといけない 無駄なものをつけるのはいらんバグを増やすだけで悪
1009 名前:デフォルトの名無しさん mailto:sage [2018/10/05(金) 23:54:14.41 ID:SgefIaql0.net] 個人的にはCのライブラリ関数名に「g_」がついていないのを遺憾に思う
1010 名前:デフォルトの名無しさん [2018/10/05(金) 23:54:47.79 ID:ZMQnisBBd.net] 今時ハンガリアン使うアホがいたとは驚きなんだがw もう絶滅したと思ってた
1011 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:00:43.80 ID:JjdhAE/r0.net] >>986 >そういうのはoopやtmpと相性が悪いんで… どういう意味?
1012 名前:さまよえる蟻人間 mailto:sage [2018/10/06(土) 00:06:22.53 ID:SJezKYMvd.net] OOP == オブジェクト指向プログラミング TMP == テンプレート/temporary
1013 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:07:22.53 ID:JjdhAE/r0.net] 何で相性が悪いのかが分からぬ。
1014 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:11:20.65 ID:d9G2ZJ030.net] いかにハンガリアン否定派といえども いざ実際ハンガリアンで書かれた変数名を見たら体が反応してしまうということなんだろJK 鍛錬が足りん
1015 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:14:20.26 ID:JjdhAE/r0.net] ずっと前に、ハンガリアン記法で書かれた比較的大きなソース・コードを見て とても分かりやすかったので自分もそれに習っただけなんだよね。
1016 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:23:46.06 ID:PyrakEMK0.net] 実際みんなが叩いてるから叩いてるってやつはいるだろうな 俺も別に悪くはないと思うよ 自分から進んで使おうとは思わないが
1017 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:28:00.98 ID:GMmUDkcN0.net] 型が殖える度に変数名のプレフィックスがどんどんどん殖えていくなんてコーダー側からしたら不毛なだけ いざ型名変えたいと思っても後ろを振り向くのが怖くなる
1018 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:33:38.42 ID:JjdhAE/r0.net] でも、BOOL 値の変数の先頭に b を付けたりすると、ミスを発見するのに大いに役立つ 事があるよ。
1019 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:36:41.02 ID:GMmUDkcN0.net] 読む側にとってはな 書く側は細心の注意を払わないといけない 簡単に後戻りできないからな メンテ効率最悪なんだよ
1020 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:38:54.48 ID:CdYUXXMG0.net] 次はpart139でいいのか?
1021 名前:デフォルトの名無しさん mailto:sage [2018/10/06(土) 00:42:40.48 ID:tQclXtq/0.net] ハンガリアンは、集団にその命名方法が周知されていないといけないので、周知するところから始めないといけない。 周知できればコスト低減できるが、それまでのコストをどうみつもる?
1022 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 39日 8時間 40分 40秒
1023 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています