- 1 名前:デフォルトの名無しさん [2008/09/06(土) 22:45:12 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.58【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1218023777/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm ◆ソースのインデントについて 半角やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのが最も良いですが、 直接貼るのであれば、全角空白か に置換しておくことをお勧めします。
- 620 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 04:08:33 ]
- template < class T > class Hoge;
で const の T を受け取った時に、 クラス内部で非 const な T 型を使いたい場合には どうすればいいんでしょう? 例えば Hoge< const string > というように呼ばれたとき、 内部で(非 const な) string 型を扱いたいのです。
- 621 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:54:20 ]
- >>620
boostのtype_traitsにconstを外した型を返せる remove_cってのがある。 ttp://www.kmonos.net/alang/boost/classes/type_traits.html 手法としてはtemplateの特殊化で行ってるらしい。
- 622 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 07:55:16 ]
- すまん、remove_constだね
- 623 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:36:56 ]
- サンクスです。boostが必要ということは
もともと const 修飾された型から 非 const の型を特定するのは 難しいプログラム技術が必要だってことなわけですね・・・。 自作のiteratorを作ってたんですが、こりゃー自分には無理かな。・_・
- 624 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 08:59:29 ]
- >>623
いや、試してないけど実装はたったこれだけで良いっぽいよ。 // remove_const : const修飾の除去 //非constが渡されたらこれが実体化 template <typename Type> struct remove_const { typedef Type type; }; //constの場合はこちらが実体化 template <typename Type> struct remove_const<Type const> { typedef Type type; }; //用例 remove_const<const int>::type i; //constが外れる
- 625 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:00:15 ]
- >>617
未定義動作じゃなくて不定動作だろ。 a++と++aの評価順が決まってない。
- 626 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:08:18 ]
- >>617
副作用完了点について理解しとかないと泣きを見るよ。
- 627 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:48:35 ]
- またそうやって「何かをわかってるフリ」したデタラメを書くw
- 628 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:51:43 ]
- >>625
↓にはそういったコードは未定義だと書いてあるが・・・ www.kouno.jp/home/c_faq/c3.html#2
- 629 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 11:59:34 ]
- ANSI-C89より前では「不定動作」だったがANSI-C89からは「未定義動作」
に改められたね。
- 630 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 13:17:57 ]
- >>624
おぉ!すごい!できました!革命的! が、これは安全なんでしょうか。^^; VC++2008では allocator::allocate, allocator::construct は const オブジェクトを引数に取れますが allocator::deallocate. allocator::destroy は const オブジェクトを引数に取れません。 つまり、例えば const string 型のオブジェクトのためのメモリ領域は確保できますが、 その領域を開放する術はありません。そこで、 // T は const string 型とする。 // T* p; // allocator< T > alloc; typedef typename remove_const< T >::type * not_constT; // T 型からコンストはずし alloc.destroy( const_cast< not_constT >( p ) ); // p からコンストはずし のようなコードを書いたわけですが、これが正常なのかどうか…。 コンパイルは通っており、テストもパスしていますが、メモリの中身を覗く術がわからないので もしかしたらメモリリークでもしてるのでは、と。
- 631 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:29:18 ]
- スレッド、セマフォ、ミューテックス辺りを次の業務でするんだけど
プロセスとスレッドの違いが良くわかりませぬ。 スレッドってなんだ?
- 632 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:42:34 ]
- ここのこと
それはスレッド
- 633 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:44:55 ]
- >>632
それだけは言って欲しくなかった…
- 634 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 14:54:21 ]
- プロセス・・・プロセスごとにメモリ空間(=グローバル変数とかヒープとか)が別々
スレッド・・・全部のスレッドでひとつのメモリ空間を共有 メモリ空間を共有するので複数のスレッドからひとつの変数を 同時に書き換えたりとかわけわからんことにならぬよう注意せよ セマフォとかは普通にプロセス間でも使えるんじゃ?
- 635 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:15:19 ]
- >>634
ありがとう 確かに共有メモリがどうの聞いた!
- 636 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:17:08 ]
- 「業務」で未知状態でマルチスレッドか……
ご愁傷様って奴だな
- 637 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:25:13 ]
- 共有メモリとメモリ空間共有とは違うw
- 638 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:36:17 ]
- えらんツッコミのせいでせっかくの感動が台無しだ
- 639 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:40:48 ]
- 地獄への第一歩で感動とかされても
- 640 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 15:50:50 ]
- Windows3.xやWin32sのプロセスはスレッドだったのか
- 641 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:06:45 ]
- 地獄とかやめて
確かに既に炎上してるらしいが
- 642 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:21 ]
- 既に炎上してるところに知識のない奴が投入されるのか・・・
ご愁傷様という他ないな
- 643 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 16:16:35 ]
- passive hell and death
- 644 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:19:33 ]
- デスマーチのプロジェクトは働かなくても給料もらえるからいいじゃない。
だって、どうせ出来上がらないんだから!
- 645 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:22:18 ]
- const char *hoge[5]={"test","test2","test3","test4","test5"};
というのを宣言します。 char *hoge2; hoge2 = hoge[3]; という代入をしたいんですが、コンパイルが通りません。hogeのほうにconstをつけなければいけるんですが・・・ 教えてください
- 646 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:26:08 ]
- >>645
そういうのを通さないためのconstです。 明示なcastをしてください。
- 647 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:11 ]
- >コンパイルが通りません
エラーになった原因とかコードとかでてるだろ? それを調べてみればここで聞くまでもなく答えはすぐわかるよ。
- 648 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:28:42 ]
- 代入される変数がconstついてなければできるのだと思ってました
hoge2 =(char)hoge[3];ですか?
- 649 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:29:53 ]
- hoge2にconst
- 650 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:31:25 ]
- char * だろ。
constのポインタをconstでないポインタに代入しようとしてるから。
- 651 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:32:21 ]
- 程よいレベルだとやっぱ群がるなぁ
- 652 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:35:24 ]
- >>649
hoge2はconstだと困るんです
- 653 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:38:02 ]
- char hoge2[5]
でstrcpy
- 654 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:35 ]
- >>652
なんで困るのか言ってみようか
- 655 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:42:48 ]
- C++ならSTLのstd::string使うとか
- 656 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:43:37 ]
- >>650
それだといけました >>653 それもありなんですね >>654 いろいろ書き換えたいんです
- 657 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:50:41 ]
- 文字列定数を書き換えてはいけない
必ずstrcpyでコピーしる
- 658 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 17:53:18 ]
- そもそもなんとなく この宣言を使ってるんですが
char *hoge[5]={"test","test2","test3","test4","test5"}; イメージ的にはどんな感じですか hoge[0] 文字列testへのポインタ hoge[1] 文字列test2へのポインタって感じですか?
- 659 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 18:24:19 ]
- そんな感じ
- 660 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:13:21 ]
- a.hにクラスAを宣言、別ファイルのb.hでクラスAを継承したクラスBを宣言したいんですが、
B宣言部の「class B:public A」の部分に「型名が必要」とエラーが出ます。(当方Borland C++) a.hをインクルードしても「Aの宣言が複数見つかった」と言われたりで、どうしたらいいんでしょうか。
- 661 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:15:04 ]
- >>660
class B の定義より前に class A の宣言だけしてみるとか class A;
- 662 名前:661 mailto:sage [2008/10/03(金) 19:16:28 ]
- ごめん >>661 は無しで
- 663 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:26:27 ]
- 質問です。
他クラスのメンバ変数にアクセスするにあたって privateなメンバにgetterを使ってアクセスするのと publicなメンバを直接参照するのではどちらが速いですか? CHoge hoge; int a = hoge.m_publicHoge; int b = hoge.getHoge(); // CHogeの実装 // const int& getHoge(){ return m_hoge; }; // public: : // int m_publicHoge; // private : // int m_hoge;
- 664 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:51 ]
- 一応
速度は直接アクセス 安全性はゲッター だろう一般的に 最適化で速度差無い事もあるけど 普通はゲッター使いなさいと教わるはず
- 665 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:30:52 ]
- >>660
それだけだとうまくいくはずなのでもうエスパーさんしか アドバイスできないんじゃないかと エラーの出る最小のコードをどうぞ
- 666 名前:デフォルトの名無しさん [2008/10/03(金) 19:32:06 ]
- VC++2008のデフォルト状態Releaseでコンパイルしたものを実行し、CPUメーターで見ました。するとコアが満遍なく使われています。
私はマルチスレッドプログラムも何もしていないのに、コンパイラが自動でマルチコアに最適化してくれたということでしょうか?
- 667 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:35:11 ]
- ほかのプログラムが満遍なくCPUを使っていただけだろ。
- 668 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:42:44 ]
- >>660
インクルードガードでぐぐれ
- 669 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:52:56 ]
- >>665
こんな感じです。 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7751.zip
- 670 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:54:33 ]
- >>669
#include "ca.cpp" #include "cb.cpp" これは。。 ヘッダをインクルードするようにして、多重インクルードガードすればいいと思うよ。
- 671 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:55:40 ]
- ボーランドのリンカ使い方知らないけど、
それぞれのcppからobj作って、それらをリンクして、exeを作るのが普通。
- 672 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 19:57:11 ]
- >>671
makefileみたらそうなってるから >>670 だけでいいんじゃないかな
- 673 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:22:08 ]
- >>670
つまり、main.cppでa.hとb.hをインクルードして、 a.cppとb.cppではインクルードガードをかけるだけて、単にメンバ関数を書くだけでいいという事ですか?
- 674 名前:663 mailto:sage [2008/10/03(金) 20:37:11 ]
- >>664
サンクスです。 やはり直接アクセスの方が速いですか。。。 参照返ししてるからほぼ同等だと思ったのですが甘かったようですね。 getter使うにしてもローカルで複数回使う場合 func1( hoge.getHoge(; ); func2( hoge.getHoge() ); func3( hoge.getHoge() ); とするより int& b = hoge.getHoge(); func1(b); func2(b); func3(b); のようにした方がオーバーヘッドは減りますよね?
- 675 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:42:29 ]
- メンバ関数はインライン関数にできてだな
- 676 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 20:43:35 ]
- 最適化を前提にするなら余計なことはしないほうがよいだろう。
get/setは*.hにインラインで記述するのが基本。 気になるならアセンブリリストを出力したり、実際に測定するといいよ。
- 677 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:05:57 ]
- >>674
intなら参照使わない方が早いんじゃね? どういう用途か知らないけど なんにせよ実測するのが一番だな
- 678 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 21:23:04 ]
- >>674
値をレジスタに置けるなら、メンバの内容をローカル変数にコピーして、 一通り操作が終わったら、メンバに書き戻す方が良いかも。 メンバへの変更 ( 副作用 ) が発生するポイントが、書き戻し部分に限定 される点もメリット。
- 679 名前:673 mailto:sage [2008/10/03(金) 21:50:44 ]
- 解決しました。
どれから読み込んでもいい様、使う関数のあるヘッダはインクルードガード付けた上で 形式上でもインクルードしておけ、って事ですね(多分)。 アドバイスくれた方々、ありがとうございました。
- 680 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 22:33:10 ]
- >>679
> a.cppとb.cppではインクルードガードをかける ヘッダ内でガードする。 多重インクルードされた結果、重複定義が発生する。 > ヘッダはインクルードガード付け となっているから理解したのかもしれないけれど。 すっきりさせるために動かない状態が続くよりは、ぐちゃぐちゃでもなんとか動く状態の ほうがいいので、動く状態をキープしたまますっきりさせられるように努力するといいですよ。 リファクタリングって言葉も調べてみてください。
- 681 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:09:43 ]
- よくwindowsプログラムのサンプルコードでInitAppとInitInstanceってあるけど、どういう分け方してるんですか?
- 682 名前:デフォルトの名無しさん mailto:sage [2008/10/03(金) 23:31:17 ]
- エスパーに失敗した。もうちょっと情報頼む。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:04:14 ]
- >>681
気分
- 684 名前:デフォルトの名無しさん mailto:sage [2008/10/04(土) 01:22:24 ]
- >>681
そういう作りはWin16時代の遺物なので今となっては意味がない Win16ではアプリケーションの最初のインスタンスだけが実行すべき処理を InitApplication()に記述して、 WinMain()の引数hPrevInstanceがNULLの場合にのみInitApplication()を実行していた。
|

|