1 :
デフォルトの名無しさん :
2008/09/11(木) 23:49:17
2 :
デフォルトの名無しさん :2008/09/11(木) 23:50:03
3 :
デフォルトの名無しさん :2008/09/12(金) 09:53:12
ここは相談室ですが、使える答えは90%返ってきません。 ご了承ください。
STLつかうと一気に実行ファイルサイズが10倍に?! 環境によるだろ。 俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力 ランタイムを使用するようにして使っているが、例えばstd::vectorを 使っても使わない時と比べ10Kほどしか増えない すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。 C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの? #include <stdafx.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁヒントぐらいにはなったな。 うむごくろう。
5 :
デフォルトの名無しさん :2008/09/14(日) 06:39:48
むしゃくしゃした時は迷わずブックオフに行く。 そして棚に隠れながら「いらっしゃいませー」と 大きい声で言ってみる。 すると広いフロアの店員がいっせいにつられて「いらっしゃいませー」 と続く。 これを二・三回繰り返しスッキリしたら店を出る。
6 :
z208.124-45-67.ppp.wakwak.ne.jp :2008/09/14(日) 09:23:01
C++っておいしいの?
料理人依存です。
8 :
デフォルトの名無しさん :2008/09/22(月) 19:03:42
最近付き合いだした私の彼氏はプログラマーだそうです。 外資系の会社勤務だそうで名詞を見せてもらったら英語の会社名でした。 ダイレクトがどうしたとかC++(ぷらぷらって読むんですか?)がこうとか、 メカセコなんたらなどとよく言っています。 私にはさっぱり理解できないのですが彼のような人はどの位の年収をもらっているものなのでしょうか。 知ってどうこうということはないんですけど。。。
>>8 板違い。マ板行け。たぶんマ板でも「本人に聞け」「ネカマ市ね」とか言われると思うけどね。
10 :
デフォルトの名無しさん :2008/09/24(水) 19:21:06
再利用?
しばらくC++相談室を追いかけてなかった間になんかまた変なテンプレが増えてるw
part64はここ?
13 :
デフォルトの名無しさん :2008/09/24(水) 20:59:48
今研修で課題が出てるけどさっぱり解らん
結局このスレ使うの?
前スレ995すげー
enum { ONE = 1 << 0, TWO = 1 << 1, THREE = 1 << 2, FOUR = 1 << 3, }; とか、 enum { ONE, TWO, THREE, FOUR, }; しといて 使うときに(1<<ONE)とか
シミュレーションで、ひたすら数値演算させるような場合って、 プログラムが終了するまではCPU使用率が100%になると思うんだけど、 これを60%くらいでダラダラ計算させるにはどうすればいい? タイマー使って休み休みさせればいいの?
適当にSleep入れるといいんじゃないか
それでいいんですね さんくす
>>19 計算時間6に対して4休めばCPU占有率60%になるが、なんか意味あるのか。
研究のシミュレーションが計算し終わるまで10分くらい かかるんだけど、シングルコアだから他のアプリが動かなくなる。 前のシミュレーション結果をエクセルで加工してる間に、新しいパラメータで シミュレーション。その結果をエクセルで加工・・・ループ って感じ。デュアルコアだったら無問題なんだけど
>>23 それならプロセスやスレッドの優先度を下げればいいだけ。
アイドル優先度にでもしておけば、他の作業を妨げることはない。
そんなん出来るだ。初めて知ったわorz ありがとうございます
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS); // こう?
一番簡単にやるにはタスクマネージャを開いてプロセス名を右クリック →優先度の設定から行ける いちいちやるのが面倒いけど
#include <windows.h> Sleep(0); でいいじゃん 要するにメッセージキューに溜まったメッセージを処理させればいいんでしょ DelphiならApplication.ProcessMessages だけど同じ事だし
Sleepでキューのメッセージ処理されねーよ。
>>28 お前は質問を誤読してるよ。
恥ずかしいから黙っとけ。
メッセージキューかんけーねーだろw
だから計算プログラムを走らせている間にエクセルが無応答に なるのを防ぐためにSleep(0)を計算プログラムの所々に入れるって 言ってるんだろ。 シングルコアのCPUにはこういうテクが必要なんだよ覚えとけ
Win3.1でもつかってんの?
Win3.1のようなノンプリエンプティブなOSではそもそもSleep()の 存在理由が全く異なる。 他の待機中のプロセスにCPUを移行して走らせるためのタスク スイッチをユーザー側に負担を強いる事で押しつけている。
通常の優先度で計算プロセスを動かしてる限り、エクセルが無応答になることはないだろ。
linuxかcygwinなら、niceコマンド使え 簡単だぜ
>>36 だから や っ て み ろ っ て
永久ループのプログラムを作って走らせておいて
エクセル立ち上げていろいろいじくってみれ
あまりの重さにイライラするから
重いと無応答は違うんですが
>>33 エクセルが重くなるのは単にタイムスライスが十分に回ってこないのが原因であって、
シングルプロセッサであることとは全く関係ないんですが。
実験もしてみないで文句言う奴らばっかしだなここは
Win API で Sleep(0) すると別スレッドに制御を渡し、待ち時間なしで待機状態になる If you specify 0 milliseconds, the thread will relinquish the remainder of its time slice but remain ready.
>>28 Sleep(0)でメッセージが処理されるとしたら他スレッドのもので、自スレッドのは処理されない。
ProcessMessagesとは全然違う。
いい加減スレ違いなんだが。 Windowsプログラミング関連のスレとかOSi板のWindows関連のスレででもやれば?
うわ、OSiってなんだ、ネットワークレイヤかよ(w OSだ。
>>33 確かにSleep(0)をすれば他のプロセスに実行時間を多く割り当てられるようになるが、それは無駄なポーリングをしてるような場合のテクニックだな。
>>23 のようにシミュレーションなど実のある処理には適さないな。
プライオリティの調整が適切でしょう。
48 :
デフォルトの名無しさん :2008/09/26(金) 12:42:36
SuspendThread と ResumeThread で定期的に停止・再開させるっきゃねえべ
c++の開発環境ってVisualStudioが一番いいの? まわりがemacsなのでVisualStudioから以降してみてだいぶたつんだけど やっぱりVisualStudioが一番便利に感じる gdbだと変数追いかけるのが不便すぎる
IDEとテキストエディタを比べられましても
やっぱり我が家が一番
警備員は黙ってろ
>>47 やってみた。スレ違いスマソ。Excelは起動毎にディスクキャッシュを
クリアして行った。
・Sleep(0)無し
Excelの起動速度は確かに遅くなったが、一度立ち上がって
しまえば別に重いと感じなかった。しかし計算速度は半分。
・Sleep(0)有り
Excelの起動速度にほとんど影響しない。立ち上がった後の
動作も通常と変わらない。計算速度も変わらない。
と言う事でSleep(0)有り無しではシングルコアでは結構差が出る
体感速度にはそんなに出ないが(Excelそのものはそんなに速度を
必要としないからか?)
気になったので、試してみた。結論からいうと、
>>26 が正解だった。
(以下のソースを、cl /EHsc /Ox /Otでコンパイルして試した)
Sleep(0)が呼び出される間隔が短いと、それがオーバーヘッドになって
非常に遅くなるようだった。
#include <windows.h>
#include <iostream>
#include <ctime>
using namespace std;
void main(void){
SetPriorityClass(GetCurrentProcess(), IDLE_PRIORITY_CLASS);
unsigned int a=0;
unsigned long count;
count = clock();
for( a=0 ; a<0xFFFFFFFF ; ++a ){
//::Sleep(0);
if ( a % 0xFFFFFFF == 0 ) cout << a << endl;
}
count = clock() - count;
cout << count << endl;
}
57 :
sage :2008/09/26(金) 23:35:57
参照の参照って合法ですか? VC9では, int main() { int n = 3; int& r = n; int& r2 = r; std::cout << r2 << std::endl; return 0; } とやると3とでるようですが.
nullを指していなければ問題無し
合法です。 というか、いちど参照変数作ってしまったらどっちが元だったか区別付かなくなる。
60 :
57 :2008/09/26(金) 23:52:13
>>57 参照の参照は違反
でも
>>57 は普通の参照になる
何も考えずにやってるとテンプレート関連で引き起こされる
>>58-59 適当いってんじゃねー
>>56 そりゃそうでしょ。
システムコールはx86の場合大抵コールゲートを通しているので
大変重い。
SYSCALLを使っていれば少しは軽いんですが。
63 :
デフォルトの名無しさん :2008/09/27(土) 04:16:46
関数ポインタとstd::vectorを使って順番に関数を実行したいと思ってます。 とりあえず struct { bool (*func)(std::vector<std::string> vecStr, std::vector<size_t> vecValue); std::vector<std::string> vecStr; std::vector<size_t> vecValue; } FS; std::vector<FS> vfs; FS fs; fs.func = f1; fs.vecStr = vs; fs.vecValue = vv; for(int i=0;int i<vfs.size();i++){ vfs[i].func(vfs[i].vecStr,vfs[i].vecValue); } こんな感じでやってみたのですが、クラスを使わなければ動くのですが、 クラス内でやろうとするとコンパイルが通りません。 fs.func = &Test::f1; error C2440: '=' : 'bool (__thiscall Test::* )(std::vector<_Ty>,std::vector<size_t>)' から 'bool (__cdecl *)(std::vector<_Ty>,std::vector<size_t>)' に変換できません。 with [ _Ty=std::string ] この変換が可能なコンテキストはありません。 根本的に何かダメでしょうか?
65 :
デフォルトの名無しさん :2008/09/27(土) 04:50:31
ありがとうございます。ぐーぐる先生で一杯でてきますね・・・ というかメンバ関数の場合はなんかめんどくさいっすね・・・
なら、普通の関数を作ればいいんだよ。 class Test { bool f1(std::vector<std::string>, std::vector<size_t>); }; bool Test_f1(Test& t, std::vector<std::string>, std::vector<size_t>) { return t.f1(t, vecStr, vecValue); } FSの中のfuncはこう直してね。 bool (*func)(Test& t, std::vector<std::string>, std::vector<size_t>); ……なんてことやっていると、結局メンバへのポインタ使うほうが楽と思う。
67 :
デフォルトの名無しさん :2008/09/27(土) 05:22:29
あーなるほど・・・ クラス内で完結させることばっかりに目がいってました。 さっそく試してみます。ありがとうございます。
boost::shared_ptr<std::vector<T> > pVector; みたいにshared_ptrでコンテナを共有するコードってどう思いますか? 構文上問題ないのは分かるんですが、pVector(new vector<T>);を見て、 コンテナをnew(笑)と思ってしまいます。 でも、コンテナを共有するためにshred_ptrに入れる事って普通にありますよね?
あらゆることがありえる それがプログラミング
boost::shared_ptr<T> pVector; みたいにshared_ptrでTを共有するコードってどう思いますか? 構文上問題ないのは分かるんですが、pVector(new T);を見て、 Tをnew(笑)と思ってしまいます。 でも、Tを共有するためにshred_ptrに入れる事って普通にありますよね? コンテナを特別視する理由が知りたい
色んなスレッドからクッチャクチャにいじくるとかなら 同期取らせるラッパークラスに入れた方がいいかもな そういう事しないなら別に
72 :
68 :2008/09/27(土) 17:46:18
>>69 ありです。
>>70 コンテナは動的に確保したメモリを扱うためのクラスだからです。
コンテナをnewするという事は、コンテナの中と外で2重にメモリを管理する事になるのが気になります。
73 :
デフォルトの名無しさん :2008/09/27(土) 17:47:52
杞憂だな
74 :
68 :2008/09/27(土) 17:50:19
コンテナ自体をdeleteするのはshared_ptrの責任で、 コンテナの中身をdeleteするのはコンテナの責任になるだけ コンテナは自分がどこにいようと、死ぬときに自分の責任は全うしてくれるはず だから気にすんな
76 :
68 :2008/09/27(土) 18:06:25
ありがとうございました。
んなこといってたらlistやmapはつかえんぞ
>>76 問題ない。ただし自由度が高くなるので一見便利そうだが、後々複雑さが増す。
コンテナを包含するクラスを作って、それを共有するようにすることをお勧めしますですハイ。
#include <iostream> template<typename T> class Hoge { public: Hoge(T i) { std::cout << i << std::endl; } }; new Hoge<int>(-1); // 結果:-1 (○) new Hoge<unsigned short>(-1); // 結果:65535 (○) new Hoge<unsigned char>(-1); // 結果: (×) new Hoge<signed char>(-1); // 結果: (×) どうすりゃいい?
正しい動作ではあるね。 数値を常に出して欲しいなら、テンプレートを使わずに Hoge(int i) で受ければいいんじゃないかな。
81 :
デフォルトの名無しさん :2008/09/27(土) 19:57:08
キャストすりゃいーじゃん
>>79 charのとき特殊化してcout << (int)iするとか。
そもそも何がしたいのかわからない
79です。
>>80 すいません。
お試し用プログラムでかなり簡略化しちゃったので…
やはりsigned charとunsigned charのときだけ特殊化するしかないようですね。
やっぱprintfの方が使いやすい><
std::cout<<boost::format("%1%")%i<<std::endl;
すみません、C++でpthreadを使って一部のメンバ関数を別スレッドで実行したい と思っているのですが、 たぶん、thisポインタがどうたらとか、デマングルがどうとかで、単純に普通(?)の メンバ関数をpthread_create()の引数に渡したりしても駄目ですよね? C++でpthreadを使う際の何か典型的なパターンというのはあるでしょうか。
pthreadはCのライブラリだから引数に渡すのはPODじゃないとダメ メンバ関数を実行したいなら、メンバ関数のポインタを直接渡すことは出来ないから それを実行するだけの関数を別に作ってそのポインタ渡せばいいんじゃない
>>86 スタティックメンバ関数のポインタなら渡せる。
インスタンスを区別するためにオブジェクトのポインタを引数にして渡せる。
void *foo_call(void *foo_obj) { static_cast<Foo *>(foo_obj)->bar(); } pthread_t th; pthread_create(&th, NULL, void * (*start_routine)(void *), void * arg);
すまん適当に書いてたの途中送信しちまった こういうfoo_call関数作って、pthread_createの第4引数に呼び出し元のオブジェクト与えればいいんじゃねと言いたかった
親子関係のあるクラスを実装しています. 以下の2通りの方法を検討しているのですが, 使い分けの指針があったらアドバイスをお願いします. class Child { }; class Parent { private: Child* pC; public: Parent(){pC = new Child();} virtual ~Parent(){delete pC;} Child* GetChild(){return pC;} }; class Parent { private: Child rC; public: Parent(){;} Child& GetChild(){;} virtual ~Parent(){;} Child& GetChild(){return rC;} };
92 :
91 :2008/09/28(日) 18:01:34
思いつきました. 親子の ・生成消滅のタイミングが違うとき ・子コンポーネントにポリモーフィズムを実装したいとき にポインタ利用ですね. スレ無駄にしてスマソ.
93 :
デフォルトの名無しさん :2008/09/28(日) 22:23:41
こういう継承って出来ないんだっけ? class CTest : public int {};
94 :
デフォルトの名無しさん :2008/09/28(日) 22:33:54
なんのためにintを継承?
95 :
デフォルトの名無しさん :2008/09/28(日) 22:49:15
scanfで入力するときに、かな入力はどうすればできますか?
>>95 意味がわかんないんだけど
コマンドプロンプトで日本語入力ならAlt + 半角/全角
でできるよ
98 :
デフォルトの名無しさん :2008/09/28(日) 23:17:31
アップキャストにdynamic_cast使うとRTTI動きますか?
アップキャストは暗黙の型変換が使えるからそのまんま代入すればいい。
>>98 アップキャストの時は普通にキャストしてくれるようにできてるはず
101 :
デフォルトの名無しさん :2008/09/28(日) 23:42:08
>>99 答えになっていません
出直してきてください
>>100 ということはキャストせず代入と実行速度などのコストは
等価なのでしょうか?
103 :
デフォルトの名無しさん :2008/09/28(日) 23:59:35
>>102 ありがとう^^
そのページに答えが書いてあったよ。
チェックする必要のないキャスト(普通のアップキャスト)では
static_cast と同じ処理に最適化されます。
104 :
93 :2008/09/29(月) 01:23:40
>>94 まさにテンプレートで、
実際には、
template<typename T>
class CNumeric : T
{
//追加メソッド
};
こんな感じで、Tに intやらshortを指定したいということ。
intをクラスのメンバーにすると、各種演算子の実装がめんどくさい
ってだけの話なんだけどね。
親クラスにするならintが仮想デストラクタ持ってないとまずいよな ということはintもvtbl持ってないとなー 馬鹿げたアイデアだとすぐ気付きそうなもんだが
>>105 馬鹿げてるとは思わんな
この場合は機能追加だから仮想関数禁止でいいじゃん
あるいは、継承できなくてもいいから、std標準ライブラリに
組み込み型と同機能のtemplate classを実装しておいてほしい
107 :
デフォルトの名無しさん :2008/09/29(月) 05:24:42
numeric_traits ?
struct test{ template<typename T> int &t2i(){ static i = 0; retrun i; } }; test a, b; struct x; //テンプレート引数に入る型の情報はstruct testの定義よりも後 //本当は a.t2i<x>() と b.t2i<x>() を別々にしたい a.t2i<x>(); b.t2i<x>(); コメントの通りにするのは不可能でしょうか?
別々の意味を定義せよ
&a.t2i<x>() != &b.t2i<x>() が求められる条件
&(a.t2i<x>()) != &(b.t2i<x>())ね
>>108 その、整数の参照を一体全体何に使うんだ?
その条件だと、単にメンバ変数でよさそうなんだが。
あるクラスを特定のクラスからのみ生成できるようにしようと思って以下のコードを書いたのですが、 class Hoge{ protected: Hoge(); public: virtual ~Hoge(); }; class Piyo{ public: Hoge& getHoge(){ struct TMP:public Hoge{ TMP():Hoge(){} }TMP(); return TMP; } }; この場合もデストラクタにvirtualは必要ですか?それとHogeに他の関数がある場合、それらも virtualにしないとダメですか?
なるほど、要するにstatic変数が欲しいんだな? しかしtest自体はテンプレートにしたくないというのか? 思いつくのはこんな方法しかないぜ。 struct test { template < typename InterfaceGUID, typename T > int & get() { static int x ; return x ; } } ; 使い方は以下の通り。 struct x {} ;//これ何か意味あるのか? int main() { test a ; int & ref1 = a.get< struct unique_id_0001, x>() ; int & ref2 = a.get< struct unique_id_0002, x>() ; std::cout << bool( &ref1 == &ref2 ) << std::endl ; } 最初のテンプレート引数は、ユニークでさえあれば、どんな型でもいい。 一番簡単なのは、その場でstruct hogehogeと書くことだ。実体の宣言はなくてもかまわない。 ただ問題は、タイプミスができない。コンパイラも警告できないから。 このテクニックは、あまりお勧めしないぜ。 boostのsandboxに、c_function.hppってのが、このテクニックを使って、関数オブジェクトをCの関数ポインタから呼び出せるようにしている。
>>93 ベースクラスになれるのはクラスのみ
int は型ではあるがクラスではないのでベースクラスにはなれない
struct も union もクラスだよ
帰ってきた!
117 :
デフォルトの名無しさん :2008/09/30(火) 08:01:47
第1種ベッセル関数で複素数引数が扱えるライブラリってありますか? 次数は整数です。
開発環境:Linux Fedora6 開発言語:C++ 質問: 文字コード変換について質問させてください。 現在仕事で、UTF8とSJISの文字コード相互変換と、UTF8からJISへの変換(相互変換不要)を する必要が出てきた為、変換方法を調べている最中なのですが、いい方法が見つかりません。 案1.文UTF8とSJISとJISの文字コード対応テーブルを作成し、それを元に変換をかける。 →コード量が多くなるためにあまりやりたくないのですが、これしか方法がない場合は 第一水準の漢字までの文字コード対応テーブルを作成して変換をかける。 案2.ICUライブラリを使用する。 →ものすごくいいものなんですが、よすぎるために容量が多すぎて搭載できません。 これ以外に方法はないでしょうか? C/C++の標準ライブラリに変換関数は見当たらないようでしたし、 ICUよりもっと簡易的な変換ライブラリはないものでしょうか? または、SJIS⇒JISのような文字コード変換みたく、簡単に計算できるものですか?
iconvとか
121 :
117 :2008/09/30(火) 18:10:17
>>118 octaveですか。ちょっと試してみます。
他におすすめあればよろしくお願いします。
122 :
119 :2008/09/30(火) 19:41:15
>>120 こんなのあったんですね。完全に見落としてました。
どうもありがとうございます。これで何とかなりそうです。
123 :
117 :2008/10/02(木) 09:56:46
liboctave使ってインテルコンパイラでコンパイルってどうするんですか? g++ならできるんですが、icpcでコンパイルするとエラーがでます。
>>123 たぶん、g++以外ではそのままコンパイルはできないと思う…
UNIX板のoctaveスレで聞いたほうがいいかもね
125 :
117 :2008/10/02(木) 12:41:35
>>124 やっぱり普通にはできないんですね。octaveスレで聞いてみます。
どうもありがとうございます。
126 :
デフォルトの名無しさん :2008/10/03(金) 20:20:23
127 :
93 :2008/10/04(土) 01:44:48
とりあえずこんなクラスにしてみた。 若干使い方に制限はあるけど、ほとんどの演算子が使えるんでOK。 template <typename T> class CNumeric { T m_Value; public: CNumeric(T val=0); T operator=(T val); operator T() const; operator T&(); public: static T Parse(const char* pVal); const char* ToString(const char* pFormatString); }; typedef CNumeric<int> CInt32;
>>127 operator const T&() const; でも可かな。
イベント処理を委譲するためのクラスを設計しています。 環境はVC2008EEです。 少し長いのですが、以下のコードの問題を指摘して頂けないでしょうか。 コンパイルは通るのですが、アクセスエラーが発生してしまいます。 // Event.h #include <iostream> #include <map> class Object { protected: virtual ~Object(){} }; typedef void (Object::*MessageFunc)();
class Event : public Object { private: std::map<int, MessageFunc> msgMap; public: long Procedure(int msg); void AddMessage(int msg, MessageFunc mf); }; class Component : public Object { protected: Event ev; public: Component(); long Procedure(int msg); void AddMessage(int msg, MessageFunc mf); virtual void OnEvent(); };
// Event.cpp #include "Event.h" long Event::Procedure(int msg) { (this->*msgMap[msg])(); // エラー発生 /** * Event.exe の 0x00000000 でハンドルされていない例外が発生しました: * 0xC0000005: 場所 0x00000000 を読み込み中にアクセス違反が発生しました。 */ return 0L; } long Component::Procedure(int msg) { return ev.Procedure(msg); } void Component::OnEvent() { std::cout << "コンポーネントのイベントが呼ばれた." << std::endl; }
void Event::AddMessage(int msg, MessageFunc OnMessage) { msgMap.insert(std::map<int, MessageFunc>::value_type(msg, OnMessage)); } void Component::AddMessage(int msg, MessageFunc OnMessage) { ev.AddMessage(msg, OnMessage); } static const int EVENT_ID = 1; Component::Component() { AddMessage(EVENT_ID, (MessageFunc)&Component::OnEvent); } int main() { Component c; c.Procedure(EVENT_ID); return 0; }
世の中にはpastbinを初めとしてソースコードを貼り付けられるサービスぐらい山ほどあってだな。
>>129 たぶん msgMap[msg] が 0。ちゃんと AddMessage できてるか確認した?
Event ev; MessageFunc func = (MessageFunc)&Component::OnEvent; (ev.*func)(); こんなことしてるんだから落ちて当然
136 :
129 :2008/10/04(土) 12:56:10
>>133 ありがとうございます。
利用してみました。
http://pastebin.com/m1babf58d これなら動くようです。
(倍角の部分は読み替えて下さい)
>>134 http://pastebin.com/m1babf58d のように変更してデバッグしたところ、
- msgMap [1]((1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }')) std::map<int,void (__thiscall Object::*)(void),std::less<int>,std::allocator<std::pair<int const ,void (__thiscall Object::*)(void)> > >
+ [0] (1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }') std::pair<int const ,void (__thiscall Object::*)(void)>
- ev.msgMap [1]((1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }')) std::map<int,void (__thiscall Object::*)(void),std::less<int>,std::allocator<std::pair<int const ,void (__thiscall Object::*)(void)> > >
+ [0] (1,0x004110cd [thunk]:Component::`vcall'{4,{flat}}' }') std::pair<int const ,void (__thiscall Object::*)(void)>
となっていましたので、登録はできているみたいです。
>>135 呼び出しを調べてみます。
137 :
129 :2008/10/04(土) 12:59:32
138 :
デフォルトの名無しさん :2008/10/04(土) 13:15:40
倍角って用語がなつかしい
まあ意味を間違えて使ってるんだろうがね
140 :
129 :2008/10/04(土) 13:46:01
>>135 Component::OnEvent()をEvent::OnEvent()に移動させたら動きました。
Event ev;
MessageFunc func = (MessageFunc)&Event::OnEvent;
(ev.*func)();
で,OKですね。ありがとうございました。
ただ、Component::OnEvent()を他のComponentを継承したクラスで
オーバーライドさせたいので、全体の実装方法はもう少し考えてみます。
template <typename Derived> class base { public: typename Derived::P1 p1; }; template <typename _P1> class derived : public base<derived<_P1> > { public: typedef _P1 P1; }; int main(int, char*[]) { derived<int> d; // error("P1"は"derived<_P1>"のメンバではない) derived<int>::P1 p1; // ok } base から derived<int>::P1 を参照できないんだが、 規格上こういうテンプレートは書けないって事でいいのかな?
何故できないんだろう。 baseのメンバ関数の中では普通に使えるのにな。
derived<_P1>のインスタンスが生成されていないからでは?
その通りです。
でもbaseクラスのDerived::P1は実体化されるまで探されないんじゃないの?
new で生成したオブジェクトのポインタは == で比較できるので std::vector に入れて線形検索できるけど、std::set に入れて検索できますか? new ではなく同一配列内のオブジェクトのポインタは場合は < で比較できるので問題ないと思いますが。
>>145 derivedの前に基底クラスのbaseを生成するので
baseが生成される時は、derived::P1 が何かわからない。
たぶん・・・
148 :
デフォルトの名無しさん :2008/10/04(土) 17:44:03
WindowsでつかうC++のコンパイラってどれがいいの?
Win なら VC 以外ありえないだろ。
BorlandやIntelはダメってことか?
DMC++が最高にいいよ
152 :
デフォルトの名無しさん :2008/10/04(土) 18:03:54
>>148 用途によって変わると思うのだが
開発効率あげたければBorland C++Builder
API直だたきしてGUIアプリ作りたければM$ Visual C++ 6.0, M$ Visual Studio 200x
C++の勉強程度ならBorland C++ Compiler とか GNU Compiler Collection
とか、プロトタイプ程度でわざわざVC++やVSのC++立ち上げるの嫌だしな
いま手に入るか知らないが、M$ Visual C++ 6.0は軽くていいよ
再帰になってね?
軽いけどバグってる
>>152 自己代入に対応してないことと、
E::operator =が例外を投げない保障をしない場合に例外安全にならないこと
くらいじゃないかな…
E::operator =じゃなかった。E::operator []だ それとE::operator []の戻り値の型のoperator = かな
158 :
146 :2008/10/04(土) 18:27:18
>>146 ですけど
オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。
ポインタを十分な大きさの整数に reinterpret_cast した場合、その整数は元のポインタに戻せるので
ポインタと変換された整数は1対1の関係ということになり、その整数を < で比較できます。
ただし十分な大きさの整数が存在するかどうかは処理系によるので、オブジェクトごとに一意の
整数 ID を持たせるしかないかもしれません。
>158 >オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。 std::less にはその制限がないから大丈夫。 > 14882:2003 20.3.3/8 >For templates greater, less, greater_equal, and less_equal, the specializations for any >pointer type yield a total order, even if the built-in operators <, >, <=, >= do not.
160 :
146 :2008/10/04(土) 21:59:13
おお、std::less にそういう仕様があったんですか。 単に operator< を関数オブジェクトにするのが目的だと思っていました。 ありがとうございました。
161 :
93 :2008/10/04(土) 23:25:28
>>128 const 付けちゃうと、a++ なんてのが出来なくなっちゃうんで。
CNumericとconst CNumericで呼び分けられるように operator T&()とoperator const T&() constは両方とも用意するのが普通
163 :
93 :2008/10/05(日) 00:31:15
↓のコードだと operator + があいまいって怒られちゃうんだが、何か間違ってる? 環境は、VC++6.0。 template <typename T> class CNumeric { T m_Value; public: CNumeric(T val=0) : m_Value(val) {} T operator=(T val) { return m_Value=val; } operator T() const { return m_Value; } operator T&() { return m_Value; } operator const T&() const { return m_Value; } }; typedef CNumeric<int> CInt32; CInt32 a=1, b=2, c; c = a+b;
VC2008だと怒られないな
VC6はそろそろ消えて欲しいな そういう自分もVC6物件のメンテナンスを2件抱えている。もうすぐ1件に減るけど
166 :
93 :2008/10/05(日) 01:04:48
ほんとVC6は切り捨てたいんだが、 外注からバージョンアップ費用出せと脅されるわ、金無いわで、どうしようもないんだよな。 といっても、いつまでもVC6使ってる訳にもいかないし。
VC6で止まってるところよりも、新しいとこ探したほうがいいんじゃないか?
168 :
93 :2008/10/05(日) 02:02:28
そうなんだが、長年使ってきたというのもあって、 ノウハウ握られ過ぎてるんだわ。
コンパイラのバージョンを上げるということはシステム全体のテストを全部やり直すことを意味する 問題領域にもよるけどね システムの性質しだいでは莫大な費用が発生する
170 :
デフォルトの名無しさん :2008/10/05(日) 06:04:47
liboctave で逆フーリエ変換したいのだが、うまくいかない。 どこがだめなんだろうか? int OCTAVE_iFFT( double *OCT_POW, int DATASIZE, double *OCT_BUF) { ComplexMatrix originalData( DATASIZE/2, 1, 0.0 ) ; for( int ii=0; ii<DATASIZE/2; ii++ ){ originalData( ii, 0 ).real() = OCT_POW[ii] ; } ComplexMatrix ifourierData = originalData.ifourier() ; for( int ii=0; ii<DATASIZE; ii++ ) OCT_BUF[ii] = ifourierData( ii, 0 ).real() ; return 0 ; }
172 :
デフォルトの名無しさん :2008/10/05(日) 10:54:05
コンパイル&実行はできますが、できるだけです。 あるデータをFFT->逆FFTにしても、まったく別のデータとなります。 >170 のソースで引数は、 double *OCT_POW:スペクトルデータ int DATASIZE:データ長 double *OCT_BUF:音データ で、意識的に意味合いを持たせているのは、 1つ目のfor:FFT後のデータの後半は対称なので、前半半分を逆フーリエ変換の対象としている。 1つ目のforの中身:実部にデータを代入。虚部=0。(originalData自体にデータを代入したが変化なし。) です。 お願いします。
>>172 まず、全域を計算対象にして、正弦波をぶち込んで、FFTが正しく行われているか確認し、次に逆FFTが正しく行われているか確認する。
その後いろいろ弄れ
174 :
デフォルトの名無しさん :2008/10/05(日) 14:29:39
>173 FFTの動作は確認済です。 色々とやってみます。
175 :
デフォルトの名無しさん :2008/10/05(日) 15:36:00
>173 フーリエ変換する最初からやってました。 "全域で"できました。 ありがとうございました。
vc++ 2005,winXP Proを使っています。 下のように、char型の配列に1バイト文字、2バイト文字混合の文字列を入れたとして、 char test[] = "abcあいうえお"; test[x]が1バイト文字の一部なのか、2バイト文字の前半なのか、後半なのかを判別する方法はないでしょうか? よろしくお願いします。
文字コードによる。
_ismbbleadもしくは_ismbslead
179 :
デフォルトの名無しさん :2008/10/06(月) 00:03:15
g++なのですがenumを論理和しちゃうとコンパイルエラーになります typedef enum { NONE = 0x00000000, A = 0x00000001, B = 0x00000010, C = 0x00000100 } Unko; int main(int ac, char** av) { // Unko unko = A; OK Unko unko = A | B; std::cout << std::hex << unko << std::endl; return 0; }
少なくとも AとBの論理和を、そのままUnkoという型に代入するのはおかしい キャストでもしない限り警告は出るだろ エラーはぱっと見分からん
>>179 Unko に D = 0x11 を定義すれば OK じゃね?
183 :
179 :2008/10/06(月) 00:29:20
main.cpp: In function ‘int main(int, char**)’: main.cpp:13: error: invalid conversion from ‘int’ to ‘Unko’ ってでてます。 昔をとくにErrorとかWarningなしで通ってた気がするのですが。。。
int→enumは暗黙変換してくれない enum→intはできる
まず言えるのは AはUnko型 BもUnko型 CもUnko型 しかし、A|Bはint型 そんな未知の値をUnko型にはコンバート出来んよ そもそもint型でウケるべきでは? 列挙型の意味理解してる?ただの定数じゃないぞ
>>183 Cでは暗黙変換で通る。C++では明示的なキャストがないと通らない。
一応、こういう関数を定義してやることは可能。 Unko operaotr |(Unko lhs, Unko rhs) { return static_cast<Unko>(lhs | rhs); }
operaotr
代入は出来ても、Unko型は「0x11なんて知りません」って感じだなw
C++初心者にどうだ!って見せられる短めの超絶テク探してるんだけどどんなのがいいかな
便利さを見せつけたいのか難解さを見せつけたいのか醜悪さを見せつけたいのか 目的による
>>190 オレにとっては STL map スゲーだった
でも、C++から始める人には何がスゲーのか分からんだろうな
>>190 Cは使えるC++初心者なら、ifとswitchが全然ないプログラムを見せてやれ。
>>194 こうですか?わかりません><
#include <cstdio>
using namespace std;
class Manko {
public:
void hoge1(){printf("1\n");}
void hoge2(){printf("2\n");}
};
void hoge(int i)
{
void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};
(*p[i])();
}
メタプログラミング見せてやれってことじゃ? boostのspiritなんかも面白いかもね
// これはC++ならではのコメントです
>>195 このほうが良くないですか?って言われて終了
void hoge(int i)
{
printf("%d\n", i+1);
}
>>197 しかしMSCのかなり前のバージョンから使ってたなあ、それ。
だいたいC99にもあるじゃねーか。
gccも拡張で採用してたし
もともとご先祖様のBCPLにあったと言う。
なんかD言語のコンパイル時に出力されるFizzBuzz問題のやつみたいな「えー、そんなことできるの!?」ってやつがいいんだが
MPLでコンパイル時にFizzBuzzのシーケンスを作ればいいじゃないか。
205 :
デフォルトの名無しさん :2008/10/06(月) 23:15:27
>>195 > void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};
なんだこれwww
文法エラー
しかもstaticじゃないと関数ポインタ取得できない
メンバ関数ポインタを知らないのですね まぁ呼び出しの方はおかしいけど
#include <cstdio> using namespace std; class Manko { public: void hoge1() {printf("1\n"); } void hoge2() {printf("2\n"); } }; int main() { void (Manko::*p[])() = {&Manko::hoge1, &Manko::hoge2}; Manko m; (m.*p[0])(); (m.*p[1])(); }
208 :
デフォルトの名無しさん :2008/10/06(月) 23:41:49
>>206 ほほぅ
インスタンスって知ってますか?www
関数ポインタ変数にメンバ関数ポインタとやらを代入して、
関数ポインタ変数越しに呼び出すコードを晒して下さい
コンパイルが通るコードね
209 :
208 :2008/10/06(月) 23:43:14
>>207 これはひどいwww
何がしたいの?www
210 :
デフォルトの名無しさん :2008/10/06(月) 23:43:48
>>208 初期化子について勉強しなおしたほうがいい
212 :
208 :2008/10/06(月) 23:48:35
>>211 なんで突然初期化子が出てくんだよwww
あぁあれか、馬鹿の一つ覚えってやつかな?www
C++初心者になら、どんなに凄いソースコードを見せるより、 テンプレート使ったときのエラーメッセージ見せる方が効果的。 「この数千文字のエラーはね、constがないってコンパイラが怒ってるんだよ」
俺もメンバ関数ポインタの構文はひどいとは思うが・・・ そういうことを言いたいのではなさそうだな?
207は逃げたかwwwwwwwwwwwwwwwwwwwwww
>>215 悪いことは言わん、お前が逃げろ
今すぐにだ
メンバ関数のアドレスとかいう馬鹿げたものをちゃんと説明できたらすぐ逃げますよ はいどうぞwwwww
208はこんな深夜にスレ住民を笑い死にさせる気のようです
220 :
208 :2008/10/07(火) 00:30:43
221 :
208 :2008/10/07(火) 00:31:56
左様ですか
223 :
208 :2008/10/07(火) 00:33:19
207ほどではないwwwww
thisについて理解してない馬鹿が約一名いるようですね
なにがなんだかわからない・・・・・・・
227 :
208 :2008/10/07(火) 00:42:01
>>225 理解していない馬鹿はお前
thisが関数ポインタとでも?www
207は早く出てきて謝れよw
208は.*が一つの演算子だということを知らないようだ。
230 :
208 :2008/10/07(火) 00:44:03
また面白いことを言い出す奴が現れたw あれ?こいつ207じゃね?
よく考えたらこんなC++ヲタしか知らないカオス機能を説明なしに使う207も悪い 207も謝れ
235 :
208 :2008/10/07(火) 00:48:42
>>231 こういう構文もあるのか、しらんかったorz
まったく実用性ないが
でも誤ろうとは思わない
知らなくて当然だよな 新しい機能だろ?こんな変なの
237 :
208 :2008/10/07(火) 00:51:52
でもこれってさ、 void (CSample::*pFunc)() = &CSample::func; この時点でメンバ関数ポインタを取得っておかしくね?
こんなわけのわからない構文におかしいも糞もないよ そういうものだと思うしかないんだろ
CSampleのインスタンスが一つもない状態から どうやってfuncなるメンバ関数を特定するのかとても不可解です
241 :
208 :2008/10/07(火) 01:01:53
おそらくオフセット的なものがpFuncに入っているのだろう そして、呼び出し時にインスタンスを指定したところで、 インスタンスのポインタ+オフセットをcallみたいなことなのかな? ん〜、どう見ても使えんwww
特定しません インスタンス付けて実際に呼ぶまで実際に呼ぶ関数は決まりません(virtualの場合)
メンバ関数の引数には、隠されたthisポインタがあることを知っていれば、別におかしくない。 class CSample { void func(); }; void (CSample::*pFunc)() = &CSample::func; (obj.*pFunc)(); ↓ void func(CSample *this); void (*pFunc)(CSample*) = &func; (*pFunc)(&obj);
で、何の役に立つのこのクソ機能
ジャンプテーブルを作るとき
大して役に立たない機能は他にもあるからなぁ 全部の機能が何かの役に立つわけではないだろう
C#でdelegateでも弄ればきっとそのとてつもない便利さに目覚めるさw
248 :
208 :2008/10/07(火) 01:14:02
でもよく考えたら、 呼び出す時にインスタンス指定しなきゃいけないんだろ? 関数ポインタっつってるけど、 これ関数ポインタじゃねーじゃんwww
>>248 納得いかないなら自分でthisとメンバ関数ポインタのペア作れよ、テンプレート使えば汎用的だし簡単にできるぞ
クラスの仕組みをメモリイメージで解説してる入門書が少ないのが問題だな
役に立たない、使い道が無いと思うのは経験不足。 無理に使う必要は無いが、使ったほうが楽になる場面というのはあるもんなんだぜ。
くれぐれも覚えたてのテクだからって乱用すんなよw
濫用してみたいけど使い道が全く思いつかないから大丈夫
254 :
sage :2008/10/07(火) 01:41:26
経験豊富になっても使い道ないから安心しろ
255 :
sage :2008/10/07(火) 01:57:09
こんな機能でジャンプテーブル作るくらいなら 普通は仮想関数使うががな こんな機能を使い道あるとかいうやつは経験不足 仮想関数呼び出しにかかるコストが、とかいうやつは なんでC++使ってんだって話だよな 一応オブジェクト指向言語なんだからさぁ
オブジェォクト指向語るなら委譲くらい使いこなせるようにならないとなw
Undo機能とか、マクロ機能とか、GUIのイベントハンドラとか、使い道はあるんだぜ?
久方ぶりにC++をいじったら色々思い出せない、なんてこったぁぁぁ リハビリ兼ねて C# の Func デレゲートを作ってみた #include <stdio.h> // ヘルパーコード namespace detail { template<typename TArg1,typename TResult> class FuncBase{ public: virtual TResult operator () (TArg1) = 0 ; }; template<typename TObject,typename TArg1,typename TResult> class FuncBaseT : public FuncBase<TArg1,TResult> { TResult (TObject::*f_)(TArg1); TObject *o_; public: FuncBaseT(TObject *o,TResult (TObject::*f)(TArg1)) : o_(o) , f_(f) {} TResult operator () (TArg1 arg1) {return (o_->*f_)(arg1);} }; } // namespace detail {
// C# の Func デレゲートもどき、委譲するぜえぇぇ // TArg1 引数型、TResult 戻り値型 template<typename TArg1,typename TResult> class Func { detail::FuncBase<TArg1,TResult> *b_; public: // object 実行対象、function メンバー関数ポインタ template<typename TObject> Func(TObject *object,TResult (TObject::*function)(TArg1)) : b_(new detail::FuncBaseT<TObject,TArg1,TResult>(object,function)) {} // 関数演算子 TResult operator () (TArg1 arg1) {return (*b_)(arg1);} }; //使い方 class F2 { public: double a_; double b_; double c_; public: F2(double a ,double b,double c) : a_(a) , b_(b) , c_(c) {} // 二次方程式計算 double Calc(int x) {return a_*x*x + b_*x + c_*x;} }; int main(int,char*[]) { F2 obj(1,2,1); Func<int,double> func(&obj,&F2::Calc); printf( "%f" , func(10) ) ; }
2chの使い方も分かんねーやつに言われたくないねw 2chも満足に使えんのにオブジェクト指向言語なんてまともに使えないだろw
ヘルパーコードを取り除いて、一つのクラスにしてコンパクトにまとめた、メンバ関数以外にスタテック関数も同様に取り扱える様にして、コピー・代入・比較も追加した。 これで実用レベルかな、typedef の使い方を忘れてしまっていたのに絶望した・・・C#にもほすぃ、そろそろ寝よう template<typename TArg1,typename TResult> class Func { typedef Func<TArg1,TResult> ThisType; class Base { public: virtual TResult operator ()(TArg1) = 0 ; }; template<typename TObject> class BaseM : public Base { TResult (TObject::*f_)(TArg1); TObject *o_; public: BaseM(TObject *o,TResult (TObject::*f)(TArg1)) : o_(o) , f_(f) {} TResult operator ()(TArg1 arg1) {return (o_->*f_)(arg1);} }; class BaseS : public Base { TResult (*f_)(TArg1); public: BaseS(TResult (*f)(TArg1)) : f_(f) {} TResult operator ()(TArg1 arg1) {return (*f_)(arg1);} }; Base *b_; public: template<typename TObject> Func(TObject *object,TResult (TObject::*function)(TArg1)) : b_(new BaseM<TObject>(object,function)) {} Func(TResult (*function)(TArg1)) : b_(new BaseS(function)) {} Func(ThisType const & o) : b_(o.b_) {} ThisType & operator = (ThisType const & o) { b_(o.b) ; return *this;} bool operator == (ThisType const & o) { return b_ == o.b; } bool operator != (ThisType const & o) { return b_ != o.b; } TResult operator () (TArg1 arg1) {return (*b_)(arg1);} };
やべぇ、delete忘れてらwwwww
そこでboost::function
昨夜恥かいた子は、メンバ関数ポインタの役に立つ頻度に話をずらして 何とか急場を凌いだみたいだけど、 知識としては「メンバ関数ポインタすら知らない」ってあり得ないくらい無知だよな。
ずいぶん伸びたな メンバ関数ポインタはalgorithmの関数群を使うときに役に立つよ
266 :
デフォルトの名無しさん :2008/10/07(火) 08:15:54
粒度の小さい Adapter パターンなどにも使えるな 仮想テーブルは、クラスひとつにつき一つ固定だが、メンバ関数ポインタを使い仮想テーブルを自分で作ってしまえばインスタンスの生成後に仮想テーブルを書き換え可能にでき動的な仮想テーブルが作れる。 他にもWindow関係のクラスのメッセージ処理のように、メッセージをキューイングしたりするのにも有効。 要はめちゃめちゃ使えるという事だな。
俺も最近boost触り始めてfunction見つけて初めてメンバ関数ポインタを知った
元々の趣旨
>>190 に沿ってるから十分役に立ったんじゃね?
C++多少使えますみたいのが釣れたみたいだし。
3 [main] ? 3084 init_cheap: Couldn't reserve 3600336 bytes of space for cy gwin's heap, Win32 error 487 C:\cygwin\lib\gcc\i686-pc-cygwin\3.4.4\cc1.exe (3084): *** AllocationBase 0x0, B aseAddress 0x61820000, RegionSize 0x360000, State 0x10000 こんなエラーが出てしまったんですが、何が問題なんでしょうか。
ヒープ領域を3.6GB確保できませんでした。 アルゴリズムを根本から見直せばか。 って怒ってるんじゃね。
>>269 コンパイル時にメモリ不足だってメッセージ
えっと、今までは出なかったのが今回出るようになった? 初めてやって出たのならインストール失敗してないか。
一回入れ直したせいかもしれない…… メモリ不足……3.6Gも!? OSはXP SP2使ってます。
3.6Gって32bitの限界じゃ?
>>255 メンバ関数へのポインタが仮想関数より低コストとは考えづらい。
どっちも間接呼び出しを少なくとも1回挟む必要がある。
そういや新しい版のMore Effectiveにメンバ関数のポインタの話が載ってた気がする たしかプロトコルクラスのところだったかな
いい加減More Effective C++の日本語訳が出る予定はないんですか 赤ちゃん語版が出てるのは知ってるけど
原書嫁
俺が読むというより人に読ませたいんだよなぁ 英語だと読んでくれない
つーかまともな訳には、 C++を理解していて、なおかつ文才のある人間が必要だし、無理だろ。 どちらか一方にたけている奴はゴロゴロいるだろうが、両方優れている奴は日本にいねぇよ。
ひどい訳のひどさはそんなもんじゃねぇよ 手を抜いてるとしか思えないもの、日本語として通じてないもの たんに書いた奴に誠意がないだけ
両方持ってるやつは別分野で実力発揮しているよ
Moreじゃない方の訳者じゃダメなの?
ASCIIのときの方がよかった
MoreじゃないほうとSTLに比べると、Moreの駄目さが目立つよね
boostのany見てて思ったんだけど、実行時に構造体を作ろうとしたときに、コンパイル前に 方が分かってるのとほぼ同じコストで構造体作るにはどうしたらいいんだろうか。 例えば実行時にユーザーに型情報を入力してもらって int long char* ^Z みたいに。それで実際そういうデータの集まりの構造体があるかのように振舞わせるには
charの配列取っといて切り分けるとかしかないんじゃないの エンディアンに依存するから移植性ないけどな
コストかかるんじゃない。
>>289 サイズからオフセットと総サイズを計算しておき、それが収まる領域に各要素のプレイスメントnewしている。ヒープからの取得一回分のコストでオブジェクトが作れる。
とりあえずこんな風に作ってみました。ここもっとこうした方が効率いいとか、使いやすいとかあったら 突っ込みお願いします。 struct Struct{ vector<unsigned int> align; Struct():align(1){align[0]=0;} template<typename T> void add(){add(sizeof(T));} void add(size_t s){align.push_back(align.back() + s);} }; struct StructData{ vector<unsigned int> s;//オフセット情報 char *data; //データ本体 StructData(Struct st):s(st.align){data=(char*)malloc(s.back());} ~StructData(){free(data);} template<typename T> void assign(size_t index,T data){*(T*)(this->data + s[index]) = data;} template<typename T> T get(size_t index){return *(T*)(data + s[index]);} }; Struct str; str.add<long int>(); str.add<int>(); str.add<char>(); str.add<float>(); StructData sd(str); sd.assign(2,100); sd.assign(3,1.5f); printf("%d %f\n",sd.get<char>(2),sd.get<float>(3));
294 :
デフォルトの名無しさん :2008/10/10(金) 23:23:27
try catch 使う時は、必ず catch( ... ) 付けろって言ってる奴が会社にいるんだけど、 理由を聞いてもピンとこない。 曰く「catch( ... ) は来ちゃいけないって意味だから、未知の例外としてプログラムを終了するべき」 という事なんだけど、これってほんとなの? 「catch( ... ) は来ちゃいけないって意味」、からして間違ってると思う。。。 catch( ... )を付けるかは、例外機構の設計によるのであって、いつも付けるってのは間違ってると思う。 常にcatch( ... )で例外受けたら、目的があって誰かが投げた例外を自分のコードで揉み消す事になり、 なんだか判らない例外で或る以上、原因も判らないという事になってしまう。 ソフトが御行儀よく終了する方が良いに決まってるけどさ、 自分の判らない事まで「気を聞かせて」処理してしまうのは、ただの無責任と思うんだが。 ご意見募集。
>>294 catch で受けた後、やるべきエラー処理やってから throw; で再送できるから
不必要に揉み消すことはないよ。
>>294 catch (...)したらthrow;する。これは常識。
catch (...)は例外発生時に確実にポインタやハンドルを開放するためのものであって、例外をなかったことにするためのもんじゃない。
まあ、スマートポインタなり使えで終わる話ではあるが。
>>294 来るはずの無い例外が来たのなら、それは何らかのバグ。
きちんと捕捉して対応しないといけない。
catch(...)が無ければどっかへ飛んでいってしまうわけで。
switchのdefault的というか。
> 目的があって誰かが投げた例外
であればそれは仕様上に無いといけないし、
きちんと把握して処理しないといけない。
つまり対応するcatchを付ける。
その上で、発生しないはずの「その他」をcatch(...)で捕まえる。
> 自分のコードで揉み消す事に
消すなっての。
> 未知の例外としてプログラムを終了するべき
が何でもみ消すことになるんだ。
> なんだか判らない例外
なんだから、なんだか判らない状態になってるわけで、
そこでプログラム止めてどういう状態なのか調べないと。
catch( ... ) はそれを受けたモジュール(やクラス)が自分を正常な状態に保つ為に使って throw; で再送すれば問題ないってことか。 最初からそういってくれれば良いのに。
本当に未知の例外ならmainまで突き抜けてランタイムの例外捕捉ルーチンが始末つける。 勝手に途中でcatch(...)する必要なんか無い。
途中で catch( ... ) と throw; しても上位のモジュールでその例外を捕まえなかったら意味ないわな。 そこまでちゃんと設計してるかどうかってことなんじゃないか。
catch( ... )は未知の例外に対処するんじゃなくて 未知の例外が通過するから、その前に自分の知ってる範囲の後始末をする所 無意味ということはない
最近仕事ではJavaばっかやってるが、これExceptionに頼りすぎて、これに慣れきった技術者が心配になる GOTO信者と大差ないよな
むかし、VC++5.0だったかで、goto文で try ブロックの中に 入れるってのがあって、 仕様だったらしいけど流石に後で廃止されたという話を思い出した。 catchの中には入れたんだっけな。 goto TryBlock; try { TryBlock: } catch ( ... ) { }
304 :
デフォルトの名無しさん :2008/10/11(土) 00:52:05
35.2361 → 35°14′9.96″ 上記のように緯度経度を"度"から"度分秒"形式に 変換するコードを教えてください。 変換式は、まず 35.2361の小数点部分の0.2361×60=14.166 この結果の整数部分の14が分になります。 そして、14.166の小数点部分の0.166×60=9.96 この結果の9.96が秒になります。
そこまでわかってるなら自分でやれよ その程度C++なんか使うまでもないし
306 :
304 :2008/10/11(土) 00:59:06
初心者で全然わからないんですよ。 ちなみに初期値の35.2361は文字列です。
307 :
304 :2008/10/11(土) 01:03:52
出力値の35°14′9.96″も文字列です。 まじでお願いします。時間が無いのです。
時間がないとは、どういったお仕事ですか?
そもそもプログラムが出来ないんなら諦めたほうが早いぜ とにかくソースコード書かないと進まんだろ
学校の宿題なら諦めてくださいね
311 :
304 :2008/10/11(土) 01:11:52
>>308 仕事はハードウェアです。
時間が無いのです。誰かお願いします。
>>304 #include <stdio.h>
int main()
{
char s[] = "35.2361";
int a , b;
sscanf(s, "%d.%d", &a, &b);
printf("%d° %d’ %d.%d”", a, b * 60 / 10000, b * 60 % 10000 * 60 / 10000,
b * 60 % 10000 * 60 % 10000 / 100);
return 0;
}
>>304 #include <stdio.h>
int main()
{
char s[] = "35.2361";
char s2[500];
int a , b;
sscanf(s, "%d.%d", &a, &b);
sprintf(s2, "%d° %d’ %d.%d”", a, b * 60 / 10000,
b * 60 % 10000 * 60 / 10000,
b * 60 % 10000 * 60 % 10000 / 100);
puts(s2);
return 0;
}
ほらよ文字列出力だw
しょうがねえな int a=strtod("35.2361",0)*'2'*'P'*'_'/'&'; printf("%d°%d′%d″",a/023420,a%023420*'<'/0x2710,a%023420*'<'%0x2710*((1<<6)-4)/'d'); デバッグはしていない
#include <iostream> #include <sstream> #include <string> #include <cmath> int main() { std::string str = "35.2361"; std::istringstream os(str); int i; double d; os >> i >> d; std::cout << i << "°" << int(d * 60) << "’" << (d * 60 - std::floor(d * 60)) * 60 << "”"; }
で、「°」と「′」と「″」は全角なのか?
適切に変換しないと多分
>>312-314 はそのままじゃ動かない
でも文字コードは隠してるみたいだからそこは自分でちゃんと出来ると言うことだな
317 :
304 :2008/10/11(土) 01:38:09
>>312 〜
>>315 本当にありがとうございます。参考にさせて頂きます。
っで312〜315の中でどれが一番上司に褒められますか?
可読性やパフォーマンスなどを考慮して。
"仕事はハードウェア"って斬新な物言いだと思った。
>>317 どれもそのままは使えないっての
316考慮しないとどれでも叱られる
まあでもそこは心配ないんだよな
>>320 さっきから一体お前はどんな環境を想定しているのか
学校じゃなくても宿題は宿題なんだから このスレの範疇外だと思うが
323 :
◆ccqXAQxUxI :2008/10/11(土) 15:53:00
test
html 関連の質問です。 VC++ 2005、WinXPでプログラムを組んでいますが、あるhtmlファイルからanchorタグを読み込み、リンク先のページを取得したいと思います。 一々、自作のライブラリでリンク先を検出するようだと、作成時間がかかって仕方ないので、どなたか、htmlをパースしてリンク先のアドレスを取得できるような ライブラリや関数などをご存知の方、教えていただけないでしょうか?
エレガントなデータ構造やオブジェクト指向やらを持った 勉強になるソースはどっかに無いでしょうか? トリッキーとかの意味じゃないほうで
>>328 標準テンプレートや boost のインターフェースを読むんだ。
実装はトリッキーなものもあるから読まないほうがいいかもな。
>>328 C++ではないが、.NET Frameworkのクラス構成、インターフェースが参考になるかも。
俺もC#をしばらくやってたら、いつの間にかC++でも結構上手く書けるようになっていた。
MFCは手軽で、エレガントでいいかもな コーディング規約だけは残念だけど
MFCがエレガント?!
釣りでしょう
>>332 MFC以外のフレームワークは使ったことはあるかい?
C++だと最も手をつけやすいってことじゃねーの?
マジレスしとくと.NETやJavaのSwing辺りが良い
Swingはねーわ
C++スレだし。
Swingが良いというのはちょっとな・・・ .NETは良いかもしれないけど、C++との相性は最悪 今後普及するとも思えないC++/CLIを使うって言うのも
wxWidgets Qt FoxToolkit とかいろいろあるけどどれがいい?
.NETがライブラリとして良い設計だと思う人がいるとはショックだ ほとんど同じ機能で名前が違うクラスがたくさんあるじゃない 初めて.NETに触ったときは何だコリャっておもった どんだけ無秩序に設計したんだって呆れた覚えがある .NETはちょっとしか触ったことないんだけど 勘違いなら設計者の方々ゴメン
うん
344 :
デフォルトの名無しさん :2008/10/12(日) 20:58:59
>>342 もしかして、同じ関数をパラメータで処理を分けるべきと思ってたりする?
リンク先見てないけど、仮想関数の話か?
347 :
344 :2008/10/12(日) 21:16:00
>>345 いや、自分が驚いたのは InstallerCollection ってなに?っこと
ArrayListとかでいいじゃないかと思ったんです
InstallContext とかも存在意義がわからないし
オブジェクト指向覚えたてのルーキーが設計したみたいでしょ
>>344 それで正しい
それが一般的な書き方
NVIといわれるC++では推奨されるイディオム
>>348 generics導入前にかじった人か……その頃のクラスは結構黒歴史化してる。
template抜きのC++を使ってクラス設計したようなものだから。
351 :
344 :2008/10/12(日) 22:01:42
>>349 ありがとうございます。
NVIというイディオムなんですね。
調べてみます。
>>351 private:ではなくprotected:だね
354 :
344 :2008/10/12(日) 22:19:39
>>352 すみません。
おっしゃるprotectedはどこに適用するべきなのでしょうか?
Base::Func()のことでしょうか?
また、(もしそうだと仮定して)Base::Func()をprotectedにした場合、
privateのままのときより、どういったメリットが得られるのでしょうか?
>>354 privateだとFuncから派生元のBase::Funcを呼べなくなる。って思ったけど、純粋仮想関数だから呼ばなくって良かったのだったのか。
仮想関数ってprivateにしてても継承先でオーバーライド出来るんだね。 なんとなく違和感があるが、何の為?
>>356 元々オーバーライドを禁止する理由が無いからじゃないの?
いや、privateのメンバー変数やら普通のメソッドは継承先から見えないよね。 一律それに揃えておけば仕様が一環してて分かりやすいように思ったのだが。
オーバーライドは出来るけど、親クラス名::関数名っていう感じで明示的なコールは出来ないだろ
virtualを付けるということはオーバーライドされる事を想定してるわけで、 呼び出せなくても派生先にはそういう関数があるということは知らされるべきだと考えられる 本当に派生先に触って欲しくないならvirtualを付けなければいい
そんな仕様だったなんて、privateにvirtualつけたことがなかったから気がつかなかった
調べてみたら、C#では仮想関数にprivate指定出来なくなってるね。 確かにその方が private の意味が一環するからってことかもね。
>>358 C++ の private メンバは、見えている。禁止されているのはアクセス。
規格の 11 Member access control p4
> It should be noted that it is access to members and base classes that is controlled, not their visibility.
オーバーロードの解決なんかでも private メンバ関数は見えている。
なるほど、サンクス。
TemplateMethod用ならありかな
C++コミュニティでは仮想関数はprivateっていうのがいいとされているでしょ privateでない仮想関数はインターフェースとカスタマイズポイントの2役を担っていて良くないという理由で
>>366 >C++コミュニティでは仮想関数はprivateっていうのがいいとされているでしょ
はつみみです
protectedは見るがprivateは見たことねえなあ privateにする理由ある?
protected にする理由が無い。
常にnon-virtualなインターフェースの殻を通して呼んで欲しいものを 派生クラスから直接いじくれるようにする何かが嬉しくなるってことだよな protectedにするってことは 想像も付かん
>>344 ~Base() {};
デストラクタも virtual に
最後の;は要らん
>>370 privateだと、オーバーライドする時にスーパークラスの元関数を呼べないんじゃないか?
そんな事は無い。実装継承でぐぐれ。
>>373 派生先から呼ばれることを前提に protected にしているメンバ関数はインターフェースであり
カスタマイズポイントの役割を負わすべきではないとNVIは言う
privateでいいじゃない 呼ばせたくないんだから
>>373 が言いたいのは要するにこういう事?(
>>344 の例で行くと)
void Derived::Func()
{
... //追加の処理
Base::Func(); //呼べねえ困った
}
でもそういう共通処理をやるために噛ませてるのがBaseFunc()なんだから
そっちに書けばBase::Func()は実装なしに出来るし、
Base::Func()を最後に呼べなんていう忘れられがちな約束を派生先としなくて済む
というかそれが目的でこんな事してるんだ
Base::Func()をするタイミングが派生先によってコロコロ変わるってなら
確かにprotectedにしないといけないけど、その場合そもそもNVIする意味がない
virtual ~Dtor() = 0; ってダメだっけ?
どっかに実体を定義する必要がある
何もしないなら virtual ~Dtor() = 0 {} でおk どうでもいいけど純粋仮想デストラクタって必殺技の名前みたいだよな
いや全然
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
>>382 仕様
そこまでは探してくれない
対策は asdf を外に出す
下記で a は int だけど f(int(0)) はどうなる? template<class T> struct A { typedef T type; }; template<class T> void f(typename A<T>::type); A<int>::type a; f(a);
逆にboost::implicit_castなんか探索されない仕様を活用している。
C++コミュニティでは仮想関数はprivateが常識ですよ レベル低い奴は帰ってね
privateかprotectedで宗教戦争レベルには落ち着いていると思う。 とりあえずpublicでさえなければどっちでもいい。
>>387 は? private と protected は全然違うだろ?
どっちでもいいわけがない。
PIMPLイディオムよりは認知されているようだ C++ nvi の検索結果 約 38,700 件中 1 - 50 件目 (0.50 秒) C++ pimpl の検索結果 約 26,100 件中 1 - 50 件目 (0.60 秒)
五十歩百歩じゃねーかw
たかがC++ごときで粋がるなよあんちゃん 世の中広いんだぜ お前の知らないことを知ってるやつなんてごまんといる。
393 :
デフォルトの名無しさん :2008/10/13(月) 18:53:11
こういう話題について WAN 側でぺらぺらしゃべくる奇特な人口を世界の趨勢と勘違いしてる痛い香具師が後を絶たない
メンバ関数は全てpublicにせよ(あとでいじれないと困るから) という嘆かわしいルールで開発してる所も未だに実在しますので
395 :
デフォルトの名無しさん :2008/10/13(月) 19:25:06
>>393 メンバ関数ならまだマシ。
俺のところはメンバ変数も全てpublicだ。
もちろん理由はみんながいじれないと困るから。
アンカー間違ったけどどうでもいいや
>>398 それなら class ではなく struct を使えばいいな
既存のコードを変更する恐怖が生んだルールですね 自動化されたテストがないんですね でもテストの自動化が非常に困難なプロジェクトでは理にかなったルールなのかも知れない
402 :
デフォルトの名無しさん :2008/10/13(月) 23:41:22
テストの自動化どころか、ロジックの自動化が(ry
403 :
ちんぱんじー :2008/10/14(火) 00:24:45
ヘッダーファイル<*.h>ってなんですか? 教えてください
インクルードすると色々な関数が使えるようになる魔法のファイル
コンパイル時に、その先のファイルの内容が、ごそっとその場所にコピペされると思えばいい
406 :
ちんぱんじー :2008/10/14(火) 00:52:06
インクルードファイルが開けませんってでたんですが、 それはヘッダーファイルと関連性はあるんですか?
>>406 もっとわかりやすく質問したほうがいいと思います
408 :
ちんぱんじー :2008/10/14(火) 00:55:58
質問内容変えます。 つまりhファイルがないとどうなるんですか?
>>408 そのhなファイルの内容について詳しく。
410 :
ちんぱんじー :2008/10/14(火) 01:00:46
#ifndef CALIB_CAMERA_H #define CALIB_CAMERA_H #include <AR/gsub_lite.h> #define H_NUM 6 #define V_NUM 4 #define LOOP_MAX 20 #define THRESH 100 typedef struct { double x_coord; double y_coord; } CALIB_COORD_T; typedef struct patt { unsigned char *savedImage[LOOP_MAX]; ARGL_CONTEXT_SETTINGS_REF arglSettings[LOOP_MAX]; CALIB_COORD_T *world_coord; CALIB_COORD_T *point[LOOP_MAX]; int h_num; // Number of dots horizontally in the calibration pattern. int v_num; // Number of dots vertically in the calibration pattern. int loop_num; // How many images of the complete calibration patterns we have completed. } CALIB_PATT_T; void calc_distortion( CALIB_PATT_T *patt, int xsize, int ysize, double dist_factor[3] ); int calc_inp( CALIB_PATT_T *patt, double dist_factor[4], int xsize, int ysize, double mat[3][4] ); #endif // CALIB_CAMERA_H
>>403 たぶんC++勉強し始めたばかりで分からないことは2chで聞いとけって思ってるんだろうけど、
なんでもここで聞くというより最低限の入門書/入門サイトで一通り勉強してきたら?
ヘッダファイルが何なのかすら載ってないようなら、他の本/サイトを探すべき。
412 :
ちんぱんじー :2008/10/14(火) 01:03:25
いちおうコピペしましたが。 ヘッダーファイルの内容かかわらず、 具体的にどのようなエラーがでるんですか? 関数を処理できないとか
413 :
ちんぱんじー :2008/10/14(火) 01:04:41
>>411 その通りですね、新しい本買ってみます。
>>412 どんなエラーが出るかはヘッダファイルの内容とそれをインクルードするファイルの内容によって変わります
たとえば構造体のサイズや構成がわからないとか
定数や変数が定義、宣言されていないとか
C++では関数のシグニチャがわからないとか
ARToolKitか。 まずは環境作らないとね
416 :
146 :2008/10/14(火) 12:13:52
関数内で定義したクラスにテンプレートメンバー関数を定義できないのはなぜですか? VC8ではできませんでした。
419 :
146 :2008/10/14(火) 14:08:25
>>418 ありがとうございます。
できれば便利だと思ったのですが残念です。
System::String の変数を const char[] にキャストして代入したいのですが、 色々調べてやってみたのですが上手くキャストできません。 お手数ですが良い方法は無いでしょうか?
配列の変数をlvalueにできたっけ?
422 :
デフォルトの名無しさん :2008/10/14(火) 14:36:29
stdだと、&s[0]かs.c_str()
&*s.begin()
>>420 C++/CLI?
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsiで変換できるよ
あと、C++/CLIには専用スレがあるよ
425 :
420 :2008/10/14(火) 15:50:12
皆さん色々と教えていただきありがとうございます。 使用しているのは Visual C++ 2005 Expressです。 std::stringだとc_str() や begin() は使用できるのですが、 System::String だと無理のようです。 でも System::String -> td::stringのキャスト方法もありそうなので、 色々と調べてみます。 System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi も試してみます。
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
postした後にF5やリロードボタンでリロードするのはやめろ
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
悲しみとかないの?
は?
ひ?
うざい質問は答える気が起きない(それ以前に読む気が起きない)
内包されたクラスをoperator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a)で出力しようとしても探査に失敗します。 なぜでしょうか?対策を教えてください。 #include <iostream> namespace tekitou{ template<typename T> struct test{ struct asdf{}; }; template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const test<A> &a){ os << "test"; return os; } //こいつが探査されない template<typename T, typename E, typename A> std::basic_ostream<T, E> &operator <<(std::basic_ostream<T, E> &os, const typename test<A>::asdf &a){ os << "asdf"; return os; } } int main(){ //これはコンパイルできる tekitou::test<void> a; std::cout << a << std::endl; //なぜか関数の探査に失敗する tekitou::test<void>::asdf b; std::cout << b << std::endl; return 0; }
この質問はどこかで読んだような気がする。
おれも少し前にも見た気がする
気のせいじゃね?
template<typename T, typename E> std::basic_ostream<T, E > &operator<<(std::basic_ostream<T, E> &os, typename tekitou::test<void>::asdf &a) { os << "asdf"; return os; }
(´・∀・`)ヘー
>>437 A が推測できないから、その関数が実態されず、コールできない。
tekitou::operator <<<char, std::char_traits<char>, void>(std::cout, b);
ってしたらコールできる。
よくわかんねぇ〜けどwww
無い知識しぼりだして答えてみたwww
>>443 >>437 ○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
>>443 >>437 ○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
446 :
デフォルトの名無しさん :2008/10/14(火) 21:57:04
× 実態化 △ 実体化 ○ 具現 内臓デバイスみたいな間違いこくなよ
実態もだが開放も間違って返還される確立他界よな
>>446 ちなみに、「間違い」は「こく」ものではなく、「する」ものですけどね
教えてください。 base64をデコードできるライブラリはありますか?
451 :
デフォルトの名無しさん :2008/10/14(火) 22:39:23
そんくらい自分で作れw 十数行で出来るだろ
実体化のほうが好みだけど、X3014では具現化なんだよな……。
"C++ 具現", "C++ 実体化" でググると、一万七千件と七万千件か。
>>454 ああ、すっかり忘れてた。そういえばそんなのあったね。
JIS規格を読んでいる日本人なんて、本家のISO/IEC 14882を読んでいる日本人より少なそうだが。
自身の型を返す関数を注入するテンプレートを作ろうとしてCRTPをやる際に、 テンプレート自身が純粋仮想関数をもつクラスの派生だと通らないのですが、 これって解決できないでしょうか。 class Derived: public Base<Derived> { ... } が通るのはいいとして、 class Interface { Interface* f()=0; } template<class C> class Base: public Interface { C* f() { return static_cast<C*>() } } class Derived: public Base<Derived> { ... } とすると、 DerivedがBaseの派生であることが定義されないままBase<Derived>が実体化されるので、 Base中のCがInterfaceを継承したものと認識されずにコンパイル不可になります。
457 :
デフォルトの名無しさん :2008/10/14(火) 23:58:01
VisualC++2008ExpressとDirectXSDKをインストールしたのに ファイル→新規作成→プロジェクト をしてもDirectX App....とかが出ない。どうしてでしょう・・
スレ違い
>>449 おれも「こく」より「する」派だな.おならもね.
>>457 ディレクトリにDirectXが追加されてるかは見た?
>>456 Base<C>::f の戻り型はC*にする必要があるの?
Interfaceを通して扱うのなら、Interface* でもいいのではと思った。
>>437 優しい俺様が問題点を3行にまとめてさしあげます
template<typename T> struct test{ struct asdf{}; };
template<typename T> void f(const typename test<T>::asdf &a);
int main() { f(test<void>::asdf()); }
463 :
457 :2008/10/15(水) 03:34:51
>>458 すいません。別スレに移って聞いて見ます。すれ違いすいませんでした。
>>460 実行可能ファイル、インクルードファイル、ライブラリにもちゃんと入ってましたが何も変わりませんでした。
>>461 456ではないが、共変戻り値を使いたいのだから答えになってないのでは?
Interface*を返すぐらいならBase<C>*を返す方が(こちらはコンパイルできる)、まだ意図に近い。
>>464 そういう意図です。
Interfaceを継承させても扱いたいが、
単独で動作させることが多いんで、
メソッドチェーンを使いたいが困った、といった感じです。
>>465 cloneが最端で実装するかないのと同じ理由でダメなんじゃないだろうか
あるクラスに他のクラスを登録するという仕組みで悩んでいます。 class Item{ }; class Hoge{ std::vector<Item> items; public: void add(Item); Item get(); }; このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか で悩んでいます。どこからでも登録できるようにして、あまりオブジェクトの削除の面倒なども見たくないので スマートポインタとして取ろうかと思っているんですが、なにかコペルニクス的実装はないでしょうか?
オブジェクトのオーナーは誰よ。
>>467 > あるクラスに他のクラスを登録するという仕組みで悩んでいます。
「登録」の意味が曖昧
Item を Hoge の所有物にしたいと見えるが (つまりは composite) 違うのかな?
> このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか
> で悩んでいます。
const& Item で良いと思うが
何か良くないことがあるので悩んでいるのだろうか?
> どこからでも登録できるようにして、
これは access 権のことなのか?
何ら問題ないように思うが
> あまりオブジェクトの削除の面倒なども見たくないので
composite なら何の問題もないと思うが
あ、俺、何が問題なのか全然見当ついてないわ
経験のなさだな>問題
addもgetも自由に出来るようにするならHogeなんてクラスいらんがな vector<Item>をそのまま扱えばいい そういう話じゃなくて?
C言語では、linuxでいうところのman -S 3 strlenなどで includeするヘッダファイル名を知ることができたり ヘッダファイル名の中で宣言されている関数名を知ることができたのですが C++では、こういった体系的な情報はどうしたら得ることができるのでしょうか? linuxではなくwindowsでも結構です。よろしくお願いします。
ISO/IEC 14882:2003かJIS X3014でも読むがいい
474 :
472 :2008/10/16(木) 02:56:09
業務上で使うプログラムではなく趣味レベルで考えていますので まだ規格書まで読み解こうとは思っておりません。 使うにあたって、もう少しリファレンスしやすいものを勧めていただけたら幸いです。 というのも、実は勉強しはじめるときに使ったwebサイトでは、 include文ではC言語と異なり<iostream>のように.hを除いた名前を使用するように 書いてあり、VC++2008で実行確認しながら進めていたのですが、 先日買った「C++ クラスと継承 完全制覇」という書籍では、 これらが全て.hの付いた名前で使用されており、 coutについてもusing namespaceしていないのにstd::をつけていない状態でした。 環境を変えてgccではコンパイルできたのですが、それでも警告が出る状態でして 結局VC++2008付属のコンパイラではコンパイルすらできませんでした。 調べた結果、中で使われていたstrcpy()をstrcpy_s()にしないとならなかったり、 includeでは.hをつけない、coutはやはりstd::coutで使用しないと名前解決できないなどでした。 これからも個々の問題の解決方法を調べるのが大変だと思い、簡単なリファレンスを探しているのです。 長くなりましたがよろしくお願いします。
>>474 C++は比較的最近にも規格がかなり変わって、ちゃんとそれが使われてるるので
古い本はよした方がいい
strcpyの件はそれとは違うけど
479 :
472 :2008/10/16(木) 03:30:08
>>475-478 ありがとうございます。
上に挙げた書籍は2002年に発売されたものなので
比較的新しいと思ったのですがこれでも古いのですね・・・
Programming: Principles and Practice Using C++は
結構いい値段しますが格式高そうな本でいいですね。
オライリーの方は本屋にありそうですので、立ち読みしてみます。
結局、linuxのmanコマンドでCのリファレンスがあるのは
システムプログラミングの側面があるからなのでしょうね。
C++は膨大なものなのだそうで仕方ないのかもしれませんが、残念です.
>>474 >477で勧められている本がマジで良い.あちしは職場と自宅に一冊ずつ用意して使ってる.
STLを使ったジェネリックプログラミングなどについては一切解説していないので、その辺の知識は別の本が良いだろうけど.
>>474 strcpy_sは、MS独自の関数だよね。
移植性が大事なら警告をオフにしてstrcpyを使うべきだね。 C++なら_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESである程度対応できるし。
C++的には本当はstringを使うべきなのかもしれんがな
484 :
デフォルトの名無しさん :2008/10/16(木) 21:58:08
だって…あんなものを必ず使えだなんて言えない…
てすつ
>>468 オーナーはHoge意外とだけ言っておきます。
>>469 登録というのは例えばリスナーを登録する時のように、オブジェクトに
イベントを通達できるような何らかのアクセス手段を持たせておくことです。
後出しで申し訳ないのですが、Itemは多態をさせたいので、そもそも実体では無理でした。すいません。
どこからでもというのは特に気にしなくていいです。
Itemをポインタにしたときnewして登録したあと、Hogeにdeleteさせるのは気持ち悪いなと思ったので・・・
ていうか普通はリスナーとかってどう実装すべきなんだろう
>>487 ほぼ自分で答え出てるじゃん
リスナーはキャスターの所有物ではない
ItemはHogeの所有物ではない
Itemをcompositeする(所有する)のはHoge意外の何か別の人
HogeのインターフェースはItemの参照でもポインタでもお好きに
boost::function + shared_ptr
std::map<int, int> *pmap = new std::map<int, int>(); int v = pmap[5]; と書くと
なんと!
コンパイルエラーが出ます
ナンダッテー!
>>491 少なくともstd::map<int, int> v = pmap[5]; だろ
それにpmap[0]にしか実体が存在してないのでpmap[5]には
何が入っているかわからない
(*pmap+1)になってoperator[Key]が呼ばれないのね。ってことでふぁ。
int v = (*pe1)[5];
498 :
デフォルトの名無しさん :2008/10/18(土) 19:06:23
質問させてください。 std::stack<T, std::list<T> >にpushやpopするとき、 push/popされるTオブジェクト以外、 つまり既に格納されているTオブジェクトに対しては、コピーは発生しませんよね? 規格で保証されてますよね?
>>499 ありがとうございました。
これで安心してTに大きなオブジェクトを使用しようと思います。
501 :
デフォルトの名無しさん :2008/10/18(土) 23:30:30
どなたか、お助け下さい。 char を wchar_t に変換する必要があったので、色々調べてみたのですが、よく分からない所があったので質問します。 char から wchar_t への変換には、mbstowcs() か Win32APIの MultiByteToWideChar() を使えばいいというのは分かったのですが、 mbstowcs を使うと問題が発生します。 c:\\ダミー\\dummy.file\0\0 のような double null-terminated な文字列を変換するとき、 mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。 (MultiByteToWideCharだと最後の\0\0も含めて変換してくれるようです) いくつかの'\0'も含めてワイド文字列に変換するにはどうすれば良いのでしょうか? 携帯から書き込みしています。見にくかったらすみません。
\0\0に出会うまでmbstowcsを何度も使えばいいかと
STLはlambdaを早く導入してもらわんと使い物にならんな
なわけないだろ
そうだそうだ コンセプトも欲しい。
SHFileOperation でフォルダーが削除出来ない orz c:\ダミー\ だとエラーがでるし c:\ダミー だと削除は出来るがアクセスエラーがでるし もう訳ワカメ ('A`)
\0\0
>>501 > mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。
仕様です
>>507 削除できてんじゃん
つかスレ違いじゃね?
>>484 string はbasic_string<T, Trait> の、特定のテンプレート引数による実体化になっており、Traitの部分で
「どの文字とどの文字が等価か」などが定義されている.また、これに基づいて辞書式順序も定義される.
場合によってはそれが邪魔になる.
>>499 安心していいのかい?
stack<T> theStack;
theStack.push_back(new T());
でTのコンストラクタが例外を投げたときにどうやってリカバリする?
513 :
512 :2008/10/19(日) 10:52:38
stack<T> に new T() は push_backできへんやろ・・
仮に *T or shared_ptr<T> だったとするなら、push_back と new という 2 つの操作を一文で行おうとするのが間違い。
×*T ○T* あと、stack のテンプレートパラメータがってことね。
\0に到達した時点で関数が変換を止めてしまう そりゃ文字列の終わりだから 長さを指定しないと永遠に続けることになる
ストリーミング型配列を扱うクラスを作りたいと思っています。 struct Vector { float x, y; Vector(){}; Vector(float _x, float _y) { x = _x; y = _y; } }; のようなクラスがあって、これの配列を class VectorArray { float x[10]; float y[10]; }; のように定義してoperator[]を使って読み書き出来るようにしたいのですが、 読み出しだけだったら Vector operator[](int n) { return Vector(x[n], y[n]); } で出来たのですが、 VectorArray[n] = Vector(0, 0); のように書き込めるようにするにはどうしたらよいのでしょうか? どなたか教えて下さい。
>>518 戻り値を参照にすればいい筈…
Vector& operator[](int n)
{
return Vector(x[n], y[n]);
}
>>518 質問と関係ないが
_(アンダースコア)で始まる変数名を使うのはよろしくないぜよ
標準ヘッダの定義と被っても文句は言えない
大文字が続いてなければ、非グローバルスコープで使っても大丈夫。 条件を確認するのがメンドイから全部禁止と考えたほうが楽だけどね。
>>519 デタラメ言うな
>>518 そのままだとトリッキーなことをしないとダメなので
VectorArrayの定義をVectorの配列にすれば簡単
class VectorArray {
Vector v[10];
};
Vector& operator[](int n) {
return v[n];
}
const
書いてる間に新着レスが
どうしてもVectorArrayを変更できない場合は
>>522 のいうような「トリッキーなこと」をする必要がある。
たとえばこんな感じ
struct VectorProxy {
VectorArray*a_;
int n_;
VectorProxy(VectorArray*a,int n):a_(a),n_(n){}
operator Vector() const {
return Vector(a_->x[n_],a_->y[n_]);
}
VectorProxy& operator=(Vector const& v) {
a_->x[n_]=v.x; a_->y[n_]=v.y; return *this;
}
};
VectorProxy VectorArray::operator[](int n) {
return VectorProxy(this,n);
}
>>521 2文字目が小文字(大文字とアンダースコア以外)ならOKなんだね
フォローありがと
m_hoge ってのもだめなの?
>>526 問題ない。 >525 は先頭がアンダースコアで始まる名前の話 (>520-521) だよ。
528 :
518 :2008/10/19(日) 19:30:21
>>522 あー、なるほど、そういう方法があるんですね。とても参考になりました。
御回答下さった皆様、どうもありがとうございました。
std::vector<T>::swapが例外を投げない保証はあるのでしょうか?
Tに依存するところがないんじゃね?
532 :
デフォルトの名無しさん :2008/10/19(日) 22:25:37
>>530 ISO/IEC14882 23.2.4 の段落 2 によれば、保証はない。
> class vector {
(中略)
> void swap(vector<T,Allocator>&);
と、例外指定がないことが示されている。
T::operator = とかが例外投げたらそれがそのままくるだろうね
それはswapの実装次第じゃね
>>532 俺が見ているのはJIS X3014:2003なんだが、
23.1 コンテナに対する要件の10段落目の中にこう書いてある。
- コンテナの比較子オブジェクト(23.1.2参照)(もし存在すれば)の
コピーコンストラクタまたは代入演算子が送出する例外を除いて、
関数swapは例外を送出しない。
>>535 例外を送出しないことを関数のシグネチャに含めてしまうと色々不便だから書いていないだけで
実際には例外を送出しないように規定されているわけか.
537 :
デフォルトの名無しさん :2008/10/20(月) 00:06:35
>>535 なんか 23.2.4.3 の説明が変だね。
23.2.4 の段落 2 では
> // 23.2.4.3 modifiers:
(中略)
> void swap(vector<T, Allocator>&);
とあるのに、
23.2.4.3 には swap の説明がない。
>>531 ,533 が言っているようなことは当然考えられるし、比較子が swap にどう関係するのか説明がないのは変だろ。
しかも JIS に至っては、
23.2.4 の段落 2 で modifiers を修飾子と訳しているのに、
23.2.4.3 では変更子になっている。まあ、これは単語の誤訳でも別にいいんだが。
C++ Standard Library Active Issues List (Revision R60)
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html でも、特に変更は見あたらないようだが、、、?
原文に説明があってこそ、初めて deffects になれるのかな。
538 :
デフォルトの名無しさん :2008/10/20(月) 00:08:42
>>536 「〜を除いて、」とあるから、「〜」に該当する場合は例外を送出するとも読めるだろ
vector は比較子オブジェクトを持ってないけどね
>>537 swapについては表65-1 コンテナ要件1(PDFだと23.1の中)で説明済みってことなんだろ。
いちいち書いていたらページ数が膨れ上がって仕がない。
比較子については疑問だが、とりあえずvectorには関係ない
(それは23.1.2が連想コンテナという項目から明らか)ので今は無視しよう。
それじゃあ少なくともTが組み込み型だと投げないわけか
542 :
536 :2008/10/20(月) 02:49:38
543 :
デフォルトの名無しさん :2008/10/20(月) 03:04:35
絶対に例外を投げない関数には "throw ()" と書いて済ませる
(コメントで書かなくてもよくする)ことを考えてるんだけど、
↓で言われてるような効率の低下が実際に起こるコンパイラって知ってる?
http://www.boost.org/development/requirements.html#Exception-specification > A "dumb" compiler, however, may make all kinds of pessimizations.
>
> For example, some compilers turn off inlining if there is an exception-specification.
> Some compilers add try/catch blocks.
そういうのは相当古いコンパイラだけと決め付けて切り捨てちゃおうかと思ってるん
だけど、大丈夫かな?
throw()なら例外が起きないんだからオーバーヘッドは無いと信じたい 実際、throw()ならboostでも使われてるし
>>544 "例外が起きない" じゃなくて、"例外がスローされてはならない" じゃなかったか?
例外がスローされた場合は、unexpected関数が呼び出されるはず
たぶん、それをするためのコードをベタ書きしちゃうのが A "dumb" compiler なんだろ
今月からガソリン価格がTOCOM、WTI原油先物相場を迅速に反映させた売値になりました! 先週のWTI相場1バレル70−75ドルを換算し、円高という値下げ要因を加味すると 来週月曜(10月27日)からレギュラーガソリンが全国平均128円になる「はず」なのです! _____ .ni 7 / \ l^l | | l ,/.) / /・\ /・\ \ .n ', U ! レ' / |  ̄ ̄  ̄ ̄ | l^l.| | /) / 〈 | (_人_) | | U レ'//) 値下げしないよ〜〜んw ヽっ \ | / ノ / /´ ̄ ̄ ノ \_| \rニ | `ヽ l 日清食品 出光興産 新日本石油 山崎製パン 便乗値上げ四天王「日の出新山」
547 :
デフォルトの名無しさん :2008/10/20(月) 18:46:40
Test::Func のポインタを static 変数の Test2::s_pFunc にセットして、 呼び出したいんですが、どうやってもコンパイルが通りません。 class Test { public: void Func() { std::cout << "Func!" << std::endl; } }; class Test2 { public: static void (Test::*s_pFunc)(); void (Test::*m_pFunc)(); }; int main() { Test obj; Test2 obj2; obj2.m_pFunc = &Test::Func; // OK (obj.*(obj2.m_pFunc))(); // OK Test2::s_pFunc = &Test::Func; // NG コンパイルエラー (obj.*(Test2::s_pFunc))(); // NG コンパイルエラー return 0; } よろしくおねがいします。
>>547 error message くらい晒したらどうか
俺は通った
俺はリンクエラーが出た まあTest2::s_pFuncの実体が定義されてないから当たり前だけど
550 :
デフォルトの名無しさん :2008/10/20(月) 19:42:49
すみません、コンパイルエラーではなく、リンクエラーの間違いでした。 おっしゃるとおり、実体がないのにリンク通るわけないですね。 class Test2 { public: static void (Test::*s_pFunc)(); }; void (Test::*Test2::s_pFunc)() = &Test::Func; とすればよかったのですね。 失礼しました。
標準やboostにstring<->wstringの変換を行う関数ってないんですか? 検索してみても、手間がかかる方法ばかりで、そのものズバリという方法が出てこない・・。
>>551 そもそも「そのものズバリ」なんて方法が存在し得ない。
string に入っているデータの文字エンコードが euc なのか sjis なのかそれとも utf-8 なのかわからないんだから。
だからboostと書いてるんじゃないのか
>>553 意味がわからんぞ
boostだからどうだというんだ
>>551 標準的には codecvt で提供してるつもりなんだろうけど、超メンドイよな。
結局 mbstowcs とか使って自作したことがある。
C++0x では codecvt が何とか使い物になりそうな感じ。
漏れはMultiByteToWideCharでやってるわ ATLならCA2Wとか
557 :
551 :2008/10/21(火) 06:08:06
レスthx
>>552 やはりないんですか。
標準にmbstowcs()とwcstombs()はあるんだから、それをラップした関数がstringにあってもよさそうに・・・。
>>555 ,556
やはりそのあたりの関数を使ってやるしかないんですね。
頻出の部分なのに、すっきりしないですねぇ。
558 :
デフォルトの名無しさん :2008/10/21(火) 06:20:35
速度と汎用性ではMultiByteToWideChar
559 :
デフォルトの名無しさん :2008/10/21(火) 06:22:18
これでやっている int char2wchar(string x, wstring &y){ int m=x.size(); if(m<=0)return 0; y.resize(m); m=MultiByteToWideChar(CP_ACP, 0, &x[0], m, &y[0], m); y.resize(m); y[m]=0; return 1;} int wchar2char(wstring x, string &y){ int m=x.size(); if(m<=0)return 0; y.resize(2*m); m=WideCharToMultiByte(CP_ACP, 0, &x[0], m, &y[0], 2*m, NULL, NULL); y.resize(m); y[m]=0; return 1;}
MultiByteToWideChar に便乗。 今、SJIS → UTF8 に変換する必要があったんだけど、MultiByte 同士の変換 API ってない? 結局 MultiByteToWideChar と WideCharToMultiByte で、SJIS → Unicode → UTF8 と2段階で変換したけどなんか無駄なことしてる気がする
テストに関して相談です。 システムコールとかのエラーのテストってどうやって起こしたりしてますか? writeとかreadの際のエラー時のコードをどう実行させればいいのかが よくわかりません。 どなたかわかる方いますか? (テストフレームワークとしては、googletestを使っています)
562 :
デフォルトの名無しさん :2008/10/21(火) 14:34:00
うごきません。 最後の行を動かしたいです。 どうやれば良いですか? class ClassA { public: int m; } ; template<ClassA &x> class ClassB { public: int n; }; int main(){ ClassA a; ClassB< a > b; }
563 :
デフォルトの名無しさん :2008/10/21(火) 14:36:17
すみません。これでいいようです。 class ClassA { public: int m; } ; class ClassB { public: int n; ClassB(ClassA x){} }; int main(){ ClassA a; ClassB b(a); }
564 :
デフォルトの名無しさん :2008/10/21(火) 16:41:49
こんにちは。 gccを使用のC++初心者です。。 拙い質問、大変恐縮です。 とあるライブラリに ClassName Instance = ClassName(); という表記がありました。 次の表記、 ClassName Instance = new ClassName(); との差異が解らないのですが、どなたか教えていただけますでしょうか?
566 :
564 :2008/10/21(火) 17:07:06
エラーになりました。 newはポインタを返し、上の例のようにインスタンスの実体(?)を指す変数にいきなり代入するときはnew不要ということなのでしょうか?
いきなりというか、普通に代入してるだけ ClassName Instance1(); ClassName Instance2 = Instance1; と似たようなもの
>>560 WindowsならConvertINetString (要IE 5.5)ってのがあるけど、
おそらくこれも中ではUTF-16を介している。
ほかのライブラリもみんな中ではUnicodeを介すのが一般的だと思う。
>>566 上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
なのでその行でコピーするなりする。
newしたものはdeleteするまであり続ける。
どこにあるのかわからないと使えないからポインタを覚えておく。
>>560 SJISとUnicode、つーかUTF-16 or UCS-2の変換は文字集合間、UTF-16からUTF-8への変換は表現形式の変換。
まあ、SJISからUTF-8に変換する変換テーブルとかも作れないことは無いが、メモリ無駄に食うだけだから普通はやらない
ある画像からある画像をを引くプログラムってどう作りますか?
>>571 「引く」ってどういう処理をイメージしてんの?
>>572 輝度温度を引く画像です。
それぞれ別々の輝度温度の画像(例えばR1、R2)があって
これをR1画像からR2の画像を引くような画像です
画像を扱うにはどうしたらいいのか聞いてるのか?
std::wstring hoge = L"文字列のようなもの。" size_t dsize = 0, ssize = 0; mbstowcs_s(&ssize, NULL, 0, hoge.c_str(), _TRUNCATE); std::string buffer(ssize); mbstowcs_s(&dsize, &buffer[0], ssize, hoge.c_str(), _TRUNCATE);
>>575 文字列クラスのポインタに勝手に書き込んでもいいの?
画像を読み込んで、引き算するようなプログラムかな?
そうです
画像を読み込むところから作るの?
いやそれstringとwstringが逆だろ
fatal error C1853: '.\../../../Build/Obj/MfColors/Debug/MfColors.pch' プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。 また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています (その逆も考えられます)。 というエラーメッセージが出て、stdafx.hの行をさしています。 このエラーはいったいどうすれば解決できるのでしょうか。
リビルド あと、cとcpp混在してる?
585 :
583 :2008/10/21(火) 19:30:18
リビルドしても同じエラーがでてます。 cとcppは混在です。 extern "C"{} は一応つかってます。
VC++のプリコンパイルヘッダは、そこで言われているようにCとC++で共通利用できない。 言語をどっちかに統一するか、片方の言語でのみPCHを使うようにするかしないといけない。
587 :
583 :2008/10/21(火) 19:43:59
すいません、解決しました。 「プリコンパイル済みヘッダをインクルードする」という設定を しないに変えたら動きました。
>>567 > いきなりというか、普通に代入してるだけ
代入はしてないね
>>569 >
>>566 > 上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
作らないね
小室直樹の本を読んでるけど 投資をどんどんやれば景気は回復する。 あとプロテスタントの倫理と資本主義の精神を持たないといけないんだって。 (1)宗教的に働くことが重要で経営や労働自体に喜びを感じる。 (2)いくら儲けても貯金や消費しないで投資する。 資本主義の精神を持って投資にどんどんお金を使えば不況なんか絶対こないみたいだぞ。 簡単だね。
>>567 > ClassName Instance1();
これだと、引数なしでClassNameを返す「関数」Instance1の宣言になる
592 :
デフォルトの名無しさん :2008/10/21(火) 21:48:37
>>592 規格で「作らないことを許されている」から、
「作る」と断言できないんじゃない?
本来のセマンティクスでは、だろ? ClassName()で、ClassNameのデフォルトコンストラクタで一時オブジェクトを作る その一時オブジェクトを引数にとったコピーコンストラクタでInstanceを作る コードはそういう意味のはず そのように見せかけるだけで、実際にはオブジェクト作らないように コンパイラが裏で細工しても良いってのはまた別の話
595 :
593 :2008/10/21(火) 22:54:05
>>594 それって単に見た目上の意味じゃん。
規格を考慮した上でコードの意味を考えれば、
「作る」と言えないんじゃないかって言いたかった。
ま、単なる言葉の行き違いな気もするが。
596 :
デフォルトの名無しさん :2008/10/21(火) 23:01:48
>>595 本当か? 本来のセマンティクスとある処理系での実行結果がなぜ違うか認識していたか?
とりあえずClassNameのデフォルトコンストラクタ、コピーコンストラクタ、デストラクタの どれかをユーザー定義してた場合は一時オブジェクトの生成は省略出来ない 全部なければコンパイラが省略してくれるかもしれないってだけ ClassNameの詳細が不明なら、一時オブジェクト作ると思っといた方がいいね
598 :
593 :2008/10/21(火) 23:19:07
>>596 ごめん、何が言いたいのかさっぱりわからん。
まず、「本来のセマンティクス」ってのがオレの主張する方と
594が主張してる方のどっちが正しいのかもはっきりしていないじゃん。
セマンティクスという言葉は普通お前が言ってるような意味では使わない コードのセマンティクスというのはコンパイラの吐くバイトコードとは別に存在するもの
600 :
デフォルトの名無しさん :2008/10/21(火) 23:33:16
601 :
593 :2008/10/21(火) 23:35:03
>>599 わかった。
規格の12.2で、「一時オブジェクトの生成が避けられる場合であっても、
すべての意味規則上の制約は、一時オブジェクトが生成されたかのように
遵守しなければならない」とあるから、確かに594が正しいね。
602 :
593 :2008/10/22(水) 00:08:38
>>597 規格の12.8.15を読んだ限り、デフォルトコンストラクタはともかく、
コピーコンストラクタ、デストラクタは関係ないみたいだけど
603 :
デフォルトの名無しさん :2008/10/22(水) 11:39:43
>581 opencv,cvSub
ここって実際仕事でC++使ってる人とかいるのか?
ノシ
サボってないで仕事しろ
今は使ってないな たぶん来年のプロジェクトでMFCやると思う
ご愁傷さまです。
いきなりの質問で申し訳ありません。 C++を勉強中の者です。 関数テンプレートを関数ポインタを経由して呼び出したいのですが そういったことはできるのでしょうか? また、どのように書けばよろしいのでしょうか? 参考になるページなどありましたら教えて頂ければありがたいです。
>>609 できるよ。テンプレートじゃない時とだいたいいっしょだけど、テンプレート引数を
明示的に示す必要があるかもしれない。
c++の開発環境をemacsで作ってるかた どんな環境なのかおおしえいただけないでしょうか? 参考にしたいです
>>611 kterm + emacs -nw
または
TeraTermPro + emacs -nw
615 :
デフォルトの名無しさん :2008/10/27(月) 13:57:03
(1) MyClass myobj; MyClass *pObj = &myobj; (2) MyClass *pObj = new MyClass(); 上の2つなんですが何か違いはあるんでしょうか?オブジェクとが確保されるメモリ領域など違いはありますか?
全然違う MyClass myobj はどこに作ってんのかな?
違う (1)だとスコープ抜けたら消える 後スタックかヒープかも違う
かぶったぁあああ
619 :
デフォルトの名無しさん :2008/10/27(月) 14:05:31
両方ともローカル関数内です。 (1)はスタックに作られるから関数ぬけたらdeleteしなくても消滅 (2)はヒープに作られるから自分でdeleteしないと残る という理解であってますか?
「スタック」に作られるといのは 実装依存なんだっけ? まあふつう話は通じると思うけど
MyClass *pObj = new MyClass(); を自動deleteに出来ないんですか?
自動って何かdeleteするタイミングが自動でとれるのかい?
>>623 そこをうまくやるの技術者PGで、出来ないのがドカタPGでしょ
そうじゃなくて自動でとれるなら可能だし、取れないなら不可能
626 :
デフォルトの名無しさん :2008/10/27(月) 18:22:01
(1)と(2)ってふつうはどっち使うといいの? どう使い分ければよい?
スコープを抜けたときに勝手にdeleteしてほしい場合は(1) スコープを抜けたときに勝手にdeleteされて困る場合は(2)
普通は考えるまでもない、必要なほうに決まる。 自動じゃ無理な時だけnewしたらいいと思うよ。
>>622 スマートポインタに入れる。
通常はstd::auto_ptr、コンテナに入れたりコピーしたり
する時はstd::tr1::shared_ptr
>>625 自動でとれるようにするのが技術者PG、できないのがドカタPGでしょ
いやだから、その自動ってやつの定義がいるだろう。 ・・もしかして、質問者はスコープ抜けたらというタイミングしか想定してないのかな? ウィンドウが破棄されたら、とか例があるからそういう自動を連想してしまった。
>>622 std::auto_ptr や boost::shared_ptr じゃダメか?
634 :
632 :2008/10/27(月) 18:33:58
見なかったことにしてくれ
>>629 ,
>>632 どうも、どうも
どう使うのかは分からないですけど
やっぱ、自動deleteを実現する機能ってあるんですね
自分でプログラム書くんですから 自動でとれるよう(開放忘れがないように)に工夫するしないんですか
スルーしないよ
638 :
デフォルトの名無しさん :2008/10/27(月) 19:39:19
>>627 >>628 速度的にはどうなんですか?たとえば、
(A) vector<MyClass> myobj;と
(B) vector<MyClass*> myobj;
はどっちの方がよいとかあります?
(A)形式でオブジェクトをそのまま格納するより(B)のようにnewで作ったポインタを格納した方がいいって聞いたのですが
639 :
デフォルトの名無しさん :2008/10/27(月) 19:39:50
(A) vector<MyClass> myvector; (B) vector<MyClass*> myvector; のまちがえでした
いやその例の変数名はどうでもいいだろうw
>>638 MyClassとMyClass*のどっちの方がコピーに時間がかかるかっていう話。
クラスのコピーコンストラクタが単純なメンバのコピーであったとしても、ほとんどの場合、クラスのサイズはポインタ1個分より大きいためBの方が速い。
但し、Bの場合myobjからeraseしたりclearしたり、あるいはmyobjの寿命が切れたりしただけではポインタはdeleteされないので注意。
642 :
デフォルトの名無しさん :2008/10/27(月) 20:21:07
テンプレートの中に、テンプレートが入ってるプログラムなのですが、 これはどういうふうに理解すればよいでしょうか? template <class DataType, template <class DataType> class Buffer = RingBuffer > class InPort : public Buffer<DataType> { : よろしくお願いします。
643 :
デフォルトの名無しさん :2008/10/27(月) 20:26:37
>>641 みなさんアドバイスありがとうございます。
ある人にチューニングしてもらったら(A)を(B)に書き換えられていて何でだろと思ったので調べていました。そのような理由があったんですね。(B)ではちゃんとデストラクタ作ってdeleteされてました。
C++はいろいろ知らないといいコードかけないと痛感orz
boost::ptr_vector 使おうぜ
MyClassがポインタを持たないなら、(A)のほうが速いぞ メモリが一箇所になるからな
646 :
642 :2008/10/27(月) 21:27:16
どなたか教えてください。 ぐぐってもそれらしい物が見つかりません。
@独自の形式の画像を表示するためのビューワを作る Aエクスプローラで縮小版にするとサムネイル表示される(ダブルクリックでビューワが起動する) 今やりたいことなんですが、 Aの設定方法と Aをするためには@のビューワ作成時にしないといけない約束事みたいなのはあるんでしょうか? 開発環境はVC++6.0です。
>>642 InPortはテンプレート引数を2つ取る。
第一引数(DataType)は見ての通り。
第二引数(Buffer)は、テンプレート引数を1つ取るクラステンプレートで、デフォルト引数としてRingBufferクラスが指定されている。
そして、Bufferのテンプレート引数にDataTypeを渡して実体化した型を継承している。
template <class T> class Hoge { ... };
InPort<int> x;//1
InPort<int, Hoge> y;//2
1と2どちらの使い方もできる。
649 :
デフォルトの名無しさん :2008/10/27(月) 21:50:37
648さん ありがとうございます。 全く理解出来なくて、困っていました
(A) vector<MyClass> myvector; (B) vector<MyClass*> myvector; Bを選んだときに必ずnewでインスタンス化しないといけないわけではないよ。 newする場合は、そうでない場合に比べて時間がかかりがちだから、 Bにする場合でもnewしなくてすめばその方がいいと思うよ。 deleteでトラブりやすいし。 MyClass m; vector<MyClass*> myvector; myvector.push_back(&m);
>>650 そのpush_back()で何が格納されるのかよーく考えてくれ。
つーか、ここまで馬鹿だといっそ清清しいな。
653 :
650 :2008/10/28(火) 20:35:20
それってvector使う意味あるのか?
>>650 boost::ptr_vector使えばdelete不要
>>654 650 じゃないけど、例えば vector< MyClass > のリストに対するループ処理
があるとして、その中で失敗した要素のポインタを vector< MyClass* > に蓄
積し、失敗データリストを一括処理、とか。
推奨はしないけど、実際に仕事でこういう処理を書いた事がある。
657 :
デフォルトの名無しさん :2008/10/28(火) 21:51:10
>>650 はMyClass m;がローカルだったらスコープぬけたら消滅しちゃうってこと?newで作れば消滅しないけど。
658 :
デフォルトの名無しさん :2008/10/28(火) 21:53:31
myvectorのスコープから言って問題ないじゃん
ローカル変数のポインタをvectorに追加することに意味があるかどうかが問題だ。 newを使わない限り、一定個数のオブジェクトしか扱えないのだからオブジェクト配列の一つもあれば充分だろう。
>>656 それはそれで途中でうっかり削除や追加をすると怖いことになりそうだな
純粋に所有権なしのpointerのvectorっていくらでも使う機会はあると思うが
そりゃそうだけど、
>>650 の話は受け入れられない。
すでに&演算子がオーバーロードされているクラスのオブジェクトに対してアドレスを出したい時はどうすればいいんでしょうか? struct Hoge{ int i; int* operator&(){return &i;} }; Hoge hoge; Hoge* foo=&hoge;
::
::operator&ですか?何度もやってるんですがどう表記するのが正解なんでしょうか
Hoge.::operator & (); とかじゃない?
だめですた
>>663 boost::addressofでできるよ
なにをやってるかはソースコードをよめばわかる
流れ豚切るが質問させてくれ。今、2次元ウェーブレット変換を作ってるんだが、参考書やらググル先生に聞いたら2回転置してるんだ。 転置無しでやろうとしたら結果が真っ黒(=0.0ばっか)で…。多分配列の参照がおかしいんだが、自分で見直してみても判らんので見てもらえないだろうか。 int dwt2d(double *s0, unsigned int H, unsigned int W, const double *p, const double *q, unsigned int sup, double *s1[4]) { // s0:入力(2次元画像の先頭ポインタ) W, H:幅と高さ p, q:係数配列 sup:係数配列の長さ s1:結果格納先(外部でメモリ確保済み) // 作業領域確保 unsigned int Size = W * H / 2; double *tmp[2] = {new double[Size], new double[Size]}; double *ptr[2] = {tmp[0], tmp[1]}; // X軸方向のdwt for(unsigned int lp = 0;lp < H;lp++){ dwt1d(s0 + lp * W, W, p, q, sup, ptr); ptr[0] += W / 2; ptr[1] += W / 2; } // Y軸方向のdwt double *tmp2[4] = {s1[0], s1[2], s1[1], s1[3]}; for(unsigned int lp = 0;lp < W / 2;lp++){ dwt1dt(tmp[0] + lp, H, W / 2, p, q, sup, tmp2); dwt1dt(tmp[1] + lp, H, W / 2, p, q, sup, tmp2 + 2); tmp2[0]++; tmp2[1]++; tmp2[2]++; tmp2[3]++; } // 作業領域解放 // #define SAFE_DELETEC(p) if(p){delete[](p);(p) = NULL;} SAFE_DELETEC(tmp[0]); SAFE_DELETEC(tmp[1]); return 0; } 続く…
670 :
669 :2008/10/29(水) 15:20:30
続き // 一次元ウェーブレット変換 int dwt1d(double *s0, unsigned int len, const double *p, const double *q, unsigned int sup, double *s1[2]) { // 1d dwt for(unsigned int k = 0;k < len >> 1;k++){ s1[0][k] = 0.0; s1[1][k] = 0.0; unsigned int t = k << 1; for(unsigned int n = 0;n < sup;n++){ unsigned int index = (n + t) % len; s1[0][k] += p[n] * s0[index]; s1[1][k] += q[n] * s0[index]; } } return 0; } // Y軸方向ウェーブレット変換 int dwt1dt(double *s0, unsigned int len, unsigned int step, const double *p, const double *q, unsigned int sup, double *s1[2]) { // step:画像の1ラインの長さ for(unsigned int k = 0;k < len >> 1;k++){ s1[0][k] = 0.0; s1[1][k] = 0.0; unsigned int t = k << 1; for(unsigned int n = 0;n < sup;n++){ unsigned int index = (n + t) % len; // ここあたりが怪しい? s1[0][k * step] += p[n] * s0[index * step]; s1[1][k * step] += q[n] * s0[index * step]; } } return 0; }
>>670 怪しい辺りで変数の値でも追跡してみればいいじゃない。
見て判らなければ動かすのが今のプログラミング。
Exceptional C++って本が評判良いようなので、買ってみましたが newのエラーチェックは必要ないとかとんでもないことが書いてあったので本棚の奥に片づけました で、タイトルよく見るとExceptional C++ Styleだったので偽物掴まされたのかと思ったんですが 書いてる人同じなんですね Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?
>newのエラーチェックは必要ないとかとんでもないことが書いてあったので本棚の奥に片づけました お前がとんでもない。
>>672 int* p = new int;
if (p == 0) ←これが要らないっていう話?
なぜいらないのかも、なぜ使われていたかも両方説明されてたと思うんだけどな
627は本をちゃんと読めない子なんですね
>>674 いいや
bad_allocを捕まえることもnew(nothrow)をヌルチェックすることも意味がないと書いてある
メモリは遅延確保するからnewは常に成功するとか書いてる
ひどすぎる
676は数字をちゃんと読めない子なんですね
>>677 それは Linux を含む一部の環境では実際正しい。
というか、malloc じゃなくて new でその説明があった?
>>679 C++の本だもん、もちろんnewの話ですよ
でも滅多に起こらないとしても、環境によっては絶対に起こらないとしても、
それでもやるのがエラーチェックでしょう?
著者の姿勢に疑問を感じざるを得ないです
>>680 それは哲学の問題であって、プログラミングの問題ではないよ。
>>681 気になったので、手元の本で調べたら p.177 辺りの話のようだ。
久しぶりに読んでみたが、個人的には、真っ当な事が書かれてると感じた。
ところで new に失敗した時、一体どんな処理をするのだろうか?
メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
>>683 他(ユーザーのデータやシステム)に致命的被害を及ぼしたりしないように安全に終了する。
可能であれば、自分が扱っているデータも安全に保存した上で。
予め余計に確保しておいてそっちを使うとか
>>684 それは普通に組んでれば例外がさかのぼる途中で実現される気がする
newで失敗したときにいろいろしたければnew_handlerでやればいいし、正直bad_allocが投げられたらオワリなんじゃ?
その前のページ(p.176)に「エラーチェックしないなんてとんでもないこと書いてる」っていう人も居るとは思うがってわざわざ書いてるじゃん。 ちなみにその章の Summary の訳。 >nothrow new の使用は避けること。通常の例外を送出する new と比べて、最近では意味のある利点がないこと、 >また大抵はより悪い失敗時の特徴を持つからである。 > >いつくかの理由から、とにかく new の失敗をチェックしようというのはあまり利点がないということは覚えておくべきである。 > >メモリの枯渇について正当な懸念があるなら、チェックしていると考えているものがチェックできているか気をつけよう。 > - メモリが使用されるまでメモリ確保しないシステムでは、new の失敗をチェックすることは大抵役に立たない。 > - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の > 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。 > - 特別な場合を除いて、new の失敗を検出した場合でも、本当にメモリが残されていないなら、できることは多くはない。
とある官庁向けのシステムで、メモリ不足のときにご丁寧にダイアログでメッセージを出すプログラムを書いてきた シナ系ソフトハウスがあった。実際にメモリ不足の状況を作ってやったら、ダイアログを出そうとする行為自体が メモリ確保エラーを起こすらしくて画面を埋め尽くす勢いでダイアログが開いていき、メモリスワップに突入。 メモリ不足の状況を解除してからダイアログの増殖が止まるまでに20分掛かったのはいい思い出w 教訓。実際にメモリ不足の状況に陥ったら、できることは高が知れている。
やらない方がマシだとは思うが終了処理とかのために予め5MB位最初に確保しておき メモリ不足になったら開放してメモリをあけるみたいなテクニックを聞いたことがある。
メモリもだが、ファイルディスクリプタ枯渇も面倒 エラーログはこうとしてファイルをオープンしようとするが失敗 そのエラーのログをさらにはこうとして…(以外同文
エラーログ出力のエラーログ出力をするヴァカがここにもまた一人
>>688 俺も、実際に似たような事例に遭遇したので、
>>683 を書いた。
エラーチェックは良い事だが、その実効性を検証しないと意味がないし、メモリ確保の問
題は OS が深く絡むので、OS がするより良い対応をアプリケーションで行うのは非常に難
しく、副作用の方が心配になる。
もし大量のメモリ確保が心配なら、API で空きメモリ量を得て、new する前に妥当性チ
ェックする方が真っ当だと思うし ( チェック直後に枯渇した場合は事故とする )。
xxx* p = new xxx; if (p == 0) {*}←これ で 実際に、これが実行された経験ある奴いるの? 1Tバイトぐらいのメモリよこせと言えば実行さるるのかな
>>693 まともな処理系なら、bad_allocが飛ぶので、絶対に実行されることはない。
賢い処理系なら最適化として if を丸ごと削除してもいいだろう。
696 :
デフォルトの名無しさん :2008/10/30(木) 07:09:37
operator new が定義されている場合を誰も考慮しねえのな、このスレ
定義されてたら何だってんだ? メモリ確保とは全く別の目的に使うような病的な場合を除いて 組み込みのnewと同じ議論が全部当てはまると思うけど
>>672 にしろ
>>696 にしろ、
大勢の人間や高名な人間を下に見ることが可能な素晴らしい閃きが
急に自分の頭に訪れたような気がしたら、
意気揚々とそれを書き込む前に疑ってみたほうがいいと思うんだ。
「いやいや待てよ、馬鹿な俺がこんなことをこんな簡単に見出せるはずがない」
って。
何でこんな簡単なことだれも思いつかないしやらないんだ?www 俺SUGEEEEEEEEEEwwwwwww と思ってやってみたら出来ないことはよくあるよな…
それはお前だけ
>>672 >Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?
安心しろ、大丈夫じゃないのは君の理解力のほうだ.
#もうちょっと基礎的なところから勉強しなおしましょう.
>>683 >ところで new に失敗した時、一体どんな処理をするのだろうか?
>メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
枯渇じゃなくて確保失敗することもあるだろ・・
ねえ、馬鹿なの?
>>702 >枯渇じゃなくて確保失敗することもあるだろ・・
kwsk
石油資源はまだまだ埋蔵されてるのに原油高で調達できないみたいな
shobjidl.hをインクルードしてビルドすると c:\program files\microsoft platform sdk\include\shtypes.h(102) : error C2011: '_SHITEMID' : 'struct' で 示される型としてすでに定義されています。 c:\program files\microsoft platform sdk\include\shtypes.h(120) : error C2011: '_ITEMIDLIST' : 'struct' で示される型としてすでに定義されています。 … c:\program files\microsoft platform sdk\include\shobjidl.h(1159) : error C2011: 'IEnumIDList' : 'struct' で示される型としてすでに定義されています。 c:\program files\microsoft platform sdk\include\shobjidl.h(1312) : error C2011: 'tagSHGDN' : 'enum' で 示される型としてすでに定義されています。 c:\program files\microsoft platform sdk\include\shobjidl.h(1322) : error C2011: 'tagSHCONTF' : 'enum' で示される型としてすでに定義されています。 c:\program files\microsoft platform sdk\include\shobjidl.h(1331) : error C2371: 'SHCONTF' : 再定義され ています。異なる基本型です。 … Sample.dll - エラー 175、警告 19 のようなエラーが延々と出るので、サイトで調べたところ #define NO_WIN32_LEAN_AND_MEAN #include <shobjidl.h> とすることで、解決できるみたいなんですが、まだ全く同じエラーが出てしまいます。 プロジェクトオプションに /D "NO_WIN32_LEAN_AND_MEAN" を追加しても同じです。 原因わかる方いましたら教えてください。 Windows XP Pro SP3 VC++6.0 Platform SDK Server 2003 SP1
>>682 ねえよww
おまえはクライアントに
「エラーは処理しません、手抜きじゃなくて哲学なんです」
って説明するのか?
>>697 むしろ定義されてても同じ議論がなりたたないとダメのような…
別にnew_handlerやbad_allocを使うか否かは定義する人の自由だけどさ。
return文の後ろにコード書くようなもんだ。
returnが失敗した時用のエラー処理だなw
retrun (0);
括弧はいらね
#define return(x)
retrun(0); 戻りつつ走るという高尚な関数呼び出しだ。
retrun (0 + 0) / 0;
#define retrun return
#define elif(x) else if(x)
file: "studio.h" ---- #include <stdio.h> ----
すいません、
>>702 を見て気になったんですが
メモリが足りない以外に失敗とはどんな場合なのでしょうか?
超断片化したとか?それも一種の枯渇と言えなくもないし・・ ハードやアロケータによっては一回に確保できるサイズに制限があったりするかもしれない?
721 :
デフォルトの名無しさん :2008/10/30(木) 21:40:50
>>719 心配になるぐらいでかいサイズを確保するなら、前もって足りるか調べるのが
定石なんじゃないかね。たとえばオンメモリでの画像処理とか。
その場合でもでかいバッファをいきなり作るんではなくて、常識的なサイズで
小分けにするだろうから、そういう意味でも考えなくていい状態だろ。
bad_alloc や NULL チェックする派の人って STL コンテナとかのメモリ確保失
敗も対処するんだろか。vector v(100) みたいなコードも try ブロックに入れな
きゃならないとしたら、無理すぎんだろ。
mainでキャッチしかしません
>>705 既に precompile header に入ってるのでは
>>719 確実にnewが失敗すると思われるのは、アドレス空間が不足するケース。
32bit OSだったらアドレス空間は全体で4GBで、さらにユーザ空間で使えるのはその一部なので、
4GB近くのメモリ確保を行ったら連続したアドレスが確保できずbad_allocが飛ぶ(メモリを4GB以上積んでてもダメ)。
726 :
デフォルトの名無しさん :2008/10/31(金) 00:08:11
_beginthreadexで作ったスレッドを別のスレッドから終了させるにはどうしたら良いんでしょうか?
>>726 Win32系のスレへ逝け、ボケ!
TerminateThread();
>>722 int main(int ac, char** av)
{
try{
}
catch( ry
visual c++でプログラミングをはじめたのですが、 1.25*1.25*1.25などの小数点の掛け算を行うと四捨五入されます。 四捨五入をさせない方法はありますか?
>>730 表示の桁を増やしたいのか?
setwとか%10f とかじゃね
732 :
730 :2008/10/31(金) 01:54:36
小数点を含んでいて6ケタ以上だと四捨五入されるみたいです。 setwはうまくいきませんでした。 なぜだ…
丸め誤差でぐぐれ その計算の場合は 5*5*5/4.0/4/4とかにした方がいい
小数や割り算は、C++で奇麗な記述が出来ると思わない方がいい
736 :
730 :2008/10/31(金) 03:39:29
<<733 ぐぐってみました…そういうことなのね。 やはり回避するようなプログラミングをしなくてはいけないのですね。 <<734 わかりました。
738 :
730 :2008/10/31(金) 03:59:38
よく見るアホの典型 正解レスのみスルーする
>>739 たしかにこれは見事なスルーっぷりだなw
釣りだろ、釣られるなよ
釣られるなよ、絶対釣られるなよ!
ヘッダファイルで次のように宣言されている場合、publicの後に書かれているslotsにはどういう意味があるのですか? public slots: void setValue(int value);
Qtのマクロ?
>>744 Qtを使ったプログラムなんですが、publicの後に":"以外の文字が書かれている構文を見たことが無いので
このようなpublic宣言はどういう意味を持つのかが理解できないのです。
#define slots で空に置換される C++的には意味がない ツールが認識するキーワード
>>746 あ、そうなんですね。emitと同じようなもんですか。
よく分かりました。ありがとうございます。
748 :
デフォルトの名無しさん :2008/10/31(金) 19:15:47
More Exceptional C++ 11/5 発売になってるけど今日、紀伊国屋で入手した。
7年も前の、現行規格が出来る前の本を今更翻訳されてもな 役に立つのかな
>>687 >> - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の
>> 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。
これちょっとダウトじゃないかなあ。
例えば実メモリは4GB以上ある32bit OSだと、あるユーザプログラムのメモリ使用量が
4GB - (システム等使用分)に到達すると脂肪だが、システム全体にはまだ余裕がある、
なんて場合はあるかと。OSにもよるわけだが。
>749 1998 と 2003 の違いなんて大してないんじゃね? vector の連続性保証は 2003 だっけ?
質問です。 namespace NS { struct T { int val; operator int&() { return val; } T& operator+=(const T&) { return *this; } }; } void test() { NS::T t; t = 3; // not compiled t += 3; // compiled } これをコンパイルすると not compiled の方は VC++ 2003, 2005, 2008, gcc 3.4.4, 4.3.2, Comeau C++ 4.3.9beta で >tc.cpp:15: error: no match for 'operator=' in 't = 3' みたいなエラーが出ます(↑は gcc 3.4.4 の例)。 一方、CodeGear C++ 5.93, 6.10(それぞれ RAD Studio 2007, 2009)だと通ります。 どちらの挙動が正しいのでしょう? NS::T::opeator= が見つかるのは Argument Dependent Lookup であって、unqualified name lookup では組み込み(built-in)の int& operator=(int&, int) が見つかって良い気がしますのでコンパイルできていいのではないかと思うのですが。 += の方はコンパイルできているわけですし。
デフォルトのコンストラクタに暗黙の型変換を許す旨があるので通る方が正しい。
今からC++始める人だっているだろ
755 :
デフォルトの名無しさん :2008/11/01(土) 14:59:44
代入の左辺が暗黙変換されたらまずいだろう 通らない方が正しい 何法の何条かを示すべきだろうが、面倒だからやらない
>755
見つけました。ありがとうございます。
> 13.3.1.2/4
> For the built-in assignment operators, conversions of the left operand are restricted as follows:
> - no temporaries are introduced to hold the left operand, and
> - no user-defined conversions are applied to the left operand to achieve a type match with the left-most
> parameter of a built-in candidate.
複合代入演算子についてはどうなのか?という点については↓がありました。
ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#423 ということで、VC++ 他の挙動が正しいようです。
まあ挙動が怪しい時はgccとVCが大抵正しくてBCCがおかしい 場合がほとんどだわな。 BCCももう少し頑張ってboost対応してくれよ・・・・BCB2009で regexには対応したんだけどね。
BCBは近い将来C++0x対応をうたってなかったか?
Builder Xのころにexportに対応したプレビュー版とか出してた気はするが
>758 とりあえず 2009 でドキュメントに載ってる対応機能 ・alignof 演算子 ・型特性関数(__has_nothrow_copy_constructor 等) ・noreturn 属性と final 属性 ・explicit 変換演算子 ・extern テンプレート ・列挙型の前方宣言 ・右辺値参照 ・静的アサーション(static_assert) ・厳密な型指定の列挙型 ・型指定子 decltype ・Unicode 文字型とリテラル(char16_t, char32_t と u'', U'')
autoなしでC++0x対応を謳うとか何なの
762 :
デフォルトの名無しさん :2008/11/02(日) 10:46:12
sprintfとかprintfをc++で使うときはcstdio、strcpyとかstrcmpを使うときはcstringをincludeしろって書いてあるんですがg++だとincludeしなくても使えるのはなんででしょう?コンパイルできてもincludeしておくべくなんでしょうか?
>>762 直接 include していないだけで、間接的に include されてんじゃない?
宣言なくても使えるからそれの可能性もあるね、警告オプション無しだとなにも言ってこないし 型のあたりで問題が出るんだけど
765 :
デフォルトの名無しさん :2008/11/02(日) 11:30:58
あーなるほど iostreamをincludeしてると使えるっぽいです。 iostreamをincludeしないと使えなくなりました。
そうなのか。 てっきりunix Cっぽくincludeなしでもprintfとかは使えるようにしてあるのかと思った。
Cは型チェックがゆるいからできた芸当。
768 :
デフォルトの名無しさん :2008/11/02(日) 12:49:07
<stream.h> なら <stdio.h> を含む仕様だったが <iostream> は違う
C++はその辺特に規定してなかったはず
More Exceptional C++ 19ページのCloneableって綴りは作者のJavaへの嫌みか
非英語ネイティブに対する配慮かも。
は?何か問題あるの?
>何か問題あるの? 過去の前例や詳細な説明を書こうかと思ったけど「は?」になんかむかついたのでやめた。
いちいちそんな説明するなんておまえ律儀だな。
「そこを解説しないと、答えられなくて敵前逃亡したと思われる」 って考えたんだろう。 解説すると、もっとそういう雰囲気出ちゃうのが玉に瑕だが。
言わぬが花ですね
つうかスペルみれば想像はつきそうなもんだが
言葉が悪かったとかちょっと謝ればいいだけの話なのに、おまえらときたら。
779 :
デフォルトの名無しさん :2008/11/03(月) 20:14:30
Pythonとか使ってるとC++でも下のようにオブジェクと作ってしまうのですが問題ありですか?(1) MyClass obj = MyClass(100); (2) MyClass obj(100);との違いは何かありますか?どっちもコンパイルできてエラーも出ないのですが。
(1)はMyclass(100)を生成して,それをさらにコピーコンストラクタでobjを初期化している つまり >C++でも下のようにオブジェクと作ってしまうのですが問題ありですか? 問題ありすぎる.今すぐコード全部書き直して首つって死ね
781 :
デフォルトの名無しさん :2008/11/03(月) 20:44:54
782 :
デフォルトの名無しさん :2008/11/03(月) 20:55:20
試してみたけどコピーコンストラクタは呼ばれないんですが?=の代入で呼ばれるの? #include <iostream> #include <algorithm> using namespace std; class MyClass { public: MyClass(int a) { cout << "constructor! " << a << endl; m_value = a; } ~MyClass() { cout << "destructor!" << endl; } MyClass(const MyClass& obj) { cout << "copy constructor" << endl; } void Show() { cout << m_value << endl; } private: int m_value; }; int main() { MyClass obj = MyClass(10); return 0; }
783 :
デフォルトの名無しさん :2008/11/03(月) 20:56:41
ちなみに結果は constructor! 10 destructor!
785 :
デフォルトの名無しさん :2008/11/03(月) 21:02:15
読んだけど意味がわからないorz 結局、コピーコンストラクタが呼ばれないようにコンパイラが裏で細工しているだけで実際はやっちゃいけないってことですか?
意味なく煽ってる奴はなんなの
787 :
デフォルトの名無しさん :2008/11/03(月) 21:03:44
788 :
デフォルトの名無しさん :2008/11/03(月) 21:10:01
なるほど、了解。 でもロベール本のp283見ると下の2つは若干の差はあるが基本的には同等とか書いてあるね。 Integer b = Integer(3) Integer b(3)
やっちゃいけないと言うが、誰もそんな変な書き方しないからやめておけという程度のこと。 極端な例を出せば#define BEGIN {のようなもの。
790 :
デフォルトの名無しさん :2008/11/03(月) 21:16:47
Integer b = 3; は、ときどき見かける
>>788 そういう書き方をさせないためのexplicitです
793 :
デフォルトの名無しさん :2008/11/03(月) 21:26:30
794 :
デフォルトの名無しさん :2008/11/03(月) 21:27:20
>>792 g++使ったよ。
郷に入れば郷に従えってことでC++の書き方に慣れるよ。Pythonは
Integer b = Integer(3)
だからつい癖でC++でも使っちまうorz
>>793 20回くらい読みましたが解りませんorz
796 :
デフォルトの名無しさん :2008/11/03(月) 21:55:19
>>795 20回で足りる奴ばかりとは限らんが、255回でも65535回でも2147483647回でも考えれ
無限回必要でないことは俺が保証する
うーん解らん なにが制約なのでしょう
798 :
デフォルトの名無しさん :2008/11/03(月) 22:08:47
800 :
デフォルトの名無しさん :2008/11/03(月) 22:15:31
俺バカ・・・言っちゃだめじゃん
class Hoge { public: vector& GetVec() { return vec_; } private: vector<int> vec_; }; こんな感じでメンバの参照をconstもつけずに返すのって設計間違ってますか? しかし、参照返す方法以外でvectorへの操作を提供しようと思うと面倒くさすぎる。
>>801 そもそも、ベクタの実装を公開してしまっていいかどうかが判断基準じゃないのか?
GetVec()使えばなんでもできてしまうってことは、Hogeクラスで管理しても意味がなくなるってことなんだけど。
例えばHoge hogeがあったとして、hoge.GetVec().clear()されてしまうかもしれないからね。
>>801 それ、vec_をpublicにするのと同じじゃないか?
>>801 なるほど。
今回のケースは、メンバ関数の引数で毎回vectorを受け取るのが面倒くさくて、vectorをメンバで保持してる意味が強いかもしれません。
vectorの中身を管理する目的がなければ、参照を返して問題ないということですね。
ありがとうございました。
805 :
804 :2008/11/04(火) 13:59:29
>>801 外部からvec_内部を直接触る構造が間違ってる気がするぜ
GetVec()使わすくらいなら、その処理をメンバ関数で内包しちゃったほうがスマートな気がするが
807 :
デフォルトの名無しさん :2008/11/04(火) 16:22:14
構造だの設計だのって how なこと以前に、what なところで何が起きているか省みるべし is a なものを has a で実装しようとしてないか?
>今回のケースは、メンバ関数の引数で毎回vectorを受け取るのが面倒くさくて、vectorをメンバで保持してる意味が強いかもしれません。 裏を返せば、クラスhogeはベクタの参照(それも、const参照で済むかもしれない)を持っているだけでいいのかもしれない。
まずは、この設計を採用することになった状況ってのが知りたい
810 :
801 :2008/11/04(火) 17:34:59
>>806-809 うーん、やはり設計がおかしかった気がします。
何がしたかったかというと、
void Hoge::XXX(vector<int>& vec);
void Hoge::YYY(vector<int>& vec);
...
このように必要なデータをvectorで受け取るメンバ関数がいくつかあります。
Hogeの利用者は、vecにデータをつめてHogeに渡すわけですが、このvecはHogeにしか使わないものなので、
Hogeのメンバにしてはどうかと思いました。
ここで問題なのは、vecにデータをつめるのはHogeの利用者であって、Hogeにはできないことなのです。
そこでvecの参照を返すのが一番手間がかからないと思い、参照返すgetterを考えました。
>>810 vecにデータ詰めてから渡したらだめなん?
何だろう、オブジェクト分割の段階で間違ってる気がする
>>811 データ詰まったvectorを受け取って、メンバ変数vecとswapということですよね?
それが一番いいかもしれません。
>>812 特別珍しいケースというわけではないと思うのですが、意外に難しくて困っています。
>808でいいんじゃないのか? コンストラクタでベクタのコンスト参照でも渡しておけば、後は世話なし。 # いい設計だとは思わないけどw
>>814 あーconst参照でオブジェクトの寿命が引き伸ばせるんでしたっけ。
でも、なんかスタックに確保したオブジェクトの参照を保持するのは気持ち悪く思えます。
それならswap使う方法にしたいです。
>>815 おいこら、参照を何だと思っているんだ、貴様は。
小粒でもぴりりと辛い
>>815 メンバでは引き延ばせないし、今回の話とも関係ない。
>>816 ,818
勘違いしていました。
const参照で寿命云々は一時オブジェクトのときの話でした。
参照をメンバとして持つのって、寿命管理の面で気持ち悪くないですか?
swapの方が自然だと思ったんですが。
フツーはvec_に対してやりたい(許可したい)操作用のメンバ関数を一式用意するもんだと思うんだが 挿入も削除も要素アクセスもオールクリアも外からやりたい放題出来ていいの? 本当にそれでいいならpublicで全然問題ないんじゃね 特定のなんかのクラスがそういうことやるってならvec_は多分Hogeじゃなくてそいつの物だ
メソッドに必要なデータ=パラメータを メンバにしようって発想自体が そもそも大失敗と推測されます
>>820 ,821
vec_にデータつめるのは特定の場所(クラス)でやります。
「Hogeクラスにデータをセットする」という操作はおかしくないと思うのですが、swapじゃだめなんですか?
Hoge使うときにvec_が絶対必要になるし、Hogeの寿命がきれたらvec_の寿命もきれていいので、メンバにすればちょうどいいのかと思いました。
Hogeは複数のクラスから参照されるので、vec_をHogeのメンバにしないとなると、Hogeの他にvec_の参照も複数のクラスが持たないといけなくなるもよくないかなと。
一度UMLツールでクラス図かけよ。
なんかswapしてみたいだけと違うのかと
自分は、データそのものの保持が主体のclassは structで宣言してメンバを直接触らせている 例えば何かのファイルヘッダを読み込んだ結果とか いちいち get, set関数を用意するのがうざいだけ
>>823 UMLはほとんど知識なくてまともに書けないです。
>>824 ただのsetterですめばいいんですが、vectorはコピーにコストかかるからswapにしようかと。
>>825 データの保持が主体というわけではないです。
データを詰める作業がHogeの外なこと以外は、普通のメンバと一緒だと思うんですけど、うーん・・。
>>826 データを詰める時に、vector<int>じゃなくてHogeのvec_アクセス関数を直接読んじゃダメなの?
operator[]かpush_backあたりを1個作れば終わるような気がしなくもないんだが
Pythonも使ってる人結構いるのかな
データを詰める作業ってのがよくわからんな なんか追加するだけならHoge::push_backかなんか作ればいいだけだし 一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし vec_に元々入ってるデータも使って複雑に中身をとっかえひっかえするなら やっぱりHogeじゃなくてそれをやるクラスの物だと思うし
>>827 ,829
push_backがあれば必要最低限ですが、データの追加はできて削除はできないの?とか、
要素の並びにも意味があるので、ソートもできた方がいいんじゃないかとか多すぎて・・。
で、最初に考えたのが、参照で返すことによってvectorの機能丸ごと使えるようししようと思いました。
> 一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし
今考えてるのはまさにこれです。
Hogeの外で自由にvectorにデータ詰めて、それをHogeに渡してswapでHogeのメンバvec_に移す方法です。
この方法にします。
ありがとうございました。
コスト気にするならHogeに持った方がメモリ解放する回数が減るだろうし、 コスト気にしないなら単純にコピーでいいんじゃ
>>830 それって結局削除とかソート、というか特にソートか
外部でコード書いてやらんといかんくなるんでしょ?
>>810 にある考え方と矛盾してる気がしてしょうがないけどまぁいいか・・・
833 :
デフォルトの名無しさん :2008/11/05(水) 18:00:15
push_back が出てくる時点で vector の採用自体について悩みそうだな、俺なら
vec_が何を入れるための物で、それを責任もって管理すべきなのは誰なのかってことから 考え直した方がいいような気がする そもそもvectorの要素の削除だのソートだのというのは低レベルな操作であって外様に見せるもんじゃない もっと何かそれ以上の意味のある操作のまとまりとして外に提供しないとクラスで包む意味がない (それの内部処理が結局の所vectorの操作に過ぎないとしてもだ)
もうvectorを継承したクラスでいいじゃん
836 :
801 :2008/11/05(水) 19:17:21
しつこいようですが、再度書き込みます。 HogeはBoost.Graphのadjacency_listのようなものと思ってください。 adjacency_listは、イテレータで複数のEdgeを受け取るコンストラクタの他に、 add、remove、remove_if、clearなどの関数でEdgeの追加/削除を行えるようになっていますが、 今回のケースではこれに加え、要素の並びにも意味があるので、 insertやsortなども必要になり、結局vectorの機能全部なんじゃないかと思うわけです。 そこで、Hogeの外で自由にvectorいじってもらって、完成したvectorを受け取ってswapするのが良いと思いました。
>>834 > 考え直した方がいいような気がする
考え直す気はないよ
swapしてみたいだけだもん
swapだとHogeから取り出すこともできるんだよな 参照やpublicと大差ないと思うけど まぁ自分しか使わないなら好きなようにやったんでいいと思う
いっそ auto_ptr<vector<int> > で受ければ?
Hogeにvecメンバの操作管理機能つける必要ないなら vecを呼び出し元のクラスのメンバにしとけ
C++のマクロ定義の部分で、 #define <文字列1> <文字列2> の<文字列2>が存在しないんですが、 これはどういった意味になるのでしょうか?
定義してるだけ #ifdef なんかではちゃんと読まれる 文中に書けば無視される
>>841 再定義の無いやつか。
#ifdef/#ifndef〜#else〜#endifでコンパイラ制御に使う。
844 :
843 :2008/11/06(木) 00:06:49
被った orz
defined のこともたまには思い出してあげてください。
俺は #ifdef と書いたら必ず #endif // defined(hogehoge) みたいなコメントを後ろに書いてる 我ながら整合性ねーよなw
まずつかわないけど <文字列1> が消滅する効果もあるじゃない
よく使うよ。 例えば、C++には本来restrictはないけれどコンパイルオプションで使えるケースもあるから役に立つ。 #if defined(USE_RESTRICT) # define RESTRICT restrict #else # define RESTRICT #endif
VC++の__restrictも忘れないで
ちゃんとenum使おうぜ
質問です。 (*this)<<buf;のところでセグメンテーション違反になっちゃう理由が分りません。(カッコは要らないと思うけどなんとなく。) cout<<buf;だと大丈夫です。 #include <iostream> #include <string> #include <cstdarg> using namespace std; class FormatedOstream:public basic_ostream<char> { public: void printf(const char* format, ...){ va_list vl; va_start(vl, format); static char buf[1024]; vsprintf(buf, format, vl); (*this)<<buf; va_end(vl); } }; int main(){ FormatedOstream out; out.printf("str:%s value:%d\n", "hello", 10); return 0; }
>>852 classの作り方がおかしい。継承は間違っている。コンポジションにすべき。
ios_baseにあるstreambufがnullぽだから<<でそこ書き込むときに nullぽに書きこもうとしてSEGVってるな 俺iostreamを作るならboost::iostreamを使うのがおぬぬめ 標準だけで作るのは結構面倒だったと思う
855 :
852 :2008/11/06(木) 12:37:41
継承にした理由は、今のがうまくいったら、 template <class STREAM> class Formatedstream:public STREAM { . . . . } Formatedstream<ofstream> ofs みたいな感じで、どんなストリームでもOKよ。という風にしたかったんですが、そもそもそんなの無理ですか?
だいたいstd::ofstreamがstd::ostreamから継承してるんだから 俺iostreamを作る時もそれに倣った方がいいと思うが
class FormatedOstream { std::ostream& ost; public: FormatedOstream(std::ostream& o) : ost(o) {} void printf(const char* format, ...){ va_list vl; va_start(vl, format); static char buf[1024]; vsprintf(buf, format, vl); ost<<buf; va_end(vl); } }; void f(FormatedOstream& out) { out.printf("str:%s value:%d\n", "hello", 10); } int main(){ FormatedOstream o1(std::cout); f(o1); std::ofstream ofs("foo.txt"); FormatedOstream o2(ofs); f(o2); return 0; } どんなostreamでもOKよ
どうも >853 >857 コンポジションだと演算子やらその他ストリームの便利機能を書かなきゃならんのですが、それくらい面倒くさがるなってことですかね。 >854 なるほ >856 もっと根元からやれってことですね。
859 :
852 :2008/11/06(木) 15:49:00
coutのstreambufferをいれてあげたら一応望みどおりになりました。 単語の意味合い的になんか微妙ですが。 どうもでした。 class FormatedOstream:public ostream { public: FormatedOstream(ostream& s):ostream(s.rdbuf()){} void printf(const char* format, ...){ va_list vl; va_start(vl, format); static char buf[1024]; vsprintf(buf, format, vl); *this<<buf; va_end(vl); } }; int main(){ FormatedOstream out(cout); out.printf("str:%s value:%d\n", "hello", 10); out.precision(10); out<<0.333333333333333333333<<endl; out.setf(ios_base::scientific); out<<0.333333333333333333333<<endl; return 0; }
860 :
デフォルトの名無しさん :2008/11/06(木) 16:32:02
if(OpenDialog1->Execute()) { Fname1 = OpenDialog1->FileName; TStringList *astringlist = new TStringList; astringlist->LoadFromFile(Fname1); A1 = astringlist->Strings[0]; A2 = astringlist->Strings[1]; A3 = astringlist->Strings[2]; ・ ・ Load(); } void __fastcall TForm1::Load() { File *fp; fp = fopen(A1.c_str(), "rb" ); fread(data,2,10,fp); fclose(fp1); } ・ ・ ・ あらかじめテキストファイルに数行に渡って読み込みたいファイルのパスが書いて あり、上のように作って読み込むプログラムを作ってみたのですがうまくいきません。 アドバイスお願いします。
読み込みたいファイルのパスをフルパスにしてみるとか
862 :
860 :2008/11/06(木) 16:55:11
>>861 テキストにはフルパスで書いてあります。。
うまくいかないってのはどこでどういう失敗するんだ? オープン直前でファイル名表示させてみては
864 :
デフォルトの名無しさん :2008/11/06(木) 18:07:08
fgets にハメられてる悪寒
それ、C入門スレのネタじゃね?w
866 :
デフォルトの名無しさん :2008/11/06(木) 19:52:57
だって 860 は fopen を使ってるんだぜ?
867 :
デフォルトの名無しさん :2008/11/06(木) 20:24:22
M系列とか線形合同法かなにかとおもったらMTかよw そのアルゴリズムの説明は一言じゃすまないつーか普通の人には無理だ かなり数学の知識が・・・・ メルセンヌツイスタの論文は公開されてるからためしに見てみればいい、きっと意味がわからない
使い方聞いてるんじゃない?w
dSFMTなら状態を構造体で持てるからそのライブラリの存在意義も薄いなあ MT19937ならboostから持ってきた方が便利だし
871 :
デフォルトの名無しさん :2008/11/06(木) 20:44:19
>>868 アルゴリズムの解読ではなく、
実際にこのアルゴリズムを使って乱数を出すにはどうしたらいいのかを聞きたいのです。。
説明下手ですみません。
>>869 その通りです。。
872 :
867 :2008/11/06(木) 20:47:11
アルゴリズムっていうより「プログラム」ですね。
とりあえず、1〜50までの乱数を取り出すようにしたいのですが・・・。
>>870 ごめんなさい。
全く意味が分かりません・・・
親切な解説ページは無視?
どうでもいいけどライセンスにだけは気を付けろよ
876 :
867 :2008/11/06(木) 21:24:06
>>873 解説ページは見たところ無かったのですが・・・
>>874 本家の方を見てみました。
cファイル、hファイルをプロジェクトに追加したのですが、
後はrand()と打てば乱数を取り出せるのでしょうか?
>>875 再配布とかはしないので大丈夫だと思います
本家のほうの.cファイルにはmain関数が入っているはず。 それが使い方の見本にもなっている。 もちろん自分のプログラムに組み込むときには、 そのmainは削除かコメントアウトする必要がある。
再配布しないならboost::randomのmt使えばいいやん ググれば一発で使い方でてくるし
>>780 (1)ではコピーコンストラクタ呼ばれないってリップマンが言ってた.
かなり迷ってやっとこさ見つけたバグが ファイルに書き込む順番と、読み込む順番が違っていた事でした そういったものを無くすような工夫とかは何かあるんでしょうか? やっぱ、気をつけるしかないんですかね orz
つTDD
シリアライズ系のライブラリを使う
現象から原因を特定するための推理力と調査する手段を多く持つ
青魚を積極的に食べて頭を良くする
シングルトンってどういうときに使えばいいの? freetypeの初期化と解放とかそういうの?
少なくともC++に限った話ではないな。
ここは初心者スレか?
初心者いがいいると思うのか?
まぁ普通は思うよな
newについて質問があります。 あるクラスの中のコンストラクタに、以下の記述がありました。 CMfLayout* MfNewLayout(MfFilterID ID, double x, double y, double z, double size) { return new CMfLayout(ID, x, y, z, size); } ID,x,y,zというのは、領域確保には関係がないとおもうんですが、 これでも正しくdouble size分だけ確保されるんでしょうか?
いや、単にCMfLayoutのコンストラクタに引数渡してるだけだろう。
うーん、ここから先が何も記述されていないんですよね。 new int(100) とかしたら領域確保されるからそれと同様に new CMfLayout(size) でもなりそうな気がしたんですが…
classは全部でこんなふうにかかれてました。 class __declspec(dllexport) CMfFeatureLayout : public CMfFilterData { friend DLLEXPORT CMfFeatureLayout *MfNewLayout(MfFilterID ID, struct feature feat,struct feautre size); private: struct feature m_feat; struct feature size; protected: CMfFeatureLayout(MfFilterID ID, struct feature feat,struct feautre size);//コンストラクタ(初期化) virtual ~CMfFeatureLayout(); virtual void Free(); public: MfDataType GetType() const; struct feature GetFeat() const { return m_feat; }; }; CMfFeatureLayout* MfNewLayout(MfFilterID ID, struct feature feat,struct feautre size){ return new CMfFeatureLayout(ID, feat); } CMfFeatureLayout::CMfFeatureLayout(MfFilterID ID, struct feature feat,struct feautre size){ SetID(ID); this->m_feat = feat; } CMfFeatureLayout::~CMfFeatureLayout(){} void CMfFeatureLayout::Free() { delete this; } MfDataType CMfFeatureLayout::GetType() const { return FILTER_DATATYPE_LAYOUT; }
>>892 なんかC++の文法を思いっきり勘違いしてるみたいだから、まともな入門書読むことからやり直すことを勧める。
895 :
デフォルトの名無しさん :2008/11/07(金) 18:16:57
CStringを使いたくなったので #include "afx.h" エラー発生 1>LINK : fatal error LNK1104: ファイル 'uafxcw.lib' を開くことができません。」 Program Files検索してみたが64用しかなかった uafxcw.libはどこでダウンッロードできる?
VC++環境依存の問題はスレ違いどす
事故解決 MFCって有料なのか express editionには入ってないのね
そもそもMFCの外でCStringなんか使おうとすんな
ATL/WTLで使っちゃダメかい?
ダメだろ CStringはMFCにベッタリ依存してる
というかCStringはMFCそのものw
あれ?VS2005辺りからATL化されたと思ってたが?
WTLにもCStringあるよ
std::stringじゃダメな理由はなんだ CStringだって五十歩百歩だろ
.c_str()をつけなくてもいいあたりはすごく楽でいい。
あと、CString::Format();
VS2002からCStringはMFC/ATL共有クラスになってる 実際にはどちらもATL::CSimpleStringT<T>から派生したATL::CStringT<T>のtypedef 自分の使ってるフレームワークについてくらい もうちょい勉強しような
私の勤務する会社のMS贔屓はBuffer()とかGetBuffer()を理由に挙げてた。
ATLのCStringを使うなら、<atlbase.h>あたりをインクルードしないといけないはず。 こっちもExpressでは使えないけど。 そう言えば、std::basic_stringもstd::vectorみたいに要素数連続の保障を加えるって話なかったっけ? それとstring-wstring間の変換関数があれば、 もう自分にとってCStringを使う理由がほとんどなくなるんだけどな。
printf風にformatしたいんじゃね 俺はstringsteam使うけど
boost::format
914 :
909 :2008/11/08(土) 16:08:01
いやいや、そんなのを使わなくても0xまで待てば変換できるようになるのは知っているぞ。
gccでC++ λfunctionって使えるの?
gccのg++でboost使えば今でも trは知らん
917 :
デフォルトの名無しさん :2008/11/09(日) 04:58:24
class Type { bool MF( void *p ) return p == this; }; Type *p = new Type; bool result = p->MF( p ); これ、trueになるって保証されてる?環境依存?
>>917 とりあえずコンパイルエラーなわけだが、 Type* → void* の変換は1対1だから
たぶん心配してるような問題は無いよ。
このケースでは問題にならないけど、継承が絡む場合で Type 以外の型のポインタから void* に変換されている場合は アドレスが異なったりするから true になるとは限らない。 つか、なんだその構文はw
920 :
デフォルトの名無しさん :2008/11/09(日) 11:57:04
newで確保したメモリをdeleteしないとメモリリークを起こして危険と書いてありますが、プログラムを強制終了しても確保したメモリは解放されないんでしょうか?OSを再起動すれば解放されるとは思いますが。
921 :
デフォルトの名無しさん :2008/11/09(日) 12:04:01
>>920 標準またはユーザ定義の operator new が、どのようにメモリ割付を実装しているかによる
自動的な解放を行う実装と、行わない実装の、両方に互換性のある書き方は言うまでもあるまい
922 :
デフォルトの名無しさん :2008/11/09(日) 12:06:18
>>920 Windows では、プロセスを強制終了するとシステムが不安定になる旨の警告をしてくるだろ
>>920 少なくともVxWorksは解放してくれない。
それに組み込みで再起動はありえない。
>>922 そのWindowsでは、強制終了してもメモリは解放される。
強制終了するとメモリが開放されなかったのは、Win95系だっけか? 16bit Windows辺りだったかな?
926 :
デフォルトの名無しさん :2008/11/09(日) 12:21:04
メモリリークに気をつけなきゃいけないのは組み込みとかインフラとか簡単に止められない系のプログラムだけってこと?
valgrind --leak-chek=fullでSDLアプリをモニタするとですね…
928 :
デフォルトの名無しさん :2008/11/09(日) 12:28:30
929 :
デフォルトの名無しさん :2008/11/09(日) 12:29:43
つまり環境による
>>926 そうとは限らない。
共有メモリを使うようなプログラムであれば、
どんなOSであれ気をつけなければならない
932 :
デフォルトの名無しさん :2008/11/09(日) 14:29:54
32bitコードを64bit化するときって どこから手をつけるべきなの?
整数をポインタにキャストしているところとか
size_tが64bitになるなんて
937 :
デフォルトの名無しさん :2008/11/09(日) 20:08:15
>>918 >>919 thx.
継承元とかにキャストしちゃってvoid* pに渡すと、
offsetがずれたまま渡されちゃうのね。
newした型でvoid*するとoffset変更なしでアドレスも同じ。と。
助かったーまぢさんすこ
part63が二つあってその次がpart64か。
940 :
デフォルトの名無しさん :2008/11/09(日) 22:16:01
GPで木構造に新しいノードを追加したいんですがプログラムを教えてください。
struct Foo { int i; union { int x; int y; struct { int a; int b; }; }; }; こういう構造体はC++で禁止されてますが Foo f; f.a;f.b;とアクセスでき、かつ同じような構造になるようなものは どうしたら定義できますか?
サイズが違うものを共用体っすか
すんません 無名構造体の中のやつらはcharです
無名じゃなくて有名にすりゃいいと思うんだが。
無名のままでも次のコードで通るが、まあ、直接a, bに通したい理由があるのだろう struct Foo { int i; union { int x; int y; struct { char a; char b; } z; }; }; Foo f; f.z.a; // valid
946 :
デフォルトの名無しさん :2008/11/09(日) 23:33:32
本当は union { int x; char a; }; union { int y; char b; }; がやりたいのと違うか?
947 :
デフォルトの名無しさん :2008/11/12(水) 11:36:07
標準出力を自分で用意したstd::ostringstreamに変更して、 標準出力への出力文字列を全部ostringstreamに受け取るには どうすればよいでしょうか?
cout.rdbuf(自分で用意したostringstream.rdbuf());
試してみた結果 最終ステップでsegvる(gcc-4.2.4@x86_64 linux 2.6.24)んですが、環境依存なんでしょうか? #include <iostream> #include <sstream> int main(int, char *[]) { std::ostringstream os(std::ostringstream::out); std::cout.rdbuf(os.rdbuf()); }
えーと、どこが笑い所?
初めてだから優しくしてあげてね #include <iostream> #include <ostream> #include <sstream> int main() { std::ostringstream oss; std::cout.rdbuf(oss.rdbuf()); std::cout << "Hello World!!" << std::flush; std::cerr << "result: " << oss.str() << std::endl; return 0; }
952 :
949 :2008/11/12(水) 13:44:12
#include <iostream>
#include <sstream>
#include <cassert>
int main(int, char *[])
{
std::ostringstream os;
os << "foo";
assert( os.str() == "foo");
os.str("");
assert( os.str().empty() );
std::streambuf *lastbuf = std::cout.rdbuf(os.rdbuf());
std::cout << "foo";
assert( os.str() == "foo" );
std::cout.rdbuf(lastbuf);
}
できました!
理由はよくわかりませんが元のstreambuf*を戻してやる必要があるみたいです
(ref
http://bytes.com/forum/thread133393.html )
埋め
次スレ
>>33 import_featuresのために必要な.libファイルをリンクしてないだけかと。
>>952 そんな行儀悪いことするよりも、文字列出力を行う関数の引数に
int func(int a, int b, ostream& os = cout)
とかしておいて、必要に応じて引数にストリーム与えたほうがいいよ。
オブジェクトの寿命とかちゃんと管理しておかないとミスの元だから
すみません質問です。 enum test{ a } とした場合、test::a でも単に a としてもアクセスできてしまい悩んでいます test::aに限定したくてtestクラスに含めて見たのですが、そうすると列挙を受け取る 引数の型などに test::test としなければならず悩んでいます。 何かいいやり方はないでしょうか? 諦めてクラスにstatic const int aとでもするべきでしょうか・・・
>>955 名前空間を使えば?
namespace test の中に enum を定義し、この enum を指定するクラスや
関数も同じ名前空間内に入れれば、それらの型部分に修飾は不要。
これらを使用する側は using namespace test を書くまで test:: を省略出来ない。
namespace 内に enum ではなく、直に定数を定義すれば、更に目的に近いかも。
オペレータに関しての質問です。 bool operator < (const HOGE &value) const { ...} と教わったのですが、 最後の"const"の文法的な意味、また必要性がわかりません。 どなたか教えて頂けないでしょうか?
>>958 糞本薦めるな
>>957 その関数内でいかなる変数もクラスも変更しないという意味
mutableを付けるとconstの意味を壊せるがお勧めしない
>>958 >>959 さん、ありがとうございます。
なるほど、では、引数にあるconstは冗長で、
bool operator < (const HOGE &value) const { ...}
でなく、
bool operator < (HOGE &value) const { ...}
としても同じだということですか?
constは付属する位置でどれを修飾するのか 違うからきちんと位置と意味づけ考えろ
>>957 *this が const になるしるし
class Hoge {
int x;
void foo() const {
x = 1; // できない
}
void bar() {
x = 2; // できる
}
};
const Hoge *hoge;
hoge->foo(); // 呼べる
hoge->bar(); // 呼べない
>>957 大抵の場合、比較演算子はインスタンス変数を変更せずに実装できるので、constを付けておいた方がいい。
最後のconstを付けないと、例えばその比較演算子を定義したクラスのconstオブジェクトで比較演算が行えない。
組み込み型と動作を合わせると言う意味で、オブジェクトの比較演算はそのオブジェクトがconstか非constかに関わらず行えることが望ましい。
>>962 >>963 さん、ありがとうございます。
目から鱗です。大変よくわかりました!
比較演算子のオーバーロードのサイトを見ていると、
最後のconstが無いところがほとんどで、ハテナマークがでてました。
ありがとうございます!
965 :
デフォルトの名無しさん :2008/11/13(木) 00:45:54
C++ 12年ぶりに次世代スタンダードへ - "C++0x" 策定進み草案公開へ
2008/11/12
The C++ Programming Language
プログラミング言語C++は1998年に発行され2003年に改訂された国際標準ISO/IEC 14882を仕様として採用している。
ISO/IEC 14882はC++の言語仕様と標準ライブラリの双方を規程しており、1998年に規程されたものは通称C++98、2003年に改訂されたものは通称 C++03と呼ばれている。
現在、JTC1/SC22/WG21 - The C++ Standards Committeeにおいて次期C++仕様"C++0x"の策定が進められている。最終的に12年ぶりに新しいC++が登場ということになりそうだ。
C++0xはC++98/03との互換性は確保しつつ、言語仕様と標準ライブラリの双方の規約を改訂するもので、新しい機能として並列プログラミングのサポートやプログラミングの簡素化、
関数プログラミング機能の強化、ジェネリックプログラミングのアップデート、オプショナルガベージコレクタ機能の導入、新しい言語仕様の機能を活用した新しい標準ライブラリの策定が盛り込まれる見通しになっている。
従来のC++との互換性を損なうことなく、より効率のいい開発ができるように拡張されるというわけだ。
ttp://journal.mycom.co.jp/news/2008/11/12/003/index.html
あのすいません、 unsigned char* をunsigned int*に清く正しく型変換するのどうするんですか? unsigned int* PUINT = (unsigned int*)PUCHAR; じゃないですよね。
それで変換できてるよ C++的にはreinterpret_castの方がいいかもしれんが
清く正しい(動作として問題ない)かどうかは指してる先による。
>>967 reinterpret_castって、下記のように関連のないのに変換する場合使うんですよね。
unsigned int INT = reinterpret_cast<unsigned int>PUCHAR
ポインタ同士の場合ポインタで関連があるから。
unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
じゃないんですか?
それstatic_cast通らなくない?
ポインタのキャストにはreinterpret_castが必要です。
俺の中で、unsigned char* と unsigned int* は 鶏の卵と蛇の卵くらいの違いがあるんだ。 みんなそうだと思ってた。
>>972 可能な状況でかつその必要があるからやるんだろ
unsigned int* PUINT = static_cast<unsigned int*>(static_cast<void *>(PUCHAR)) なら通る
どうしてポインタ変換はstatic_castでなくreinterpret_castなの?
キャストしてるから
>>978 unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
だとどうして駄目なの?
暗黙に出来るポインタの変換はX*→void*だけだから
>>979 たとえば中身がchar s [1] だったとして十分危険だろ?
982 :
966 :2008/11/14(金) 19:11:32
>>966 =969です。
>>975 、
>>980 そういうことなんですか。ありがとうございました。
暗黙変換が可能なケースが?ですけど、staticの場合、暗黙に変換出来るもの
じゃなければ変換不可で、ポインタ間変換ではX*→void*とvoid*→X*しか
暗黙変換出来ないから、それ以外のポインタ間変換はreinterpretで行うと。
えらく賢くなったv
>>966 暗黙変換できるのはX*→void*だけ
static_castは暗黙変換と「暗黙変換の逆変換」ができるからvoid*→X*もできる
ポインタの変換を多用するんだったらこんなん作っとくといいよ
reinterpret_castと違ってintとかをポインタにしようとするとコンパイルエラーになってくれるから
template <typename T*>
inline T ptr_cast(void *p)
{
return static_cast<T>(p);
}
unsigned int* PUINT = ptr_cast<unsigned int*>(PUCHAR);
変なの入ってた template <typename T> inline T ptr_cast(void *p) { return static_cast<T>(p); }
static_cast はコンストラクタを呼び出してるだけなんだよね。
すいませんが それはどういう意味なのか教えていただけませんか?
二次元配列を動的に確保したいんですが、これってどこがまずいですか? どう書いたら動きますか? struct feature **features = new struct feature*[CATEGORY]; for(i = 0; i < CATEGORY; i++) features[i] = new struct feature[CANDIDATES];
少しくらい自分で勉強してから質問したらどうかと・・・
>>983-984 unsigned int* PUINT = ptr_cast<unsigned int*>(PUCHAR); じゃなく
もっと短く
unsigned int* PUINT = ptr_cast(PUCHAR);
とか出来ないですか? unsigned int*を二回も書くのメンドイです。
たとえば、
unsigned int* PUINT;
PUINT = reinterpret_cast<unsigned int*>PUCHAR の場合
<unsigned int*>をつけたほうが分かりやすいですが、
unsigned int* PUINT = reinterpret_cast<unsigned int*>(PUCHAR)の場合なんか、
見れば何に変換するのか明らかなのに、なぜ<unsigned int*>をつけるのか不思議です。
>>990 ありがとうございます。やっぱり出来るんですか、メモメモ
新しいのは、後ろじゃなく前のほうを略すですか。
992 :
989 :2008/11/14(金) 23:33:43
すみません、
>>984 ,
>>990 を元にポインタ変換をつくたんですけど
これで、ポインタ間変換以外はエラーで且つ、T* t = auto_cast(X* x);
な使い方できますか?
template<class T> class auto_cast_type {
void* value;
public:
auto_cast_type(T* x) : value(x) {}
template<class U> operator U () { return static_cast<U>(value); }
};
template<class T> inline auto_cast_type<T> auto_cast(T* x) { return x; }
ところで、下記は何をやっているんですか? で、どこで呼ばれるのですか?
template<class U> operator U () { ... }
Cでのキャストをオーバーロードしているんでね? operator int(){...} とかのテンプレート版。
994 :
989 :2008/11/14(金) 23:54:02
>>992 の
auto_cast_type(T* x) : value(x) {} は
auto_cast_type(T* x) { value = static_cast<void*>(x); }
が良いですか?
>>993 つまり U u =(U)自分; の変換法を記しているですか
void*へ変換してることをはっきりしたいならこう 初期化リストで書けるものは初期化リストで書く auto_cast_type(T* x) : value(static_cast<void*>(x)) {} まあvoid*へは暗黙変換できるんだしなくてもいいと思うが
void*に変換した物をdeleteするとうまく消せるのってどういう場合ですか?
void*に変換する直前の型に変換し戻した場合
・newした時の型 ・newした時の型の、仮想デストラクタを持つ基底クラスへのポインタ の時だけかな
,. -──- 、 ミ r‐、
/ _ -v-- 、 \ ノ) }
/ / rv、 、`ヾヽ /ハ l ! / ))
l/ // | l l lヾヘマヽ / \/
/ /ー '^′`ー:: ┼l_」ヘ/| / /
H'´ ≡/////≡ | / | j / /
l{ ::::: ┌─ ┐ :::::: 冂ヽ lく / /
八 | | l´レj / /
/ /\ | | | |/ / ここに来てね〜!
〈_/ rく ` ー--‐ 7´:! {:{ /
http://pc11.2ch.net/test/read.cgi/tech/1226347371/ /\ / l/Ll:|:. .:/|
/ / ー-/ :|: l:l:/ l
/ / i :|: //:. ヽ
/ヽ ヽ、 __::人 __:ノ:/'´|:. l: __ノ
\ \_ { ,,,):::::l(,,.;;} .:|:.__冫´
/ `ー/ー┤:::l .:|
_,,,-'''´ ̄  ̄`''- ,,,_ _,,-'''´ `'-,, / `ヽ / \ . / ヽ / ヘ /. l i ヘ . / i |. | ., l . l l |. | λ l. | |. | .| λ .l l ト .|.| .| . | | i. _/ヘ | .| .| l |.ヽ_,, -''´| | ., | | , .| /`''ヽ.,,_ .| l | ヽ,-|''ヘ l ノ .i | .| | | ヾ .|__ゝ_`,|、,, ヽ ヽ、.| ,,-''´_ゝ,、‐ヽ'''''∧ // .| . | | ヾ |.l i. `-' ̄|`i'-'\,,_ `|´,'7´`‐' .l ヘ/ ヾ / .| 22:00 MX 見て! | i ヘ. ゞ、,|.ヘ, \,,,,,,ノ.丿 `'' ヘ,,ゝ,,,,,,,ノ /. i , ., λ | ヘ ∧ ヘ 丶ヘ `''‐--‐'''´ `''‐--‐''´./ ./ / /.| / \ .ヘ `i\ .ヘ = ./ ,,-''1.,ィ / ノ ヘ |ヽ `ト、_ゝ '''´ ./'' .| / ヽl. \l `''-,,,,___,,,,-'' / . \ ,,-'' `''- ,,_ _,, -'''´  ̄''''''''''''''' ̄
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。