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/
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 コードすら貼らないオツムの足りなさじゃ諦めろ
653 名前:633 mailto:sage [2018/04/18(水) 12:59:22.55 ID:uQo81sbZ.net] >>634-635 ありがとうございます。 VSは2015よりも前なので、このやり方はダメってことですね。 関数の外に置くようにします。 MFCの内部ではやっちゃってますが。
654 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:03:03.18 ID:H8UzlwrM.net] なんだよ。このクソ言語。やっとわかったわ。 ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。 エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。 ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。 hファイルにエラーがあるとかミスリードしてんじゃねぇよ。
655 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:07:10.12 ID:iSn0xXbj.net] エラーも貼れないなら、助けるのはムリ。 テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。 つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。
656 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:12:55.50 ID:H8UzlwrM.net] そりゃ、ソースコード全部張れば分かるとは思うけど、 エラーの内容は 「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」 みたいなエラーでて、この意味ぐらい自分で分かるし。 だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。 お手数かけました片山さん。
657 名前:片山博文MZ mailto:sage [2018/04/18(水) 13:22:59.72 ID:iSn0xXbj.net] May the source be with you.
658 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:25:36.89 ID:whM0Cl8U.net] プリプロセッサの結果を見れば判るだろうに
659 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:37:08.45 ID:H8UzlwrM.net] そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が ありませんでした。 まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は 頻繁に数行書いたらコンパイルすることにします。
660 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:45:55.17 ID:MXcoXWvI.net] C++の文法のクソさには誰も異論はない。
661 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 13:59:47.30 ID:+aOsPa5t.net] プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな
662 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 14:01:11.21 ID:v7hqXOET.net] クソどころじゃない
663 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 15:30:25.37 ID:EU/tZBmZ.net] >>642 今後のためにそのエラーになる最少構成でやってみ
664 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 20:25:53.95 ID:hZhORVVR.net] ヘッダファイルがこんなふうにconst用と非const用の関数があるとして class A { B b; B& get() { return b; } const B& get() const { return b; } } このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか? auto& get() { return b; } auto& get() const { return b; }
665 名前:片山博文MZ mailto:sage [2018/04/18(水) 20:49:19.46 ID:cGcFIcRA.net] 型名が長すぎるときは、typedef。
666 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 20:52:50.32 ID:5Rgz0HeV.net] >>653 型の別名を定義することについての是非は置くとして、 typedef はオワコン。 using を使うのがモダンな C++ やで。
667 名前:デフォルトの名無しさん mailto:sage [2018/04/18(水) 21:22:43.95 ID:hZhORVVR.net] typedefやusingはなるべく使いたくないんですよね やはりヘッダーの返り型くらいはちゃんと記述すべきですかね イタレータとか長くなりがちだけど・・・
668 名前:片山博文MZ mailto:sage [2018/04/18(水) 21:26:54.29 ID:cGcFIcRA.net] こうだな。動くかどうか知らんけど。 auto& get() { return b; } const auto& get() const { return b; }
669 名前:はちみつ餃子 mailto:sage [2018/04/18(水) 21:27:07.88 ID:5Rgz0HeV.net] decltype(b) でもええんやで。
670 名前:デフォルトの名無しさん mailto:sage [2018/04/19(木) 01:18:42.72 ID:AYGORpen.net] 悩んでる時間があったら素直に全て書け と思う
671 名前:デフォルトの名無しさん [2018/04/24(火) 10:32:40.90 ID:Z9G2Fq/H.net] 柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?
672 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 12:27:26.17 ID:1D4v+3Mx.net] ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古 修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、 C++11/14 コア言語、江添 亮、2015
673 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 13:18:05.66 ID:+bGv0z3c.net] 「C++の設計と進化」は良いよ
674 名前:デフォルトの名無しさん [2018/04/24(火) 15:48:30.83 ID:Z9G2Fq/H.net] >>660-661 ありがとうございます。 Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。 柴田さんの中級という本も細かい話がないように思います。
675 名前:デフォルトの名無しさん [2018/04/24(火) 18:56:34.08 ID:Z9G2Fq/H.net] vector について質問です。 コピーコンストラクタ、operator= について一応勉強したのですが、 vector などのクラスでは、 コピーコンストラクタや operator= はどうなっているのでしょうか?
676 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:23:44.30 ID:4uyKjeBM.net] 実際にヘッダ読んで見るしかないと思うが ディープコピーしてるよとしか
677 名前:片山博文MZ mailto:sage [2018/04/24(火) 19:27:47.73 ID:Eukzbh8y.net] Visual Studioなどでデバッグするとヘッダーが見れるよ。vectorはテンプレートのクラスだから、 読み進めるにはテンプレートの知識が必要かもね。
678 名前:デフォルトの名無しさん [2018/04/24(火) 19:32:21.39 ID:Z9G2Fq/H.net] >>664 ありがとうございました。 ディープコピーでしたら、使う上では、何も考えずに関数の引数として渡したり、 関数から返したりしてもかまわないですね。 >>665 ありがとうございました。
679 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 19:40:11.28 ID:4uyKjeBM.net] >>666 それはディープコピーのコストがかさむのでおすすめしない
680 名前:デフォルトの名無しさん mailto:sage [2018/04/24(火) 20:11:58.65 ID:Ukt80uX+.net] >>666 >何も考えず引数で渡しても良いですね 何をもってして「良い」と評価するのかはわかりませんが、 そういうのは拙い知識で独断せずそこら中にある 経験豊富な先人の書いたコードを読んで真似するのがいいですよ 引数は大抵 const 参照で渡しているでしょう
681 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 01:34:48.58 ID:Z7x9U0tp.net] class TestA { TestA() {} ~TestA() {} }; class TestB { TestB() {} ~TestB() {} TestA getA() { return TestA(); } }; int main() { TestB b; TestA a = b.getA(); } TestBクラスの getA() メソッドがこのテストコードで正しく動作しているのですが、TestAの インスタンスは一体どこで作られてるんでしょうか? TestA getA() { TestA a; return a; } としないでいきなり reurn TestA() で良い理由が良く分かりませんでした。
682 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:25:57.17 ID:E0/AuDcr.net] >>669 どこのメモリにどう作られているのかという質問だと思うけど、 C や C++ では式の値として構造体やオブジェクトが認められていて、 コンパイラがどこぞにメモリを用意して上手いこと作ってくれることになっている。 式や式の一部の値としてだけ現れて変数に格納されないオブジェクトはテンポラリーオブジェクトとか言うので、 詳細はテンポラリーオブジェクトでぐぐって。 >>669 のmain はテンポラリーオブジェクトを使って b を用意せず TestB().getA(); ともかける ところで今回の質問の、関数の戻り値に関するコンパイラの動作は 「戻り値最適化」なる最適化によって色々複雑なことになっているので これは自分で戻り値最適化でググって調べて欲しい。
683 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 07:37:06.21 ID:E0/AuDcr.net] >>669 質問が文法的なことについてだとすると、式中の項ととして TestA() std::string("foo") などのように型名にコンストラタの引数を加えて関数呼び出しのように書くと テンポラリーオブジェクトを生成してそれを値とする頃ということになる。 例 size_t l = std::string("abc").length(); std::string 型のテンポラリーオブジェクト(中身は"abc") が作られ、 それのメンバ関数 length が呼ばれ、l はその値(3)で初期化される。
684 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 11:26:25.34 ID:Z7x9U0tp.net] >>670-671 詳細をありがとうございました。 大変良く解りました。より深くは自分でググってみます。
685 名前:デフォルトの名無しさん mailto:sage [2018/04/26(木) 14:19:03.06 ID:LZqqVlEY.net] 共同ツール 1 https://seleck.cc/685 https://trello.com/ ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど Trello Chrome拡張機能 elegant ttp://www.kikakulabo.com/service-eft/ trelloのオープンソースあり 共同ツール 2 https://www.google.com/intl/ja_jp/sheets/about/ 共同ツール 3 https://slack.com/intl/ja-jp https://www.dropbox.com/ja/ https://bitbucket.org/ https://ja.atlassian.com/software/sourcetree https://sketchapp.com/extensions/plugins/ ttp://photoshopvip.net/103903 ttps://goodpatch.com/blog/sketch-plugins/
686 名前:デフォルトの名無しさん [2018/04/27(金) 13:24:43.31 ID:wnXDwKhi.net] for (int i = 0; i < n + 1; ++i) {;} とやると、 i が n + 1 未満かどうかの判定をする際、毎度 n + 1 を計算してそれを i と比較するということになるので しょうか? もし、そうなら、 m = n + 1 for (int i = 0; i < m; ++i) {;} としたほうがよいのでしょうか?
687 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 13:35:12.84 ID:GhhThAV7.net] >>674 ただの整数の足し算程度なら最適化されることが期待できるのであまり気にしなくていい。
688 名前:デフォルトの名無しさん [2018/04/27(金) 14:09:53.91 ID:ouRrzssA.net] 【マイトLーヤとPS4】 FFとDQの最新作、VR開発は危険、プレーヤーの日常感覚を損なうおそれ rosie.5ch.net/test/read.cgi/liveplus/1524621704/l50
689 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:21:42.79 ID:qED012zx.net] https://ideone.com/TVzVzF 上記のコードで、read関数を持ったIReadableクラス(基底クラス)があって、そのクラスから派生したCFileReaderクラス、 直接は派生していないけどread関数を持ったCMemoryReaderクラスがあって、その両方を受け取れるvector<IReadable*>を作りたいのですがコンパイルが通りません。 どうしたらいいでしょうか? どなたか教えてください。。。
690 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 18:38:42.04 ID:yKF4ET93.net] >>674 いまだに最適化されないコンパイラもあることはある 8bitマイコンとかの話 あと、nがvolatileだと当然毎回計算する nがSFRだったり複数スレッド共有変数だったりするなら気を付けよう 普通は気にしなくて大丈夫 コンパイラの最適化の基本の基本なので このループの比較がパフォーマンスに大きく影響するなら 高速化テクニックは色々とある
691 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:03:28.59 ID:uctWpHV6.net] >>677 なんとなく互換性のある read を持つものをエンベロープして IReadable になるエンベロープクラスを用いるのはどう? ifstream も IReadable じゃないからエンベロープする。 https://ideone.com/27yhhu
692 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:06:52.81 ID:O6TOHWbP.net] >>674 > for (int i = 0; i <= n; ++i) {;}
693 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:18:38.40 ID:uctWpHV6.net] for ループといえばつい手癖で for (int i =0; i < count-1; ++i ) {...} と書いてて、 後日に count を int から size_t にしたとき countが0のケースではまったことがあるなあ for (int i =0; i + 1 < count; ++i ) {...} と書けば良いだけなんだけど
694 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:27:34.55 ID:mctUhDKo.net] n+1未満とn以下は違うと思うの
695 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:33:05.63 ID:AimUsleE.net] >>681 それcountが1でも全くループしないというヘンテコ仕様だけど そんなもの手癖で書くの?
696 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:37:07.17 ID:uctWpHV6.net] >>683 隣り合った2項、例えばv[i] と v[i+1] を用いた処理をするとか 後続のものがある項だけ処理するとか良くある
697 名前:デフォルトの名無しさん [2018/04/27(金) 19:37:30.10 ID:wnXDwKhi.net] int **a を利用して2次元の動的配列を作ります。 a を関数に渡して、計算に利用します。 2次元配列 a の要素は変更しないので、 int func(const int **a){ ... } としました。 main 内には以下のように書きました。 ret = func(a); すると、 a を int** から const int** に変換できませんというエラーが出てしまいます。 これはなぜでしょうか?
698 名前:デフォルトの名無しさん [2018/04/27(金) 19:39:48.54 ID:wnXDwKhi.net] >>675 >>678 >>680 ありがとうございました。
699 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:49:10.59 ID:O6TOHWbP.net] >>682 ん? レアケースを語り出すのか?
700 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:51:18.26 ID:mctUhDKo.net] >>683 そんなにヘンテコでもないと思う for (size_t count = 0 ; count < 10 ; count++){ for (size_t i = 0 ; i < count - 1 ; i++){ .... } } こんなのはありがちかと
701 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 19:52:51.39 ID:mctUhDKo.net] >>687 レアケースっていうか nが小数の場合だな
702 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:02:30.96 ID:AimUsleE.net] ふむ、なくはないか。 やはり条件の方に+1とか-1とか書くんじゃなくて初期値変える方が素直だろうな。 最適化の下手なコンパイラ対策も含めて。
703 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:03:21.75 ID:O6TOHWbP.net] >>689 だからそう言うのをレアケースって言ってるんだが... よく書くと言うなら多分住む世界が違う
704 名前:片山博文MZ mailto:sage [2018/04/27(金) 20:10:35.47 ID:HF3+Vuoy.net] レイアース
705 名前:デフォルトの名無しさん [2018/04/27(金) 20:28:24.05 ID:wnXDwKhi.net] >>685 具体的なコードは以下です: int func(const int **a) { return 0; } int main() { int n = 10; int **a = new int*[n]; for (int i = 0; i < n; ++i) { a[i] = new int[n]; } func(a); for (int i = 0; i < n; ++i) { delete[] a[i]; } delete[] a; }
706 名前:はちみつ餃子 mailto:sage [2018/04/27(金) 20:32:49.73 ID:GhhThAV7.net] >>692 さくらの続編を放送してる今日この頃、レイアースの第三章もワンチャン有るかもな!
707 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:36:06.84 ID:mctUhDKo.net] >>687 そんな事言ったら countが0でループだってレアケースだぞ
708 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:43:41.07 ID:mctUhDKo.net] >>693 const付きに変換出来るのは ポインタの先がconstに変わる場合 int finc(int * const * a) なら大丈夫
709 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:52:32.49 ID:wnXDwKhi.net] ありがとうございます。 const についてよくわからないのですが、 func の中で、 a[i][j] = 1; みたいなことをできないようにしたいのですが、どうすればいいでしょうか?
710 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:55:03.35 ID:qED012zx.net] >>679 ありがとうございます。その方法で取りあえずの目的は果たせそうなのですが、ほかの方法はないでしょうか? というのも、他のクラスでラッピングしたりキャストしたりせずにifstreamを食わせたいのです。 たとえば、STLの各種関数はポインタでもvector等のコンテナでも大体OKですよね? あれと同様に関数ポインタでもクラスのインスタンスへのポインタでもread()を持つものなら何でも突っ込めるようにしてforでぶん回したいのです。 標準のコンテナや自作
711 名前:クラス等の違いを吸収できるような構造にしたいのです。条件が後出しになってしまって申し訳ありません。 [] [ここ壊れてます]
712 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:57:43.26 ID:mctUhDKo.net] キャスト が一番コストが少ないと思う 関数の中で delete [] a[i]; a[i] = new int[10]; は出来ても良いの?
713 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 20:58:32.28 ID:mctUhDKo.net] >>699 は>>697 あて
714 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:24.66 ID:wnXDwKhi.net] >>699 ありがとうございます。 ちょっと回答が理解できないため、質問を代えさせてください 以下のプログラムの func はNGなのに func2 はOKなのはなぜでしょうか?
715 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:19:40.66 ID:wnXDwKhi.net] int func(const int **a) { return 0; } int func2(const int *b) { return 0; } int main() { int n = 10; int **a = new int*[n]; for (int i = 0; i < n; ++i) { a[i] = new int[n]; } func(a); int *b = new int[n]; func2(b); for (int i = 0; i < n; ++i) { delete[] a[i]; } delete[] a; delete[] b; }
716 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 21:47:52.98 ID:uctWpHV6.net] >>701 それは c / c++ の欠点の1つで、 T * は const T * に文句も言わず変換してくれるが T ** は const T ** に変換してくれないという問題 T は const T と定数性以外 compatible だよね、という判断を 1 段階しかしてくれない。 キャストが必要 const_cast<const int**>(a) など
717 名前:デフォルトの名無しさん mailto:sage [2018/04/27(金) 22:48:56.90 ID:bqnCmOTp.net] >>702 皆が言っているのは質問の内容とはちょっと違うけど、 func の中で a[0] = 0; などを禁止するために内側のポインタ自体も const にして const int * const * にした方がいいよということ
718 名前:704 mailto:sage [2018/04/27(金) 22:53:34.55 ID:bqnCmOTp.net] いやごめん func(int * const * )にすればコンパイル通るのか… T * const * ==> const T * const * という変換は暗黙でokなのか 自分がバカでした
719 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 14:10:11.64 ID:uFYPLUkV.net] >>703 欠点なの? T ** を const T ** に勝手に変換されると困るんだが。
720 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:26:18.04 ID:AQKaesvC.net] T * を const T * には勝手に変換するけどな
721 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 15:27:57.34 ID:AQKaesvC.net] T * を volatile T * にも
722 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:08:44.48 ID:p2Z/45DS.net] >>706 ちょっと興味があるので困るコードを教えて
723 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 16:11:13.28 ID:p2Z/45DS.net] >>705 慌ててたのかこのレス書き間違ってた func(const int * const * )にすればコンパイル通る、 T ** ==> const T * const * という変換は暗黙でok、 と書きたかった(全然違うな)
724 名前:デフォルトの名無しさん [2018/04/29(日) 18:37:23.21 ID:uFYPLUkV.net] >>709 int** ipp; const int ci=0; const int ** cipp; cipp = ipp; *cipp= &ci; **ipp = 3;
725 名前:711 mailto:sage [2018/04/29(日) 18:50:17.15 ID:uFYPLUkV.net] おっと ipp の初期化忘れた int** ipp; const int ci=0; const int ** cipp; int *ip; ipp = &ip; cipp = ipp; *cipp= &ci; **ipp = 3;
726 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 18:55:31.07 ID:tn8JNm3m.net] ロベールの本に、 ios::out | ios::trunc が意味がないと書いてあります。 既存のファイルを破棄してから書き込むということだとすると意味があるように思います。 ios::in | ios::out | ios::trunc とした場合のみ意味があると書いてあります。 どういう意味なのでしょうか?
727 名前:デフォルトの名無しさん mailto:sage [2018/04/29(日) 23:14:14.46 ID:hAJLRgtx.net] truncate は、ファイルサイズを切り詰め・縮小する。 これは、読み書き両用時に使える機能 ファイルを読み込んで、ファイルサイズを縮小して書き込む ファイルの書き込みでは、使えない。 書き込みでは、ファイルサイズ0で開くから、前のファイルが消える
728 名前:デフォルトの名無しさん mailto:sage [2018/04/30(月) 03:21:44.30 ID:/NJkj9K4.net] >>712 なるほどね。 T ** => cont T ** は許すとcont T を操作できてしまうから禁止されていて、 T * => const T * T ** => const T * const * ...(以下略) にはその問題が無いから許可されているわけか
729 名前:デフォルトの名無しさん [2018/05/05(土) 10:57:39.35 ID:dx2uIifv.net] file.read((char*)buf, sizeof buf); は buf のサイズ分だけ読み込めということだと思います。 ファイルの最後の部分を読み込むとき、サイズが WIDTH 未満の場合にはどうなるのでしょうか? fstream file; file.open("hello.txt", ios::in | ios::binary); do { unsigned char buf[WIDTH]; file.read((char*)buf, sizeof buf); for (int i = 0, size = file.gcount(); i < size; ++i) { printf("%02X ", buf[i]); } cout << endl; } while (!file.eof()); file.close(); 👀 Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
730 名前:デフォルトの名無しさん [2018/05/05(土) 11:15:19.94 .net] >>716 https://cpprefjp.github.io/reference/istream/basic_istream/read.html
731 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 11:22:41.78 ID:dx2uIifv.net] >>717 ありがとうございました。 あともう一つ質問させてください: ロベールの本なのですが、 int n = 0x41424344; file.write((const char*)&n, sizeof n); というコードがあるページにあります。 その少し後ろのページには、以下のコードがあります。 char buf[BUF_SIZE]; dst.write(buf, src.gcount()); ここで、なぜ dst.write((const char*)buf, src.gcount()); としていないのでしょうか?
732 名前:デフォルトの名無しさん [2018/05/05(土) 11:28:13.02 ID:4WOSF73M.net] 【マイトLーヤとUFO】 『月面にはウサギやウルフが棲息』 『宇宙人グレイは溶けてゼリーに』 rosie.5ch.net/test/read.cgi/liveplus/1525483483/l50
733 名前:片山博文MZ mailto:sage [2018/05/05(土) 11:56:29.00 ID:y1NIMmWz.net] >>718 char *はconst char *に互換だから。constは書き換えないという意味で、constなしはconstありに対して互換性がある。
734 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:03.35 ID:dx2uIifv.net] すみません。もう一つ質問です。 またロベールの本なんですが、以下のコードが書いてあります。 ファイルから入力中にエラーが起きたときの対処法です。 if(src.fail()) { ではなく、 if(src.fail() && ! src.eof()) { と書いてあります。その理由として、 「読み込みの場合はファイルの終端に到達した際も fail メンバ関数が 真となるため、 eof メンバ関数が真になる場合は除外しておきます。」 と書いてあります。 そこで質問です。 ファイルの終端の直前の部分を読み込む最後の読み込みの際に何等かのエラーが起こった場合、 src.fail() == true かつ src.eof() == true となります。 そのため、 src.fail() && ! src.eof() == false となってしまいます。 この場合、読み込みエラーが起こったにもかかわらず、その対処ができないことになりはしないでしょうか? それともロベールさんのコードはOKなコードなんでしょうか?
735 名前:デフォルトの名無しさん [2018/05/05(土) 11:58:46.39 ID:dx2uIifv.net] fstream src; … char buf[BUF_SIZE]; src.read(buf, sizeof buf); if(src.fail() && ! src.eof()) { error = true; break; }
736 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:03:26.22 ID:dx2uIifv.net] >>720 ありがとうございます。 つまりどちらもエラーにはならないということですね。 ですが、記述が統一していない理由というのは何か考えられるでしょうか? int n = 0x41424344; file.write((const char*)&n, sizeof n); に const がついているのは、 n は int 型だから write に渡すときには絶対に キャストしなければならない。(char *) でもいいが、どうせなら const もつけて しまおうということですかね? 一方、 char buf[BUF_SIZE]; dst.write(buf, src.gcount()); の方は、キャストの必要がないからわざわざ (const char*) とキャストすることも ないかなという感じですかね?
737 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:05:14.84 ID:dx2uIifv.net] ロベールさんの本は色々細かいことが書いてあって有用なのですが、なぜこういうコードなんだろう?という 疑問を持って読んでいくと次から次へと疑問が生まれてきて読み進むのが大変です。
738 名前:デフォルトの名無しさん [2018/05/05(土) 12:18:38.57 .net] >>721 >>717 再読のこと
739 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:19:01.91 ID:y1NIMmWz.net] Cスタイルのキャストは強力すぎて、効果が分かりにくいので、モダンでは、そのキャストは、reinterpret_cast<const char *>(&n)って書いた方がいい。
740 名前:デフォルトの名無しさん mailto:sage [2018/05/05(土) 12:23:53.42 ID:LkKePK4y.net] winsowsにはC#コンパイラが標準付属してますが、C++コンパイラは標準付属してないんですか?
741 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:24:24.44 ID:y1NIMmWz.net] つまり、その本は古い。温故知新とは言うが、Cスタイルのキャストの使用はモダンではない。
742 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:35:42.78 ID:y1NIMmWz.net] >>726 訂正。 × reinterpret_cast<const char *>(&n) ○ reinterpret_cast<char *>(&n) そのCスタイルのキャストは const_cast<const char *>(reinterpret_cast<char *>(&n))と同じ。 下手なキャストはバグのもと。キャストは最小限に。
743 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:43:36.49 ID:y1NIMmWz.net] コンパイラによっては、reinterpret_castとconst_castをCスタイルのキャストで一度にしようとすると、警告やエラーになるものもある。
744 名前:片山博文MZ mailto:sage [2018/05/05(土) 12:53:07.14 ID:y1NIMmWz.net] file.write((const char*)&n, sizeof n); ここでconstをわざわざ付けるのは、型で書き換えないことを確認するためだが、 このCスタイルのキャストは強力すぎて、行儀が悪い。reinterpret_castとconst_castに分けるべきだと考える。
745 名前:はちみつ餃子 mailto:sage [2018/05/05(土) 23:49:27.10 ID:/wbyRxeL.net] 元の趣旨がキャストについての質問だけどそれは置くとして、 そういうことするなら fstream じゃなくて basic_fstream<int> を使った方がよくなくなくない?
746 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:07:10.95 ID:RbjPx358.net] そんなもんがいいと思ってる人に何言っても無駄だし 他人に強要しなけりゃそれ使ってもいいんじゃないの
747 名前:デフォルトの名無しさん mailto:sage [2018/05/06(日) 00:56:59.17 ID:G6stHO5N.net] >>732 初心者が入門書で学習している段階で、途中の過程をすっ飛ばしてこっちの方がいいからこれ使えなんて進めるのはかえって理解を妨げるんでないの?
748 名前:はちみつ餃子 mailto:sage [2018/05/06(日) 02:31:33.69 ID:ATh7OHAm.net] 繰返すが趣旨と外れてることはわかってるので、元質問は忘れて。 こっちの手段もアリだよね? っていう別の質問。
749 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 14:30:37.57 ID:YgEwOBRT.net] 競技プログラミングってやった方がいいんですか?
750 名前: mailto:sage [2018/05/09(水) 16:44:52.51 ID:dHqNIKDN.net] >>736 競技プログラミングが流行る前には、宿題請負スレが隆盛を誇り、私もそれに便乗していろいろやっていましたが、 競プロをやりたいとは思わないなあ…
751 名前:デフォルトの名無しさん [2018/05/09(水) 17:28:08.89 ID:bhGLBTeZ.net] ロベールの本に以下のコードがあります。 buf という配列ですが、 for 文の中で宣言されています。 PAGE_HEIGHT 回、配列 buf が作られるのでしょうか? 何か非効率的な気がします。 for (int h = 0; h < PAGE_HEIGHT; ++h) { unsigned char buf[PAGE_WIDTH]; m_file.read((char*)buf, sizeof buf); for (int w = 0, size = m_file.gcount(); w < size; ++w) { printf("%02X ", buf[w]); } cout << endl; }
752 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:38:59.81 ID:J0gm0Ysv.net] スタックポインタをずらす量が変わるだけ これによる時間はゼロと思って良い
753 名前:デフォルトの名無しさん [2018/05/09(水) 17:44:16.81 ID:bhGLBTeZ.net] >>739 そういうのを分かるようんなるにはどうすればいいのでしょうか? C++の本だけ読んでいても分からないような気がします。
754 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:45:58.33 ID:J0gm0Ysv.net] もしパフォーマンスが問題になるなら printfをなんとかすべき
755 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 17:52:37.44 ID:J0gm0Ysv.net] >>740 コードを書いたときに具体的にどんな処理が行われるか を地道に学んで行くしかない アセンブラを見てもいいし本で学んでも良いし 時間を測っても良い C言語の方が簡単なのでC言語にある機能から
756 名前:デフォルトの名無しさん [2018/05/09(水) 18:27:14.15 ID:bhGLBTeZ.net] >>742 ありがとうございました。
757 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:10:47.36 ID:WcTkBSWX.net] >>738 毎ループその buf が作られるかという質問について言えば 関数に入るときに確保された領域が毎ループ使い回されるだけ
758 名前:デフォルトの名無しさん [2018/05/09(水) 19:12:26.96 ID:bhGLBTeZ.net] >>744 ありがとうございます。 newした場合にはもちろん毎回別の領域が確保されるわけですよね。 文法だけからでは分からないことだと思うので、そのような部分を解説した本が あればよいのですが。。。
759 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 19:21:16.91 ID:sQgpoJ7Q.net] コンストラクターを起こすようなクラスならアレだけど 基本型はループの
760 名前:外においやらている可能性が高い まぁ使ってるコンパイラの最適化次第というのはある 文法/規格だけで解決しない自由な部分は 実際に使ってるコンパイラの吐き出すコードをみるなり 実測して違いが出るか確認いてみたり…… 初心の「それ無駄だろうという直感」は最適化で瑣末ごとになることが多い?かな? [] [ここ壊れてます]
761 名前:デフォルトの名無しさん [2018/05/09(水) 20:03:17.36 ID:bhGLBTeZ.net] >>746 ありがとうございました。
762 名前:デフォルトの名無しさん mailto:sage [2018/05/09(水) 20:03:43.32 ID:tbbSaefy.net] >>745 C++ スタック ヒープで検索すると解説しているページは山ほどヒットするけどいい本ってあるのかな。 CPUとメモリの動作とか簡単に学んでおくといい気がする。 スタックに収まらないような大きな領域をスタックに取ってはいけないとか 実践的に必要な知識でもあるんだよね。
763 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 00:46:37.51 ID:hNESkqkP.net] >>748 個人的には、はじめて読むシリーズがコンパクトで良かった。 はじめて読む8086 はじめて読むPentium はじめて読むMASM はじめて読む486 486は結構ボリュームがある
764 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:36:43.93 ID:dXwOta4y.net] クラスの練習に文字列クラスっぽいものを作ったんですが Mystr Mystr::operator=(Mystr &obj){ //左辺に右辺を代入 return *this } こうすると代入のたびに戻り値を返すためにコピーコンストラクタとデストラクタがわざわざ呼ばれてるみたいなんですが 関数の戻り値をvoidにする以外でなくす方法はありませんか? 一応コード全文 https://ideone.com/A1iQ3Y
765 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 12:55:29.56 ID:vDlJ/Ca2.net] >>750 >Mystr Mystr::operator=(Mystr &obj){ 一般的にはこうする Mystr & Mystr::operator=(Mystr &obj){
766 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:00:33.59 ID:TqAsciuR.net] Mystr & Mystr::operator=(const Mystr &obj);
767 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 13:59:44.86 ID:dXwOta4y.net] ありがとうございました 戻り値にも参照が使えることを知りませんでした
768 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 14:05:03.21 ID:vDlJ/Ca2.net] >>753 おそらくわかっていると思うけど、ローカル変数や テンポラリーオブジェクトの参照は返しちゃダメなので注意 ダメな例 T& f() { T a; .....; return a;} string& g() { string a, b; .....; return a+b;}
769 名前: mailto:sage [2018/05/10(木) 17:59:19.87 ID:XVn0zvPu.net] >>749 はじめて読む 486 は良書だけれでも、今、これを実際のマシンで試してみることはできなくなりましたね…
770 名前:はちみつ餃子 mailto:sage [2018/05/10(木) 18:38:04.46 ID:RiSXhiCD.net] アセンブラって「低水準言語」なはずだけども、今となっては機械語すらもかなり高水準だもんな……。 機械語の並びをコンパイルして最適化された μop にするみたいなことが CPU の中で起こってて、 機械の気持ちを理解するには機械語はまだまだ外側の方って感じ。 >>755 動かすための情報を集約しようとしてはしてるよ。 ある程度は動く。 https://github.com/tkmc/486
771 名前: mailto:sage [2018/05/10(木) 19:41:56.87 ID:XVn0zvPu.net] >>756 これなんかも、動くかもしれません takeda-toshiya.my.coocan.jp
772 名前:デフォルトの名無しさん mailto:sage [2018/05/10(木) 20:45:54.69 ID:CLWEept/.net] アドレスでアクセスできるメモリってものがあってデータやコードが書かれてるのかー スタックなる仕組みでローカルな記憶域をほぼコストゼロで確保してんのかー と言うことがわかれば十分な気がする
773 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 00:09:23.84 ID:cA/jbwin.net] >>758 >>749 これの上の3冊は薄くてすぐ読めるから、もやもやとした状態でいるよりはいい気がする。 ただ、486以外は古本でしか手に入らなそうだけど。
774 名前:デフォルトの名無しさん [2018/05/11(金) 07:04:43.76 .net] 薄い本ならコミケで売れや
775 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 13:11:04.97 ID:Mluu9Rs0.net] アセンブラの前に まずは変数がどこにどのように確保されるかとか どのように初期化されるかとか そっちの方が先だろ スタティック、スタック、ヒープ をまず理解する C++であればvirtual関数が呼ばれる仕組みとかも 知ってた方が良い 例外の仕組みは機種依存が大きいのでもうちょっと先で
776 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 14:03:43.45 ID:lM6VzEPt.net] >>760 つ zob.club/zob/2018/04/16/ 同人誌-advanced-assembler-386-上ノ巻/
777 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 15:32:04.47 ID:L7FGnh/N.net] >>761 そう。 でもスタックを理解するにはメモリという概念モデルの理解が必要 だけど皆が勧めてるようなx86の解説書はやめたほうが良いと思う セグメントレジスタとか原理を学ぶには邪魔なノイズが多過ぎる
778 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 16:43:05.52 ID:ArEHxDOw.net] Z80からはじめよう。
779 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:23:03.14 ID:fUD4+ayW.net] 実用レベルのCで関数ローカル変数がどう実現されてるか、となると ベースポインタというほぼ専用のレジスタが出てくるからなぁ。 そういえば昔、Cが全然分からない頃にMASMの本を読んだら、 Z80や6502のアセンブラではついぞ出てこないディレクティブが色々あって まったく意味が分からなかったのを思い出した。 高級言語のコンパイラを作ったり、ライブラリとして呼べるマシン語の サブルーチンを作るための機能なんだと後になって腑に落ちたけど。
780 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 17:39:10.37 ID:e+Ei11A7.net] C の言語としての理屈が現代のコンピュータの仕組みと乖離しててもはや低級言語とは言えないということを 「C は PDP-11 エミュレータ」なんて揶揄してるのをどこかで見たことがあるな。
781 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 17:48:59.53 ID:S57n19k4.net] Cに引きずられて仕様のできたMIPSはCの理解にとてもいいよ
782 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 19:45:01.89 ID:CPfY1M+a.net] 龍芯3号か
783 名前: mailto:sage [2018/05/11(金) 20:48:44.74 ID:/s88DeTW.net] マシン語をやるのなら、実際に石を触れる感じのする環境がいいなあ、あくまで「感じ」だけれども 仮想マシンの中間コードを触るのは疑問
784 名前:デフォルトの名無しさん mailto:sage [2018/05/11(金) 20:52:01.78 ID:Mluu9Rs0.net] PCはPCで面白いし、 8bitは8bitで面白い
785 名前:はちみつ餃子 mailto:sage [2018/05/11(金) 20:54:19.03 ID:e+Ei11A7.net] AKI-80 の時代の人なのでラズパイで電子工作とかやってるのを見ると隔世の感がある。
786 名前:デフォルトの名無しさん [2018/05/11(金) 20:56:49.04 ID:2EGPeEG9.net] Donald Knuth の MMIX っていう言語は勉強するとためになりますか?
787 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 01:53:53.98 ID:Cq1QtQw6.net] >>761 理解すると言っても何を勉強して理解するのか? という話だと思ったんだけど。 アセンブリやCPU関連の本以外で具体的に分かるものがあるというのがよく分からないな。
788 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 04:35:38.94 ID:F7LxnV/h.net] wikipedia の「コールスタック」の項に意外にしっかりした説明あるな コールスタックって何?スタックフレームってなに? って人は読んでおくといいと思う。
789 名前:デフォルトの名無しさん [2018/05/12(土) 14:17:18.55 ID:CbmhA0Cx.net] メモリとかスタックとかヒープとかって、C/C++ 言語仕様とは直接の関係がないけど、使う上では結構重要な情報だよねー。 Cを学習する上で避けられない割に、C視点側からの詳しい学習書って無いよなー。 環境依存部分だから、言語学習書に適さないってのもわかるんだが…何とかできないものかと常々思ってる。 (思ってる「だけ」で実行には移さないのだけれどもw
790 名前:デフォルトの名無しさん [2018/05/12(土) 14:20:15.63 ID:CbmhA0Cx.net] >>772 ならないと思う。 クヌース先生の本を読む上での決まり事を、先生が定義しただけに過ぎない、と理解してる。
791 名前:デフォルトの名無しさん mailto:sage [2018/05/12(土) 15:41:16.04 ID:9vavBtpK.net] RISC-Vの方がまだ有用な可能性が
792 名前:デフォルトの名無しさん [2018/05/23(水) 19:24:44.84 ID:Au5e7VGg.net] 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 AA6VB
793 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 10:45:43.84 ID:cPlRxlDn.net] AA6VB
794 名前: mailto:sage [2018/05/24(木) 20:42:22.15 ID:dCOL2CYR.net] >>775 たしかに、そこをつく本を書けば売れるかもしれない そんな本に書くべきことは、他に何があるだろうか? ・qsort() の説明 ・アセンブリ言語とのリンク ・PEフォーマット …etc
795 名前:はちみつ餃子 mailto:sage [2018/05/24(木) 21:49:22.52 ID:jqqWnK8Z.net] >>775 ,780 江添氏が C++ の入門書で、言語以外の周辺事情もある程度カバーしたものを書こうとしてるみたいだぞ。 今は二の補数を説明すべきかどうかとか TWITTER でグダグダ言ってるから、 当たり前みたいで、しかし説明を省略されがちなことも含まれると思う。
796 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 22:04:43.75 ID:hqF4m+Xg.net] シフトを使って多倍長計算とか、ZDDとか(クヌースの4巻だけど日本発)
797 名前:デフォルトの名無しさん mailto:sage [2018/05/24(木) 23:04:39.55 ID:agu/wXZc.net] 浮動小数点の誤差がらみとか、バッファオーバーフローでなんで脆弱になるのかとか、キリがなくなるぞ
798 名前:デフォルトの名無しさん mailto:sage [2018/05/25(金) 06:31:49.05 ID:ZdzP9wu5.net] コンパイルとリンクとロードの話とか。 ソースファイルからオブジェクトファイルに変換したときに どんな情報が残ってどんな情報が消えるか。 オブジェクトファイル群をリンクした段階でまだ確定せずに 実行時のロードで配置されるアドレスのこと、あたり。
799 名前:デフォルトの名無しさん [2018/05/31(木) 19:40:53.15 ID:xDJZQ821.net] ちょっとCと関係ないですが、コンピュータサイエンティストの人がよくMacを使っているのはなぜですか?
800 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 19:48:19.66 ID:DFMmAXw3.net] しねばいいのに
801 名前: mailto:sage [2018/05/31(木) 20:29:52.32 ID:4k9lsrlf.net] >>781 二の補数はあたりまえに書いてもいいとおもうけれども、二の補数以外のものがあることを陽に記述する必要はないんじゃないかな…
802 名前: mailto:sage [2018/05/31(木) 20:30:39.27 ID:4k9lsrlf.net] >>785 Mac はお高いからな…
803 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 22:34:17.78 ID:Dy3hGHo2.net] >>785 17"でお手頃価格なWindowsなNoteが他に無くてね HPとかDELLだと2.5kgとか
804 名前:デフォルトの名無しさん [2018/05/31(木) 22:37:50.13 ID:xDJZQ821.net] >>788-789 ありがとうございます。 >>789 使い勝手がいいとかそういうことはないですか?
805 名前:デフォルトの名無しさん mailto:sage [2018/05/31(木) 22:42:46.81 ID:Dy3hGHo2.net] 当時は無かったな。 MSのセミナーとかもmac+windows多かったよ
806 名前:デフォルトの名無しさん [2018/06/02(土) 18:09:00.04 ID:YEAzW6Zk.net] ヘッダーファイルについて質問なのです。 ヘッダーファイル内で、 ostream というのを使っているのですが、 #include <iostream>をヘッダーファイル内に記述していません。 エラーが出るだろうと思いつつ、ビルドしてみたらエラーが出ませんでした。 これはどういうからくりでしょうか?
807 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:23:14.65 ID:tlq/OxaF.net] ヘッダファイルの中じゃなくostreamを使っている
808 名前:|訳単位(cppファイル)の中で最低1回include iostreamされてればOK [] [ここ壊れてます]
809 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:25:58.96 ID:LSJtd55X.net] >>792 他のヘッダファイルで include してて間接的に読み込んでいることになってるってのが、一番ありそうかなぁ。
810 名前:デフォルトの名無しさん [2018/06/02(土) 18:30:00.66 ID:YEAzW6Zk.net] >>793 ありがとうございました。 ↓のファイルをビルドするとエラーが出るのですが、何が原因かよく分かりません。 フレンド関数関連だと思います。フレンド関数については全く知らないので、真似して 作っただけです。 Vec.h codepad.org/3ROYH1yq Vec.cpp codepad.org/f3eSheBS
811 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:30:45.89 ID:YEAzW6Zk.net] >>794 ありがとうございました。 もしかしてヘッダーファイルのみをビルドしてもオブジェクトファイルはできないんですか?
812 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:34:39.57 ID:YEAzW6Zk.net] >>795 ある本に書いてあるコードでは、 Vec.h と Vec.cpp のようには分かれていないため、 自分で分けたのですが、エラーになってしまいました。
813 名前:デフォルトの名無しさん [2018/06/02(土) 18:46:23.02 ID:RQ4rJlvL.net] 定義があればヘッダだけでもオブジェクトファイルに実装はできますよ。
814 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 18:50:06.69 ID:YEAzW6Zk.net] >>798 Vec.h codepad.org/3ROYH1yq 上のVec.hの最初の方の #include <iostream> #include <cassert> 削除してもビルドエラーが出ません。 プロジェクトにはVec.hしかない状態でビルドしました。
815 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 18:55:56.26 ID:LSJtd55X.net] >>799 テンプレートのエラーはテンプレートが実体化するときに出ると思うよ。 だから、テンプレートを使ってないなら、エラーがあってもコンパイル自体は出来たりする。
816 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:50.14 ID:YEAzW6Zk.net] >>800 ありがとうございました。 あともう一つ質問なのですが、ロベールの本に、 「関数を実体化するには呼び出したところからその実装が見える必要があります。」 「つまり、関数テンプレートは宣言と実装をヘッダファイルとソースファイルに分離して 書くことはできず、すべてヘッダファイルで実装する必要があるのです。」 と書いてあります。 クラステンプレートについては同様の記述がないのですが、 クラステンプレートについても宣言と実装をヘッダファイルとソースファイルに分離して 書くことはできず、すべてヘッダファイルで実装する必要がありますか?
817 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:00:59.43 ID:uqsytqRM.net] >>795 このへんの問題かな? https://ja.wikibooks.org/wiki/More_C%2B%2B_Idioms/friend_%E9%96%A2%E6%95%B0%E3%81%AE%E7%94%9F%E6%88%90(Making_New_Friends)
818 名前:はちみつ餃子 mailto:sage [2018/06/02(土) 19:06:46.84 ID:LSJtd55X.net] >>801 Yes。 テンプレートはヘッダファイルに書く必要がある。 同じ実体 (テンプレート引数も同じなテンプレート) はリンク時に統合されるので、 最終的な実行ファイルに複数の実体があったりはしない。
819 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:21:25.63 ID:YEAzW6Zk.net] >>802 ありがとうございました。 ちょっと理解できないと思うので、あきらめて codepad.org/ABfo8I3a としたところビルドできました。 ありがとうございました。
820 名前:デフォルトの名無しさん mailto:sage [2018/06/02(土) 19:22:03.75 ID:YEAzW6Zk.net] >>803 ありがとうございました。
821 名前:デフォルトの名無しさん [2018/06/03(日) 17:10:25.43 ID:XweloLai.net] ヘッダファイルについて質問です。 assert() が使いたいため、「List2.h」内に、以下のように書いたとします。 #pragma once #include "List.h" #include <cassert> 実は、「List.h」内にも#include <cassert>が書いてあります。 ヘッダファイルにはすべて#pragma onceを書いているので多重インクルードについて 問題はないと思います。 そこで質問なのですが、「List2.h」内で assert() を使っているため、自分としては、 必要ありませんが、「List2.h」内にも#include <cassert>を書いた方が分かりやす いのではないかと思いました。 既にインクルードされていてもあえて、#include <> を書くという人はいるのでしょうか? それとも、既にインクルードされていることに気付いている場合には、できるだけ #include <> は書かないほうがいいのでしょうか?
822 名前: mailto:sage [2018/06/03(日) 17:20:14.25 ID:5RsKIUxf.net] >>806 すでにインクルードされているかどうかは書いているときにはわからない、から書いとく ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った しかしテンプレート関数に assert() が
823 名前:入る場合があるのだから、こういったこともあり得るのかもしれないが、まだ私は体験していない… [] [ここ壊れてます]
824 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:34:16.61 ID:XweloLai.net] >>807 ありがとうございます。 >ただヘッダは分割コンパイルにおいて共用するデータだけを書いておくものだから >ヘッダ List.h に #include <cassert> が含まれているのは、一見、疑問だと思った ここのところがよく理解できないのですが、 List.h にテンプレートクラス List<T> が書いてあって、 List2.h には List<T> を継承したクラス List2<T> が書いてあります。 そして、List.h, List2.h の両方で assert() を使っています。
825 名前: mailto:sage [2018/06/03(日) 17:36:57.15 ID:5RsKIUxf.net] >>808 うんうん、なるほど テンプレートに assert() が含まれているのならば、ヘッダに #include <cassert> が入るのも止むを得ないです
826 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 17:47:06.72 ID:XweloLai.net] >>809 ありがとうございました。 また質問で申し訳ないのですが、今度は、全く違う質問になります。 一方向リスト用のセルである Cell<T> というクラスを作りました。 Cell<T> のメンバ変数は、 T data Cell<T> *next です。 List<T> には、一方向リストの先頭のセルを指すメンバ変数 Cell<T> *head およびリストに挿入したり、 リストから削除したり、リストのサイズを返したりする様々なメンバ関数があります。 List<T> は一方向リストでしたが、List2<T> は双方向リストにしたいとします。 オブジェクト指向プログラミングでは再利用が重要ということなので、 新たに、双方向リスト用のセルを作るのではなく、 Cell<T> を継承して Cell2<T> というクラスを作ることにします。 Cell2<T> には新たにメンバ変数 Cell<T> *prev を追加します。 List2<T> のほうも List<T> と共通で使えるメンバ関数があるため、再利用したいとします。その場合、気持ちとしては、 List<T> のメンバ変数 Cell<T> *head は無効にして、新たに、 Cell2<T> *head と Cell2<T> *tail をメンバ変数に したいです。 そして、Cell2<T> に対しても使えるメンバ関数はそのまま使い、双方向リストにしたことにより、より効率的に実装できる メンバ関数については、オーバーライドしたいです。 上記のようなことをどうやって実現したらよいのか分からないのですが、可能でしょうか? 可能だとして、こういうやり方は非推奨でしょうか?
827 名前:デフォルトの名無しさん mailto:sage [2018/06/03(日) 20:55:43.49 ID:E53R3BDh.net] 一方向・双方向リストの、ソースコードを見た方が速い 繰り返しを表す、C++ iterator みたいな、 抽象クラス・インターフェースでも使っているのだろう
828 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 08:19:48.74 ID:DAGyu3MW.net] 再利用など考えず 一から好きなように双方向リストを作れ >オブジェクト指向プログラミングでは再利用が重要 は幻想 この場合で言ったらまったく逆で もともと何か双方向リストがあって、継承して機能制限をして一方向リストに仕立て上げるなら分かるが 一方向リストを継承して双方向リストにするなどイカれてる
829 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 09:50:25.37 ID:3BCLNr2e.net] >>810 一方向リストと双方向リストでどれ程共通的な処理があるのか知らんけどCellBase<T>に共通的な処理を定義してそれからCell<T>とCell2<T>を継承させるのが普通じゃね?
830 名前:はちみつ餃子 mailto:sage [2018/06/04(月) 13:04:55.31 ID:zKvF3SpI.net] どうだろう。 総合的な判断が必要という前提はあるけども、 継承が妥当なときの基準のひとつに「is a 関係であるか?」ってのがあるよね。 XはYの一種であると言えるときはXはYを継承していい。 双方向リストは一方向リストの一種であるかというと、まあ Yes って呼んでいいんじゃないの。 ただ、それで楽に使いまわしが出来るかというとそうでもないこともあるので、楽なように作ればいいよ。 練習でやるのなら、使いまわしは置いてそれぞれを作ってみた上で、 共通な部分を探してデザインしなおしてみるというのもいいんじゃないかな。 クラス定義自体は継承関係を持たずにトレイトの方で性質を定義したりとかいったことも今どきはよくやるし、 将来的にコンセプトが入ったらそっちが主流になるかもしれん。
831 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:18:55.79 ID:K9p9OoRg.net] >>812 もともと何か一方向リストがあって、継承して機能追加をして双方向リストに仕立て上げる これはダメなん?継承は機能追加ダメなん?
832 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:19:07.80 ID:e7JLMPXe.net] >>811 ありがとうございました。 >>812 本を見ると再利用が重要と強調されているので、拘ってしまいました。 ありがとうございました。 >>813 ありがとうございました。
833 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:20:24.25 ID:e7JLMPXe.net] >>814 ありがとうございました。
834 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 13:43:52.15 ID:3BCLNr2e.net] >>815 >>812 はだいぶイカれてるから触らないで
835 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 14:30:56.26 ID:YRbUwbvV.net] >>810 単方向リストから双方向リストを派生させると、内部構造が違うから相違を埋めるのに面倒臭い事になる 派生した双方向リストから単方向リスト内部のノード列にアクセスできたとしても 単方向リストの状態は単方向でノードが繋がっているのだから双方向リストからどうこうはできない 結局の所、双方向用のノードを単方向用ノードにアップキャストしないと格納できないし、取り出すにはダウンキャストしないといけない もし何とかして単方向リストに双方向用のノードを双方向に数珠繋ぎ出来たら、そのリストはもう双方向リストだよ あと、insert()の問題もある、std::forward_listの持つinsert_after()が何故そうなのかは構造的に一目瞭然でしょ 厳密に言えば、std::forward_listはコンテナ要件を満たしていないしな 単方向も双方向もLinked Listとして構造的に似ているが効率的に見ても構造的に見ても別のデータ構造だよ is-aの関係ですら無いし、再利用ってのはhas-aの関係を考えるべきで、継承は再利用するためのものではないよ 例えば、皆、std::stringをhas-aで利用するよね、std::stackはstd::vectorやstd::listなどのアダプタだよね
836 名前:デフォルトの名無しさん mailto:sage [2018/06/04(月) 16:46:27.38 ID:OAwYb5Pt.net] 自分の勉強用だったら、継承した双方向リストクラス作ってみて 「やっぱ普通に作った方が簡単にできたな」って経験をするのもいいと思う よく「オブジェクト指向はこうだから」って言葉にこだわって面倒くさいことしてる人いるけど プログラムの基本としては「わかりやすさ」「シンプルさ」こそこだわった方がいいと思うから 将来拡張予定がないプログラムなんかだと無駄な継承しない方がいい
837 名前: mailto:sage [2018/06/04(月) 19:05:36.84 ID:gbEnuF2j.net] キーワード「継承」もずいぶんと評価が落ちたものですねえ…
838 名前:はちみつ餃子 mailto:sage [2018/06/05(火) 02:58:20.15 ID:l2agtc6/.net] C++ からクラスが無くなることは無いだろうが、 構成の仕方の流行はだいぶん変わってて、 コンセプトが入ったら一気に再編されるかもしれない。 クラスの継承ってそんなに万能じゃないよ。
839 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:11:26.28 ID:ucySJasT.net] ま、そういうことです 単方向リストを継承して双方向リストにするのは悪手 やってみるまでもなくわかるだろJK 結局ほぼすべてのメソッドを上書きしないといけないから意味ない しかも一から双方向リストを書いた方が分かりやすいし速い
840 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 12:24:14.11 ID:ucySJasT.net] この場合、どうしても手抜きしたかったら 大は小を兼ねるの考えで、双方向リストのみを作って 単方向リストを使う場面でも双方向リストを使えばよい それがベストだろうというアンサーがちらついてるからこそ、余計に 単方向リストを継承して双方向リストってのが悪手に見えるんよなぁ 余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし 単方向リストなどその程度の扱い、必要ない
841 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 15:11:28.97 ID:5kytDI4t.net] >>824 >余談だけどC++には std::list っていう双方向リストがあるけど単方向リストは提供されてないし std::forward_list など無かった
842 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 18:07:41.59 ID:9YbuVUhL.net] >>824 いやあ、単方向リストはそれはそれで使い道はあると思うよ 大体、キャッシュに載り易くメモリ効率も良いstd::vectorで十分だけど 挿入操作を多用するならstd::listやstd::forward_listの方が良いよね std::forward_listは、std::listよりも要素N個 x ポインタサイズ分のメモリ消費量を抑えられるし イテレータを使ってO(1)で連続してpush_back()みたいなことも出来る、pop_back()みたいなことはO(1)で出来ないけどね 必要性を問うよりも、その特徴を理解して適切に効率的に使うことが大事なんじゃないかな まあ、std::mapやstd::setは使うのを躊躇するけどな O(log n)で値を取り出せて、イテレータでソートされた要素に順次アクセス可能を売りとするけど、メモリ効率が悪すぎる 他の言語のそれらが大体ハッシュテーブルで実装されているのを見るに連想コンテナはunordered系で十分な気もする
843 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 19:32:54.16 ID:ucySJasT.net] 言葉が足りなくて申し訳ない 俺もリンクリストを使うことは有るけど、大概切迫していてカリカリカスタマイズしたいときに使うものだから 汎用のテンプレートのリンクリストを使ったためしがない 一方向リストなら、なおのこと使わない
844 名前:デフォルトの名無しさん [2018/06/06(水) 20:16:30.41 ID:rNkLMN6z.net] 単方向リストを継承して双方向リストを作ることは無いと思うけど、コンポジットすることはあると思う。 ゼロコストの原則の視点に立つと、単方向リストを実装に流用して、双方向リストを作成するのもあり。
845 名前:デフォルトの名無しさん [2018/06/06(水) 20:30:07.38 ID:sZLPzbQ0.net] STLのコンテナにstd::unique_ptr突っ込むと、カスタムアロケーター使えないよな?
846 名前:デフォルトの名無しさん [2018/06/06(水) 20:32:29.81 ID:sZLPzbQ0.net] >>826 O(1)で10個挿入したら、O(1)*10なんだから、結局O(N)じゃないの?
847 名前:デフォルトの名無しさん [2018/06/06(水) 20:34:19.38 ID:sZLPzbQ0.net] もしかして、std::unique_ptrを突っ込むのがすでに間違いで、std::anyを使えってことなんだろうか。
848 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:03:14.93 ID:9YbuVUhL.net] >>827 std::forward_listとそのイテレータだけでFIFOのQueueを実装できたりするよ イテレータを介したinsert_after()になるから要素を入れるコストはイテレータのコピー分、std::queueよりも高くなると思うけど std::queueはstd::dequeかstd::listを利用するから、std::forward_listで実装した方がメモリ使用量は少ない 単方向リストを使用して独自実装した方が低コストに抑えられると思うけどね まあ、再利用も良し悪しって事だね
849 名前:デフォルトの名無しさん mailto:sage [2018/06/06(水) 21:09:23.87 ID:9YbuVUhL.net] >>830 ごめん書き方が悪かった、1つの要素の挿入にO(1)って意味ね Linked Listは、挿入場所への移動にO(n)かかり、挿入にO(1)かかるから 最後の要素を指し示すイテレータを保持してたらpush_back()みたいなことも出来るよって話ね
850 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 00:34:24.48 ID:l0w/1aK3.net] std::array の empty()メソッドって意味があるのか?と最近思ったので質問させてください arrayは通常 array<int, 固定値>のように宣言してから使うと思うのですが、 empty()メソッドの戻り値は <int, 0> 以外は全てfalseでした。 つまり通常<int,(0より大きい整数)>で宣言して使う場合empty()はfalseしか返ってこない 気がするのですが、このメソッドは意味があるのでしょうか?
851 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 05:56:11.66 ID:nuHHgQUg.net] >>834 テンプレートを使って異なる種類のコンテナに共通に使える処理を書くときに、他のコンテナ達と共通の関数を備えていると都合がいいからかなと思う。
852 名前:デフォルトの名無しさん mailto:sage [2018/06/09(土) 12:31:35.52 ID:pc7gEgF8.net] >>834 そのメンバの存在意味の有無に関わらず、コンテナ要件の1つだからね 他のオブジェクト指向言語でのインターフェイスや抽象クラスを用意していないだけで コンテナとして共通の要件(インターフェイス)が設けられている 例えば、size()、empty()、begin()、end()など 本来、動的なポリモーフィズムをするためにインターフェイスや抽象クラスを設けるけど vtableは高コストだから、ゼロオーバーヘッドの原則に則り使用していないのよ まあ、コンテナ自体STLの1つだからオブジェクト指向的な機能は意識していなかったと思うけどね 余談だが、聞いた所によるとテンプレートって最初マクロで実現しようとしてたらしいね
853 名前:はちみつ餃子 mailto:sage [2018/06/09(土) 12:50:19.63 ID:EdmRUNh7.net] 具体的にコンテナに求められる要求はここでまとめられているので参考になれば。 ja.cppreference.com/w/cpp/concept/Container クラスに求める要求を表現するための機能「コンセプト」は C++ の悲願としてずっと前から温められているのだけれど、 なかなか仕様に入らずに先送りされてるという状況。
854 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:42:05.03 ID:SE5SjeC/.net] ファイルから読み込んだバイト列の先頭部分を参照して、 それがJPEGファイルなのか、PNGファイルなのか、などを判定したいのですが、 どの程度の判定をすればよいものなのでしょうか。 例えばJPEGファイルなら、先頭3バイトを{0xFF, 0xD8, 0xFF}とmemcmp()で十分なのでしょうか。
855 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 16:50:15.52 ID:9mmiVsnm.net] 十分かどうかは時と場合による
856 名前:放置された蟻人間 mailto:sage [2018/06/11(月) 16:51:12.74 ID:7op9QnGW.net] 画像ファイルには、過去にいくつか脆弱性が確認されている。使用において、脆弱性の存在が致命的ならば、きちんとチェックすべきだし、 処理スピードを優先するなら、memcmpで十分。
857 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:03:57.96 ID:SE5SjeC/.net] すいません、十分というのは、ファイルの破損や脆弱性関連は置いておいて、 他の形式の正常なファイルも拾ってしまわないかということです。 JPEGの場合、先頭の3バイトを判定すれば、他の正常なファイルが引っかかることはないのでしょうか。
858 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:06:17.81 ID:3AghcpDH.net] 中身見ないなら、拡張子でもできそうだが
859 名前:デフォルトの名無しさん mailto:sage [2018/06/11(月) 17:12:32.50 ID:oqoWhxjw.net] 3バイトをランダムなデータと比較する場合、1/16777216の確率で誤認する ファイルを最後までパースして、JPEGデータとして読み込めるかどうかチェックするのが確実だが
860 名前:はちみつ餃子 mailto:sage [2018/06/11(月) 17:40:03.88 ID:CXPnR3I1.net] >>841 POSIX には file コマンドがあってファイルの種類を判定できるけど、その実装はヒューリスティックだよ。 参考になるとは思うから読んでみるのもいいんじゃない? ライセンス的に OK ならそのまま流用してもいいかも。 どの程度の精度で判定すべきかは状況によるので総合的に考えてとしか言えない。 例えば、 jpg ではないファイルが多数ある中から jpg を探すというような状況だったら、 先頭をちょっとだけ読んで jpg っぽかったら全部を読んで詳細に判定するというのでもいい。 ほとんどが jpg なのだったら、いちいち詳細に判定するのは速度的に遅くなるけど、それが許容できるのか、 許容できないのであればどの程度まで緩い判定にしていいのか、バランスの問題。
861 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 12:54:07.45 ID:xDeIiE2o.net] なぜ多数から探すかどうかで判定方法が変わるのか
862 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 13:09:55.18 ID:U9ShKAeR.net] >>845 速度とかとのバランスだって書いてあるつもりだけど、わかり難かった?
863 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:15:57.78 ID:BvPEMwcC.net] 明らかに一致しない時は瞬時に判断出来る ヘッダですぐにわかるので jpgではあるんだけど 非対応フォーマットとか一部化けてて表示出来ないとか そういう判断が難しい
864 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 13:34:24.68 ID:BvPEMwcC.net] はちみつはJPGを扱ったことが無いってのがよく分かる
865 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 14:45:14.29 ID:U9ShKAeR.net] >>847 えっ? だからまずは先頭をちょっとだけ読んでみる (この判定だと false positive はあっても false negative はない) という話なんだけど。
866 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 16:23:32.57 ID:LTqXdgcV.net] 元の >>838 の質問に戻れば「どんなファイル群を扱うのかによる」としか 言いようがないんじゃないか? 極端な話、行儀の良いファイルだけなら拡張子で判定しても大丈夫。 (拡張子が間違ってるけど)一般的なファイルばかりなら先頭の何バイトかで判定。 悪意を持って偽装ヘッダや追加情報エリアまで利用してる可能性を気にすれば JPEGの規格に準拠してるファイルでさえ危険、というレベルまであるかも。
867 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 16:44:07.95 ID:U9ShKAeR.net] ある程度は信じて割り切るしかしょうがない。
868 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:43:08.97 ID:RH6dhGDk.net] JFIF以下のJPEG出す機材って監視カメラ以外見たことないなぁ 実運用上はJFIFとEXIF以外は対象外でも良いのかも
869 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 17:56:59.93 .net] ポインタでないなら、継承した関数を呼び出すときに、仮想テーブル参照による動的オーバーヘッドはないのですよね?
870 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 18:20:08.25 ID:U9ShKAeR.net] >>853 Yes それが仮想関数であろうとも、 オブジェクトへのアクセスがポインタ経由でないならば どの関数を呼び出すのかコンパイル時に確定可能なので、 仮想関数テーブルにアクセスする必要はない。 (はずだと思うが言語仕様での保証はないだろうし、 実態がどうなってるか確かめたことはないんで、 誰かやってみてくれんかな。)
871 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:35:01.32 ID:Q/HiJGFf.net] >>849 ファイル判別の一般論じゃなくてjpgの判別ですよ jpgの判別方法を語ればいいんです 文字コードと違ってあやしいとかはなくて APPnの中数バイト見れば簡単にわかるんですよ 文字でJFIFとかExifとか書いてあるわけなんで 偽装が無いならこれで十分 あとは 対応フォーマットであるのか 正しいフォーマットであるのか 実際にデコード出来るのかどうか などを判別する必要があるかどうかでその先が決まる
872 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:43:20.13 ID:RH6dhGDk.net] >>855 baka?
873 名前:デフォルトの名無しさん mailto:sage [2018/06/12(火) 18:57:45.80 .net] >>854 ありがとうございます
874 名前:はちみつ餃子 mailto:sage [2018/06/12(火) 20:19:36.50 ID:U9ShKAeR.net] >>855 何言ってんの? その偽装があるかもしれん (ということも想定に入れるかどうは場合による) という話なんだけど。
875 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 00:32:03.88 ID:21BMiWPP.net] >>841 を読んでの発言? 日本語が読めないの?
876 名前:はちみつ餃子 mailto:sage [2018/06/13(水) 01:55:04.01 ID:3eXA0K0W.net] >>859 なるほど、偽装に騙されるのは脆弱性の内 (で、それはないという前提が提示された) という解釈? 判定を誤りうる (データを作れる) のとセキュリティ的な欠陥をなんとなく区別してたけど、 質問者の感じからすると、確かに偽装で騙されるのは脆弱性の内かな。
877 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 01:56:34.26 ID:l7UBIPff.net] >>855 JPEGの規格書を読んだ事が無いだろう
878 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 07:50:57.05 ID:vaxyQxvX.net] 昔ゲーム機のハックで偽装した画像ファイルを読み込ませるってのがあったような気がする。
879 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 08:14:06.81 ID:7lldK1Da.net] >>838 >>841 を合わせた質問の意図からすると、 JPEG以外で先頭3byteが {0xFF, 0xD8, 0xFF} のファイル形式が存在するか、 普通に出回ってるか? という問題じゃないのかな。
880 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 09:42:34.58 ID:V88S+L9t.net] ゲロトラップとして普通に出回ってないかね?
881 名前:デフォルトの名無しさん [2018/06/13(水) 09:46:09.42 ID:Lf/dU7gs.net] テンポラリオブジェクトについて質問です。 ロベールの本ですが、 「 Hoge Two() { Hoge n(2); return n; } int main() { Hoge hoge(1); hoge = Two(); とした場合、基本的には n のコピーがいったん作られて、それが hoge に 代入される形になります。このコピーこそが、テンポラリオブジェクトになる わけです。 」 と書かれていますが、なぜわざわざ n のコピーを作るのでしょうか? n は Two() 関数を抜けたら消えてしまいますが、これを消さずに、 返した方が効率的な気がします。
882 名前:デフォルトの名無しさん [2018/06/13(水) 10:17:19.41 ID:Lf/dU7gs.net] ・テンポラリオブジェクト = n のコピー ・代入により、 hoge に テンポラリオブジェクトがコピーされる。 これはなんか非常に無駄なことをやっているように思ってしまいます。 hoge に 捨てずにとっておいた n を参照させれば十分のように思います。
883 名前:838 mailto:sage [2018/06/13(水) 10:17:36.81 ID:818/kKId.net] みなさんありがとうございます。 話が難しい方向に進んでしまってすいません。 勉強させていただきます。 元々の疑問は>>863 の言われるとおりで、 他の形式の画像をJPEGだと誤判定してしまわないか、 さらに言うと、先頭が{0xFF, 0xD8, 0xFF}以外のJPEGファイルも存在していて、 JPEGファイルを見逃してしまうことがあるのか、ということでした。
884 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:58:14.75 ID:54SDWBzN.net] >>865-866 そういう時こそ右辺値参照ですよ hoge = std::move(Two()); でもこんな事をしなくても大抵戻り値最適化(RVOやNRVO)でコピーコンストラクタは呼び出されない 明示的にムーブコンストラクタを無効にするとコンパイルエラーが発生するはず Hoge(Hoge&&) = delete;
885 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 14:59:33.86 ID:54SDWBzN.net] そしてこの場合代入演算子をオーバーロードしてやるとそちらが使われる Hoge& operator=(const Hoge& hoge) { std::cout << "assign operator called." << std::endl; return *this; }
886 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 20:08:20.11 ID:VLQaO2hj.net] (最適化をおいとくと)値渡し/値返しってそういうもんじゃん Two()内の変数nは自動変数だからスタックに作られる とっとけないじゃん
887 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:00:21.79 ID:qH/FTczC.net] まあ2回コピーされるのを1回に抑えるための最適化でしょう
888 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:08:53.19 ID:buJbRccy.net] 確実なのは戻り値じゃなくて参照、もしくはポインタにすること
889 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 21:40:28.10 ID:GheUJm4W.net] >>872 それヤバくね?関数を抜けた途端消える存在を参照するとか
890 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:09:20.49 ID:1EWuco5t.net] 呼び出し元から参照を渡してそこに返してもらえってことじゃなくて?
891 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 22:13:11.63 ID:21BMiWPP.net] もちろんそう 昔ながらの方法
892 名前:デフォルトの名無しさん mailto:sage [2018/06/13(水) 23:23:40.79 ID:MDGDBDRC.net] -Wreturn-local-addr みたいなwarningじゃなくて規格でエラーにすれば873みたいな勘違いは無くなるのにな
893 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 10:53:47.52 ID:BKSAN5oR.net] 普段c#使っているのですが、c++/cliでデータベース絡みのdllを作ってて、わからないことがあります。 SqlConnectionやDataSetのDispose()がインテリセンスでは候補に上がるのに、コンパイルで「メンバーではありません」とエラーになります。 スコープを抜けると破棄されるので何もしなくてよいという認識でよいのでしょうか? また、この理屈で、c#の勝手に破棄してくれるusing相当の機能はない、と言うか、必要ないのでしょうか?
894 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 14:30:10.48 ID:Lgo9GPo1.net] >>877 IDisposable使ってる? スコープ抜けてもGCによって回収されるタイミングは保証できない どうしてもすぐにGCしたいなら GC.Collect(); をする。 多分ジェネレーション0だろうから GC.Collect(0); でいいのでは
895 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 15:24:59.55 ID:BKSAN5oR.net] >>878 レスをござます。 作ってるクラスがIDisposableを継承しないとダメってことですか? 作ってるのはインスタンス作らなくてもいいstaticクラスなんですけど。 GCは効果の程を確認できないですが、やってみます。
896 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 15:25:54.47 ID:BKSAN5oR.net] >>879 レスありがとうございます。です。
897 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 16:42:09.02 ID:79UoYXtL.net] >>879 https://qiita.com/haniwo820/items/ba0ab725c25673c20338 こんなのとか staticクラスだとファイナライザーを書けないから内部で他のクラスをnewした場合が問題 それとメンバ変数もstaticでなければならない となると普通はアプリケーションが破棄されるまで残る IDisposableをstaticクラスが継承するとエラーになる というかstaticクラスはインターフェイスを継承できない むしろusingを使えない理由が分からない ufcpp.net/study/csharp/oo_dispose.html こういうのだとstaticクラス風にファイナライザーを走らせられる それかStreamみたいのでClose()したいのならClose()メソッドを書けばいい SqlConnectionやDataSetはいちいちClose()する必要があるのかな?
898 名前:デフォルトの名無しさん mailto:sage [2018/06/14(木) 22:51:20.07 ID:khTKmU6v.net] >>877 ここの記述を信じるなら、全部Yesってことになるのかな。 mag.autumn.org/Content.modf?id=20050506023118
899 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 09:10:59.15 ID:8YDR1CpT.net] >>879 です。 VS2013 c++のCLRコンソールアプリを新規作成したやつです。 include "stdafx.h" using namespace System; using namespace System::Data; using namespace System::Data::SqlClient; int main(array<System::String ^> ^args) { Console::WriteLine(L"Hello World"); String ^constr = "xxxxx"; SqlConnection ^connection = gcnew SqlConnection(constr); connection->Open(); connection->Close(); connection->Dispose(); return 0; } この Disposeでエラーになります。 ここには書いてませんがDataSetも Disposeでエラーになります。 上記コードの場合 Dispose抜きで問題ないのでしょうか? >>882 まさにこれを読みました。c#のusingがc++にはない認識です。 この理由がこの通りならDisposeなしで心配ないのですが。
900 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 10:38:59.49 ID:uIGrLsPa.net] 共同ツール 1 https://seleck.cc/685 https://trello.com/ ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど Trello Chrome拡張機能 elegant ttp://www.kikakulabo.com/service-eft/ trelloのオープンソースあり 共同ツール 2 https://www.google.com/intl/ja_jp/sheets/about/ 共同ツール 3 https://slack.com/intl/ja-jp https://www.dropbox.com/ja/ https://bitbucket.org/ https://ja.atlassian.com/software/sourcetree https://www.sketchapp.com/ ttp://photoshopvip.net/103903 ttps://goodpatch.com/blog/sketch-plugins/ Trello Chrome拡張機能プラグイン集 https://chrome.google.com/webstore/search/trello?_category=extensions Slackプラグイン集 https://slack.com/apps Sketchプラグイン集 https://sketchapp.com/extensions/plugins/ https://supernova.studio/
901 名前:デフォルトの名無しさん mailto:sage [2018/06/15(金) 19:01:40.09 ID:J8URhrRM.net] >>882 によると、自動でDisposeさせたい場合は以下のようにする、 と書いてあるように見える。(手元に環境がないので未確認) SqlConnection connection(constr); connection.Open(); connection.Close();
902 名前:デフォルトの名無しさん mailto:sage [2018/06/16(土) 06:42:53.11 ID:PCTFj+qN.net] >>883 そのコードでconnection->Dispose();を消すだけだとDisposeは呼ばれない。 C++/CLIでDisposeを呼びたい場合「delete connection;」と書く。 C#のusing相当のことをしたい場合は>>885 詳細は↓を参照。 https://loafer.jp/mixi/diary/class.xsp?2007-09-07-23-55
903 名前:デフォルトの名無しさん mailto:sage [2018/06/18(月) 12:02:02.44 ID:P1toAgew.net] Dispose の件で質問してた者です。 自作のIDisposableを継承したクラスを作って確認したところ delete で Disposeが通る事を確認できました。 不慣れで詰まらない質問してしまってすみませんでした。
904 名前:865 [2018/06/20(水) 12:43:56.50 ID:XX+H87IB.net] みなさん、いろいろありがとうございました。 参考にさせていただきます。 ところで、 Cとアセンブリ言語で学ぶ計算機プログラミングの基礎概念 - プログラムはプロセッサ上でどのように実行されるのか 角川 裕次 https://www.amazon.co.jp/dp/4627848315/ この本を読んだ人はいますか? かなり自分にとって理想的な本のようですので、買ってみようと思います。 こういう本を読めば、少しは言語の設計者の気持ちが分かるようになるのではないかと期待します。
905 名前:デフォルトの名無しさん mailto:sage [2018/06/22(金) 23:22:38.51 ID:pTq2TJuj.net] あちらこちらでC++はひどい言語だって叩かれてるけどその割に広く使われている つまりこれはC++を頑張って覚えればその分見返りも大きいということではなかろうか。なにしろ人の嫌がること高いスキルが必要なことはそれだけ報酬も高いはずで
906 名前: mailto:sage [2018/06/23(土) 00:11:02.67 ID:OlLfOCSW.net] C++ はひどい言語だ。これは、多くの平均以下のプログラマーが使ってるために さらに輪をかけてゲロゲロになっていて、どうしようもないゴミが 簡単に生産されるようになってる。正直いって、C を選ぶ理由が C++ プログラマーを 追っぱらうため *だけ* だったとしても、それ自体、C を使う強力
907 名前:ネ理由になりうる。 C++ はトンでもなく悪い設計の元になりうる。どうせこの言語ではいつも STL やら Boost やら、その他ゲロゲロベロベロの「素敵な」ライブラリの機能を使って、 それがあんたのプログラムに「役立つ」んだろうが、以下のことが起きる: - うまく動かないときにもたらされる際限のない苦痛 (あと STL とか、特に Boost が 安定してるとか移植性があるとかいう奴は、どいつもこいつも大ウソつきで、 もはや笑えるレベルを超えている) - 非効率な抽象プログラミングモデルで、2年たった後にこれらが実はそんなに 効率的じゃなかったことに気づくケース。でもそのときにはすでに全部の コードがその素晴らしいオブジェクトモデルに依存していて、直すためには アプリ全体を書き直さなきゃなんない。 言いかえれば、唯一まともで、効率がよくて、システムレベルで使えて、移植性がある C++ ってのは、基本的に C で使える機能だけに限ったときなんだ。そして C だけに 限定するってことは、他の人がそれをめちゃくちゃにしないってことで、 ついでに沢山のプログラマが実際に低水準の問題を理解することができて、アホらしい 「オブジェクト・モデル」のたわごとを持ちこまないってことだ。 [] [ここ壊れてます]
908 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 10:31:52.34 ID:UiVIxiJp.net] 抽象化とコード(バイナリ)の質は相反するものだから
909 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 11:45:24.39 ID:NcXYPjUn.net] alignas(32)とかalignas(64)とかつけなくても大体アライメント揃ってる気がするんですけどつけた方がいいんですか?
910 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 12:58:59.14 ID:g5s8p4AT.net] リーナスのそれがいっちばん有名なC++批判よね
911 名前: mailto:sage [2018/06/23(土) 13:53:36.35 ID:OlLfOCSW.net] >>893 linus は昔から C++ を批判していたが、git 開発に関する 2009 年のこれが、最も効果的な批判になっていますね これを読むと C++er は一瞬自分がわからなくなりゲシュタルト崩壊に陥りますね、もう c++11 over を追いかける気力も失せてしまいました…
912 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:43:13.01 ID:DOoRmJ6H.net] 抽象的な思考ができる人とそうでない人が居るというだけだな >>890 もSTLやboostの使い方が理解できない、良い抽象モデルが作れない人が愚痴ってるだけにしか読めんが
913 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 14:54:08.05 ID:UiVIxiJp.net] 抽象化が目的になって パフォーマンスとか使用リソースとか工数を軽視する人が実務経験の浅い人に多い ってのが問題であって 言語自体には罪はない
914 名前: mailto:sage [2018/06/23(土) 15:32:24.63 ID:OlLfOCSW.net] >>895 >良い抽象モデル が役に立つとは限らないのでは? 抽象化を目的とするあまりに YAGNI を忘れてしまうのでは、これは重大な思考的欠陥なのでは? あれほどもてはやされていた GoF は、すくなくとも C++界では、もうみるかげもなく凋落の一途をたどっているのは、どうみるのでしょうか?
915 名前:デフォルトの名無しさん [2018/06/23(土) 16:46:26.83 ID:8e5n022B.net] デザインパターンって廃れたんですか? だとすると、なぜ、デザインパターンは流行り、そして廃れたのでしょうか? 一度は流行ったということは確かに役に立つものだったのではないでしょうか? 一度は役に立つと認められたものがなぜ、否定されたのでしょうか?
916 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 16:51:17.93 ID:7hlQnbj9.net] 日本人は基本すっ飛ばして銀の弾丸欲しがるからな
917 名前:はちみつ餃子 mailto:sage [2018/06/23(土) 17:00:49.94 ID:/E9OfcV+.net] >>898 デザインパターンってのは典型的なパターン (に名前を付けたもの) ってだけだよ。 基礎として押さえておくと便利だし、価値が失われたわけではないけど、 何もかもが既存のパターンに当てはまるわけではないという当たり前の話。
918 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:15:09.64 ID:DOoRmJ6H.net] >>897 抽象化とYAGNIは関係ありません こういう意見が出てくるあたりが良いモデリングを理解してない証拠ですね
919 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:29:02.45 ID:ul2D0Jgq.net] >>898 別に廃れたわけではなく、使われるものは当たり前に使われてて取り立てて言われなくなっただけ。
920 名前: mailto:sage [2018/06/23(土) 17:30:40.89 ID:OlLfOCSW.net] >>901 たとえば、iostream をどう思う?これは良い抽象化の例ですか?
921 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:31:54.13 ID:wjw7dXXk.net] Visual C++6.0です。 Windows7でやってます。 ツールバーを作ると、ボタンを押すとペコってへこんで、また押すとまた戻りますが、見づらいので 押したときと戻ったときとで色を付けたいのですが、どこかにサンプルはないでしょうか また、私は未だに6.0でやっていてこれで十分にプログラムできるので特にこれで不満はないのですが もしバージョンを上げれば出来るのであればバージョンアップも考えたいと思っています 最新のバージョンで出来るのなら、そのサンプルも教えて頂けるとありがたいです
922 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:40:24.88 ID:LiutUffZ.net] >>904 OwnerDraw
923 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 17:59:38.49 ID:wjw7dXXk.net] >>905 CToolbarには、DrawItemがないようなのですが ステータスバーにはあります
924 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:04:15.08 ID:LiutUffZ.net] ナンシークラッツ本を探した方が良いかな
925 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 18:14:04.63 ID:wjw7dXXk.net] ツールバーに色を付けることもできないとか。ちょっと貧弱ですよね 最新のバージョンのVC+でも出来ないのかな。結構そういう要望はあると思うけど
926 名前:デフォルトの名無しさん [2018/06/23(土) 19:24:24.28 ID:8e5n022B.net] 2分探索木を実装したC++プログラムを読んでいますが、分からないところに出くわしました。 ノードは以下のクラスです: template <typename T> class BinNode { private: T data; BinNode<T> *left, *right; BinNode(T d, BinNode<T> *l = NULL, BinNode<T> *r = NULL); friend class BinarySearchTree; }; 2分探索木のクラス BinarySearchTree 内のメンバ関数 insert の引数としてノードを渡すのですが、 なぜ、 BinNode<int>* tree ではなく BinNode<int>*& tree となっているのかが分かりません。本の説明によると、木構造の変形を可能にするためにそうしているとのことです。 bool BinarySearchTree::insert(int data, BinNode<int>*& tree) { … }
927 名前:デフォルトの名無しさん [2018/06/23(土) 19:25:19.09 ID:8e5n022B.net] >>899 >>900 >>902 ありがとうございました。 一時は、もてはやされすぎたということですね。
928 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:28:47.13 ID:8e5n022B.net] insert 内に、 if (tree == NULL) {
929 名前:デフォルトの名無しさん [2018/06/23(土) 19:29:33.57 ID:8e5n022B.net] insert 内に、 if (tree == NULL) { tree = new BinNode<int>(data); … } というコードがありましたが、これのことでしょうか?
930 名前:デフォルトの名無しさん [2018/06/23(土) 19:30:15.04 ID:8e5n022B.net] >>912 あ、そのようですね。
931 名前:放置された蟻人間 mailto:sage [2018/06/23(土) 19:30:26.05 ID:QXtVRpnb.net] >>909 void f(int *a) { static int s_i = 0; a = &s_i; } int main(void) { int i = 3; int *p = &i; f(p); printf("%d\n", *p); return 0; }
932 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 19:45:59.33 ID:8e5n022B.net] >>914 ありがとうございました。 3のままですね。
933 名前: mailto:sage [2018/06/23(土) 19:54:24.54 ID:OlLfOCSW.net] >>909 これは C の課題ですね。 適当な二分木ないし二分探索木に対して、ノード(節)を追加したり削除したりする関数を書く場合、 C ならば add_node(node **root, ...) と書きます。@ これを C++ ならば add_node(node *&root, ...) と書くこともあります。node *&root は「ポインタ変数の参照」です。A @とAとではプログラムの表現もかわります。 これは一度、白紙の状態から自分の手で書くのが、理解するのに一番です。お試しあれ。
934 名前:デフォルトの名無しさん [2018/06/23(土) 21:09:04.41 ID:nmsTY6vF.net] 0,115200 1,38400 2,19200 3,9600 こういう関係がある時に配列を作れば1から38400はダイレクトに求められるが 検索を使わずに38400からダイレクトに1を求める方法はないだろうか?
935 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:22:36.64 ID:b0QIE6qX.net] 115200個の配列
936 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:26:12.81 ID:EyvIrgyz.net] A/9600 を添え字にして13個の配列で逆引き作る?
937 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:29:09.89 ID:b0QIE6qX.net] 9600の倍数であることがわかってるなら割ればテーブルは減る でも4個なら素直に検索した方が速い
938 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 21:41:29.91 ID:EyvIrgyz.net] 検索については同意 元質問は検索使うなって条件なので、まぁ 数値からRS232Cのボーレート設定を想定しちゃうけど、 それなら検索を嫌うようなもんでもないし… な…
939 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:02:58.56 ID:ZZklpiyn.net] a1 : b1 a2 : b2 a から、b への辞書と、 b から、a への辞書の、両方を作る
940 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:07:27.68 ID:V32XRqjB.net] >>920 は>>919 を見る前に書いた たまたま同じ発想になっただけ 浮動小数数に直すってのもある LSB側から数えて1になるビット位置を返す命令があるのでそれとシフトを使う 115200は(900, 7) 38400は(300, 7) 19200は(300, 6) 9600は(300, 5) RS-232Cだと300x2^nと900x2^nしか普通は使わないから オーディオのサンプリング周波数にも同じような方法が使える
941 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:09:33.77 ID:5Wb6fwhK.net] n = (x/9600 > 4) ? 0 : 3 - log2f(x/9600); 入力を検証する手間を考えたらテーブル逆引きと大差ないけど
942 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:19:10.79 ID:V32XRqjB.net] >>924 メモリアクセス速度を考えても>>918 の方が速くて簡単 >>923 なんかおかしかった 115200は(225, 9) 38400は(75, 9) 19200は(75, 8) 9600は(75, 7) ビットスキャン命令とシフトとテーブル 変換しなきゃならないデータが多量にあって パフォーマンスが非常に重要ならこれを使うかな
943 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 22:21:03.20 ID:V32XRqjB.net] 普通はこんなものはリニア検索でいい
944 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:23:08.99 ID:ZZklpiyn.net] 普通、最適化でも、8個までは線形(全)探索・if 文 それ以上で、ジャンプテーブル・switch-case
945 名前:デフォルトの名無しさん mailto:sage [2018/06/23(土) 23:47:49.24 ID:UiVIxiJp.net] >>927 ただのテーブル逆変換だぞ なんでジャンプテーブル? なんでswitch case? リニア検索で問題なら2分検索 それでも遅ければハッシュその他のテーブル 簡単な演算を併用出来るものはする じゃないか普通
946 名前:927 mailto:sage [2018/06/24(日) 00:50:44.41 ID:chBT6m1a.net] コンパイラの最適化について書いた if 文を8個以上書くと、ジャンプテーブルに変換されるってこと
947 名前:デフォルトの名無しさん [2018/06/24(日) 08:15:02.59 ID:cbD8du/l.net] >>916 ありがとうございました。
948 名前:デフォルトの名無しさん [2018/06/24(日) 10:44:32.50 ID:8StK2ZXu.net] class clsAにconst member 変数を登録したいのだけどうまくいかない。 クラスコンストラクタでconst char *mes[] を{"abc","def"}のように 初期化するにはどうやるの?
949 名前:デフォルトの名無しさん [2018/06/24(日) 10:57:11.49 ID:8StK2ZXu.net] //そもそもC++は文字列の配列を扱うことができるのか? constexpr auto str1 = {"abc", "def"}; これがエラーするんだがなんでなの?
950 名前:デフォルトの名無しさん [2018/06/24(日) 11:00:18.70 ID:8StK2ZXu.net] constexpr string[] str1 = {"abc", "def"}; コンパイルエラー constexpr string str1[] = {"abc", "def"}; コンパイルエラー クッ、、、どうしてもうごかない。
951 名前:デフォルトの名無しさん [2018/06/24(日) 11:15:54.16 ID:8StK2ZXu.net] string str1 = "abc"; //OK vector<int> dat(100,3); //ok vector<string> str2("aaa",4); //error こういうのもうごかない。
952 名前:デフォルトの名無しさん [2018/06/24(日) 11:23:27.77 ID:8StK2ZXu.net] 自分としてはストリングを多用するのでストリング配列が使えないと厳しい。 検索をしても例がなかなか出てこないので、Effectiv Modern C++という本 をamazonで買ってみたんだが、届いたので今見ているところだが、ここでも string配列の記述を巧みに避けている。皆目出てこない。 string配列の扱い方ってどうやるの?
953 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 11:52:20.14 ID:/GbiIoLW.net] 文字配列って良く分からないけど、Javaみたいに一文字だったりして? {"a","b","c","d","e","f","g"}みたいな?
954 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 12:32:00.67 ID:StWe8jKY.net] >>932 定数式じゃないから。 >>933 string は constexpr に非対応のはず。 現時点では。 new が constexpr 的に扱いが難しいので、 内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 ただ、制限を緩和する提案は出ているので将来的にはなんとかなるかもしれない。 >>934 string に一文字づつ入れたいってこと? std::vector<std::string> str2 = {"a", "a", "a"}; でいけるよ。
955 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:35:35.92 ID:QFRKHUIu.net] ["abc","def"];
956 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 12:36:44.62 ID:p8F2e5jx.net] >>934 >vector<string> str2("aaa",4); //error 「vector<string> str2(4,"aaa");」の誤りじゃね?
957 名前:デフォルトの名無しさん [2018/06/24(日) 13:13:44.88 ID:8StK2ZXu.net] string str1 = "abc"; //OK vector<int> dat(100,3); //ok //vector<string> str2("aaa",4); //error // string str1[] = {"abc", "def"}; //error // const std::vector<std::string> str3 = {"abc", "def"}; //error // constexpr char *mes1 = "abc"; //error const char *mes1 = "abc"; //ok // vector<char *> ch(10,mes1);//error vector<string> ch(10,str1);//ok ここまで確認できた。ただしコンパイルが通っただけだから、動くかどうかは不明。
958 名前:デフォルトの名無しさん [2018/06/24(日) 13:37:02.58 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; } //clsA::clsA(char *name[]) : m_name(["mike","tetu"]){};//だめ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ
959 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:38:12.37 ID:zWtoG2OO.net] サイズ不明だし無理だろ
960 名前:デフォルトの名無しさん [2018/06/24(日) 13:41:38.91 ID:8StK2ZXu.net] >内部的にヒープを使うようなクラスはほとんど constexpr 非対応だと思う。 constexpr char *mes1 = "abc"; //error これもだめですね。ヒープは必要ないとおもいますが、、、
961 名前:デフォルトの名無しさん [2018/06/24(日) 13:42:37.94 ID:8StK2ZXu.net] >>サイズ不明だし無理だろ コンストラクトする時点でサイズは確定していますが、、、
962 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 13:45:06.66 ID:p8F2e5jx.net] お前はまずエラーメッセージをちゃんと読め。
963 名前:デフォルトの名無しさん [2018/06/24(日) 14:12:06.73 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[]; clsA(char *name[]); }; //clsA::clsA(char *name[]) : m_name(["Bike","tetu"]){}; /*だめだが可能性がありそう。 Invalidはでていない。 --error message-- #29 expected an expression */ //clsA::clsA(char *name[]) : m_name("mike","tetu"){};//これもだめ invalid /* Multiple markers at this line - #2125 invalid initializer for array member "clsA::m_name" - #18 expected a ")" */ //clsA::clsA(char *name[]) : m_name({"mike","tetu"}){};//これもだめ /* * Multiple markers at this line 以下省略 */
964 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:20:47.48 ID:p8F2e5jx.net] すまん、そっちはエラーメッセージじゃ分からん。 string str1[] = {"abc", "def"}; //error とか constexpr char *mes1 = "abc"; //error とかの話。
965 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 14:38:12.08 ID:iIKq/Q4Y.net] string関数の第二引数には何の意味がありますか? 試しに文字列を2つ引数に入れても、第一引数しか出力しないみたいですが ↓です string readFile(const char *filename) { ifstream ifs(filename); return string(istreambuf_iterator<char>(ifs), istreambuf_iterator<char>()); } https://www.miraclelinux.com/tech-blog/1n4hgx
966 名前:デフォルトの名無しさん [2018/06/24(日) 14:46:22.41 ID:iIKq/Q4Y.net] すみません自己解決しました>>948
967 名前:デフォルトの名無しさん [2018/06/24(日) 14:58:47.68 ID:8StK2ZXu.net] >>947 string str2[] = {"abc", "def"}; //okでした。 constexpr 文字列は諦めました。多分相当難しい。 でおもうのだが、結局は普通の人は誰もconst char *配列の初期化について解らない。 というか、ファーム開発にC++を使う場合には文字列の配列はかなり重要でしかも Ramが少ないのでこれをRom配置できないと致命的だ。ということでファーム開発 ではconst char *mes[] = {"zzz","aaa"}; こういう処理が必要になる。 しかしファーム開発をやらない人にとってはconstである理由はないので、この重要さ には無関心なのだろう。 もちろん分かる人もいるが教えるのは恐ろしくめんどくさいか、非常に苦労して マスターしたので簡単には教えたくない。 それほどC++において const char *配列 のクラスでの初期化は難しいのだろうと思う。 いやそもそもできないのかもしれないが、、、(そんなはずはないだろう)。しかし できないとすると、クラス内で初期化するのは諦めてCで初期化してるのだろうか? 多くのファーム開発者は諦めてCで初期化してるのだろうな。
968 名前:デフォルトの名無しさん [2018/06/24(日) 15:43:14.02 ID:zWtoG2OO.net] 配列の初期化の時には()いらないぞ{}だけ >>941 の最後の行の()はずせば通るけどたぶん環境依存じゃないかな 意図してる動作がname使ってm_nameの初期化ならめんどくさそう
969 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:08.57 ID:zWtoG2OO.net] あれコンパイル通るけど未指定だと動的確保してplacement newでもしないとだめか
970 名前:なこれ [] [ここ壊れてます]
971 名前:デフォルトの名無しさん [2018/06/24(日) 16:11:30.09 ID:8StK2ZXu.net] class clsA { private: const char *m_name; clsA(); }; clsA::clsA() : m_name("Bike"){}; これはOK、しかし配列はできない。
972 名前:sage [2018/06/24(日) 16:24:15.11 ID:zWtoG2OO.net] class a { public: const char* name[]; ここで非標準だなんだの警告でる a():name{ "aaa","bbb" } { } }; vsだとこれでコンパイルは通るしぱっと見正常だけどそのまま使うとたぶんどっかでメモリ壊すんじゃないかな 配列の数指定しといたほうが無難な気がするけど
973 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 16:39:11.76 ID:Q9QWMZ9P.net] C++にはサイズ不定の配列は無いからサイズ指定しないと無理だよ コンストラクト時にわかってるじゃないか、って話もあったけど 中身の配列数が変わったらそれは違う型になる つまりテンプレートが必要になる 配列の要素数を推定させるのは、C++17で入ったクラステンプレートの引数推定を使えば一応出来るけど
974 名前:デフォルトの名無しさん [2018/06/24(日) 17:24:18.36 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: const char *m_name[2]; clsA():m_name{"aaa","bbbb"}{} }; これでもエラーします。
975 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 17:42:22.01 ID:zWtoG2OO.net] なんてエラーでてるの
976 名前:デフォルトの名無しさん [2018/06/24(日) 17:54:03.23 ID:8StK2ZXu.net] //C++はchar *[]のコンストラクタでの初期化はできるのか? class clsA { private: char *m_name[10]; clsA(); void init(); }; clsA::clsA() : m_name{"Bike","bbb"}{}; //エラーする。 /* Multiple markers at this line - #66 expected a ";" - #171 expected a declaration - #126 expected a "(" - #176-D expression has no effect */
977 名前:デフォルトの名無しさん [2018/06/24(日) 18:01:33.16 ID:8StK2ZXu.net] それconst つけるの忘れてたが、つけた場合もエラー表示は同じだね。
978 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 18:04:27.08 ID:p8F2e5jx.net] あなたの使っているコンパイラは、おそらくC++11未対応です。 constexprはC++11の機能なので、そのコンバイラでは使えないか、 使えたとしても標準とは異なる動作をする可能性があります。
979 名前:デフォルトの名無しさん [2018/06/24(日) 18:18:27.13 ID:8StK2ZXu.net] >>960 あっ、そうなの? ごめん、それはうっかりしていた。今年の2月にインストール した最近のコンパイラなので当然C++11以上だとおもっていた。 一寸調べてみる。
980 名前:はちみつ餃子 mailto:sage [2018/06/24(日) 18:23:43.69 ID:StWe8jKY.net] >>961 対応していてもデフォルトでは C++11 の挙動にならない (オプション指定すると対応する) ようなものも有りうる。
981 名前:デフォルトの名無しさん [2018/06/24(日) 18:36:49.63 ID:8StK2ZXu.net] >>962 おお、ありがとう。全然気が付かなかった。これは一つ前のバージョンでプロパティを みてもC11++がない。 最新のバージョンはC++14をサポートしてるみたいなのでUPDATEしてみる。
982 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 19:43:42.27 ID:G0tizpK6.net] 勘違いしてたらすまないけど↓みたいな事がしたいの? https://ideone.com/Zm8LO5
983 名前:デフォルトの名無しさん [2018/06/24(日) 22:24:29.32 ID:8StK2ZXu.net] >>964 凄い!!。まさにそれです。こちらでもコンパイル通りました。 難しいなー。 もうコンストラクタでの初期化はすっかり諦めて代替案を作っていたところだけ ど、それを丁重に拝借いたします。ありがとう。
984 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 22:30:41.96 ID:EmcxYm71.net] 借りるってことは返すんだよね
985 名前:デフォルトの名無しさん [2018/06/24(日) 23:08:30.10 ID:8StK2ZXu.net] >>966 もらい受けたいところだけども、意味が理解できるかどうか? あなたは意味が わかりますか? clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; (const char* const []){"mike","tetu",nullptr} これは何を意味してるの?
986 名前:デフォルトの名無しさん mailto:sage [2018/06/24(日) 23:09:16.86 ID:chBT6m1a.net] 「c++ constexpr 文字列」で検索すれば?
987 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 00:15:08.68 ID:RQXh1ivn.net] void func1(int a) { printf("%d\n", a); } void func2(int a, int b) { printf("%d,%d\n", a, b);} template<?????> class Test { public: void method(void) { (templateの引数で func1(int a) か func2(int a, in b)を呼ぶ) } private: int a; in b; }; のような事をしたいのですが、引数が1つか2つの関数をそれぞれ名前でtemplate引数にして 記述したいのですが、うまくいきません。どうすれば良いでしょうか? 例えば template < void F(int)> とすると Test<func1>() でいけるのですが、func2の場合が 表現出来ません。
988 名前:デフォルトの名無しさん [2018/06/25(月) 01:49:02.18 ID:Gwlgg6/B.net] class class1 { private: int m_a; public: class1(int a) : m_a(a) {} class1(class1 const& rhs) { m_a = rhs.m_a; } void method(void) { printf("%d\n", m_a); } }; class class2 { private: int m_a; int m_b; public: class2(int a, int b) : m_a(a), m_b(b) {} class2(class2 const& rhs) { m_a = rhs.m_a; m_b = rhs.m_b; } void method(void) { printf("%d,%d\n", m_a, m_b); } }; template<class _Myclass> class Test { private: _Myclass m_myClass; public: Test(_Myclass myClass) : m_myClass(myClass) {} void method(void) { m_myClass.method(); } }; int main() { Test<class1> x(class1(1)); Test<class2> y(class2(2, 3)); x.method(); y.method(); } 意味があるのか分からないがとりあえずコレで もしくはTest::methodを可変引数にしてprintfにその可変引数を渡すしかない まずなにがやりたいのか分からないからテキトーに書いてやったぞ
989 名前:デフォルトの名無しさん [2018/06/25(月) 03:37:15.06 ID:3f3crQyZ.net] const char *[]の初期化だけれども clsA(const char* const name[]) : m_name(name) {}; これはまあ何となく意味が解る。m_name <−−nameってことだよね。 clsA() : clsA((const char* const []){"mike","tetu",nullptr}) {}; しかしこれはどういう意味だろうか? clsA <−− (const char* const []){"mike","tetu",nullptr} ラムダ関数?かとおもったが、前半はcastだろうか? m_name <−−name clsA <−− {"mike","tetu",nullptr} この二つがセットで意味を持つんだろうな。 const char *[] の初期化が3つくらいあったらどうするんだろうね。 まるでクイズを解いてるみたいだよ。 いくらなんでも言語仕様としてやはり不味いよね。
990 名前:デフォルトの名無しさん [2018/06/25(月) 04:00:03.54 ID:3f3crQyZ.net] わかった。コンストラクタに引数がないディフォールトでは clsA <−− {"mike","tetu",nullptr} そしてm_nameは一つしかないから、m_name= {"mike","tetu",nullptr}となる。 引数を持つ場合は clsA(const char* const name[]) : m_name(name) {}; m_name <-- name; になる。 じゃあconstのメンバ変数が二つある場合はどうするんだろうか? clsA:clsA( {"xxx"}),clsA({"yyy"}) {} とは書けない。変数を明示しないといけないから、、、 clsA:m_name1( {"xxx","abc"}), m_name2({"yyy","def"}){} 必然的にとなる。 じゃあ最初から clsA:m_name1( {"xxx","abc"}){} こう書いていた方が分かりやすいし、これが成り立たないと論理破綻する。
991 名前:デフォルトの名無しさん [2018/06/25(月) 04:04:26.64 ID:3f3crQyZ.net] class clsA{ private: const char* const* m_name1; const char* const* m_name2; public: clsA() : m_name1((const char* const []){"mike","tetu",nullptr}), m_name2((const char* const []){"mike2","tetu2",nullptr}) {}; clsA(const char* const name[]) : m_name1(name) {}; void put(){ for(const char* const * p=m_name1; *p!=nullptr ;++p ) { printf(*p); } }; virtual ~clsA() {}; }; 実験したみたが、コンパイルは通った。
992 名前:デフォルトの名無しさん mailto:sage [2018/06/25(月) 05:56:57.36 ID:MAmRCfEQ.net] >>964 のソースをclangでビルドしたら最初の結果が文字化けする。 環境依存で動作が変わるようなソースコードを参考にしてはいけない。
993 名前:デフォルトの名無しさん [2018/06/26(火) 09:01:37.25 ID:6tjGTw22.net] >>969 template<class ... args> class clsTest { public: void func1(int dt) {} void func1(int dt1, int dt2) {} void func2(args...) { } }; int main() { clsTest<int, int, int> a; clsTest<int, int, char *> b; a.func2(2, 3, 4); b.func2(5, 6, (char *)"test"); a.func1(2); a.func1(2, 3); return 0; }
994 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 10:37:33.14 ID:dRU/pr3A.net] c++です LNK2005 DllMain は既に vstplugmain.obj で定義されています 1>vstplugmain.obj : error LNK2005: DllMain は既に vstplugmain.obj で定義されています。 左と右が違うファイルだったら順序を入れ替えるだけでよかったのですが 両方vstplugmain.objで困ってます どのようにすれば解決できるでしょうか?
995 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:09:44.92 ID:9ql/FcZD.net] 自動でリンクしてるライブラリと明示的にリンカに渡
996 名前:してるパス違いの同じライブラリで衝突してんんじゃないの? 知らんけど [] [ここ壊れてます]
997 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 11:44:03.03 ID:dRU/pr3A.net] 検索してみたのですが vstplugmain.objは一つしか無いようです
998 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 12:06:53.39 ID:dRU/pr3A.net] もしかしたら関係あるのかもしれないので参考までに記述します 以下のようなエラーも同時に発生しています vstplugmain.obj : error LNK2001: 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))" (?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 LNK2001 外部シンボル ""class AudioEffect * __cdecl createEffectInstance(__int64 (__cdecl*)(struct AEffect *,int,int,__int64,void *,float))" (?createEffectInstance@@YAPEAVAudioEffect@@P6A_JPEAUAEffect@@HH_JPEAXM@Z@Z)" は未解決です。 Dll6 source\repos\Dll6\Dll6\vstplugmain.obj 1 よろしくおねがいします
999 名前:デフォルトの名無しさん mailto:sage [2018/06/28(木) 17:14:50.29 ID:hh115pnF.net] エラーログの上から順番に解決するようにしたらいい
1000 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 09:50:56.72 ID:8ZX2E7EU.net] 無事解決しました ありがとうございました
1001 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 10:22:32.55 ID:h8zo0ENm.net] >>981 そういう場合は、経緯を説明するのが、考えようとしてくれた人への礼儀。
1002 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:16.69 ID:OiiVA+37.net] ロベールのC++の本の typedef の説明ですが、よく分かりません。 typedef int* IntPtr; int n = 0; const IntPtr p = &n; IntPtr const q = &n; はどちらも、 int* const p; int* const q; の意味になるそうです。 分からないのは、ロベールさんの解釈の部分です。 const int* p; → 「const の右側にあるものが const になる」 int* const q; → 「const の右側にあるものが const になる」 と解釈すればよいと説明してます。 この解釈が const IntPtr IntPtr const の場合にも通用するというのです。
1003 名前:デフォルトの名無しさん [2018/06/29(金) 10:53:56.86 ID:OiiVA+37.net] const IntPtr = const int* IntPtr const = int* const ではないのでしょうか?
1004 名前:デフォルトの名無しさん [2018/06/29(金) 10:55:12.72 ID:OiiVA+37.net] const IntPtr p = &n; IntPtr const q = &n; ↑「const の右にあるのは p や q なので、 p や q が const になるのです。」 と説明していますが、これが意味不明です。
1005 名前:デフォルトの名無しさん [2018/06/29(金) 10:56:58.22 ID:OiiVA+37.net] >>985 の論法を↓に適用すれば、 const の右にあるのは p や q なので、 p や q が const になるのです。 となってしまいますが、 p は const ではないですよね。 q は const ですが。 const int* p; int* const q;
1006 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 11:34:56.01 ID:rwm1MJ+D.net] >>983 マクロで IntPtr を int * と定義した場合は >>984 のように展開されるけど typedef はマクロじゃないので int * 型のシノニムとして IntPtr 型を作る const int と int const もどちらも const の int であるのと同じように int を IntPtr 型に置き換えて考えれば どちらも int * const と同じ意味になると思うよ
1007 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:00:29.81 ID:nFp4wdEK.net] i.csvには1行に名前と整数値で点数3つ書かれているのが10行あり、読み込んで点数の和を加えて表示しようとしましたが和が出てきません。また¥nを打っているのに改行されないです。理由を教えてください。配列にしたのはこの後にも操作をするためです。 #include <stdio.h> #include <stdlib.h> int main(void) { const char ifname[] ="i.csv"; int a,b,c; char name[30][100]; int sum[30]; int i; FILE *ifp; ifp=fopen(ifname,"r"); /*読み込み込みモードでopen*/ if(ifp==NULL){ printf("ファイルが開けない"); exit(1); } for(i=0;i<=29;i++){ if(fscanf(ifp,"%s%d%d%d",name[i],&a,&b,&c)==EOF) break; else sum[i]=a+b+c; printf("%s %d %d %d %d\n",name[i],a,b,c,sum[i]); } fclose(ifp); }
1008 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:06:09.83 ID:nFp4wdEK.net] 10行ではなく30行でした、すみません
1009 名前:デフォルトの名無しさん [2018/06/29(金) 12:10:17.92 ID:OiiVA+37.net] >>987 ありがとうございました。
1010 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 12:40:26.79 ID:nFp4wdEK.net] 988ですが自力で解決出来たので大丈夫です
1011 名前:デフォルトの名無しさん [2018/06/29(金) 14:45:38.42 ID:+YHimQiw.net] Windows10で、デスクトップのアイコンと壁紙の間のレイヤーに描画したいです。 どのように設定すればいいでしょうか? VisualStudio2017/C++
1012 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:50:24.25 ID:+YHimQiw.net] 何がしたいかというと、カレンダーを表示させたいです。
1013 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 14:52:35.06 ID:+YHimQiw.net] 小出しですみません。カレンダー機能はMFCで作成済みです。
1014 名前:デフォルトの名無しさん [2018/06/29(金) 22:49:34.96 ID:DjTQOr6S.net] 無理でしょうか?
1015 名前:デフォルトの名無しさん mailto:sage [2018/06/29(金) 23:03:37.60 ID:DjTQOr6S.net] C#ですが、方法が見つかったので自力でやってみます。 https://www.codeproject.com/Articles/856020/Draw-Behind-Desktop-Icons-in-Windows-plus
1016 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:10.80 ID:UA/DrxK6.net] t
1017 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:30.62 ID:UA/DrxK6.net] v
1018 名前:デフォルトの名無しさん mailto:sage [2018/07/01(日) 01:14:47.85 ID:UA/DrxK6.net] g
1019 名前:小倉優子 mailto:sage [2018/07/01(日) 01:15:06.26 ID:UA/DrxK6.net] ∧,,,∧ ( ・∀・) 1000ならジュースでも飲むか ( ) し─J
1020 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 238日 8時間 41分 31秒
1021 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています