[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 05/16 09:46 / Filesize : 287 KB / Number-of Response : 1022
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.102【環境依存OK】



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
コードすら貼らないオツムの足りなさじゃ諦めろ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<287KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef