1 名前:デフォルトの名無しさん [2017/11/04(土) 16:33:35.07 ID:NYxCuvMY.net] エスケープシーケンスやWin32APIなどの環境依存なものもOK そのような質問は必ず環境を書きましょう 半角空白やタブでのインデントはスレに貼ると無くなります コードを貼れる所 codepad.org/ https://ideone.com/ 前スレ 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 https://mevius.5ch.net/test/read.cgi/tech/1500329247/
552 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:44:10.91 ID:mVcRE5FO.net] 結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。
553 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 12:50:27.67 ID:UkpF6ptq.net] >>539 > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; > bResult = Api(...) && bResult; これでいいと思う >>541 3個位ならいいけどたくさんになると数え間違いとかやらかしそう
554 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:35:54.06 ID:OgXHMhZG.net] >>543 1年後の自分がやらかしそうだわw
555 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:37:30.50 ID:eQfDSJES.net] 普通に&で繋げてしまえば。 return Api()&Api()&Api()...;
556 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 14:44:49.05 ID:lxf6ix6+.net] >>545 そもそもの質問のキモがわかってないよ
557 名前:539 mailto:sage [2018/04/13(金) 15:24:49.14 ID:roGFrSR8.net] みなさんご意見ありがとうございます。 例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、 常に同じ関数が3回というわけではありませんでした。 失礼しました。 bResult = Api(...) && bResult; の書き方自体は、そこまで汚いわけではないのですね。 同じような書き方をしているソースも、検索してみたら出てきました。 個人的には、 bResult &&= Api(...); のような記述ができるとありがたかったです。
558 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 16:20:54.65 ID:RMqAMM1S.net] >>547 こういう手段もあるぞ。 bResult *= Api(...); 一度 0 になったら何をかけても 0 だ。
559 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:04.14 ID:cn4ajNkQ.net] &&= と書けないことをこの質問で知ったわ。 >>548 「返り値が0でなければ成功」の関数で変テコな返り値が来ると 組み合わせでダメになるかも。 256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。
560 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:33:39.54 ID:aZorcSvM.net] 明確なメリットが無いのに、 無駄にトリッキーなコードを書くのはおすすめしない
561 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 16:39:34.39 ID:aZorcSvM.net] 数が少なく重要な箇所であれば、 デバッグ用コードを追加しやすい以下で良い <
562 名前:br> if (!Api(...)){ bResult = FALSE; } ... 数が少なく重要じゃなければ >>547 で良い 数が多ければ色々と工夫しようか [] [ここ壊れてます]
563 名前: mailto:sage [2018/04/13(金) 16:44:07.64 ID:fORiWt/O.net] >>548 適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか? …んー、ないな、何故ないのだろう?
564 名前:デフォルトの名無しさん [2018/04/13(金) 17:53:26.34 ID:ledbPVdv.net] 基底クラスのメンバ関数に virtual をつけないことってあるんですか? つけてもつけなくてもどちらでもいいという場合はあると思いますが、 つけちゃいけないという場合が考えにくいのですが、そういう場合は あるのでしょうか?
565 名前:デフォルトの名無しさん [2018/04/13(金) 17:55:06.07 ID:ledbPVdv.net] 逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の デフォルトの機能にすればいいのにと思います。 どうでしょうか?
566 名前:片山博文MZ mailto:sage [2018/04/13(金) 17:56:07.81 ID:meZ//aXI.net] >>553 仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。
567 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 17:58:31.25 ID:ledbPVdv.net] >>555 virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。 ありがとうございました。
568 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 19:32:26.21 ID:UkpF6ptq.net] >>552 オーバーフローで0とか
569 名前:はちみつ餃子 mailto:sage [2018/04/13(金) 21:02:41.55 ID:RMqAMM1S.net] >>557 せやな。 普通はないと思うが、無いと言い切ることもできない。 ここまでいろんな案が出てるけど、なんだかんだで >>539 が自分で結論出してるのがベストだと思う。 書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。
570 名前:デフォルトの名無しさん mailto:sage [2018/04/13(金) 21:13:39.42 ID:ko86uHhA.net] 浮動小数点ならダーティー0とかあるけど 普通は意識しないでしょうねぇ
571 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 00:48:59.29 ID:qJeIaUAA.net] 今回は「非ゼロ」が様々な数値である場合について考えているわけだから 0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然
572 名前:デフォルトの名無しさん [2018/04/14(土) 01:08:45.20 .net] int64_t 使えばいいだろwww ケチケチすんなってwwwww
573 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 03:21:52.45 ID:yJ5VtHzf.net] 4つ掛けたらアウトじゃん ほんとうにバカだなあ
574 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 05:40:34.13 ID:DUdlBUp3.net] >>547 汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。 俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、 そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。
575 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 07:52:50.53 ID:Fxbc5uis.net] !か!!使えば1か0にしかならんからそれかけるとか
576 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 08:44:41.44 ID:whWbsAFN.net] それをシフトと組み合わせると、エラー箇所までわかって便利だね
577 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 10:42:40.78 ID:pziCCgl7.net] >>556 補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ
578 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:38:28.43 ID:aYmqXLA5.net] >>565 ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら>>542 とかでいいだろ
579 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 11:59:10.38 ID:gkV4B+Je.net] メモリをけちるとかそんなけちな理由じゃない
580 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:05:20.64 ID:whWbsAFN.net] selectって知っている?
581 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 12:31:15.66 ID:aYmqXLA5.net] select? その時代の知識で止まってるの?
582 名前:デフォルトの名無しさん mailto:sage [2018/04/14(土) 17:00:09.46 ID:6q9VmxFv.net] a=1に対して、 cout << a << a++なら21 cout << a++ << aなら12 cout << a++ << a++なら21 と表示されました。 coutはどんな順番で評価されているのでしょうか?
583 名前:デフォルトの名無しさん [2018/04/14(土) 18:21:04.74 .net] >>571 確かに以下は https://ideone.com/sBACG3 21 12 21 と表示される でも、手元のVC 2017 / Windows 10 では 11 12 11 と表示された g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では 11 12 12 と表示された
584 名前:デフォルトの名無しさん [2018/04/14(土) 18:31:12.32 .net] >>572 codepad.org/KVv4KD8O ではコンパイルエラーになった。 cc1plus: warnings being treated as errors In function 'void test1()': Line 6: warning: operation on 'a' may be undefined In function 'void test2()': Line 12: warning: operation on 'a' may be undefined In function 'void test3()': Line 18: warning: operation on 'a' may be undefined techtipshoge.blogspot.jp/2012/01/c.html www.kouno.jp/home/c_faq/c3.html www.st.rim.or.jp/~phinloda/cqa/cqa7.html こんな書き方をするなってことだね
585 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 00:38:00.30 ID:/OvgYAab.net] >>571 いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、 評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。
586 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 08:36:03.86 ID:IUBKEb9a.net] 未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで 同じ順序で評価されない可能性もある、じゃないかな。 実際のところ、コンパイルごとに評価順が変化するとも思えないけど。 いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。
587 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 09:17:15.75 ID:CIuag2/D.net] >>573 おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな
588 名前:デフォルトの名無しさん [2018/04/15(日) 10:08:58.88 ID:c4dXLki+.net] class Base { public: void A(); protected virtual void B(); } void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } class Derived : public Base { protected virtual void B(); } void Derived::B() { cout << "Derived" << endl; } Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Derived」が表示される。 b = d; b.A() ⇒ 「Base」が表示される。
589 名前:デフォルトの名無しさん [2018/04/15(日) 10:11:08.98 ID:c4dXLki+.net] b = d; b.A() ⇒ 「Base」が表示される。 ↑で、なぜ、「Derived」が表示されないのでしょうか? ロベールの本に、 「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」 と書いてあります。
590 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:29:12.58 ID:VXOW+WoG.net] void Base::A() { B(); } void Base::B() { cout << "Base" << endl; } A() の中で、B() を呼んでいるから A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。 こんなコーディングはしない
591 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 10:37:36.78 ID:sXJBpbWg.net] バカを装った荒らしか本当のバカか
592 名前:デフォルトの名無しさん [2018/04/15(日) 10:41:29.91 ID:c4dXLki+.net] >>578-579 よく分かりません。 ポリモーフィズムというのがありますが、その考え方だと b = d; b.A() ⇒ 「Derived」が表示される。 のではないかと思ってしまいます。
593 名前:デフォルトの名無しさん [2018/04/15(日) 10:59:34.87 ID:c4dXLki+.net] Base::B() の virtual を削除する: class Base { public: void A(); protected void B(); }; すると、 Base b; b.A(); ⇒ 「Base」が表示される。 Derived d; d.A(); ⇒ 「Base」が表示される。
594 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:27:00.75 ID:ZEcSoj1Y.net] ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。
595 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:33:52.43 ID:q/GS/gh9.net] スライシングとも別の問題のような
596 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 11:52:13.52 ID:igXjAIRS.net] bの型がBaseだからだろ?
597 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 12:16:46.54 ID:VXOW+WoG.net] まずこの本で、オブジェクト指向を学ぶ。 スッキリわかる Java入門 第2版、2014 最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w 軽く、数年を無駄にするだけ C++ なんて、偏差値70以上しか無理やのに
598 名前:デフォルトの名無しさん [2018/04/15(日) 12:34:26.84 .net] >>577 > b = d; > b.A() ⇒ 「Base」が表示される。 Base bp; bp = &d; b->A(); こうやね
599 名前:デフォルトの名無しさん [2018/04/15(日) 12:35:11.72 .net] >>582 間違えた Base *bp; bp = &d; b->A();
600 名前:デフォルトの名無しさん [2018/04/15(日) 12:36:47.16 ID:c4dXLki+.net] >>583-585 ありがとうございました。 C++が難しいというのは、設計が悪いからですか? C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに 設計することは無理ですか?
601 名前:デフォルトの名無しさん [2018/04/15(日) 12:37:23.54 ID:c4dXLki+.net] >>587-588 ありがとうございました。 試してみようと思います。
602 名前:デフォルトの名無しさん [2018/04/15(日) 12:43:40.81 ID:c4dXLki+.net] 理由があってC++を習得するのが難しいのならOKですが、設計が悪いから 難しいということになると、利用者にとっては迷惑な話ですね。
603 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:30:31.42 ID:VXOW+WoG.net] C++ は、何でも出来るようにしているから、ルール数が100以上ある さらに、ルールAでは、B, C は除くとか、 1つのルールが、他のルールとからむから、 非常に難しいし、組み合わせ爆発が起こる 膨大な時間を無駄にしても、さほど理解できず、身につかない。 組み込み機器も想定しているから、 どうしてこういうルールが必要なのか、初心者には理解できない。 Rust ですら、初心者には無理だろ だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。 ルールの多さで、廃人になってしまう 初心者には、絶対に無理。 最初から、エベレストを登るようなもの。 まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし このレベルでは言語どうこうじゃない。 小中高大学まで行くような、研修制度・道筋が大事。 徐々に基礎体力を付けていかないと、何もできない
604 名前:592 mailto:sage [2018/04/15(日) 13:45:38.29 ID:VXOW+WoG.net] ロベールでC++ を勉強するのも良いけど、 あくまで、C++ の初心者というだけで、 C++ をやるには、最低でも数言語は知っている必要がある 特に、Java, C, Rust は、絶対に知っていないといけない。 組み込みの知識も必要 C++ の初心者だけど、他の言語はプロ級で、 PC・組み込み・Linux コマンドも知っていて、C++ を始められる それでも、ほとんどのC プログラマーは、C++ へ進めない
605 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 13:49:36.88 ID:ldkcKhuZ.net] スッキリ厨はちゃんとコテ付けてくれ
606 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:24:18.71 ID:qZPDSYA2.net] 某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。 第3版が難読版というのは判る
607 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 15:55:19.09 ID:/OvgYAab.net] = が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、 という理解が必要なんだろうけれどこれ難しいだろうか? cから来た人なら struct base b; b = ...; で b の型が変わるなんて考えもしないだろうけど 最近の人は c やらないのかな
608 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 16:39:48.86 ID:VXOW+WoG.net] ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単
609 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 17:20:50.44 ID:s7NpyR5v.net] 原典も読まずに能書き垂れる奴っているんだなぁ
610 名前:デフォルトの名無しさん [2018/04/15(日) 18:07:17.49 ID:c4dXLki+.net] >>588 試してみました。 確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。 これはなぜでしょうか? #include "Derived.h" int main() { Base b; Base& br = b; br.A(); Derived d; br = d; br.A(); Base *bp; bp = &b; bp->A(); bp = &d; bp->A(); } 実行結果は以下です。 Base Base Base Derived
611 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:44:29.81 ID:ZEcSoj1Y.net] 参照は書き換えられないからな。 >br = d; 参照先のbに代入してるのと同じこと。
612 名前:デフォルトの名無しさん mailto:sage [2018/04/15(日) 18:50:44.48 ID:CIuag2/D.net] >>599 当たり前 br は b の別名なだけだから b = d; ってやってるのと同じ b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし
613 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 00:20:31.20 ID:TXxoP4/a.net] 参照のポインタっぽい振る舞いを確認したいならこう Derived d; Base & b1(d); b1.A();
614 名前:デフォルトの名無しさん [2018/04/16(月) 07:57:32.89 ID:PsSdBUuj.net] >>602 ありがとうございました。 下の結果は、 Base Derived Derived になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が 解消することになると思うので、理解したいです。 #include "Derived.h" int main() { Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2(d); br2.A(); Base *bp; bp = &d; bp->A(); }
615 名前:デフォルトの名無しさん [2018/04/16(月) 08:01:12.80 ID:PsSdBUuj.net] Base Derived Derived となりました。 2番目と3番目は同じことの別表現のようですね。 見た感じ、1番目と2番目に違いがあるようには思えません。 Derived d; Base b; Base& br1 = b; br1 = d; br1.A(); Base& br2 = d; br2.A(); Base& br3(d); br3.A();
616 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:14:10.02 ID:TXxoP4/a.net] >>604 参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。 初期化と代入を区別すること。 Base& br1 = b; // 初期化 br1 は b の参照 br1 = d; // 代入 b = d と同じ動作 Base& br2 = d; // 初期化 br2 は d の参照
617 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 08:32:20.53 ID:PsSdBUuj.net] >>605 ありがとうございました。 >Base& br1 = b; // 初期化 br1 は b の参照 >br1 = d; // 代入 b = d と同じ動作 br1 = d としても参照先は変わらないんですね。 ありがとうございました。
618 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:10:28.34 ID:rDfY3L1y.net] Java,C#などのプログラマです。 C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、 https://ideone.com/k7g2nn ITestAとITestBはインターフェース的なものです。 で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを 作ったのですが、 CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは 抽象クラスになってて実体化できません。 ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? というかこういう場合C++ではどうすればいいのでしょうか?
619 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 12:43:19.10 ID:qlfABgAK.net] Base Pointer : 100〜119 Derived Pointer : 120〜139 こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。 100〜119 内で、Base クラスの変数・メソッドのアドレスを探す Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。 120〜139 内で、Derived クラスの変数・メソッドのアドレスを探す
620 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 13:08:20.92 ID:5MYyAHFg.net] >>607 単なる文法エラーだからエラーメッセージみてコードを直してください
621 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:01:04.61 ID:rDfY3L1y.net] >>609 文法エラー?? https://ideone.com/k7g2nnの今回の部分と関係ないエラーは無視してください。 あくまでイメージ目的でそこらへん適当にやりました。 すみません。 https://ideone.com/QxErKY こっちですね。
622 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:08:31.72 ID:rDfY3L1y.net] ちなみに、C#だとこんな感じです。 https://ideone.com/8SZhJ7
623 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:29:48.23 ID:7XdbFr6Z.net] CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな? ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる これならok https://ideone.com/FGHyda
624 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:32:34.81 ID:rDfY3L1y.net] もちろん、エラーなくしてコンパイルを通す方法は >>607 の >ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか?? で書いた
625 名前:ようにすればとりあえず、コンパイルは通ります。 聞きたいのは、 C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、 C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか?? それともC++では他の方法があるのでしょうか? [] [ここ壊れてます]
626 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 14:34:54.92 ID:rDfY3L1y.net] >>612 あ、すみません。ちょっと被ってしましましたね。>>613 は忘れて下さい。 >>612 のコードを見てみます。
627 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:08:36.13 ID:rDfY3L1y.net] >>612 そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。 まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。 ありがとうございます。
628 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 15:30:44.68 ID:7XdbFr6Z.net] >>615 インターフェース側をいじるのは仕方ない どっちかになる https://ideone.com/qrd4fN https://ideone.com/kVZzRi
629 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 16:21:16.33 ID:Gm7LZDiq.net] 実装とインタフェースの両方を継承するならこういう書き方もある ATL なんかがこれ式かな https://ideone.com/B7JWER
630 名前:デフォルトの名無しさん mailto:sage [2018/04/16(月) 17:30:50.30 ID:rDfY3L1y.net] >>616 >>617 色々ありがとうございます。>>617 がよさそうなのでこれで行こうかなと思います。
631 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:08:59.76 ID:SGgdop5e.net] 巨大なファァイルの読み込みに関してです。 たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に 代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか? 現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?
632 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:20:32.18 ID:/qMRupTB.net] 行という概念が 先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない? ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど
633 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:29:32.71 ID:KTfx2aCu.net] >>619 テキストのフォーマットによっては高速化は可能 例えば1行が固定サイズとか行番号が書いてあるとか 全く自由なフォーマットだと頭から解析するしかない 読み込みスレッドと解析スレッドを分けると速くなることもあるかも 同じファイルが複数回指定されることが多ければ ファイル名と更新日時と1000行目の位置 のデータベースを持つとか
634 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:30:11.39 ID:cVYjBdTw.net] >>619 「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。 1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる) 1000番目のバイト位置を計算してそこから読むことができます。 FILE * を用いてシーケンシャルにたくさん読む場合は setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう いろんな行に何度もアクセスするなら、 全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。
635 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:36:06.95 ID:p5xwhAV/.net] 末尾にseekして、適当に戻って読んでみて、 改行がなければまた戻って、を繰り返すのが現実的。
636 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:40:13.25 ID:/qMRupTB.net] 巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?
637 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 17:50:32.61 ID:yyY2OAEq.net] 対象のテキストファイルとは独立に、 「そのテキストファイルの各行がファイルの何バイト目から始まるか」 という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。 >>622 の後半部分だな。
638 名前:619 mailto:sage [2018/04/17(火) 18:03:45.64 ID:SGgdop5e.net] 皆様いろいろご指導ありがとうございました。 私の能力では難しそうですが、いろいろ高速化を試してみます。
639 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:46:11.69 ID:NCQX7EWc.net] 末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して) \n が現れるまで1文字ずつ戻りながらキューに積んで 最後にキューの中身を逆順にする
640 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 18:55:56.84 ID:gaNnpc4H.net] 配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?
641 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 19:35:04.61 ID:wvS91pUR.net] >>628 scanf("%d",&n); int array[n]; //読み込んだ値を要素数にするってこういう事?
642 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:21:29.36 ID:AHw7lgSX.net] 基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。 auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、 newした場合はどうすればいいのでしょうか? autov = new vector<int>(); for (auto &i : v)だと begin関数が見つかりませんといってコンパイルできません。 どうすればいいでしょうか?
643 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:24:11.47 ID:AHw7lgSX.net] すみませんでした。普通に逆参照すればいいのか。 auto v = new vector<int>(); for (auto &i : *v)
644 名前:デフォルトの名無しさん mailto:sage [2018/04/17(火) 20:46:42.62 ID:hZ2W0cz8.net] >>629 ありがとうございました
645 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 11:35:26.22 ID:uQo81sbZ.net] MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、 CやC++の仕組みのことなので、こちらで質問させていただきます。 複数のスレッドから呼ばれる関数の内部は、 CCriticalSectionを使って排他制御しています。 void Test() { static CCriticalSection cs; cs.Lock(); : cs.Unlock(); } 関数内のstatic変数は、その関数が初めて呼ばれたときに 実体が作成されると理解しているのですが、 1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に 他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、 正しく排他制御されるのでしょうか? コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか? それとも、CCriticalSectionの変数は、 関数の外に置かなくてはいけないものでしょうか? MFCの内部でも、AFXPlaySystemSound()などで 同じようなことをやっているようなのですが。
646 名前:片山博文MZ mailto:sage [2018/04/18(水) 11:57:34.76 ID:iSn0xXbj.net] https://cpprefjp.github.io/lang/cpp11/static_initialization_thread_safely.html d.hatena.ne.jp/yohhoy/touch/20120309/p1
647 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:00:55.78 ID:EfAk4eu6.net] >>633 C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。 (C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった) msvc では 2015 から。 c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる 以下を参照 https://docs.microsoft.com/ja-jp/cpp/build/reference/zc-threadsafeinit-thread-safe-local-static-initialization gcc / clang では -fno-threadsafe-statics オプション
648 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:06:23.94 ID:H8UzlwrM.net] 他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。 エラーの行番号見ても、あってるよーな?よくわからない。 どうすりゃいいの。
649 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:26:53.25 ID:MXcoXWvI.net] 独り言ならチラシの裏にかけ
650 名前:片山博文MZ mailto:sage [2018/04/18(水) 12:28:10.26 ID:iSn0xXbj.net] >>636 ソースとエラー貼って
651 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:39:00.98 ID:8LhMtFC1.net] >>638 NDAを結ばないと出せません
652 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 12:48:05.38 ID:Odk+F4n0.net] >>636 コードすら貼らないオツムの足りなさじゃ諦めろ