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


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

C++相談室 part56



1 名前:デフォルトの名無しさん [2007/07/26(木) 00:33:07 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

テンプレその他 >>2-15 付近参照

前スレ
class C++相談室lt;part56gt;
pc11.2ch.net/test/read.cgi/tech/1170343752/l50



552 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 00:58:09 ]
メンバ関数ポインタから整数型へのキャストができた試しはないけど、
どうもそれを禁止している条項が規格を洗っても見つからない。
誰か、どこにあるか知ってる人いますか?

553 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:10:26 ]
肯定的な形でreinterpret_castの

554 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 01:55:41 ]
ポインタは同じサイズの整数型へとキャストできるけど、結果は処理系依存、ってやつのことですよね?
処理系依存だから禁止するのも処理系次第、ってことでいいんですかね。

555 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:02:42 ]
僕の肛門からも悪魔が出そうです><

556 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:03:29 ]
ポインタを同じサイズの整数型にキャストしたときは、それを元のポインタに戻せるはずじゃ?

A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value;
mappings between pointers and integers are otherwise implementation-defined.

557 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:04:32 ]
いや、そもそもキャスト自体がコンパイル通らない。
VC++ でも g++ でも。

558 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:08:24 ]
もちろん、普通のポインタならキャストは通る。
でも、メンバポインタだと通らない。
警告じゃなくて、エラーになる。

559 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:16:34 ]
メンバポインタは

560 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:20:11 ]
>>558
だったらメンバ関数のキャストの仕方間違ってるだけだろ



561 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:21:32 ]
boostとかで、
namespace xxx_detail{ ふがふが }
ってのを見掛けるんですが、
これは何か意味あるんですか?
ADLの効果抑止とか?

無名namespace( namespace { げふげふ } )とかじゃダメなの?

562 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 02:26:30 ]
(C++というプライドに賭けた)保守性を考慮した結果。
彼らがあくまでC++プログラマという事を忘れてはいけない。

563 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 03:40:05 ]
>>561
ヘッダで宣言するコンポーネントに無名 namespace の名前を使ったら、
コンパイル単位ごとに個別の宣言になっちゃうから、 ODR 違反になるだろ。

564 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 07:42:42 ]
>>552
5.2.10 p4 の以下の記述がメンバへのポインタから整数型への変換を許しているように読める。
"A pointer can be explicitly converted to any integral type large enough to hold it."

でも 3.9.2 p3 に以下の記述がある。
"Except for pointers to static members, text referring to “pointers” does not apply to pointers to members."

"A pointer" も同様に、メンバへのポインタは含まないってことじゃない?

565 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:43:59 ]
C/C++室でも出てた話題だけど、メンバポインタはvoid*には変換できないが、メンバポインタへのポインタならvoid*に変換できると誰かが言っていた。
[void*]を[整数型]として考える

566 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 10:56:38 ]
>>564
それだ! 凄いわ。ありがとう。

567 名前:デフォルトの名無しさん mailto:sage [2007/09/10(月) 11:03:16 ]
人権擁護委員会が在日を擁護する時
ttp://www.kajisoku-f-2.com/dd/img2-03/img625_j01.jpg
ttp://www.kajisoku-f-2.com/dd/img2-03/img626_j02.jpg

568 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 11:27:29 ]
質問です。hogeオブジェクトを大量に生産しつつ、いらなくなったものを削除しようとして、
以下のようなコードを書きました。

//using namespace std;

//hoge pHoge = new hoge();
//pHogeList.push_back(pHoge);

list<hoge*>::iterator it = pHogeList.begin();
while(it != pHogeList.end()){
if (/*消滅条件が整ったら*/){
delete *it;
*it = NULL;
}
it++;
}
pHogeList.remove(NULL);

しかし、なぜかhogeオブジェクトを生産し続けると動作が極端に遅くなります。
双方向リストを使用し続けると動作が遅くなるということはあるのでしょうか?
このやり方が悪いのでしょうか? もしくは、別の原因があるのでしょうか?

569 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 12:01:45 ]
実際にどこが遅いのかを特定するところから始めたらどうだ

570 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:41:35 ]
C++の話じゃないかもしれないけど、C++で書いてるので質問させてください

0x00と"\x00"って何が違うんですか?



571 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 21:44:53 ]
>>570
数値と文字(列)の違い

572 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:01:11 ]
std::cout << typeid(0x00).name() << std::endl;
std::cout << typeid("\0x00").name() << std::endl;

573 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 22:13:32 ]
文字は整数です。

574 名前:デフォルトの名無しさん mailto:sage [2007/09/11(火) 23:16:31 ]
仮に0x00と'\x00'の違いだったとしたら、
C++の場合、値としては同じ0でも前者はint型で、後者はchar型という違いがある。


575 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 00:32:31 ]
おお、知らなかった。C++だと文字リテラル
(この用語自体C++からみたいだけど)はcharなのね。

576 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 01:03:12 ]
理由は演算子多重定義の都合。
IOストリーム作っていたときにそうすべきと感じたそう。
D&Eに書いてある。

577 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:26:38 ]
"\x00" == { 0x0, 0x0 }

578 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 03:40:04 ]
  ノ| ,ノ|
 ( 0x0)b

  ノ| ,ノ|
 (; 0x0)a

579 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 19:55:32 ]
>>575
int だったり wchar_t だったりもするけど

580 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:41:34 ]
質問よろしいでしょうか?

/* main.cpp */
#inlucde "test.h"

main()
{
int a=1,b=2;
inlinetest(a,b);
}


/* test.h */
inline void inlinetest(int x,int y);


/* test.cpp */
#inlucde "test.h"
inline void inlinetest(int x,int y)
{
return;
}


上記の具合にinline関数を使おうとすると
「未定義のシンボル」とコンパイルエラーがでてしまいました。
inlineの使い方が間違っているのでしょうか?
ご指南お願いいたします。



581 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 21:55:52 ]
> inlineの使い方が間違っているのでしょうか
そうです。

582 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:14:20 ]
>>580
#inlucde
これは試したソースではちゃんとしてるんだろうか?

583 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:20:50 ]
インライン関数は、普通ヘッダに定義を書く。

584 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:24:30 ]
>>580
inline関数はその呼び出された場所に展開されることが前提になりますから、
呼び出し元でその定義が分かるようにしなければなりません。
したがって、通常はヘッダ内で定義し、そのヘッダを#includeします。
>>580の場合は、test.hで定義するのが適当かと思います。


585 名前:580 mailto:sage [2007/09/12(水) 23:40:58 ]
明快に理解できました。
頭の靄がいっぺんに貫かれて光が差し込まれたような晴々しい気分になりました。

丁寧な説明ありがとうございます。

586 名前:デフォルトの名無しさん mailto:sage [2007/09/12(水) 23:53:53 ]
寧ろ、inlineなんかは積極的に使わずにコンパイラの最適化に任せた方がいいと思うが。

587 名前:register mailto:sage [2007/09/12(水) 23:56:06 ]
おいらのこともたまには思い出してくれないか?

588 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 00:25:43 ]
>>587
そう言えばconstも、今はプログラマ側の変更不可、副作用不可という側面が際立って紹介されてるけど
K&R読むとキャッシュへの最適化を促すregisterの様に、殆ど読み込みしかしないメモリに配置されて速度的に有利になる様な
最適化を、コンパイラへ促す効果があると記述されてたね。今のハードウェアの観点から考察すするとどうかは知らないけど。

589 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 16:50:41 ]
初期化された const T[] がROM化可能な領域に配置されるのは
昔のコンパイラには良くある振舞い。まぁ今でも似たようなものか。
プロセス間で場合共有可能なページという感じで。

590 名前:,588 mailto:sage [2007/09/13(木) 21:06:23 ]
なんか趣旨が伝わりにくい文章ですが、要するにregisterもconstもに多様な位置づけだよね、ってことです。



591 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 22:26:55 ]
>>590
いいえ。

592 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:33:35 ]
それはトムです。

593 名前:デフォルトの名無しさん mailto:sage [2007/09/13(木) 23:43:15 ]
tomcat

594 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:01:10 ]
わろた

595 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 00:03:35 ]
べ、別にわろてなんかいません!勘違いしないでください!

596 名前:デフォルトの名無しさん mailto:sage [2007/09/14(金) 11:29:42 ]
トムも仏も無い

597 名前:デフォルトの名無しさん [2007/09/15(土) 19:56:06 ]
ところで作りかけのソースあっぷしたら虐めてくれますか?

598 名前:デフォルトの名無しさん [2007/09/15(土) 21:39:52 ]
うん

599 名前:デフォルトの名無しさん [2007/09/17(月) 03:19:16 ]
あるテキストファイルを行の順番を逆にして出力したいんだけど、
スマートなやり方が思いつきません。

今は

vector<string> str;
テキストファイルから1行読み込み
str.push_back(読み込んだ文字列);
for(int i=str.size()-1;i>=0;i--) cout << str[i] <<endl;

こうしてるんだけど、これだとファイルが数百MByte以上になったときにバッファを大量に食うので避けたい。
打開策として、インプットファイルを終端からReadするって手があるのですが、
これ以外でいい方法はありませんか?

600 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 03:29:23 ]
ファイルを分割して読み込む



601 名前:599 [2007/09/17(月) 03:41:50 ]
>>600
あーなるほど!
それも一つの手ですね!

602 名前:599 [2007/09/17(月) 04:01:35 ]
>>600
お礼を言い忘れました。
どうもありがとうございました。

603 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 05:15:30 ]
あとはまぁ、行頭位置のインデックスを作るとか。
元ファイルを調べて、「改行の次の位置」をvector<ifstream::pos_type>型のコンテナにでも詰め込めば、
あとは好きな行を取り出せる。

同じテキストファイルを、毎度毎度ひっくり返して表示する仕様の場合、
そのインデックスを、a.txtに対してa.indexとか名前付けて保存しておけば、2度目以降は速いよね。

604 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 07:14:59 ]
数百MB単位のファイル読むときはちゃんとmemory mapped file使おうぜ。
このスレの範疇からは外れるが。

605 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 08:23:03 ]
>>604
でもさ、>>599の場合だと、
結局は、一度は最初から最後まで全部読み込まないといけないことには変わりないし、
先頭から読んでいくのと違いあるのかな。

普通のモダンなOSはディスクアクセスから予測した先読みのキャッシュぐらいあるだろうし

606 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 09:16:07 ]
つ[tail -r]

607 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 12:10:29 ]
$ tail -r
tail: オプションが違います -- r
詳しくは `tail --help' を実行して下さい.


608 名前:デフォルトの名無しさん [2007/09/17(月) 13:31:44 ]
つか、テキストファイルを逆順に表示する必要があるのか?

609 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 13:34:05 ]
実用的な場面はあまりないかもしれないけど、言語の勉強のための課題としては
手ごろな内容なんじゃないかな。

610 名前:デフォルトの名無しさん [2007/09/17(月) 13:35:00 ]
tail -f /var/log/messages でいいでね?



611 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:05:18 ]
馬鹿はすっこんでろ

612 名前:デフォルトの名無しさん [2007/09/17(月) 14:18:17 ]
言語の勉強ならなぜにstd::vectorを使う?


613 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:26:42 ]
C++の勉強ならSTLが適当だろう。C++スレだし

614 名前:デフォルトの名無しさん [2007/09/17(月) 14:32:09 ]
勉強が目的なんでしょ?


615 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 14:35:55 ]
「言語文法の勉強」って限定してないなら標準ライブラリの使用法も範疇だろ

616 名前:デフォルトの名無しさん [2007/09/17(月) 15:17:22 ]
c++の質問じゃないかもしれないけど
0x00000F00
こってどういう意味なんでしょうか?
16進法かなと思うんですが

617 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:27:26 ]
明らかにC++じゃないしプログラムの質問でもないぞ
0x00000F00は10進数の3840だ。

618 名前:デフォルトの名無しさん mailto:age [2007/09/17(月) 15:29:33 ]
.

619 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:31:05 ]
>>616 数値のリテラルを16進数で書きたいときの書き方。
その数値自体の意味までは判らんよ。

620 名前:デフォルトの名無しさん [2007/09/17(月) 15:37:41 ]
3840ってことはF00ってことでおk?



621 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:39:47 ]
>>620
何がOKかさっぱりわからん。3840(10)=F00(16)ってだけだ。
わからんならWindows標準の電卓でも使ってくれ。

622 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:44:17 ]
>>617
一応C++の質問になるなじゃない?
CやC++など一部の言語では16進数を表記する文法として0x〜を採用しているだけで、
一般的に16進数を0x〜と表記するという規則はないでしょ。

623 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:50:12 ]
いやー、どこの言語でも0xか\xのプリフィックスが付いたら
16進数だと思うけど。

624 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:56:26 ]
"0x"が仮にC++特有だとしてもそれ以降はただの16進数だしな

625 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 15:58:36 ]
数字の混ざったトークンにa - fが入ってたら接頭子がなんであれ16進と解釈できるだろ。

626 名前:599 mailto:sage [2007/09/17(月) 16:00:52 ]
>>603-615
どうも、ありがとうございました。
勉強になります。

学校の課題とかではないです(私はもう学生ではないので…)
株と為替の時系列データを処理するプログラムを書いているのですが、
データの入手先によって、系列の時間が上り順のものと下り順のものの2種類あるので、
一方を並べ替えることで1つの書式にそろえようとしたわけです。

627 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:04:36 ]
>>625
17進数〜36進数という可能性も。

628 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:13:47 ]
1バイト文字コードなら256進数までありうる

629 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:52:10 ]
>>616
死ね

630 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 16:57:01 ]
そこは気を利かせて
0xDEAD
とか書かないと



631 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:01:14 ]
>>630
0xDEAD=57005
実はお前さんの書き込み時間は、57分00.5秒だったのでは…

632 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 17:29:46 ]
0xDEADBEEF

633 名前:デフォルトの名無しさん mailto:sage [2007/09/17(月) 19:23:11 ]
0xBADCAFFE

634 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 19:51:52 ]
0xBACA

635 名前:デフォルトの名無しさん mailto:C++でOOPらしいコードを書くにはどうすればいいだろうか [2007/09/18(火) 19:54:44 ]
0xCPLASPLASDEOOPRASIIKODEWOKAKUNIHADOUSUREBAIIDAROUKA

636 名前:デフォルトの名無しさん [2007/09/18(火) 20:19:58 ]
どうせなら CPLUSPLUS ってかけよ

637 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 20:21:27 ]
>>635
C++はマルチパラダイム言語だ。そんな意味のない目標は捨てて身軽になろう。
OOPなんて所詮たくさんある道具の内の一つに過ぎない。

638 名前:デフォルトの名無しさん [2007/09/18(火) 20:25:01 ]
>>636
気づかなかったわ
>>637
okそうするよ

639 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:36:41 ]
そういやどっかのサイトにあったけど、「OOPは呼び出し元を再利用するための手法の一つ」
というのはかなり納得した。特にC++のはそうだよな。


640 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:40:04 ]
定義なんぞどうでもいい



641 名前:デフォルトの名無しさん mailto:sage [2007/09/18(火) 22:43:20 ]
定義?定義じゃネーヨ
概念だろ

642 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:03:17 ]
テンプレート関数にテンプレートクラスを渡したいのですが、可能でしょうか
具体的には
std::list<int> a;
std::list<double> b;

func( a );
func( b );

のようにしたいです

643 名前:642 mailto:sage [2007/09/19(水) 00:12:49 ]
自己解決しました

644 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:08 ]
template <typename T> void func(std::list<T> x)
{
};
こんな感じ?

645 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:17:59 ]
そんなちょっと考えたら解決するようなことをいちいち・・・

646 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 00:30:38 ]
馬鹿だからなんだぜ?

647 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:05:47 ]
KODE

648 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:15:12 ]
氷結しよっ!

649 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 12:43:44 ]
>>639
それはOOPっていうか、古くは各種アプリのプラグイン(DLL)に始まる
インタフェイス抽象とかコンポーネント化とかの特徴のような気が・・・


650 名前:デフォルトの名無しさん [2007/09/19(水) 20:34:13 ]
>>649
それは呼び出される側の再利用でなくて?



651 名前:デフォルトの名無しさん [2007/09/19(水) 21:28:47 ]
今ポインタの宿題をしていて  数値を交換するというやつで実行前の値の表示とでたのですがどういういみですか?

652 名前:デフォルトの名無しさん mailto:sage [2007/09/19(水) 21:48:45 ]
その質問を訊く身にもなってください。
今流行りのアスペルガーですか?






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

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

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