C++相談室 part63
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2008/09/11(木) 23:49:17ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part63
http://pc11.2ch.net/test/read.cgi/tech/1217008269/
0002デフォルトの名無しさん
2008/09/11(木) 23:50:03ググレカス
http://www.google.co.jp/
0003デフォルトの名無しさん
2008/09/12(金) 09:53:12ご了承ください。
0004デフォルトの名無しさん
2008/09/12(金) 09:56:01環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0005デフォルトの名無しさん
2008/09/14(日) 06:39:48そして棚に隠れながら「いらっしゃいませー」と
大きい声で言ってみる。
すると広いフロアの店員がいっせいにつられて「いらっしゃいませー」
と続く。
これを二・三回繰り返しスッキリしたら店を出る。
0006z208.124-45-67.ppp.wakwak.ne.jp
2008/09/14(日) 09:23:010007デフォルトの名無しさん
2008/09/17(水) 21:37:270008デフォルトの名無しさん
2008/09/22(月) 19:03:42外資系の会社勤務だそうで名詞を見せてもらったら英語の会社名でした。
ダイレクトがどうしたとかC++(ぷらぷらって読むんですか?)がこうとか、
メカセコなんたらなどとよく言っています。
私にはさっぱり理解できないのですが彼のような人はどの位の年収をもらっているものなのでしょうか。
知ってどうこうということはないんですけど。。。
0009デフォルトの名無しさん
2008/09/22(月) 19:19:29板違い。マ板行け。たぶんマ板でも「本人に聞け」「ネカマ市ね」とか言われると思うけどね。
0010デフォルトの名無しさん
2008/09/24(水) 19:21:060011デフォルトの名無しさん
2008/09/24(水) 20:39:050012デフォルトの名無しさん
2008/09/24(水) 20:48:120013デフォルトの名無しさん
2008/09/24(水) 20:59:480014デフォルトの名無しさん
2008/09/24(水) 21:50:410015デフォルトの名無しさん
2008/09/25(木) 00:33:030016デフォルトの名無しさん
2008/09/25(木) 02:01:36ONE = 1 << 0,
TWO = 1 << 1,
THREE = 1 << 2,
FOUR = 1 << 3,
};
とか、
enum { ONE, TWO, THREE, FOUR, }; しといて
使うときに(1<<ONE)とか
0017デフォルトの名無しさん
2008/09/25(木) 08:00:56あら?こうやって書けたの?
0018デフォルトの名無しさん
2008/09/25(木) 08:19:17定数なら演算が入ってもOKよ。
0019デフォルトの名無しさん
2008/09/25(木) 19:25:08プログラムが終了するまではCPU使用率が100%になると思うんだけど、
これを60%くらいでダラダラ計算させるにはどうすればいい?
タイマー使って休み休みさせればいいの?
0020デフォルトの名無しさん
2008/09/25(木) 19:39:420021デフォルトの名無しさん
2008/09/25(木) 19:47:52さんくす
0022デフォルトの名無しさん
2008/09/25(木) 19:49:41計算時間6に対して4休めばCPU占有率60%になるが、なんか意味あるのか。
0023デフォルトの名無しさん
2008/09/25(木) 19:59:12かかるんだけど、シングルコアだから他のアプリが動かなくなる。
前のシミュレーション結果をエクセルで加工してる間に、新しいパラメータで
シミュレーション。その結果をエクセルで加工・・・ループ
って感じ。デュアルコアだったら無問題なんだけど
0024デフォルトの名無しさん
2008/09/25(木) 20:00:41それならプロセスやスレッドの優先度を下げればいいだけ。
アイドル優先度にでもしておけば、他の作業を妨げることはない。
0025デフォルトの名無しさん
2008/09/25(木) 20:05:19ありがとうございます
0026デフォルトの名無しさん
2008/09/25(木) 20:42:20// こう?
0027デフォルトの名無しさん
2008/09/25(木) 20:53:05→優先度の設定から行ける
いちいちやるのが面倒いけど
0028デフォルトの名無しさん
2008/09/25(木) 20:56:55Sleep(0); でいいじゃん
要するにメッセージキューに溜まったメッセージを処理させればいいんでしょ
DelphiならApplication.ProcessMessages だけど同じ事だし
0029デフォルトの名無しさん
2008/09/25(木) 21:08:540030デフォルトの名無しさん
2008/09/25(木) 21:35:59やってみて言ってんのか?
0031デフォルトの名無しさん
2008/09/25(木) 21:44:29お前は質問を誤読してるよ。
恥ずかしいから黙っとけ。
0032デフォルトの名無しさん
2008/09/25(木) 21:47:290033デフォルトの名無しさん
2008/09/25(木) 21:50:56なるのを防ぐためにSleep(0)を計算プログラムの所々に入れるって
言ってるんだろ。
シングルコアのCPUにはこういうテクが必要なんだよ覚えとけ
0034デフォルトの名無しさん
2008/09/25(木) 21:57:540035デフォルトの名無しさん
2008/09/25(木) 22:19:53存在理由が全く異なる。
他の待機中のプロセスにCPUを移行して走らせるためのタスク
スイッチをユーザー側に負担を強いる事で押しつけている。
0036デフォルトの名無しさん
2008/09/25(木) 22:41:490037デフォルトの名無しさん
2008/09/25(木) 22:46:56簡単だぜ
0038デフォルトの名無しさん
2008/09/25(木) 22:51:13他の人は皆わかってるんだよね?
0039デフォルトの名無しさん
2008/09/25(木) 22:52:46だから や っ て み ろ っ て
永久ループのプログラムを作って走らせておいて
エクセル立ち上げていろいろいじくってみれ
あまりの重さにイライラするから
0040デフォルトの名無しさん
2008/09/26(金) 00:01:530041デフォルトの名無しさん
2008/09/26(金) 00:10:59エクセルが重くなるのは単にタイムスライスが十分に回ってこないのが原因であって、
シングルプロセッサであることとは全く関係ないんですが。
0042デフォルトの名無しさん
2008/09/26(金) 00:26:590043デフォルトの名無しさん
2008/09/26(金) 04:32:45If you specify 0 milliseconds, the thread will relinquish the remainder of its time slice but remain ready.
0044デフォルトの名無しさん
2008/09/26(金) 07:45:20Sleep(0)でメッセージが処理されるとしたら他スレッドのもので、自スレッドのは処理されない。
ProcessMessagesとは全然違う。
0045デフォルトの名無しさん
2008/09/26(金) 08:45:06Windowsプログラミング関連のスレとかOSi板のWindows関連のスレででもやれば?
0046デフォルトの名無しさん
2008/09/26(金) 08:46:190047デフォルトの名無しさん
2008/09/26(金) 12:33:03確かにSleep(0)をすれば他のプロセスに実行時間を多く割り当てられるようになるが、それは無駄なポーリングをしてるような場合のテクニックだな。
>>23のようにシミュレーションなど実のある処理には適さないな。
プライオリティの調整が適切でしょう。
0048デフォルトの名無しさん
2008/09/26(金) 12:42:360049デフォルトの名無しさん
2008/09/26(金) 14:08:30まわりがemacsなのでVisualStudioから以降してみてだいぶたつんだけど
やっぱりVisualStudioが一番便利に感じる
gdbだと変数追いかけるのが不便すぎる
0050デフォルトの名無しさん
2008/09/26(金) 14:14:300051デフォルトの名無しさん
2008/09/26(金) 14:15:29いいかどうかなんてその人次第
0052デフォルトの名無しさん
2008/09/26(金) 14:17:550053デフォルトの名無しさん
2008/09/26(金) 14:29:090054デフォルトの名無しさん
2008/09/26(金) 14:35:23やってみた。スレ違いスマソ。Excelは起動毎にディスクキャッシュを
クリアして行った。
・Sleep(0)無し
Excelの起動速度は確かに遅くなったが、一度立ち上がって
しまえば別に重いと感じなかった。しかし計算速度は半分。
・Sleep(0)有り
Excelの起動速度にほとんど影響しない。立ち上がった後の
動作も通常と変わらない。計算速度も変わらない。
と言う事でSleep(0)有り無しではシングルコアでは結構差が出る
体感速度にはそんなに出ないが(Excelそのものはそんなに速度を
必要としないからか?)
0055デフォルトの名無しさん
2008/09/26(金) 14:45:080056デフォルトの名無しさん
2008/09/26(金) 21:37:20(以下のソースを、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;
}
0057sage
2008/09/26(金) 23:35:57VC9では,
int main()
{
int n = 3;
int& r = n;
int& r2 = r;
std::cout << r2 << std::endl;
return 0;
}
とやると3とでるようですが.
0058デフォルトの名無しさん
2008/09/26(金) 23:37:030059デフォルトの名無しさん
2008/09/26(金) 23:40:42というか、いちど参照変数作ってしまったらどっちが元だったか区別付かなくなる。
006057
2008/09/26(金) 23:52:13>>59
ありがとうございます.
参照の参照が,まずいと聞いたことがあった気がしたのですが,
まずいのは,
int&&
でした.
普通やらないですね..
http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/cwg_defects.html#106
0061デフォルトの名無しさん
2008/09/26(金) 23:53:53参照の参照は違反
でも>>57は普通の参照になる
何も考えずにやってるとテンプレート関連で引き起こされる
>>58-59
適当いってんじゃねー
0062デフォルトの名無しさん
2008/09/27(土) 02:38:44そりゃそうでしょ。
システムコールはx86の場合大抵コールゲートを通しているので
大変重い。
SYSCALLを使っていれば少しは軽いんですが。
0063デフォルトの名無しさん
2008/09/27(土) 04:16:46とりあえず
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
]
この変換が可能なコンテキストはありません。
根本的に何かダメでしょうか?
0064デフォルトの名無しさん
2008/09/27(土) 04:34:550065デフォルトの名無しさん
2008/09/27(土) 04:50:31というかメンバ関数の場合はなんかめんどくさいっすね・・・
0066デフォルトの名無しさん
2008/09/27(土) 04:59:52class 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>);
……なんてことやっていると、結局メンバへのポインタ使うほうが楽と思う。
0067デフォルトの名無しさん
2008/09/27(土) 05:22:29クラス内で完結させることばっかりに目がいってました。
さっそく試してみます。ありがとうございます。
0068デフォルトの名無しさん
2008/09/27(土) 13:50:38みたいにshared_ptrでコンテナを共有するコードってどう思いますか?
構文上問題ないのは分かるんですが、pVector(new vector<T>);を見て、
コンテナをnew(笑)と思ってしまいます。
でも、コンテナを共有するためにshred_ptrに入れる事って普通にありますよね?
0069デフォルトの名無しさん
2008/09/27(土) 14:10:37それがプログラミング
0070デフォルトの名無しさん
2008/09/27(土) 16:58:53みたいにshared_ptrでTを共有するコードってどう思いますか?
構文上問題ないのは分かるんですが、pVector(new T);を見て、
Tをnew(笑)と思ってしまいます。
でも、Tを共有するためにshred_ptrに入れる事って普通にありますよね?
コンテナを特別視する理由が知りたい
0071デフォルトの名無しさん
2008/09/27(土) 17:45:47同期取らせるラッパークラスに入れた方がいいかもな
そういう事しないなら別に
007268
2008/09/27(土) 17:46:18ありです。
>>70
コンテナは動的に確保したメモリを扱うためのクラスだからです。
コンテナをnewするという事は、コンテナの中と外で2重にメモリを管理する事になるのが気になります。
0073デフォルトの名無しさん
2008/09/27(土) 17:47:520075デフォルトの名無しさん
2008/09/27(土) 17:51:17コンテナの中身をdeleteするのはコンテナの責任になるだけ
コンテナは自分がどこにいようと、死ぬときに自分の責任は全うしてくれるはず
だから気にすんな
007668
2008/09/27(土) 18:06:250077デフォルトの名無しさん
2008/09/27(土) 18:54:490078デフォルトの名無しさん
2008/09/27(土) 19:37:07問題ない。ただし自由度が高くなるので一見便利そうだが、後々複雑さが増す。
コンテナを包含するクラスを作って、それを共有するようにすることをお勧めしますですハイ。
0079デフォルトの名無しさん
2008/09/27(土) 19:48:30template<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); // 結果: (×)
どうすりゃいい?
0080デフォルトの名無しさん
2008/09/27(土) 19:55:26数値を常に出して欲しいなら、テンプレートを使わずに
Hoge(int i)
で受ければいいんじゃないかな。
0081デフォルトの名無しさん
2008/09/27(土) 19:57:080082デフォルトの名無しさん
2008/09/27(土) 19:58:22charのとき特殊化してcout << (int)iするとか。
0083デフォルトの名無しさん
2008/09/27(土) 19:59:230084デフォルトの名無しさん
2008/09/27(土) 20:04:17>>80
すいません。
お試し用プログラムでかなり簡略化しちゃったので…
やはりsigned charとunsigned charのときだけ特殊化するしかないようですね。
やっぱprintfの方が使いやすい><
0085デフォルトの名無しさん
2008/09/27(土) 20:13:380086デフォルトの名無しさん
2008/09/27(土) 21:47:20と思っているのですが、
たぶん、thisポインタがどうたらとか、デマングルがどうとかで、単純に普通(?)の
メンバ関数をpthread_create()の引数に渡したりしても駄目ですよね?
C++でpthreadを使う際の何か典型的なパターンというのはあるでしょうか。
0087デフォルトの名無しさん
2008/09/27(土) 21:53:04メンバ関数を実行したいなら、メンバ関数のポインタを直接渡すことは出来ないから
それを実行するだけの関数を別に作ってそのポインタ渡せばいいんじゃない
0088デフォルトの名無しさん
2008/09/27(土) 22:02:36スタティックメンバ関数のポインタなら渡せる。
インスタンスを区別するためにオブジェクトのポインタを引数にして渡せる。
0089デフォルトの名無しさん
2008/09/27(土) 22:27:38void *foo_call(void *foo_obj)
{
static_cast<Foo *>(foo_obj)->bar();
}
pthread_t th;
pthread_create(&th, NULL, void * (*start_routine)(void *), void * arg);
0090デフォルトの名無しさん
2008/09/27(土) 22:29:26こういうfoo_call関数作って、pthread_createの第4引数に呼び出し元のオブジェクト与えればいいんじゃねと言いたかった
0091デフォルトの名無しさん
2008/09/28(日) 17:51:18以下の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;}
};
009291
2008/09/28(日) 18:01:34親子の
・生成消滅のタイミングが違うとき
・子コンポーネントにポリモーフィズムを実装したいとき
にポインタ利用ですね.
スレ無駄にしてスマソ.
0093デフォルトの名無しさん
2008/09/28(日) 22:23:41class CTest : public int
{};
0094デフォルトの名無しさん
2008/09/28(日) 22:33:540095デフォルトの名無しさん
2008/09/28(日) 22:49:150096デフォルトの名無しさん
2008/09/28(日) 22:51:45意味がわかんないんだけど
コマンドプロンプトで日本語入力ならAlt + 半角/全角
でできるよ
0097デフォルトの名無しさん
2008/09/28(日) 23:02:080098デフォルトの名無しさん
2008/09/28(日) 23:17:310099デフォルトの名無しさん
2008/09/28(日) 23:34:270100デフォルトの名無しさん
2008/09/28(日) 23:37:51アップキャストの時は普通にキャストしてくれるようにできてるはず
0101デフォルトの名無しさん
2008/09/28(日) 23:42:08答えになっていません
出直してきてください
>>100
ということはキャストせず代入と実行速度などのコストは
等価なのでしょうか?
0102デフォルトの名無しさん
2008/09/28(日) 23:48:05ここで見たってだけ
ttp://www7b.biglobe.ne.jp/robe/cpphtml/html02/cpp02042.html
0103デフォルトの名無しさん
2008/09/28(日) 23:59:35ありがとう^^
そのページに答えが書いてあったよ。
チェックする必要のないキャスト(普通のアップキャスト)では
static_cast と同じ処理に最適化されます。
010493
2008/09/29(月) 01:23:40まさにテンプレートで、
実際には、
template<typename T>
class CNumeric : T
{
//追加メソッド
};
こんな感じで、Tに intやらshortを指定したいということ。
intをクラスのメンバーにすると、各種演算子の実装がめんどくさい
ってだけの話なんだけどね。
0105デフォルトの名無しさん
2008/09/29(月) 04:45:37ということはintもvtbl持ってないとなー
馬鹿げたアイデアだとすぐ気付きそうなもんだが
0106デフォルトの名無しさん
2008/09/29(月) 05:21:34馬鹿げてるとは思わんな
この場合は機能追加だから仮想関数禁止でいいじゃん
あるいは、継承できなくてもいいから、std標準ライブラリに
組み込み型と同機能のtemplate classを実装しておいてほしい
0107デフォルトの名無しさん
2008/09/29(月) 05:24:420108デフォルトの名無しさん
2008/09/29(月) 16:20:23test a, b;
struct x;
//テンプレート引数に入る型の情報はstruct testの定義よりも後
//本当は a.t2i<x>() と b.t2i<x>() を別々にしたい
a.t2i<x>();
b.t2i<x>();
コメントの通りにするのは不可能でしょうか?
0109デフォルトの名無しさん
2008/09/29(月) 16:27:480110デフォルトの名無しさん
2008/09/29(月) 16:29:510111デフォルトの名無しさん
2008/09/29(月) 16:31:180112デフォルトの名無しさん
2008/09/29(月) 16:39:35その、整数の参照を一体全体何に使うんだ?
その条件だと、単にメンバ変数でよさそうなんだが。
0113デフォルトの名無しさん
2008/09/29(月) 16:41:36class Hoge{
protected:
Hoge();
public:
virtual ~Hoge();
};
class Piyo{
public:
Hoge& getHoge(){
struct TMP:public Hoge{
TMP():Hoge(){}
}TMP();
return TMP;
}
};
この場合もデストラクタにvirtualは必要ですか?それとHogeに他の関数がある場合、それらも
virtualにしないとダメですか?
0114デフォルトの名無しさん
2008/09/29(月) 16:52:27しかし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の関数ポインタから呼び出せるようにしている。
0115デフォルトの名無しさん
2008/09/29(月) 20:25:20ベースクラスになれるのはクラスのみ
int は型ではあるがクラスではないのでベースクラスにはなれない
struct も union もクラスだよ
0116デフォルトの名無しさん
2008/09/29(月) 21:58:150117デフォルトの名無しさん
2008/09/30(火) 08:01:47次数は整数です。
0118デフォルトの名無しさん
2008/09/30(火) 09:14:59liboctaveは使えるはず
0119デフォルトの名無しさん
2008/09/30(火) 16:52:42開発言語:C++
質問:
文字コード変換について質問させてください。
現在仕事で、UTF8とSJISの文字コード相互変換と、UTF8からJISへの変換(相互変換不要)を
する必要が出てきた為、変換方法を調べている最中なのですが、いい方法が見つかりません。
案1.文UTF8とSJISとJISの文字コード対応テーブルを作成し、それを元に変換をかける。
→コード量が多くなるためにあまりやりたくないのですが、これしか方法がない場合は
第一水準の漢字までの文字コード対応テーブルを作成して変換をかける。
案2.ICUライブラリを使用する。
→ものすごくいいものなんですが、よすぎるために容量が多すぎて搭載できません。
これ以外に方法はないでしょうか?
C/C++の標準ライブラリに変換関数は見当たらないようでしたし、
ICUよりもっと簡易的な変換ライブラリはないものでしょうか?
または、SJIS⇒JISのような文字コード変換みたく、簡単に計算できるものですか?
0120デフォルトの名無しさん
2008/09/30(火) 17:25:450121117
2008/09/30(火) 18:10:17octaveですか。ちょっと試してみます。
他におすすめあればよろしくお願いします。
0123117
2008/10/02(木) 09:56:46g++ならできるんですが、icpcでコンパイルするとエラーがでます。
0124デフォルトの名無しさん
2008/10/02(木) 11:37:14たぶん、g++以外ではそのままコンパイルはできないと思う…
UNIX板のoctaveスレで聞いたほうがいいかもね
0126デフォルトの名無しさん
2008/10/03(金) 20:20:23http://www.pej-hed.jp/washo/2591.html
日本語の Boost本 2 冊目キターーー
http://www.pej-hed.jp/washo/2590.html
012793
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;
0128デフォルトの名無しさん
2008/10/04(土) 09:34:30operator const T&() const; でも可かな。
0129デフォルトの名無しさん
2008/10/04(土) 11:48:54環境はVC2008EEです。
少し長いのですが、以下のコードの問題を指摘して頂けないでしょうか。
コンパイルは通るのですが、アクセスエラーが発生してしまいます。
// Event.h
#include <iostream>
#include <map>
class Object {
protected:
virtual ~Object(){}
};
typedef void (Object::*MessageFunc)();
0130デフォルトの名無しさん
2008/10/04(土) 11:49:24private:
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();
};
0131デフォルトの名無しさん
2008/10/04(土) 11:51:24#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;
}
0132デフォルトの名無しさん
2008/10/04(土) 11:52:40{
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;
}
0133デフォルトの名無しさん
2008/10/04(土) 12:00:280134デフォルトの名無しさん
2008/10/04(土) 12:10:31たぶん msgMap[msg] が 0。ちゃんと AddMessage できてるか確認した?
0135デフォルトの名無しさん
2008/10/04(土) 12:25:04MessageFunc func = (MessageFunc)&Component::OnEvent;
(ev.*func)();
こんなことしてるんだから落ちて当然
0136129
2008/10/04(土) 12:56:10ありがとうございます。
利用してみました。
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
呼び出しを調べてみます。
0138デフォルトの名無しさん
2008/10/04(土) 13:15:400139デフォルトの名無しさん
2008/10/04(土) 13:36:020140129
2008/10/04(土) 13:46:01Component::OnEvent()をEvent::OnEvent()に移動させたら動きました。
Event ev;
MessageFunc func = (MessageFunc)&Event::OnEvent;
(ev.*func)();
で,OKですね。ありがとうございました。
ただ、Component::OnEvent()を他のComponentを継承したクラスで
オーバーライドさせたいので、全体の実装方法はもう少し考えてみます。
0141デフォルトの名無しさん
2008/10/04(土) 13:58:32class 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 を参照できないんだが、
規格上こういうテンプレートは書けないって事でいいのかな?
0142デフォルトの名無しさん
2008/10/04(土) 14:23:04baseのメンバ関数の中では普通に使えるのにな。
0143デフォルトの名無しさん
2008/10/04(土) 14:33:570144デフォルトの名無しさん
2008/10/04(土) 14:54:060145デフォルトの名無しさん
2008/10/04(土) 15:26:270146デフォルトの名無しさん
2008/10/04(土) 16:02:30std::vector に入れて線形検索できるけど、std::set に入れて検索できますか?
new ではなく同一配列内のオブジェクトのポインタは場合は < で比較できるので問題ないと思いますが。
0147デフォルトの名無しさん
2008/10/04(土) 16:10:24derivedの前に基底クラスのbaseを生成するので
baseが生成される時は、derived::P1 が何かわからない。
たぶん・・・
0148デフォルトの名無しさん
2008/10/04(土) 17:44:030149デフォルトの名無しさん
2008/10/04(土) 17:51:510150デフォルトの名無しさん
2008/10/04(土) 17:57:490151デフォルトの名無しさん
2008/10/04(土) 18:03:310152デフォルトの名無しさん
2008/10/04(土) 18:03:54ここに書いてあるoperator=はやってはいけない実装らしいのですが
どこらへんがだめなのでしょうか?
0153デフォルトの名無しさん
2008/10/04(土) 18:05:30用途によって変わると思うのだが
開発効率あげたければ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は軽くていいよ
0154デフォルトの名無しさん
2008/10/04(土) 18:06:140155デフォルトの名無しさん
2008/10/04(土) 18:06:260156デフォルトの名無しさん
2008/10/04(土) 18:16:02自己代入に対応してないことと、
E::operator =が例外を投げない保障をしない場合に例外安全にならないこと
くらいじゃないかな…
0157デフォルトの名無しさん
2008/10/04(土) 18:22:29それとE::operator []の戻り値の型のoperator = かな
0158146
2008/10/04(土) 18:27:18オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。
ポインタを十分な大きさの整数に reinterpret_cast した場合、その整数は元のポインタに戻せるので
ポインタと変換された整数は1対1の関係ということになり、その整数を < で比較できます。
ただし十分な大きさの整数が存在するかどうかは処理系によるので、オブジェクトごとに一意の
整数 ID を持たせるしかないかもしれません。
0159デフォルトの名無しさん
2008/10/04(土) 21:23:08>オブジェクトが同じ集成体にない場合、< の結果は未規定なのでできないようです。
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.
0160146
2008/10/04(土) 21:59:13単に operator< を関数オブジェクトにするのが目的だと思っていました。
ありがとうございました。
0162デフォルトの名無しさん
2008/10/04(土) 23:28:29operator T&()とoperator const T&() constは両方とも用意するのが普通
016393
2008/10/05(日) 00:31:15環境は、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;
0164デフォルトの名無しさん
2008/10/05(日) 00:36:500165デフォルトの名無しさん
2008/10/05(日) 00:51:40そういう自分もVC6物件のメンテナンスを2件抱えている。もうすぐ1件に減るけど
016693
2008/10/05(日) 01:04:48外注からバージョンアップ費用出せと脅されるわ、金無いわで、どうしようもないんだよな。
といっても、いつまでもVC6使ってる訳にもいかないし。
0167デフォルトの名無しさん
2008/10/05(日) 01:56:49016893
2008/10/05(日) 02:02:28ノウハウ握られ過ぎてるんだわ。
0169デフォルトの名無しさん
2008/10/05(日) 02:03:49問題領域にもよるけどね
システムの性質しだいでは莫大な費用が発生する
0170デフォルトの名無しさん
2008/10/05(日) 06:04:47どこがだめなんだろうか?
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 ;
}
0171デフォルトの名無しさん
2008/10/05(日) 08:47:28どこがうまくいかないのだろうか?
0172デフォルトの名無しさん
2008/10/05(日) 10:54:05あるデータをFFT->逆FFTにしても、まったく別のデータとなります。
>170
のソースで引数は、
double *OCT_POW:スペクトルデータ
int DATASIZE:データ長
double *OCT_BUF:音データ
で、意識的に意味合いを持たせているのは、
1つ目のfor:FFT後のデータの後半は対称なので、前半半分を逆フーリエ変換の対象としている。
1つ目のforの中身:実部にデータを代入。虚部=0。(originalData自体にデータを代入したが変化なし。)
です。
お願いします。
0173デフォルトの名無しさん
2008/10/05(日) 12:35:37まず、全域を計算対象にして、正弦波をぶち込んで、FFTが正しく行われているか確認し、次に逆FFTが正しく行われているか確認する。
その後いろいろ弄れ
0174デフォルトの名無しさん
2008/10/05(日) 14:29:39FFTの動作は確認済です。
色々とやってみます。
0175デフォルトの名無しさん
2008/10/05(日) 15:36:00フーリエ変換する最初からやってました。
"全域で"できました。
ありがとうございました。
0176デフォルトの名無しさん
2008/10/05(日) 23:06:16下のように、char型の配列に1バイト文字、2バイト文字混合の文字列を入れたとして、
char test[] = "abcあいうえお";
test[x]が1バイト文字の一部なのか、2バイト文字の前半なのか、後半なのかを判別する方法はないでしょうか?
よろしくお願いします。
0177デフォルトの名無しさん
2008/10/05(日) 23:07:240178デフォルトの名無しさん
2008/10/05(日) 23:11:440179デフォルトの名無しさん
2008/10/06(月) 00:03:15typedef 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;
}
0180デフォルトの名無しさん
2008/10/06(月) 00:18:07Unko
0181デフォルトの名無しさん
2008/10/06(月) 00:24:47キャストでもしない限り警告は出るだろ
エラーはぱっと見分からん
0182デフォルトの名無しさん
2008/10/06(月) 00:26:15Unko に D = 0x11 を定義すれば OK じゃね?
0183179
2008/10/06(月) 00:29:20main.cpp:13: error: invalid conversion from ‘int’ to ‘Unko’
ってでてます。 昔をとくにErrorとかWarningなしで通ってた気がするのですが。。。
0184デフォルトの名無しさん
2008/10/06(月) 00:32:07enum→intはできる
0185デフォルトの名無しさん
2008/10/06(月) 00:32:44AはUnko型
BもUnko型
CもUnko型
しかし、A|Bはint型
そんな未知の値をUnko型にはコンバート出来んよ
そもそもint型でウケるべきでは?
列挙型の意味理解してる?ただの定数じゃないぞ
0186デフォルトの名無しさん
2008/10/06(月) 00:46:23Cでは暗黙変換で通る。C++では明示的なキャストがないと通らない。
0187デフォルトの名無しさん
2008/10/06(月) 00:48:54Unko operaotr |(Unko lhs, Unko rhs)
{
return static_cast<Unko>(lhs | rhs);
}
0188デフォルトの名無しさん
2008/10/06(月) 00:50:200189デフォルトの名無しさん
2008/10/06(月) 00:54:370190デフォルトの名無しさん
2008/10/06(月) 01:27:440191デフォルトの名無しさん
2008/10/06(月) 01:39:26目的による
0192デフォルトの名無しさん
2008/10/06(月) 01:46:45オレにとっては STL map スゲーだった
でも、C++から始める人には何がスゲーのか分からんだろうな
0193デフォルトの名無しさん
2008/10/06(月) 11:53:400194デフォルトの名無しさん
2008/10/06(月) 12:18:14Cは使えるC++初心者なら、ifとswitchが全然ないプログラムを見せてやれ。
0195デフォルトの名無しさん
2008/10/06(月) 12:35:10こうですか?わかりません><
#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])();
}
0196デフォルトの名無しさん
2008/10/06(月) 13:04:29boostのspiritなんかも面白いかもね
0197デフォルトの名無しさん
2008/10/06(月) 13:13:290198デフォルトの名無しさん
2008/10/06(月) 14:17:57このほうが良くないですか?って言われて終了
void hoge(int i)
{
printf("%d\n", i+1);
}
0199デフォルトの名無しさん
2008/10/06(月) 14:27:39しかしMSCのかなり前のバージョンから使ってたなあ、それ。
0200デフォルトの名無しさん
2008/10/06(月) 15:55:270201デフォルトの名無しさん
2008/10/06(月) 20:39:570202デフォルトの名無しさん
2008/10/06(月) 21:55:570203デフォルトの名無しさん
2008/10/06(月) 21:58:260204デフォルトの名無しさん
2008/10/06(月) 22:15:090205デフォルトの名無しさん
2008/10/06(月) 23:15:27> void (Manko::*p[])() = {&Manko::hoge1,&Manko::hoge2};
なんだこれwww
文法エラー
しかもstaticじゃないと関数ポインタ取得できない
0206デフォルトの名無しさん
2008/10/06(月) 23:33:39まぁ呼び出しの方はおかしいけど
0207デフォルトの名無しさん
2008/10/06(月) 23:38:14using 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])();
}
0208デフォルトの名無しさん
2008/10/06(月) 23:41:49ほほぅ
インスタンスって知ってますか?www
関数ポインタ変数にメンバ関数ポインタとやらを代入して、
関数ポインタ変数越しに呼び出すコードを晒して下さい
コンパイルが通るコードね
0209208
2008/10/06(月) 23:43:14これはひどいwww
何がしたいの?www
0210デフォルトの名無しさん
2008/10/06(月) 23:43:48お前は一体何を・・・
0211デフォルトの名無しさん
2008/10/06(月) 23:44:47初期化子について勉強しなおしたほうがいい
0212208
2008/10/06(月) 23:48:35なんで突然初期化子が出てくんだよwww
あぁあれか、馬鹿の一つ覚えってやつかな?www
0213デフォルトの名無しさん
2008/10/07(火) 00:03:22テンプレート使ったときのエラーメッセージ見せる方が効果的。
「この数千文字のエラーはね、constがないってコンパイラが怒ってるんだよ」
0214デフォルトの名無しさん
2008/10/07(火) 00:04:44そういうことを言いたいのではなさそうだな?
0215デフォルトの名無しさん
2008/10/07(火) 00:22:330216デフォルトの名無しさん
2008/10/07(火) 00:25:170217デフォルトの名無しさん
2008/10/07(火) 00:25:28悪いことは言わん、お前が逃げろ
今すぐにだ
0218デフォルトの名無しさん
2008/10/07(火) 00:27:29はいどうぞwwwww
0219デフォルトの名無しさん
2008/10/07(火) 00:27:520222デフォルトの名無しさん
2008/10/07(火) 00:33:110223208
2008/10/07(火) 00:33:19>>218は頭悪そうだなwww
0224デフォルトの名無しさん
2008/10/07(火) 00:35:180225デフォルトの名無しさん
2008/10/07(火) 00:36:110226デフォルトの名無しさん
2008/10/07(火) 00:41:350227208
2008/10/07(火) 00:42:01理解していない馬鹿はお前
thisが関数ポインタとでも?www
0228デフォルトの名無しさん
2008/10/07(火) 00:42:090229デフォルトの名無しさん
2008/10/07(火) 00:43:050230208
2008/10/07(火) 00:44:03お前も何言ってんだ?www
0231デフォルトの名無しさん
2008/10/07(火) 00:44:06http://www.geocities.jp/ky_webid/cpp/language/034.html
0232デフォルトの名無しさん
2008/10/07(火) 00:44:54あれ?こいつ207じゃね?
0233デフォルトの名無しさん
2008/10/07(火) 00:46:10お前が207叩くから恥かいた
謝れよ
0234デフォルトの名無しさん
2008/10/07(火) 00:47:44207も謝れ
0235208
2008/10/07(火) 00:48:42こういう構文もあるのか、しらんかったorz
まったく実用性ないが
でも誤ろうとは思わない
0236デフォルトの名無しさん
2008/10/07(火) 00:50:13新しい機能だろ?こんな変なの
0237208
2008/10/07(火) 00:51:52void (CSample::*pFunc)() = &CSample::func;
この時点でメンバ関数ポインタを取得っておかしくね?
0238デフォルトの名無しさん
2008/10/07(火) 00:53:53そういうものだと思うしかないんだろ
0239デフォルトの名無しさん
2008/10/07(火) 00:56:00別におかしくないよ。
0240デフォルトの名無しさん
2008/10/07(火) 00:57:41どうやってfuncなるメンバ関数を特定するのかとても不可解です
0241208
2008/10/07(火) 01:01:53そして、呼び出し時にインスタンスを指定したところで、
インスタンスのポインタ+オフセットをcallみたいなことなのかな?
ん〜、どう見ても使えんwww
0242デフォルトの名無しさん
2008/10/07(火) 01:01:59インスタンス付けて実際に呼ぶまで実際に呼ぶ関数は決まりません(virtualの場合)
0243デフォルトの名無しさん
2008/10/07(火) 01:02:01class CSample { void func(); };
void (CSample::*pFunc)() = &CSample::func;
(obj.*pFunc)();
↓
void func(CSample *this);
void (*pFunc)(CSample*) = &func;
(*pFunc)(&obj);
0244デフォルトの名無しさん
2008/10/07(火) 01:02:390245デフォルトの名無しさん
2008/10/07(火) 01:05:590246デフォルトの名無しさん
2008/10/07(火) 01:08:47全部の機能が何かの役に立つわけではないだろう
0247デフォルトの名無しさん
2008/10/07(火) 01:09:410248208
2008/10/07(火) 01:14:02呼び出す時にインスタンス指定しなきゃいけないんだろ?
関数ポインタっつってるけど、
これ関数ポインタじゃねーじゃんwww
0249デフォルトの名無しさん
2008/10/07(火) 01:15:53納得いかないなら自分でthisとメンバ関数ポインタのペア作れよ、テンプレート使えば汎用的だし簡単にできるぞ
0250デフォルトの名無しさん
2008/10/07(火) 01:21:080251デフォルトの名無しさん
2008/10/07(火) 01:26:01無理に使う必要は無いが、使ったほうが楽になる場面というのはあるもんなんだぜ。
0252デフォルトの名無しさん
2008/10/07(火) 01:30:260253デフォルトの名無しさん
2008/10/07(火) 01:34:160254sage
2008/10/07(火) 01:41:260255sage
2008/10/07(火) 01:57:09普通は仮想関数使うががな
こんな機能を使い道あるとかいうやつは経験不足
仮想関数呼び出しにかかるコストが、とかいうやつは
なんでC++使ってんだって話だよな
一応オブジェクト指向言語なんだからさぁ
0256デフォルトの名無しさん
2008/10/07(火) 02:01:110257デフォルトの名無しさん
2008/10/07(火) 02:11:280258デフォルトの名無しさん
2008/10/07(火) 02:26:04リハビリ兼ねて 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 {
0259デフォルトの名無しさん
2008/10/07(火) 02:26:57// 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) ) ;
}
0260デフォルトの名無しさん
2008/10/07(火) 02:30:342chも満足に使えんのにオブジェクト指向言語なんてまともに使えないだろw
0261デフォルトの名無しさん
2008/10/07(火) 03:18:21これで実用レベルかな、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);}
};
0262デフォルトの名無しさん
2008/10/07(火) 03:21:430263デフォルトの名無しさん
2008/10/07(火) 03:36:090264デフォルトの名無しさん
2008/10/07(火) 06:43:35何とか急場を凌いだみたいだけど、
知識としては「メンバ関数ポインタすら知らない」ってあり得ないくらい無知だよな。
0265デフォルトの名無しさん
2008/10/07(火) 07:17:24メンバ関数ポインタはalgorithmの関数群を使うときに役に立つよ
0266デフォルトの名無しさん
2008/10/07(火) 08:15:54仮想テーブルは、クラスひとつにつき一つ固定だが、メンバ関数ポインタを使い仮想テーブルを自分で作ってしまえばインスタンスの生成後に仮想テーブルを書き換え可能にでき動的な仮想テーブルが作れる。
他にもWindow関係のクラスのメッセージ処理のように、メッセージをキューイングしたりするのにも有効。
要はめちゃめちゃ使えるという事だな。
0267デフォルトの名無しさん
2008/10/07(火) 09:15:320268デフォルトの名無しさん
2008/10/07(火) 11:01:03C++多少使えますみたいのが釣れたみたいだし。
0269デフォルトの名無しさん
2008/10/07(火) 15:44:46gwin'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
こんなエラーが出てしまったんですが、何が問題なんでしょうか。
0270デフォルトの名無しさん
2008/10/07(火) 16:27:13アルゴリズムを根本から見直せばか。
って怒ってるんじゃね。
0271デフォルトの名無しさん
2008/10/07(火) 16:30:59コンパイル時にメモリ不足だってメッセージ
0272デフォルトの名無しさん
2008/10/07(火) 16:31:59初めてやって出たのならインストール失敗してないか。
0273デフォルトの名無しさん
2008/10/07(火) 16:34:43ttp://d.hatena.ne.jp/kazy/20080310/p1
これかもね。
0274デフォルトの名無しさん
2008/10/07(火) 16:55:57メモリ不足……3.6Gも!?
OSはXP SP2使ってます。
0275デフォルトの名無しさん
2008/10/07(火) 16:56:540276デフォルトの名無しさん
2008/10/07(火) 16:57:30> 3.6GB
0277デフォルトの名無しさん
2008/10/07(火) 17:49:02メンバ関数へのポインタが仮想関数より低コストとは考えづらい。
どっちも間接呼び出しを少なくとも1回挟む必要がある。
0278デフォルトの名無しさん
2008/10/07(火) 18:35:01たしかプロトコルクラスのところだったかな
0279デフォルトの名無しさん
2008/10/07(火) 20:25:05赤ちゃん語版が出てるのは知ってるけど
0280デフォルトの名無しさん
2008/10/07(火) 23:10:310281デフォルトの名無しさん
2008/10/08(水) 00:22:44英語だと読んでくれない
0282デフォルトの名無しさん
2008/10/08(水) 02:38:51C++を理解していて、なおかつ文才のある人間が必要だし、無理だろ。
どちらか一方にたけている奴はゴロゴロいるだろうが、両方優れている奴は日本にいねぇよ。
0283デフォルトの名無しさん
2008/10/08(水) 06:02:26そんな考え方もあるのか
0284デフォルトの名無しさん
2008/10/08(水) 11:04:02手を抜いてるとしか思えないもの、日本語として通じてないもの
たんに書いた奴に誠意がないだけ
0285デフォルトの名無しさん
2008/10/08(水) 11:12:420286デフォルトの名無しさん
2008/10/08(水) 22:13:010287デフォルトの名無しさん
2008/10/08(水) 23:10:440288デフォルトの名無しさん
2008/10/08(水) 23:23:050289デフォルトの名無しさん
2008/10/10(金) 02:22:58方が分かってるのとほぼ同じコストで構造体作るにはどうしたらいいんだろうか。
例えば実行時にユーザーに型情報を入力してもらって
int
long
char*
^Z
みたいに。それで実際そういうデータの集まりの構造体があるかのように振舞わせるには
0290デフォルトの名無しさん
2008/10/10(金) 02:52:42エンディアンに依存するから移植性ないけどな
0291デフォルトの名無しさん
2008/10/10(金) 09:00:020292デフォルトの名無しさん
2008/10/10(金) 12:28:51サイズからオフセットと総サイズを計算しておき、それが収まる領域に各要素のプレイスメントnewしている。ヒープからの取得一回分のコストでオブジェクトが作れる。
0293デフォルトの名無しさん
2008/10/10(金) 16:05:44突っ込みお願いします。
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));
0294デフォルトの名無しさん
2008/10/10(金) 23:23:27理由を聞いてもピンとこない。
曰く「catch( ... ) は来ちゃいけないって意味だから、未知の例外としてプログラムを終了するべき」
という事なんだけど、これってほんとなの?
「catch( ... ) は来ちゃいけないって意味」、からして間違ってると思う。。。
catch( ... )を付けるかは、例外機構の設計によるのであって、いつも付けるってのは間違ってると思う。
常にcatch( ... )で例外受けたら、目的があって誰かが投げた例外を自分のコードで揉み消す事になり、
なんだか判らない例外で或る以上、原因も判らないという事になってしまう。
ソフトが御行儀よく終了する方が良いに決まってるけどさ、
自分の判らない事まで「気を聞かせて」処理してしまうのは、ただの無責任と思うんだが。
ご意見募集。
0295デフォルトの名無しさん
2008/10/10(金) 23:36:21catch で受けた後、やるべきエラー処理やってから throw; で再送できるから
不必要に揉み消すことはないよ。
0296デフォルトの名無しさん
2008/10/10(金) 23:37:11catch (...)したらthrow;する。これは常識。
catch (...)は例外発生時に確実にポインタやハンドルを開放するためのものであって、例外をなかったことにするためのもんじゃない。
まあ、スマートポインタなり使えで終わる話ではあるが。
0297デフォルトの名無しさん
2008/10/10(金) 23:40:21来るはずの無い例外が来たのなら、それは何らかのバグ。
きちんと捕捉して対応しないといけない。
catch(...)が無ければどっかへ飛んでいってしまうわけで。
switchのdefault的というか。
> 目的があって誰かが投げた例外
であればそれは仕様上に無いといけないし、
きちんと把握して処理しないといけない。
つまり対応するcatchを付ける。
その上で、発生しないはずの「その他」をcatch(...)で捕まえる。
> 自分のコードで揉み消す事に
消すなっての。
> 未知の例外としてプログラムを終了するべき
が何でもみ消すことになるんだ。
> なんだか判らない例外
なんだから、なんだか判らない状態になってるわけで、
そこでプログラム止めてどういう状態なのか調べないと。
0298デフォルトの名無しさん
2008/10/10(金) 23:47:21throw; で再送すれば問題ないってことか。
最初からそういってくれれば良いのに。
0299デフォルトの名無しさん
2008/10/10(金) 23:48:11勝手に途中でcatch(...)する必要なんか無い。
0300デフォルトの名無しさん
2008/10/11(土) 00:06:32そこまでちゃんと設計してるかどうかってことなんじゃないか。
0301デフォルトの名無しさん
2008/10/11(土) 00:29:37未知の例外が通過するから、その前に自分の知ってる範囲の後始末をする所
無意味ということはない
0302デフォルトの名無しさん
2008/10/11(土) 00:41:21GOTO信者と大差ないよな
0303デフォルトの名無しさん
2008/10/11(土) 00:48:03仕様だったらしいけど流石に後で廃止されたという話を思い出した。
catchの中には入れたんだっけな。
goto TryBlock;
try {
TryBlock:
} catch ( ... ) {
}
0304デフォルトの名無しさん
2008/10/11(土) 00:52:05上記のように緯度経度を"度"から"度分秒"形式に
変換するコードを教えてください。
変換式は、まず
35.2361の小数点部分の0.2361×60=14.166
この結果の整数部分の14が分になります。
そして、14.166の小数点部分の0.166×60=9.96
この結果の9.96が秒になります。
0305デフォルトの名無しさん
2008/10/11(土) 00:53:27その程度C++なんか使うまでもないし
0306304
2008/10/11(土) 00:59:06ちなみに初期値の35.2361は文字列です。
0307304
2008/10/11(土) 01:03:52まじでお願いします。時間が無いのです。
0308デフォルトの名無しさん
2008/10/11(土) 01:09:020309デフォルトの名無しさん
2008/10/11(土) 01:09:42とにかくソースコード書かないと進まんだろ
0310デフォルトの名無しさん
2008/10/11(土) 01:10:130311304
2008/10/11(土) 01:11:52仕事はハードウェアです。
時間が無いのです。誰かお願いします。
0312デフォルトの名無しさん
2008/10/11(土) 01:16:16#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;
}
0313デフォルトの名無しさん
2008/10/11(土) 01:19:05#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
0314デフォルトの名無しさん
2008/10/11(土) 01:20:23int a=strtod("35.2361",0)*'2'*'P'*'_'/'&';
printf("%d°%d′%d″",a/023420,a%023420*'<'/0x2710,a%023420*'<'%0x2710*((1<<6)-4)/'d');
デバッグはしていない
0315デフォルトの名無しさん
2008/10/11(土) 01:24:31#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 << "”";
}
0316デフォルトの名無しさん
2008/10/11(土) 01:24:36適切に変換しないと多分>>312-314はそのままじゃ動かない
でも文字コードは隠してるみたいだからそこは自分でちゃんと出来ると言うことだな
0317304
2008/10/11(土) 01:38:09本当にありがとうございます。参考にさせて頂きます。
っで312〜315の中でどれが一番上司に褒められますか?
可読性やパフォーマンスなどを考慮して。
0318デフォルトの名無しさん
2008/10/11(土) 01:38:120319デフォルトの名無しさん
2008/10/11(土) 01:39:46>>314がおすすめ、きっと興奮してくれる
0320デフォルトの名無しさん
2008/10/11(土) 01:39:50どれもそのままは使えないっての
316考慮しないとどれでも叱られる
まあでもそこは心配ないんだよな
0321デフォルトの名無しさん
2008/10/11(土) 01:41:15さっきから一体お前はどんな環境を想定しているのか
0322デフォルトの名無しさん
2008/10/11(土) 06:39:48このスレの範疇外だと思うが
0323 ◆ccqXAQxUxI
2008/10/11(土) 15:53:000324デフォルトの名無しさん
2008/10/11(土) 22:21:19VC++ 2005、WinXPでプログラムを組んでいますが、あるhtmlファイルからanchorタグを読み込み、リンク先のページを取得したいと思います。
一々、自作のライブラリでリンク先を検出するようだと、作成時間がかかって仕方ないので、どなたか、htmlをパースしてリンク先のアドレスを取得できるような
ライブラリや関数などをご存知の方、教えていただけないでしょうか?
0325デフォルトの名無しさん
2008/10/11(土) 22:32:20鼬害。
0326デフォルトの名無しさん
2008/10/11(土) 22:49:52このスレで聞いてみるとか。
IEコンポーネントを使い倒すスレ Ver.2
http://pc11.2ch.net/test/read.cgi/tech/1145189322/
0327デフォルトの名無しさん
2008/10/11(土) 22:58:21どうもです、そちらで聞いてみます。
0328デフォルトの名無しさん
2008/10/12(日) 15:20:44勉強になるソースはどっかに無いでしょうか?
トリッキーとかの意味じゃないほうで
0329デフォルトの名無しさん
2008/10/12(日) 15:25:04標準テンプレートや boost のインターフェースを読むんだ。
実装はトリッキーなものもあるから読まないほうがいいかもな。
0330デフォルトの名無しさん
2008/10/12(日) 17:09:00MFCは?
0331デフォルトの名無しさん
2008/10/12(日) 17:27:33C++ではないが、.NET Frameworkのクラス構成、インターフェースが参考になるかも。
俺もC#をしばらくやってたら、いつの間にかC++でも結構上手く書けるようになっていた。
0332デフォルトの名無しさん
2008/10/12(日) 17:28:18コーディング規約だけは残念だけど
0333デフォルトの名無しさん
2008/10/12(日) 17:39:400334デフォルトの名無しさん
2008/10/12(日) 17:55:030335デフォルトの名無しさん
2008/10/12(日) 18:29:59MFC以外のフレームワークは使ったことはあるかい?
0336デフォルトの名無しさん
2008/10/12(日) 18:31:510337デフォルトの名無しさん
2008/10/12(日) 18:32:040338デフォルトの名無しさん
2008/10/12(日) 18:34:570339デフォルトの名無しさん
2008/10/12(日) 18:35:480340デフォルトの名無しさん
2008/10/12(日) 18:42:56.NETは良いかもしれないけど、C++との相性は最悪
今後普及するとも思えないC++/CLIを使うって言うのも
0341デフォルトの名無しさん
2008/10/12(日) 18:59:190342デフォルトの名無しさん
2008/10/12(日) 20:34:03ほとんど同じ機能で名前が違うクラスがたくさんあるじゃない
初めて.NETに触ったときは何だコリャっておもった
どんだけ無秩序に設計したんだって呆れた覚えがある
.NETはちょっとしか触ったことないんだけど
勘違いなら設計者の方々ゴメン
0343デフォルトの名無しさん
2008/10/12(日) 20:46:120344デフォルトの名無しさん
2008/10/12(日) 20:58:59C++勉強中のものです。
継承を勉強しています。
以下のコードのような書き方/使い方は一般的に良いのでしょうか?
やりたいことは、Hoge/FooはBaseクラスの機能を持ち、
かつ、Baseクラスのメソッドから自分のprivateメソッドを呼び出したい。
このprivateメソッドを継承によりオーバーライドしたいと考えているのですが、
こういったことをしたい場合、以下のようなコードで良いのでしょうか?
色々な書き方、考え方があるかとは思いますが、ご指導をお願いします。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7779.txt
0345デフォルトの名無しさん
2008/10/12(日) 21:07:39もしかして、同じ関数をパラメータで処理を分けるべきと思ってたりする?
0346デフォルトの名無しさん
2008/10/12(日) 21:08:340348デフォルトの名無しさん
2008/10/12(日) 21:21:44いや、自分が驚いたのは InstallerCollection ってなに?っこと
ArrayListとかでいいじゃないかと思ったんです
InstallContext とかも存在意義がわからないし
オブジェクト指向覚えたてのルーキーが設計したみたいでしょ
0349デフォルトの名無しさん
2008/10/12(日) 21:28:09それで正しい
それが一般的な書き方
NVIといわれるC++では推奨されるイディオム
0350デフォルトの名無しさん
2008/10/12(日) 21:28:32generics導入前にかじった人か……その頃のクラスは結構黒歴史化してる。
template抜きのC++を使ってクラス設計したようなものだから。
0352デフォルトの名無しさん
2008/10/12(日) 22:07:06private:ではなくprotected:だね
0353デフォルトの名無しさん
2008/10/12(日) 22:14:37いいや private だ
0354344
2008/10/12(日) 22:19:39すみません。
おっしゃるprotectedはどこに適用するべきなのでしょうか?
Base::Func()のことでしょうか?
また、(もしそうだと仮定して)Base::Func()をprotectedにした場合、
privateのままのときより、どういったメリットが得られるのでしょうか?
0355デフォルトの名無しさん
2008/10/12(日) 23:06:52privateだとFuncから派生元のBase::Funcを呼べなくなる。って思ったけど、純粋仮想関数だから呼ばなくって良かったのだったのか。
0356デフォルトの名無しさん
2008/10/12(日) 23:18:35なんとなく違和感があるが、何の為?
0357デフォルトの名無しさん
2008/10/12(日) 23:37:15元々オーバーライドを禁止する理由が無いからじゃないの?
0358デフォルトの名無しさん
2008/10/12(日) 23:46:34一律それに揃えておけば仕様が一環してて分かりやすいように思ったのだが。
0359デフォルトの名無しさん
2008/10/12(日) 23:54:400360デフォルトの名無しさん
2008/10/12(日) 23:57:09呼び出せなくても派生先にはそういう関数があるということは知らされるべきだと考えられる
本当に派生先に触って欲しくないならvirtualを付けなければいい
0361デフォルトの名無しさん
2008/10/13(月) 00:15:200362デフォルトの名無しさん
2008/10/13(月) 00:17:05確かにその方が private の意味が一環するからってことかもね。
0363デフォルトの名無しさん
2008/10/13(月) 00:18:41C++ の 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 メンバ関数は見えている。
0364デフォルトの名無しさん
2008/10/13(月) 00:22:120365デフォルトの名無しさん
2008/10/13(月) 00:26:470366デフォルトの名無しさん
2008/10/13(月) 00:30:03privateでない仮想関数はインターフェースとカスタマイズポイントの2役を担っていて良くないという理由で
0367デフォルトの名無しさん
2008/10/13(月) 02:50:44>C++コミュニティでは仮想関数はprivateっていうのがいいとされているでしょ
はつみみです
0368デフォルトの名無しさん
2008/10/13(月) 02:54:410369デフォルトの名無しさん
2008/10/13(月) 03:04:17privateにする理由ある?
0370デフォルトの名無しさん
2008/10/13(月) 03:14:100371デフォルトの名無しさん
2008/10/13(月) 03:23:25派生クラスから直接いじくれるようにする何かが嬉しくなるってことだよな
protectedにするってことは
想像も付かん
0372デフォルトの名無しさん
2008/10/13(月) 06:33:43~Base() {};
デストラクタも virtual に
最後の;は要らん
0373デフォルトの名無しさん
2008/10/13(月) 10:08:23privateだと、オーバーライドする時にスーパークラスの元関数を呼べないんじゃないか?
0374デフォルトの名無しさん
2008/10/13(月) 10:49:430375デフォルトの名無しさん
2008/10/13(月) 13:46:22派生先から呼ばれることを前提に protected にしているメンバ関数はインターフェースであり
カスタマイズポイントの役割を負わすべきではないとNVIは言う
0376デフォルトの名無しさん
2008/10/13(月) 14:05:04呼ばせたくないんだから
0377デフォルトの名無しさん
2008/10/13(月) 14:13:40void Derived::Func()
{
... //追加の処理
Base::Func(); //呼べねえ困った
}
でもそういう共通処理をやるために噛ませてるのがBaseFunc()なんだから
そっちに書けばBase::Func()は実装なしに出来るし、
Base::Func()を最後に呼べなんていう忘れられがちな約束を派生先としなくて済む
というかそれが目的でこんな事してるんだ
Base::Func()をするタイミングが派生先によってコロコロ変わるってなら
確かにprotectedにしないといけないけど、その場合そもそもNVIする意味がない
0378デフォルトの名無しさん
2008/10/13(月) 14:38:23ってダメだっけ?
0379デフォルトの名無しさん
2008/10/13(月) 15:01:200380デフォルトの名無しさん
2008/10/13(月) 17:23:57virtual ~Dtor() = 0 {}
でおk
どうでもいいけど純粋仮想デストラクタって必殺技の名前みたいだよな
0381デフォルトの名無しさん
2008/10/13(月) 17:40:110382デフォルトの名無しさん
2008/10/13(月) 17:46:38なぜでしょうか?対策を教えてください。
#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;
}
0383デフォルトの名無しさん
2008/10/13(月) 17:54:36仕様
そこまでは探してくれない
対策は asdf を外に出す
0384デフォルトの名無しさん
2008/10/13(月) 18:05:09template<class T> struct A { typedef T type; };
template<class T> void f(typename A<T>::type);
A<int>::type a;
f(a);
0385デフォルトの名無しさん
2008/10/13(月) 18:10:320386デフォルトの名無しさん
2008/10/13(月) 18:16:35レベル低い奴は帰ってね
0387デフォルトの名無しさん
2008/10/13(月) 18:20:39とりあえずpublicでさえなければどっちでもいい。
0388デフォルトの名無しさん
2008/10/13(月) 18:25:18そこまで認知されてないだろ。
0389デフォルトの名無しさん
2008/10/13(月) 18:26:27は? private と protected は全然違うだろ?
どっちでもいいわけがない。
0390デフォルトの名無しさん
2008/10/13(月) 18:28:14C++ nvi の検索結果 約 38,700 件中 1 - 50 件目 (0.50 秒)
C++ pimpl の検索結果 約 26,100 件中 1 - 50 件目 (0.60 秒)
0391デフォルトの名無しさん
2008/10/13(月) 18:29:160392デフォルトの名無しさん
2008/10/13(月) 18:47:44お前の知らないことを知ってるやつなんてごまんといる。
0393デフォルトの名無しさん
2008/10/13(月) 18:53:110394デフォルトの名無しさん
2008/10/13(月) 18:55:23という嘆かわしいルールで開発してる所も未だに実在しますので
0395デフォルトの名無しさん
2008/10/13(月) 19:25:06ワロタ
0396デフォルトの名無しさん
2008/10/13(月) 19:30:59お前、頭いいな^^
0397デフォルトの名無しさん
2008/10/13(月) 20:33:52ttp://fit.c2.com/
0398デフォルトの名無しさん
2008/10/13(月) 23:10:59メンバ関数ならまだマシ。
俺のところはメンバ変数も全てpublicだ。
もちろん理由はみんながいじれないと困るから。
0399デフォルトの名無しさん
2008/10/13(月) 23:11:560400デフォルトの名無しさん
2008/10/13(月) 23:17:30それなら class ではなく struct を使えばいいな
0401デフォルトの名無しさん
2008/10/13(月) 23:18:53自動化されたテストがないんですね
でもテストの自動化が非常に困難なプロジェクトでは理にかなったルールなのかも知れない
0402デフォルトの名無しさん
2008/10/13(月) 23:41:220403ちんぱんじー
2008/10/14(火) 00:24:45教えてください
0404デフォルトの名無しさん
2008/10/14(火) 00:27:110405デフォルトの名無しさん
2008/10/14(火) 00:33:350406ちんぱんじー
2008/10/14(火) 00:52:06それはヘッダーファイルと関連性はあるんですか?
0407デフォルトの名無しさん
2008/10/14(火) 00:54:30もっとわかりやすく質問したほうがいいと思います
0408ちんぱんじー
2008/10/14(火) 00:55:58つまりhファイルがないとどうなるんですか?
0409デフォルトの名無しさん
2008/10/14(火) 00:59:01そのhなファイルの内容について詳しく。
0410ちんぱんじー
2008/10/14(火) 01:00:46#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
0411デフォルトの名無しさん
2008/10/14(火) 01:01:50たぶんC++勉強し始めたばかりで分からないことは2chで聞いとけって思ってるんだろうけど、
なんでもここで聞くというより最低限の入門書/入門サイトで一通り勉強してきたら?
ヘッダファイルが何なのかすら載ってないようなら、他の本/サイトを探すべき。
0412ちんぱんじー
2008/10/14(火) 01:03:25ヘッダーファイルの内容かかわらず、
具体的にどのようなエラーがでるんですか?
関数を処理できないとか
0413ちんぱんじー
2008/10/14(火) 01:04:41その通りですね、新しい本買ってみます。
0414デフォルトの名無しさん
2008/10/14(火) 01:08:28どんなエラーが出るかはヘッダファイルの内容とそれをインクルードするファイルの内容によって変わります
たとえば構造体のサイズや構成がわからないとか
定数や変数が定義、宣言されていないとか
C++では関数のシグニチャがわからないとか
0415デフォルトの名無しさん
2008/10/14(火) 01:23:46まずは環境作らないとね
0416146
2008/10/14(火) 12:13:52VC8ではできませんでした。
0417デフォルトの名無しさん
2008/10/14(火) 12:32:20コードプリーズ
0418デフォルトの名無しさん
2008/10/14(火) 12:44:14規格によって禁じられているためです。
0420デフォルトの名無しさん
2008/10/14(火) 14:32:18色々調べてやってみたのですが上手くキャストできません。
お手数ですが良い方法は無いでしょうか?
0421デフォルトの名無しさん
2008/10/14(火) 14:36:160422デフォルトの名無しさん
2008/10/14(火) 14:36:290423デフォルトの名無しさん
2008/10/14(火) 14:52:070424デフォルトの名無しさん
2008/10/14(火) 15:20:13C++/CLI?
System::Runtime::InteropServices::Marshal::StringToHGlobalAnsiで変換できるよ
あと、C++/CLIには専用スレがあるよ
0425420
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
も試してみます。
0426デフォルトの名無しさん
2008/10/14(火) 16:14:38なぜでしょうか?対策を教えてください。
#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;
}
0427デフォルトの名無しさん
2008/10/14(火) 17:00:30http://vene.wankuma.com/prog/CppCli_strings.aspx
0428デフォルトの名無しさん
2008/10/14(火) 17:25:31なぜでしょうか?対策を教えてください。
#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;
}
0429デフォルトの名無しさん
2008/10/14(火) 17:58:39なぜでしょうか?対策を教えてください。
#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;
}
0430デフォルトの名無しさん
2008/10/14(火) 18:01:280431デフォルトの名無しさん
2008/10/14(火) 18:03:02なぜでしょうか?対策を教えてください。
#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;
}
0432デフォルトの名無しさん
2008/10/14(火) 18:09:16なぜでしょうか?対策を教えてください。
#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;
}
0433デフォルトの名無しさん
2008/10/14(火) 18:27:530434デフォルトの名無しさん
2008/10/14(火) 18:50:030435デフォルトの名無しさん
2008/10/14(火) 19:37:580436デフォルトの名無しさん
2008/10/14(火) 19:42:490437デフォルトの名無しさん
2008/10/14(火) 19:49:12なぜでしょうか?対策を教えてください。
#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;
}
0438デフォルトの名無しさん
2008/10/14(火) 20:07:480439デフォルトの名無しさん
2008/10/14(火) 20:09:570440デフォルトの名無しさん
2008/10/14(火) 20:20:590441デフォルトの名無しさん
2008/10/14(火) 20:24:36std::basic_ostream<T, E > &operator<<(std::basic_ostream<T, E> &os, typename tekitou::test<void>::asdf &a)
{
os << "asdf";
return os;
}
0442デフォルトの名無しさん
2008/10/14(火) 20:31:520443デフォルトの名無しさん
2008/10/14(火) 21:09:32A が推測できないから、その関数が実態されず、コールできない。
tekitou::operator <<<char, std::char_traits<char>, void>(std::cout, b);
ってしたらコールできる。
よくわかんねぇ〜けどwww
無い知識しぼりだして答えてみたwww
0444デフォルトの名無しさん
2008/10/14(火) 21:10:38>>437
○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
0445デフォルトの名無しさん
2008/10/14(火) 21:52:06>>437
○ A が推測できないから、その関数が実態されず、コールできない。
× A が推測できないから、その関数が実態化されず、コールできない。
0446デフォルトの名無しさん
2008/10/14(火) 21:57:04△ 実体化
○ 具現
内臓デバイスみたいな間違いこくなよ
0447デフォルトの名無しさん
2008/10/14(火) 22:08:270448デフォルトの名無しさん
2008/10/14(火) 22:09:43スマン
0449デフォルトの名無しさん
2008/10/14(火) 22:12:42ちなみに、「間違い」は「こく」ものではなく、「する」ものですけどね
0450デフォルトの名無しさん
2008/10/14(火) 22:29:41base64をデコードできるライブラリはありますか?
0451デフォルトの名無しさん
2008/10/14(火) 22:39:23ライブラリが必要なことか?
0452デフォルトの名無しさん
2008/10/14(火) 22:40:00十数行で出来るだろ
0453デフォルトの名無しさん
2008/10/14(火) 23:27:51実体化の方が使用例が多いぜ。
まあ、一番多い実体化でも、たったの千件なんだが。
これも、templateを詳しく解説した日本語の本ってないせいだな。
むしろ現状では、instantiationと言った方がよくね?
http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+実体化
http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+具現化
http://www.google.com/search?hl=en&q=C%2B%2B+instantiation+具現
0454デフォルトの名無しさん
2008/10/14(火) 23:33:040455デフォルトの名無しさん
2008/10/14(火) 23:38:23>>454
ああ、すっかり忘れてた。そういえばそんなのあったね。
JIS規格を読んでいる日本人なんて、本家のISO/IEC 14882を読んでいる日本人より少なそうだが。
0456デフォルトの名無しさん
2008/10/14(火) 23:54:02テンプレート自身が純粋仮想関数をもつクラスの派生だと通らないのですが、
これって解決できないでしょうか。
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を継承したものと認識されずにコンパイル不可になります。
0457デフォルトの名無しさん
2008/10/14(火) 23:58:01ファイル→新規作成→プロジェクト
をしてもDirectX App....とかが出ない。どうしてでしょう・・
0458デフォルトの名無しさん
2008/10/15(水) 00:12:210459デフォルトの名無しさん
2008/10/15(水) 00:14:56おれも「こく」より「する」派だな.おならもね.
0460デフォルトの名無しさん
2008/10/15(水) 00:29:45ディレクトリにDirectXが追加されてるかは見た?
0461デフォルトの名無しさん
2008/10/15(水) 01:47:23Base<C>::f の戻り型はC*にする必要があるの?
Interfaceを通して扱うのなら、Interface* でもいいのではと思った。
0462デフォルトの名無しさん
2008/10/15(水) 03:04:07優しい俺様が問題点を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()); }
0463457
2008/10/15(水) 03:34:51すいません。別スレに移って聞いて見ます。すれ違いすいませんでした。
>>460
実行可能ファイル、インクルードファイル、ライブラリにもちゃんと入ってましたが何も変わりませんでした。
0464デフォルトの名無しさん
2008/10/15(水) 08:57:08456ではないが、共変戻り値を使いたいのだから答えになってないのでは?
Interface*を返すぐらいならBase<C>*を返す方が(こちらはコンパイルできる)、まだ意図に近い。
0465デフォルトの名無しさん
2008/10/15(水) 23:22:42そういう意図です。
Interfaceを継承させても扱いたいが、
単独で動作させることが多いんで、
メソッドチェーンを使いたいが困った、といった感じです。
0466デフォルトの名無しさん
2008/10/15(水) 23:51:49cloneが最端で実装するかないのと同じ理由でダメなんじゃないだろうか
0467デフォルトの名無しさん
2008/10/15(水) 23:59:33class Item{
};
class Hoge{
std::vector<Item> items;
public:
void add(Item);
Item get();
};
このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか
で悩んでいます。どこからでも登録できるようにして、あまりオブジェクトの削除の面倒なども見たくないので
スマートポインタとして取ろうかと思っているんですが、なにかコペルニクス的実装はないでしょうか?
0468デフォルトの名無しさん
2008/10/16(木) 00:20:430469デフォルトの名無しさん
2008/10/16(木) 00:23:19> あるクラスに他のクラスを登録するという仕組みで悩んでいます。
「登録」の意味が曖昧
Item を Hoge の所有物にしたいと見えるが (つまりは composite) 違うのかな?
> このaddやgetのところで引数や返り値は実体にすべきか、参照にすべきか、ポインタにすべきか
> で悩んでいます。
const& Item で良いと思うが
何か良くないことがあるので悩んでいるのだろうか?
> どこからでも登録できるようにして、
これは access 権のことなのか?
何ら問題ないように思うが
> あまりオブジェクトの削除の面倒なども見たくないので
composite なら何の問題もないと思うが
あ、俺、何が問題なのか全然見当ついてないわ
0470デフォルトの名無しさん
2008/10/16(木) 00:42:190471デフォルトの名無しさん
2008/10/16(木) 01:01:28vector<Item>をそのまま扱えばいい
そういう話じゃなくて?
0472デフォルトの名無しさん
2008/10/16(木) 02:13:27includeするヘッダファイル名を知ることができたり
ヘッダファイル名の中で宣言されている関数名を知ることができたのですが
C++では、こういった体系的な情報はどうしたら得ることができるのでしょうか?
linuxではなくwindowsでも結構です。よろしくお願いします。
0473デフォルトの名無しさん
2008/10/16(木) 02:28:160474472
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で使用しないと名前解決できないなどでした。
これからも個々の問題の解決方法を調べるのが大変だと思い、簡単なリファレンスを探しているのです。
長くなりましたがよろしくお願いします。
0475デフォルトの名無しさん
2008/10/16(木) 03:03:47つ google
0476デフォルトの名無しさん
2008/10/16(木) 03:05:46http://www.amazon.co.jp/Programming-Principles-Practice-Using-C/dp/0321543726
まだ発売されてないけどこれがいいと思う
0477デフォルトの名無しさん
2008/10/16(木) 03:10:21買った本が悪かったようだな。
ライブラリのクイックリファレンスでよければ、
ttp://www.amazon.co.jp/gp/product/487311196X/ref=sib_rdr_dp
0478デフォルトの名無しさん
2008/10/16(木) 03:11:20C++は比較的最近にも規格がかなり変わって、ちゃんとそれが使われてるるので
古い本はよした方がいい
strcpyの件はそれとは違うけど
0479472
2008/10/16(木) 03:30:08ありがとうございます。
上に挙げた書籍は2002年に発売されたものなので
比較的新しいと思ったのですがこれでも古いのですね・・・
Programming: Principles and Practice Using C++は
結構いい値段しますが格式高そうな本でいいですね。
オライリーの方は本屋にありそうですので、立ち読みしてみます。
結局、linuxのmanコマンドでCのリファレンスがあるのは
システムプログラミングの側面があるからなのでしょうね。
C++は膨大なものなのだそうで仕方ないのかもしれませんが、残念です.
0480デフォルトの名無しさん
2008/10/16(木) 05:20:44>477で勧められている本がマジで良い.あちしは職場と自宅に一冊ずつ用意して使ってる.
STLを使ったジェネリックプログラミングなどについては一切解説していないので、その辺の知識は別の本が良いだろうけど.
0481デフォルトの名無しさん
2008/10/16(木) 08:35:00strcpy_sは、MS独自の関数だよね。
0482デフォルトの名無しさん
2008/10/16(木) 20:07:18C++なら_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMESである程度対応できるし。
0483デフォルトの名無しさん
2008/10/16(木) 21:04:170484デフォルトの名無しさん
2008/10/16(木) 21:58:08なんで自信ないんだよ
0485デフォルトの名無しさん
2008/10/16(木) 22:27:050486デフォルトの名無しさん
2008/10/16(木) 22:35:210487デフォルトの名無しさん
2008/10/16(木) 22:46:04>>469 登録というのは例えばリスナーを登録する時のように、オブジェクトに
イベントを通達できるような何らかのアクセス手段を持たせておくことです。
後出しで申し訳ないのですが、Itemは多態をさせたいので、そもそも実体では無理でした。すいません。
どこからでもというのは特に気にしなくていいです。
Itemをポインタにしたときnewして登録したあと、Hogeにdeleteさせるのは気持ち悪いなと思ったので・・・
ていうか普通はリスナーとかってどう実装すべきなんだろう
0488デフォルトの名無しさん
2008/10/16(木) 23:23:26ほぼ自分で答え出てるじゃん
リスナーはキャスターの所有物ではない
ItemはHogeの所有物ではない
Itemをcompositeする(所有する)のはHoge意外の何か別の人
HogeのインターフェースはItemの参照でもポインタでもお好きに
0490デフォルトの名無しさん
2008/10/16(木) 23:34:460491デフォルトの名無しさん
2008/10/17(金) 18:24:43int v = pmap[5];
と書くと
0492デフォルトの名無しさん
2008/10/17(金) 18:27:040493デフォルトの名無しさん
2008/10/17(金) 18:38:110494デフォルトの名無しさん
2008/10/17(金) 18:42:420495デフォルトの名無しさん
2008/10/17(金) 18:46:50少なくともstd::map<int, int> v = pmap[5]; だろ
それにpmap[0]にしか実体が存在してないのでpmap[5]には
何が入っているかわからない
0496デフォルトの名無しさん
2008/10/17(金) 18:50:450497デフォルトの名無しさん
2008/10/17(金) 19:06:430498デフォルトの名無しさん
2008/10/18(土) 19:06:23std::stack<T, std::list<T> >にpushやpopするとき、
push/popされるTオブジェクト以外、
つまり既に格納されているTオブジェクトに対しては、コピーは発生しませんよね?
規格で保証されてますよね?
0499デフォルトの名無しさん
2008/10/18(土) 19:27:190500デフォルトの名無しさん
2008/10/18(土) 21:13:34ありがとうございました。
これで安心してTに大きなオブジェクトを使用しようと思います。
0501デフォルトの名無しさん
2008/10/18(土) 23:30:30char を wchar_t に変換する必要があったので、色々調べてみたのですが、よく分からない所があったので質問します。
char から wchar_t への変換には、mbstowcs() か Win32APIの MultiByteToWideChar() を使えばいいというのは分かったのですが、
mbstowcs を使うと問題が発生します。
c:\\ダミー\\dummy.file\0\0 のような double null-terminated な文字列を変換するとき、
mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。
(MultiByteToWideCharだと最後の\0\0も含めて変換してくれるようです)
いくつかの'\0'も含めてワイド文字列に変換するにはどうすれば良いのでしょうか?
携帯から書き込みしています。見にくかったらすみません。
0502デフォルトの名無しさん
2008/10/18(土) 23:35:350503デフォルトの名無しさん
2008/10/19(日) 00:12:570504デフォルトの名無しさん
2008/10/19(日) 00:24:000505デフォルトの名無しさん
2008/10/19(日) 00:31:51予想だけどlocale
0506デフォルトの名無しさん
2008/10/19(日) 00:32:25コンセプトも欲しい。
0507デフォルトの名無しさん
2008/10/19(日) 03:55:55c:\ダミー\ だとエラーがでるし
c:\ダミー だと削除は出来るがアクセスエラーがでるし
もう訳ワカメ ('A`)
0508デフォルトの名無しさん
2008/10/19(日) 04:25:120509デフォルトの名無しさん
2008/10/19(日) 08:46:30> mbstowcs だと最初の\0に到達した時点で関数が変換を止めてしまうようです。
仕様です
0510デフォルトの名無しさん
2008/10/19(日) 10:18:07削除できてんじゃん
つかスレ違いじゃね?
0511483じゃないけど
2008/10/19(日) 10:48:46string はbasic_string<T, Trait> の、特定のテンプレート引数による実体化になっており、Traitの部分で
「どの文字とどの文字が等価か」などが定義されている.また、これに基づいて辞書式順序も定義される.
場合によってはそれが邪魔になる.
0512デフォルトの名無しさん
2008/10/19(日) 10:51:43安心していいのかい?
stack<T> theStack;
theStack.push_back(new T());
でTのコンストラクタが例外を投げたときにどうやってリカバリする?
0514デフォルトの名無しさん
2008/10/19(日) 11:15:21に
new T()
は
push_backできへんやろ・・
0515デフォルトの名無しさん
2008/10/19(日) 12:30:030516デフォルトの名無しさん
2008/10/19(日) 12:30:51○T*
あと、stack のテンプレートパラメータがってことね。
0517デフォルトの名無しさん
2008/10/19(日) 16:01:07そりゃ文字列の終わりだから
長さを指定しないと永遠に続けることになる
0518デフォルトの名無しさん
2008/10/19(日) 17:14:11struct 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);
のように書き込めるようにするにはどうしたらよいのでしょうか?
どなたか教えて下さい。
0519デフォルトの名無しさん
2008/10/19(日) 17:29:47戻り値を参照にすればいい筈…
Vector& operator[](int n)
{
return Vector(x[n], y[n]);
}
0520デフォルトの名無しさん
2008/10/19(日) 17:38:22_(アンダースコア)で始まる変数名を使うのはよろしくないぜよ
標準ヘッダの定義と被っても文句は言えない
0521デフォルトの名無しさん
2008/10/19(日) 17:39:49条件を確認するのがメンドイから全部禁止と考えたほうが楽だけどね。
0522デフォルトの名無しさん
2008/10/19(日) 17:40:30デタラメ言うな
>>518
そのままだとトリッキーなことをしないとダメなので
VectorArrayの定義をVectorの配列にすれば簡単
class VectorArray {
Vector v[10];
};
Vector& operator[](int n) {
return v[n];
}
0523デフォルトの名無しさん
2008/10/19(日) 17:42:110524デフォルトの名無しさん
2008/10/19(日) 17:46:04どうしても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);
}
0525デフォルトの名無しさん
2008/10/19(日) 18:06:102文字目が小文字(大文字とアンダースコア以外)ならOKなんだね
フォローありがと
0526デフォルトの名無しさん
2008/10/19(日) 18:24:160527デフォルトの名無しさん
2008/10/19(日) 18:27:150529デフォルトの名無しさん
2008/10/19(日) 20:05:39すまん、完全寝ぼけてたw
0530デフォルトの名無しさん
2008/10/19(日) 20:13:200531デフォルトの名無しさん
2008/10/19(日) 22:17:460532デフォルトの名無しさん
2008/10/19(日) 22:25:37ISO/IEC14882 23.2.4 の段落 2 によれば、保証はない。
> class vector {
(中略)
> void swap(vector<T,Allocator>&);
と、例外指定がないことが示されている。
0533デフォルトの名無しさん
2008/10/19(日) 23:01:520534デフォルトの名無しさん
2008/10/19(日) 23:05:310535デフォルトの名無しさん
2008/10/19(日) 23:16:29俺が見ているのはJIS X3014:2003なんだが、
23.1 コンテナに対する要件の10段落目の中にこう書いてある。
- コンテナの比較子オブジェクト(23.1.2参照)(もし存在すれば)の
コピーコンストラクタまたは代入演算子が送出する例外を除いて、
関数swapは例外を送出しない。
0536デフォルトの名無しさん
2008/10/19(日) 23:50:54例外を送出しないことを関数のシグネチャに含めてしまうと色々不便だから書いていないだけで
実際には例外を送出しないように規定されているわけか.
0537デフォルトの名無しさん
2008/10/20(月) 00:06:35なんか 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 になれるのかな。
0538デフォルトの名無しさん
2008/10/20(月) 00:08:42「〜を除いて、」とあるから、「〜」に該当する場合は例外を送出するとも読めるだろ
0539デフォルトの名無しさん
2008/10/20(月) 00:15:350540デフォルトの名無しさん
2008/10/20(月) 00:19:18swapについては表65-1 コンテナ要件1(PDFだと23.1の中)で説明済みってことなんだろ。
いちいち書いていたらページ数が膨れ上がって仕がない。
比較子については疑問だが、とりあえずvectorには関係ない
(それは23.1.2が連想コンテナという項目から明らか)ので今は無視しよう。
0541デフォルトの名無しさん
2008/10/20(月) 00:44:550543デフォルトの名無しさん
2008/10/20(月) 03:04:35(コメントで書かなくてもよくする)ことを考えてるんだけど、
↓で言われてるような効率の低下が実際に起こるコンパイラって知ってる?
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.
そういうのは相当古いコンパイラだけと決め付けて切り捨てちゃおうかと思ってるん
だけど、大丈夫かな?
0544デフォルトの名無しさん
2008/10/20(月) 08:38:44実際、throw()ならboostでも使われてるし
0545デフォルトの名無しさん
2008/10/20(月) 11:40:02"例外が起きない" じゃなくて、"例外がスローされてはならない" じゃなかったか?
例外がスローされた場合は、unexpected関数が呼び出されるはず
たぶん、それをするためのコードをベタ書きしちゃうのが A "dumb" compiler なんだろ
0546デフォルトの名無しさん
2008/10/20(月) 15:42:43先週のWTI相場1バレル70−75ドルを換算し、円高という値下げ要因を加味すると
来週月曜(10月27日)からレギュラーガソリンが全国平均128円になる「はず」なのです!
_____
.ni 7 / \
l^l | | l ,/.) / /・\ /・\ \ .n
', U ! レ' / |  ̄ ̄  ̄ ̄ | l^l.| | /)
/ 〈 | (_人_) | | U レ'//) 値下げしないよ〜〜んw
ヽっ \ | / ノ /
/´ ̄ ̄ ノ \_| \rニ |
`ヽ l
日清食品
出光興産
新日本石油
山崎製パン
便乗値上げ四天王「日の出新山」
0547デフォルトの名無しさん
2008/10/20(月) 18:46:40呼び出したいんですが、どうやってもコンパイルが通りません。
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;
}
よろしくおねがいします。
0548デフォルトの名無しさん
2008/10/20(月) 19:05:41error message くらい晒したらどうか
俺は通った
0549デフォルトの名無しさん
2008/10/20(月) 19:14:34まあTest2::s_pFuncの実体が定義されてないから当たり前だけど
0550デフォルトの名無しさん
2008/10/20(月) 19:42:49おっしゃるとおり、実体がないのにリンク通るわけないですね。
class Test2
{
public:
static void (Test::*s_pFunc)();
};
void (Test::*Test2::s_pFunc)() = &Test::Func;
とすればよかったのですね。
失礼しました。
0551デフォルトの名無しさん
2008/10/21(火) 04:32:37検索してみても、手間がかかる方法ばかりで、そのものズバリという方法が出てこない・・。
0552デフォルトの名無しさん
2008/10/21(火) 05:13:49そもそも「そのものズバリ」なんて方法が存在し得ない。
string に入っているデータの文字エンコードが euc なのか sjis なのかそれとも utf-8 なのかわからないんだから。
0553デフォルトの名無しさん
2008/10/21(火) 05:14:070554デフォルトの名無しさん
2008/10/21(火) 05:33:39意味がわからんぞ
boostだからどうだというんだ
0555デフォルトの名無しさん
2008/10/21(火) 05:48:50標準的には codecvt で提供してるつもりなんだろうけど、超メンドイよな。
結局 mbstowcs とか使って自作したことがある。
C++0x では codecvt が何とか使い物になりそうな感じ。
0556デフォルトの名無しさん
2008/10/21(火) 06:00:52ATLならCA2Wとか
0557551
2008/10/21(火) 06:08:06>>552
やはりないんですか。
標準にmbstowcs()とwcstombs()はあるんだから、それをラップした関数がstringにあってもよさそうに・・・。
>>555,556
やはりそのあたりの関数を使ってやるしかないんですね。
頻出の部分なのに、すっきりしないですねぇ。
0558デフォルトの名無しさん
2008/10/21(火) 06:20:350559デフォルトの名無しさん
2008/10/21(火) 06:22:18int 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;}
0560デフォルトの名無しさん
2008/10/21(火) 08:31:46今、SJIS → UTF8 に変換する必要があったんだけど、MultiByte 同士の変換 API ってない?
結局 MultiByteToWideChar と WideCharToMultiByte で、SJIS → Unicode → UTF8 と2段階で変換したけどなんか無駄なことしてる気がする
0561デフォルトの名無しさん
2008/10/21(火) 09:31:57システムコールとかのエラーのテストってどうやって起こしたりしてますか?
writeとかreadの際のエラー時のコードをどう実行させればいいのかが
よくわかりません。
どなたかわかる方いますか?
(テストフレームワークとしては、googletestを使っています)
0562デフォルトの名無しさん
2008/10/21(火) 14:34:00class ClassA { public: int m; } ;
template<ClassA &x> class ClassB { public: int n; };
int main(){
ClassA a;
ClassB< a > b;
}
0563デフォルトの名無しさん
2008/10/21(火) 14:36:17class ClassA { public: int m; } ;
class ClassB { public: int n; ClassB(ClassA x){} };
int main(){
ClassA a;
ClassB b(a);
}
0564デフォルトの名無しさん
2008/10/21(火) 16:41:49gccを使用のC++初心者です。。
拙い質問、大変恐縮です。
とあるライブラリに
ClassName Instance = ClassName();
という表記がありました。
次の表記、
ClassName Instance = new ClassName();
との差異が解らないのですが、どなたか教えていただけますでしょうか?
0565デフォルトの名無しさん
2008/10/21(火) 16:59:13下はコンパイルエラーにならない?
0566564
2008/10/21(火) 17:07:06newはポインタを返し、上の例のようにインスタンスの実体(?)を指す変数にいきなり代入するときはnew不要ということなのでしょうか?
0567デフォルトの名無しさん
2008/10/21(火) 17:22:59ClassName Instance1();
ClassName Instance2 = Instance1;
と似たようなもの
0568デフォルトの名無しさん
2008/10/21(火) 17:25:43WindowsならConvertINetString (要IE 5.5)ってのがあるけど、
おそらくこれも中ではUTF-16を介している。
ほかのライブラリもみんな中ではUnicodeを介すのが一般的だと思う。
0569デフォルトの名無しさん
2008/10/21(火) 17:40:37上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
なのでその行でコピーするなりする。
newしたものはdeleteするまであり続ける。
どこにあるのかわからないと使えないからポインタを覚えておく。
0570デフォルトの名無しさん
2008/10/21(火) 17:46:58SJISとUnicode、つーかUTF-16 or UCS-2の変換は文字集合間、UTF-16からUTF-8への変換は表現形式の変換。
まあ、SJISからUTF-8に変換する変換テーブルとかも作れないことは無いが、メモリ無駄に食うだけだから普通はやらない
0571デフォルトの名無しさん
2008/10/21(火) 18:03:220572デフォルトの名無しさん
2008/10/21(火) 18:08:47「引く」ってどういう処理をイメージしてんの?
0573デフォルトの名無しさん
2008/10/21(火) 18:15:57それぞれ別々の輝度温度の画像(例えばR1、R2)があって
これをR1画像からR2の画像を引くような画像です
0574デフォルトの名無しさん
2008/10/21(火) 18:20:560575デフォルトの名無しさん
2008/10/21(火) 18:23:05size_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);
0576デフォルトの名無しさん
2008/10/21(火) 18:27:34なら普通に引き算すればいいんじゃ?
0577デフォルトの名無しさん
2008/10/21(火) 18:34:06文字列クラスのポインタに勝手に書き込んでもいいの?
0578デフォルトの名無しさん
2008/10/21(火) 18:43:190579デフォルトの名無しさん
2008/10/21(火) 18:54:500580デフォルトの名無しさん
2008/10/21(火) 18:56:330581デフォルトの名無しさん
2008/10/21(火) 18:59:120582デフォルトの名無しさん
2008/10/21(火) 19:03:560583デフォルトの名無しさん
2008/10/21(火) 19:22:45fatal error C1853: '.\../../../Build/Obj/MfColors/Debug/MfColors.pch'
プリコンパイル ヘッダー ファイルが旧バージョンのコンパイラで作成されています。
また、C++ のプリコンパイル済みヘッダー ファイルを C で使用しています
(その逆も考えられます)。
というエラーメッセージが出て、stdafx.hの行をさしています。
このエラーはいったいどうすれば解決できるのでしょうか。
0584デフォルトの名無しさん
2008/10/21(火) 19:28:07あと、cとcpp混在してる?
0585583
2008/10/21(火) 19:30:18cとcppは混在です。
extern "C"{}
は一応つかってます。
0586デフォルトの名無しさん
2008/10/21(火) 19:39:18言語をどっちかに統一するか、片方の言語でのみPCHを使うようにするかしないといけない。
0587583
2008/10/21(火) 19:43:59「プリコンパイル済みヘッダをインクルードする」という設定を
しないに変えたら動きました。
0588デフォルトの名無しさん
2008/10/21(火) 19:47:20> いきなりというか、普通に代入してるだけ
代入はしてないね
>>569
> >>566
> 上の書き方は一時的にオブジェクトを作る。それはその行が終わったら消える。
作らないね
0589デフォルトの名無しさん
2008/10/21(火) 19:56:36投資をどんどんやれば景気は回復する。
あとプロテスタントの倫理と資本主義の精神を持たないといけないんだって。
(1)宗教的に働くことが重要で経営や労働自体に喜びを感じる。
(2)いくら儲けても貯金や消費しないで投資する。
資本主義の精神を持って投資にどんどんお金を使えば不況なんか絶対こないみたいだぞ。
簡単だね。
0590デフォルトの名無しさん
2008/10/21(火) 21:39:20> ClassName Instance1();
これだと、引数なしでClassNameを返す「関数」Instance1の宣言になる
0591デフォルトの名無しさん
2008/10/21(火) 21:40:23お前はまず就職しろ
0592デフォルトの名無しさん
2008/10/21(火) 21:48:37本来のセマンティクスでは「作る」
0593デフォルトの名無しさん
2008/10/21(火) 22:28:38規格で「作らないことを許されている」から、
「作る」と断言できないんじゃない?
0594デフォルトの名無しさん
2008/10/21(火) 22:45:41ClassName()で、ClassNameのデフォルトコンストラクタで一時オブジェクトを作る
その一時オブジェクトを引数にとったコピーコンストラクタでInstanceを作る
コードはそういう意味のはず
そのように見せかけるだけで、実際にはオブジェクト作らないように
コンパイラが裏で細工しても良いってのはまた別の話
0595593
2008/10/21(火) 22:54:05それって単に見た目上の意味じゃん。
規格を考慮した上でコードの意味を考えれば、
「作る」と言えないんじゃないかって言いたかった。
ま、単なる言葉の行き違いな気もするが。
0596デフォルトの名無しさん
2008/10/21(火) 23:01:48本当か? 本来のセマンティクスとある処理系での実行結果がなぜ違うか認識していたか?
0597デフォルトの名無しさん
2008/10/21(火) 23:17:44どれかをユーザー定義してた場合は一時オブジェクトの生成は省略出来ない
全部なければコンパイラが省略してくれるかもしれないってだけ
ClassNameの詳細が不明なら、一時オブジェクト作ると思っといた方がいいね
0598593
2008/10/21(火) 23:19:07ごめん、何が言いたいのかさっぱりわからん。
まず、「本来のセマンティクス」ってのがオレの主張する方と
594が主張してる方のどっちが正しいのかもはっきりしていないじゃん。
0599デフォルトの名無しさん
2008/10/21(火) 23:28:07コードのセマンティクスというのはコンパイラの吐くバイトコードとは別に存在するもの
0601593
2008/10/21(火) 23:35:03わかった。
規格の12.2で、「一時オブジェクトの生成が避けられる場合であっても、
すべての意味規則上の制約は、一時オブジェクトが生成されたかのように
遵守しなければならない」とあるから、確かに594が正しいね。
0602593
2008/10/22(水) 00:08:38規格の12.8.15を読んだ限り、デフォルトコンストラクタはともかく、
コピーコンストラクタ、デストラクタは関係ないみたいだけど
0603デフォルトの名無しさん
2008/10/22(水) 11:39:43opencv,cvSub
0604デフォルトの名無しさん
2008/10/23(木) 13:06:580605デフォルトの名無しさん
2008/10/23(木) 13:17:350606デフォルトの名無しさん
2008/10/23(木) 13:59:570607デフォルトの名無しさん
2008/10/23(木) 19:14:27たぶん来年のプロジェクトでMFCやると思う
0608デフォルトの名無しさん
2008/10/23(木) 21:04:260609デフォルトの名無しさん
2008/10/24(金) 14:26:53C++を勉強中の者です。
関数テンプレートを関数ポインタを経由して呼び出したいのですが
そういったことはできるのでしょうか?
また、どのように書けばよろしいのでしょうか?
参考になるページなどありましたら教えて頂ければありがたいです。
0610デフォルトの名無しさん
2008/10/24(金) 14:29:26できるよ。テンプレートじゃない時とだいたいいっしょだけど、テンプレート引数を
明示的に示す必要があるかもしれない。
0611デフォルトの名無しさん
2008/10/24(金) 16:54:02どんな環境なのかおおしえいただけないでしょうか?
参考にしたいです
0612デフォルトの名無しさん
2008/10/24(金) 19:43:30ありがとうございます。やってみます。
0613デフォルトの名無しさん
2008/10/24(金) 22:25:15c++-mode
0614デフォルトの名無しさん
2008/10/25(土) 18:29:28kterm + emacs -nw
または
TeraTermPro + emacs -nw
0615デフォルトの名無しさん
2008/10/27(月) 13:57:03MyClass *pObj = &myobj;
(2) MyClass *pObj = new MyClass();
上の2つなんですが何か違いはあるんでしょうか?オブジェクとが確保されるメモリ領域など違いはありますか?
0616デフォルトの名無しさん
2008/10/27(月) 13:59:57MyClass myobj はどこに作ってんのかな?
0617デフォルトの名無しさん
2008/10/27(月) 14:02:46(1)だとスコープ抜けたら消える
後スタックかヒープかも違う
0618デフォルトの名無しさん
2008/10/27(月) 14:03:180619デフォルトの名無しさん
2008/10/27(月) 14:05:31(1)はスタックに作られるから関数ぬけたらdeleteしなくても消滅
(2)はヒープに作られるから自分でdeleteしないと残る
という理解であってますか?
0620デフォルトの名無しさん
2008/10/27(月) 16:14:53概ね合っている。
0621デフォルトの名無しさん
2008/10/27(月) 17:19:30実装依存なんだっけ?
まあふつう話は通じると思うけど
0622デフォルトの名無しさん
2008/10/27(月) 18:03:35を自動deleteに出来ないんですか?
0623デフォルトの名無しさん
2008/10/27(月) 18:08:560624デフォルトの名無しさん
2008/10/27(月) 18:17:53そこをうまくやるの技術者PGで、出来ないのがドカタPGでしょ
0625デフォルトの名無しさん
2008/10/27(月) 18:21:150626デフォルトの名無しさん
2008/10/27(月) 18:22:01どう使い分ければよい?
0627デフォルトの名無しさん
2008/10/27(月) 18:24:44スコープを抜けたときに勝手にdeleteされて困る場合は(2)
0628デフォルトの名無しさん
2008/10/27(月) 18:25:02自動じゃ無理な時だけnewしたらいいと思うよ。
0629デフォルトの名無しさん
2008/10/27(月) 18:27:19スマートポインタに入れる。
通常はstd::auto_ptr、コンテナに入れたりコピーしたり
する時はstd::tr1::shared_ptr
0630デフォルトの名無しさん
2008/10/27(月) 18:27:23自動でとれるようにするのが技術者PG、できないのがドカタPGでしょ
0631デフォルトの名無しさん
2008/10/27(月) 18:31:32・・もしかして、質問者はスコープ抜けたらというタイミングしか想定してないのかな?
ウィンドウが破棄されたら、とか例があるからそういう自動を連想してしまった。
0632デフォルトの名無しさん
2008/10/27(月) 18:32:04std::auto_ptr や boost::shared_ptr じゃダメか?
0633デフォルトの名無しさん
2008/10/27(月) 18:32:470634632
2008/10/27(月) 18:33:580635デフォルトの名無しさん
2008/10/27(月) 18:41:05どうも、どうも
どう使うのかは分からないですけど
やっぱ、自動deleteを実現する機能ってあるんですね
0636デフォルトの名無しさん
2008/10/27(月) 18:48:51自動でとれるよう(開放忘れがないように)に工夫するしないんですか
0637デフォルトの名無しさん
2008/10/27(月) 19:32:260638デフォルトの名無しさん
2008/10/27(月) 19:39:19>>628
速度的にはどうなんですか?たとえば、
(A) vector<MyClass> myobj;と
(B) vector<MyClass*> myobj;
はどっちの方がよいとかあります?
(A)形式でオブジェクトをそのまま格納するより(B)のようにnewで作ったポインタを格納した方がいいって聞いたのですが
0639デフォルトの名無しさん
2008/10/27(月) 19:39:50(B) vector<MyClass*> myvector;
のまちがえでした
0640デフォルトの名無しさん
2008/10/27(月) 19:41:570641デフォルトの名無しさん
2008/10/27(月) 20:09:30MyClassとMyClass*のどっちの方がコピーに時間がかかるかっていう話。
クラスのコピーコンストラクタが単純なメンバのコピーであったとしても、ほとんどの場合、クラスのサイズはポインタ1個分より大きいためBの方が速い。
但し、Bの場合myobjからeraseしたりclearしたり、あるいはmyobjの寿命が切れたりしただけではポインタはdeleteされないので注意。
0642デフォルトの名無しさん
2008/10/27(月) 20:21:07これはどういうふうに理解すればよいでしょうか?
template <class DataType,
template <class DataType> class Buffer = RingBuffer >
class InPort
: public Buffer<DataType>
{
:
よろしくお願いします。
0643デフォルトの名無しさん
2008/10/27(月) 20:26:37みなさんアドバイスありがとうございます。
ある人にチューニングしてもらったら(A)を(B)に書き換えられていて何でだろと思ったので調べていました。そのような理由があったんですね。(B)ではちゃんとデストラクタ作ってdeleteされてました。
C++はいろいろ知らないといいコードかけないと痛感orz
0644デフォルトの名無しさん
2008/10/27(月) 20:38:160645デフォルトの名無しさん
2008/10/27(月) 20:45:41メモリが一箇所になるからな
0646642
2008/10/27(月) 21:27:16ぐぐってもそれらしい物が見つかりません。
0647デフォルトの名無しさん
2008/10/27(月) 21:29:10�Aエクスプローラで縮小版にするとサムネイル表示される(ダブルクリックでビューワが起動する)
今やりたいことなんですが、
�Aの設定方法と
�Aをするためには�@のビューワ作成時にしないといけない約束事みたいなのはあるんでしょうか?
開発環境はVC++6.0です。
0648デフォルトの名無しさん
2008/10/27(月) 21:44:40InPortはテンプレート引数を2つ取る。
第一引数(DataType)は見ての通り。
第二引数(Buffer)は、テンプレート引数を1つ取るクラステンプレートで、デフォルト引数としてRingBufferクラスが指定されている。
そして、Bufferのテンプレート引数にDataTypeを渡して実体化した型を継承している。
template <class T> class Hoge { ... };
InPort<int> x;//1
InPort<int, Hoge> y;//2
1と2どちらの使い方もできる。
0649デフォルトの名無しさん
2008/10/27(月) 21:50:37ありがとうございます。
全く理解出来なくて、困っていました
0650デフォルトの名無しさん
2008/10/28(火) 20:24:37(B) vector<MyClass*> myvector;
Bを選んだときに必ずnewでインスタンス化しないといけないわけではないよ。
newする場合は、そうでない場合に比べて時間がかかりがちだから、
Bにする場合でもnewしなくてすめばその方がいいと思うよ。
deleteでトラブりやすいし。
MyClass m;
vector<MyClass*> myvector;
myvector.push_back(&m);
0651デフォルトの名無しさん
2008/10/28(火) 20:29:11そのpush_back()で何が格納されるのかよーく考えてくれ。
0652デフォルトの名無しさん
2008/10/28(火) 20:29:550654デフォルトの名無しさん
2008/10/28(火) 20:45:260655デフォルトの名無しさん
2008/10/28(火) 20:51:23boost::ptr_vector使えばdelete不要
0656デフォルトの名無しさん
2008/10/28(火) 21:14:18650 じゃないけど、例えば vector< MyClass > のリストに対するループ処理
があるとして、その中で失敗した要素のポインタを vector< MyClass* > に蓄
積し、失敗データリストを一括処理、とか。
推奨はしないけど、実際に仕事でこういう処理を書いた事がある。
0657デフォルトの名無しさん
2008/10/28(火) 21:51:10はMyClass m;がローカルだったらスコープぬけたら消滅しちゃうってこと?newで作れば消滅しないけど。
0658デフォルトの名無しさん
2008/10/28(火) 21:53:310659デフォルトの名無しさん
2008/10/28(火) 21:56:33newを使わない限り、一定個数のオブジェクトしか扱えないのだからオブジェクト配列の一つもあれば充分だろう。
0660デフォルトの名無しさん
2008/10/28(火) 21:58:03それはそれで途中でうっかり削除や追加をすると怖いことになりそうだな
0661デフォルトの名無しさん
2008/10/29(水) 00:29:200662デフォルトの名無しさん
2008/10/29(水) 00:38:520663デフォルトの名無しさん
2008/10/29(水) 12:24:37struct Hoge{
int i;
int* operator&(){return &i;}
};
Hoge hoge;
Hoge* foo=&hoge;
0664デフォルトの名無しさん
2008/10/29(水) 12:33:370665デフォルトの名無しさん
2008/10/29(水) 12:36:510666デフォルトの名無しさん
2008/10/29(水) 12:54:510667デフォルトの名無しさん
2008/10/29(水) 13:10:050668デフォルトの名無しさん
2008/10/29(水) 13:10:52boost::addressofでできるよ
なにをやってるかはソースコードをよめばわかる
0669デフォルトの名無しさん
2008/10/29(水) 15:17:38転置無しでやろうとしたら結果が真っ黒(=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;
}
続く…
0670669
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;
}
0671デフォルトの名無しさん
2008/10/29(水) 15:54:12怪しい辺りで変数の値でも追跡してみればいいじゃない。
見て判らなければ動かすのが今のプログラミング。
0672デフォルトの名無しさん
2008/10/29(水) 17:55:37newのエラーチェックは必要ないとかとんでもないことが書いてあったので本棚の奥に片づけました
で、タイトルよく見るとExceptional C++ Styleだったので偽物掴まされたのかと思ったんですが
書いてる人同じなんですね
Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?
0673デフォルトの名無しさん
2008/10/29(水) 18:13:45お前がとんでもない。
0674デフォルトの名無しさん
2008/10/29(水) 19:36:58int* p = new int;
if (p == 0) ←これが要らないっていう話?
0675デフォルトの名無しさん
2008/10/29(水) 19:39:000676デフォルトの名無しさん
2008/10/29(水) 19:40:290677デフォルトの名無しさん
2008/10/29(水) 19:41:44いいや
bad_allocを捕まえることもnew(nothrow)をヌルチェックすることも意味がないと書いてある
メモリは遅延確保するからnewは常に成功するとか書いてる
ひどすぎる
0678デフォルトの名無しさん
2008/10/29(水) 19:42:230679デフォルトの名無しさん
2008/10/29(水) 19:44:01それは Linux を含む一部の環境では実際正しい。
というか、malloc じゃなくて new でその説明があった?
0680デフォルトの名無しさん
2008/10/29(水) 19:46:49C++の本だもん、もちろんnewの話ですよ
でも滅多に起こらないとしても、環境によっては絶対に起こらないとしても、
それでもやるのがエラーチェックでしょう?
著者の姿勢に疑問を感じざるを得ないです
0681デフォルトの名無しさん
2008/10/29(水) 20:07:24参考までにどこのページ?
0682デフォルトの名無しさん
2008/10/29(水) 21:05:17それは哲学の問題であって、プログラミングの問題ではないよ。
0683デフォルトの名無しさん
2008/10/29(水) 21:11:50気になったので、手元の本で調べたら p.177 辺りの話のようだ。
久しぶりに読んでみたが、個人的には、真っ当な事が書かれてると感じた。
ところで new に失敗した時、一体どんな処理をするのだろうか?
メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
0684デフォルトの名無しさん
2008/10/29(水) 21:24:57他(ユーザーのデータやシステム)に致命的被害を及ぼしたりしないように安全に終了する。
可能であれば、自分が扱っているデータも安全に保存した上で。
0685デフォルトの名無しさん
2008/10/29(水) 21:27:590686デフォルトの名無しさん
2008/10/29(水) 21:46:59それは普通に組んでれば例外がさかのぼる途中で実現される気がする
newで失敗したときにいろいろしたければnew_handlerでやればいいし、正直bad_allocが投げられたらオワリなんじゃ?
0687デフォルトの名無しさん
2008/10/29(水) 21:55:45ちなみにその章の Summary の訳。
>nothrow new の使用は避けること。通常の例外を送出する new と比べて、最近では意味のある利点がないこと、
>また大抵はより悪い失敗時の特徴を持つからである。
>
>いつくかの理由から、とにかく new の失敗をチェックしようというのはあまり利点がないということは覚えておくべきである。
>
>メモリの枯渇について正当な懸念があるなら、チェックしていると考えているものがチェックできているか気をつけよう。
> - メモリが使用されるまでメモリ確保しないシステムでは、new の失敗をチェックすることは大抵役に立たない。
> - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の
> 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。
> - 特別な場合を除いて、new の失敗を検出した場合でも、本当にメモリが残されていないなら、できることは多くはない。
0688デフォルトの名無しさん
2008/10/29(水) 22:01:25シナ系ソフトハウスがあった。実際にメモリ不足の状況を作ってやったら、ダイアログを出そうとする行為自体が
メモリ確保エラーを起こすらしくて画面を埋め尽くす勢いでダイアログが開いていき、メモリスワップに突入。
メモリ不足の状況を解除してからダイアログの増殖が止まるまでに20分掛かったのはいい思い出w
教訓。実際にメモリ不足の状況に陥ったら、できることは高が知れている。
0689デフォルトの名無しさん
2008/10/29(水) 22:08:37メモリ不足になったら開放してメモリをあけるみたいなテクニックを聞いたことがある。
0690デフォルトの名無しさん
2008/10/29(水) 22:13:05エラーログはこうとしてファイルをオープンしようとするが失敗
そのエラーのログをさらにはこうとして…(以外同文
0691デフォルトの名無しさん
2008/10/29(水) 22:33:430692デフォルトの名無しさん
2008/10/29(水) 22:33:47俺も、実際に似たような事例に遭遇したので、>>683 を書いた。
エラーチェックは良い事だが、その実効性を検証しないと意味がないし、メモリ確保の問
題は OS が深く絡むので、OS がするより良い対応をアプリケーションで行うのは非常に難
しく、副作用の方が心配になる。
もし大量のメモリ確保が心配なら、API で空きメモリ量を得て、new する前に妥当性チ
ェックする方が真っ当だと思うし ( チェック直後に枯渇した場合は事故とする )。
0693デフォルトの名無しさん
2008/10/30(木) 01:36:37if (p == 0) {*}←これ
で
実際に、これが実行された経験ある奴いるの?
1Tバイトぐらいのメモリよこせと言えば実行さるるのかな
0694デフォルトの名無しさん
2008/10/30(木) 01:39:39まともな処理系なら、bad_allocが飛ぶので、絶対に実行されることはない。
0695デフォルトの名無しさん
2008/10/30(木) 01:50:460696デフォルトの名無しさん
2008/10/30(木) 07:09:370697デフォルトの名無しさん
2008/10/30(木) 07:12:35メモリ確保とは全く別の目的に使うような病的な場合を除いて
組み込みのnewと同じ議論が全部当てはまると思うけど
0698デフォルトの名無しさん
2008/10/30(木) 08:45:02大勢の人間や高名な人間を下に見ることが可能な素晴らしい閃きが
急に自分の頭に訪れたような気がしたら、
意気揚々とそれを書き込む前に疑ってみたほうがいいと思うんだ。
「いやいや待てよ、馬鹿な俺がこんなことをこんな簡単に見出せるはずがない」
って。
0699デフォルトの名無しさん
2008/10/30(木) 09:15:53俺SUGEEEEEEEEEEwwwwwww
と思ってやってみたら出来ないことはよくあるよな…
0700デフォルトの名無しさん
2008/10/30(木) 09:26:050701デフォルトの名無しさん
2008/10/30(木) 09:40:00>Styleの方はダメ本ですが、Exceptional C++ってのは大丈夫なんですか?
安心しろ、大丈夫じゃないのは君の理解力のほうだ.
#もうちょっと基礎的なところから勉強しなおしましょう.
0702デフォルトの名無しさん
2008/10/30(木) 09:46:23>ところで new に失敗した時、一体どんな処理をするのだろうか?
>メモリ枯渇が原因だとして、そんな環境で打つ手があるのか。
枯渇じゃなくて確保失敗することもあるだろ・・
ねえ、馬鹿なの?
0703デフォルトの名無しさん
2008/10/30(木) 09:49:53>枯渇じゃなくて確保失敗することもあるだろ・・
kwsk
0704デフォルトの名無しさん
2008/10/30(木) 09:59:550705デフォルトの名無しさん
2008/10/30(木) 10:10:13c:\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
0706デフォルトの名無しさん
2008/10/30(木) 10:18:11ねえよww
おまえはクライアントに
「エラーは処理しません、手抜きじゃなくて哲学なんです」
って説明するのか?
0707デフォルトの名無しさん
2008/10/30(木) 10:19:59むしろ定義されてても同じ議論がなりたたないとダメのような…
別にnew_handlerやbad_allocを使うか否かは定義する人の自由だけどさ。
0708デフォルトの名無しさん
2008/10/30(木) 10:20:270709デフォルトの名無しさん
2008/10/30(木) 10:21:030710デフォルトの名無しさん
2008/10/30(木) 12:10:100711デフォルトの名無しさん
2008/10/30(木) 12:20:340712デフォルトの名無しさん
2008/10/30(木) 12:45:310713デフォルトの名無しさん
2008/10/30(木) 13:32:38戻りつつ走るという高尚な関数呼び出しだ。
0714デフォルトの名無しさん
2008/10/30(木) 13:42:410715デフォルトの名無しさん
2008/10/30(木) 13:47:470716デフォルトの名無しさん
2008/10/30(木) 21:22:260717デフォルトの名無しさん
2008/10/30(木) 21:23:19----
#include <stdio.h>
----
0718デフォルトの名無しさん
2008/10/30(木) 21:28:18あのさ、ここまでの流れ読めてる?
0719デフォルトの名無しさん
2008/10/30(木) 21:31:48メモリが足りない以外に失敗とはどんな場合なのでしょうか?
0720デフォルトの名無しさん
2008/10/30(木) 21:39:56ハードやアロケータによっては一回に確保できるサイズに制限があったりするかもしれない?
0721デフォルトの名無しさん
2008/10/30(木) 21:40:50つまり、定義する必要性がある状況だ
0722デフォルトの名無しさん
2008/10/30(木) 21:57:20心配になるぐらいでかいサイズを確保するなら、前もって足りるか調べるのが
定石なんじゃないかね。たとえばオンメモリでの画像処理とか。
その場合でもでかいバッファをいきなり作るんではなくて、常識的なサイズで
小分けにするだろうから、そういう意味でも考えなくていい状態だろ。
bad_alloc や NULL チェックする派の人って STL コンテナとかのメモリ確保失
敗も対処するんだろか。vector v(100) みたいなコードも try ブロックに入れな
きゃならないとしたら、無理すぎんだろ。
0723デフォルトの名無しさん
2008/10/30(木) 22:30:260724デフォルトの名無しさん
2008/10/30(木) 23:23:41既に precompile header に入ってるのでは
0725デフォルトの名無しさん
2008/10/31(金) 00:03:41確実にnewが失敗すると思われるのは、アドレス空間が不足するケース。
32bit OSだったらアドレス空間は全体で4GBで、さらにユーザ空間で使えるのはその一部なので、
4GB近くのメモリ確保を行ったら連続したアドレスが確保できずbad_allocが飛ぶ(メモリを4GB以上積んでてもダメ)。
0726デフォルトの名無しさん
2008/10/31(金) 00:08:110727デフォルトの名無しさん
2008/10/31(金) 00:10:41Win32系のスレへ逝け、ボケ!
TerminateThread();
0728デフォルトの名無しさん
2008/10/31(金) 00:14:27つ _endthreadex()
0729デフォルトの名無しさん
2008/10/31(金) 00:25:07int main(int ac, char** av)
{
try{
}
catch( ry
0730デフォルトの名無しさん
2008/10/31(金) 00:29:201.25*1.25*1.25などの小数点の掛け算を行うと四捨五入されます。
四捨五入をさせない方法はありますか?
0731デフォルトの名無しさん
2008/10/31(金) 00:30:52表示の桁を増やしたいのか?
setwとか%10f とかじゃね
0732730
2008/10/31(金) 01:54:36setwはうまくいきませんでした。
なぜだ…
0733デフォルトの名無しさん
2008/10/31(金) 02:06:10その計算の場合は
5*5*5/4.0/4/4とかにした方がいい
0734デフォルトの名無しさん
2008/10/31(金) 02:11:310735デフォルトの名無しさん
2008/10/31(金) 02:12:36setwではなくsetprecision
%10fではなく%.10f
0736730
2008/10/31(金) 03:39:29ぐぐってみました…そういうことなのね。
やはり回避するようなプログラミングをしなくてはいけないのですね。
<<734
わかりました。
0737デフォルトの名無しさん
2008/10/31(金) 03:53:29アンカーはこう書きます
0738730
2008/10/31(金) 03:59:38慌てていたとはいえ…
欝だ
0739デフォルトの名無しさん
2008/10/31(金) 06:37:03正解レスのみスルーする
0740デフォルトの名無しさん
2008/10/31(金) 08:02:03たしかにこれは見事なスルーっぷりだなw
0741デフォルトの名無しさん
2008/10/31(金) 08:41:570742デフォルトの名無しさん
2008/10/31(金) 08:48:220743デフォルトの名無しさん
2008/10/31(金) 10:55:49public slots:
void setValue(int value);
0744デフォルトの名無しさん
2008/10/31(金) 11:22:580745デフォルトの名無しさん
2008/10/31(金) 11:26:54Qtを使ったプログラムなんですが、publicの後に":"以外の文字が書かれている構文を見たことが無いので
このようなpublic宣言はどういう意味を持つのかが理解できないのです。
0746デフォルトの名無しさん
2008/10/31(金) 11:33:01C++的には意味がない
ツールが認識するキーワード
0747デフォルトの名無しさん
2008/10/31(金) 11:36:18あ、そうなんですね。emitと同じようなもんですか。
よく分かりました。ありがとうございます。
0748デフォルトの名無しさん
2008/10/31(金) 19:15:4711/5 発売になってるけど今日、紀伊国屋で入手した。
0749デフォルトの名無しさん
2008/11/01(土) 02:05:35役に立つのかな
0750デフォルトの名無しさん
2008/11/01(土) 07:39:39>> - 仮想メモリシステムでは、new の失敗に遭遇することはまれか全くない。なぜなら仮想メモリが枯渇する遥か以前の
>> 時点で、大抵スラッシングが発生し管理者がプロセスを kill し始めるからである。
これちょっとダウトじゃないかなあ。
例えば実メモリは4GB以上ある32bit OSだと、あるユーザプログラムのメモリ使用量が
4GB - (システム等使用分)に到達すると脂肪だが、システム全体にはまだ余裕がある、
なんて場合はあるかと。OSにもよるわけだが。
0751デフォルトの名無しさん
2008/11/01(土) 08:49:251998 と 2003 の違いなんて大してないんじゃね?
vector の連続性保証は 2003 だっけ?
0752デフォルトの名無しさん
2008/11/01(土) 10:57:29namespace 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) が見つかって良い気がしますのでコンパイルできていいのではないかと思うのですが。
+= の方はコンパイルできているわけですし。
0753デフォルトの名無しさん
2008/11/01(土) 14:09:100754デフォルトの名無しさん
2008/11/01(土) 14:30:440755デフォルトの名無しさん
2008/11/01(土) 14:59:44通らない方が正しい
何法の何条かを示すべきだろうが、面倒だからやらない
0756デフォルトの名無しさん
2008/11/01(土) 16:11:20見つけました。ありがとうございます。
> 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++ 他の挙動が正しいようです。
0757デフォルトの名無しさん
2008/11/01(土) 16:32:29場合がほとんどだわな。
BCCももう少し頑張ってboost対応してくれよ・・・・BCB2009で
regexには対応したんだけどね。
0758デフォルトの名無しさん
2008/11/01(土) 16:46:140759デフォルトの名無しさん
2008/11/01(土) 17:46:230760デフォルトの名無しさん
2008/11/01(土) 18:37:00とりあえず 2009 でドキュメントに載ってる対応機能
・alignof 演算子
・型特性関数(__has_nothrow_copy_constructor 等)
・noreturn 属性と final 属性
・explicit 変換演算子
・extern テンプレート
・列挙型の前方宣言
・右辺値参照
・静的アサーション(static_assert)
・厳密な型指定の列挙型
・型指定子 decltype
・Unicode 文字型とリテラル(char16_t, char32_t と u'', U'')
0761デフォルトの名無しさん
2008/11/01(土) 19:48:070762デフォルトの名無しさん
2008/11/02(日) 10:46:120763デフォルトの名無しさん
2008/11/02(日) 11:13:30直接 include していないだけで、間接的に include されてんじゃない?
0764デフォルトの名無しさん
2008/11/02(日) 11:15:35型のあたりで問題が出るんだけど
0765デフォルトの名無しさん
2008/11/02(日) 11:30:58iostreamをincludeしてると使えるっぽいです。
iostreamをincludeしないと使えなくなりました。
0766デフォルトの名無しさん
2008/11/02(日) 11:41:55てっきりunix Cっぽくincludeなしでもprintfとかは使えるようにしてあるのかと思った。
0767デフォルトの名無しさん
2008/11/02(日) 11:42:460768デフォルトの名無しさん
2008/11/02(日) 12:49:070769デフォルトの名無しさん
2008/11/02(日) 13:45:460770デフォルトの名無しさん
2008/11/02(日) 18:21:420771デフォルトの名無しさん
2008/11/02(日) 18:27:110772デフォルトの名無しさん
2008/11/02(日) 18:37:300773デフォルトの名無しさん
2008/11/02(日) 19:57:17過去の前例や詳細な説明を書こうかと思ったけど「は?」になんかむかついたのでやめた。
0774デフォルトの名無しさん
2008/11/02(日) 20:14:070775デフォルトの名無しさん
2008/11/02(日) 21:50:40って考えたんだろう。
解説すると、もっとそういう雰囲気出ちゃうのが玉に瑕だが。
0776デフォルトの名無しさん
2008/11/03(月) 11:11:580777デフォルトの名無しさん
2008/11/03(月) 11:27:570778デフォルトの名無しさん
2008/11/03(月) 11:49:140779デフォルトの名無しさん
2008/11/03(月) 20:14:30(2) MyClass obj(100);との違いは何かありますか?どっちもコンパイルできてエラーも出ないのですが。
0780デフォルトの名無しさん
2008/11/03(月) 20:44:14つまり
>C++でも下のようにオブジェクと作ってしまうのですが問題ありですか?
問題ありすぎる.今すぐコード全部書き直して首つって死ね
0782デフォルトの名無しさん
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;
}
0783デフォルトの名無しさん
2008/11/03(月) 20:56:41constructor! 10
destructor!
0784デフォルトの名無しさん
2008/11/03(月) 20:56:53あと=は代入ではない
0785デフォルトの名無しさん
2008/11/03(月) 21:02:15結局、コピーコンストラクタが呼ばれないようにコンパイラが裏で細工しているだけで実際はやっちゃいけないってことですか?
0786デフォルトの名無しさん
2008/11/03(月) 21:03:170787デフォルトの名無しさん
2008/11/03(月) 21:03:44そゆこと
0788デフォルトの名無しさん
2008/11/03(月) 21:10:01でもロベール本のp283見ると下の2つは若干の差はあるが基本的には同等とか書いてあるね。
Integer b = Integer(3)
Integer b(3)
0789デフォルトの名無しさん
2008/11/03(月) 21:14:38極端な例を出せば#define BEGIN {のようなもの。
0790デフォルトの名無しさん
2008/11/03(月) 21:16:47は、ときどき見かける
0791デフォルトの名無しさん
2008/11/03(月) 21:19:10そういう書き方をさせないためのexplicitです
0792デフォルトの名無しさん
2008/11/03(月) 21:23:24のようになるコンパイラは
.>>601
の規格に非準拠ということですか
0794デフォルトの名無しさん
2008/11/03(月) 21:27:20g++使ったよ。
郷に入れば郷に従えってことでC++の書き方に慣れるよ。Pythonは
Integer b = Integer(3)
だからつい癖でC++でも使っちまうorz
0795デフォルトの名無しさん
2008/11/03(月) 21:32:5420回くらい読みましたが解りませんorz
0796デフォルトの名無しさん
2008/11/03(月) 21:55:1920回で足りる奴ばかりとは限らんが、255回でも65535回でも2147483647回でも考えれ
無限回必要でないことは俺が保証する
0797デフォルトの名無しさん
2008/11/03(月) 22:05:32なにが制約なのでしょう
0798デフォルトの名無しさん
2008/11/03(月) 22:08:47ヒント: private
0799デフォルトの名無しさん
2008/11/03(月) 22:14:23なるほど
0800デフォルトの名無しさん
2008/11/03(月) 22:15:310801デフォルトの名無しさん
2008/11/04(火) 13:28:17public:
vector& GetVec() { return vec_; }
private:
vector<int> vec_;
};
こんな感じでメンバの参照をconstもつけずに返すのって設計間違ってますか?
しかし、参照返す方法以外でvectorへの操作を提供しようと思うと面倒くさすぎる。
0802デフォルトの名無しさん
2008/11/04(火) 13:32:35そもそも、ベクタの実装を公開してしまっていいかどうかが判断基準じゃないのか?
GetVec()使えばなんでもできてしまうってことは、Hogeクラスで管理しても意味がなくなるってことなんだけど。
例えばHoge hogeがあったとして、hoge.GetVec().clear()されてしまうかもしれないからね。
0803デフォルトの名無しさん
2008/11/04(火) 13:54:32それ、vec_をpublicにするのと同じじゃないか?
0804デフォルトの名無しさん
2008/11/04(火) 13:56:00なるほど。
今回のケースは、メンバ関数の引数で毎回vectorを受け取るのが面倒くさくて、vectorをメンバで保持してる意味が強いかもしれません。
vectorの中身を管理する目的がなければ、参照を返して問題ないということですね。
ありがとうございました。
0805804
2008/11/04(火) 13:59:29>>803
言われてみれば・・・。
publicにvectorを置くほうがわかりやすいかなぁ・・。
0806デフォルトの名無しさん
2008/11/04(火) 16:14:39外部からvec_内部を直接触る構造が間違ってる気がするぜ
GetVec()使わすくらいなら、その処理をメンバ関数で内包しちゃったほうがスマートな気がするが
0807デフォルトの名無しさん
2008/11/04(火) 16:22:14is a なものを has a で実装しようとしてないか?
0808デフォルトの名無しさん
2008/11/04(火) 16:31:57裏を返せば、クラスhogeはベクタの参照(それも、const参照で済むかもしれない)を持っているだけでいいのかもしれない。
0809デフォルトの名無しさん
2008/11/04(火) 16:33:180810801
2008/11/04(火) 17:34:59うーん、やはり設計がおかしかった気がします。
何がしたかったかというと、
void Hoge::XXX(vector<int>& vec);
void Hoge::YYY(vector<int>& vec);
...
このように必要なデータをvectorで受け取るメンバ関数がいくつかあります。
Hogeの利用者は、vecにデータをつめてHogeに渡すわけですが、このvecはHogeにしか使わないものなので、
Hogeのメンバにしてはどうかと思いました。
ここで問題なのは、vecにデータをつめるのはHogeの利用者であって、Hogeにはできないことなのです。
そこでvecの参照を返すのが一番手間がかからないと思い、参照返すgetterを考えました。
0811デフォルトの名無しさん
2008/11/04(火) 17:43:42vecにデータ詰めてから渡したらだめなん?
0812デフォルトの名無しさん
2008/11/04(火) 17:50:560813デフォルトの名無しさん
2008/11/04(火) 17:57:04データ詰まったvectorを受け取って、メンバ変数vecとswapということですよね?
それが一番いいかもしれません。
>>812
特別珍しいケースというわけではないと思うのですが、意外に難しくて困っています。
0814デフォルトの名無しさん
2008/11/04(火) 18:12:50コンストラクタでベクタのコンスト参照でも渡しておけば、後は世話なし。
# いい設計だとは思わないけどw
0815デフォルトの名無しさん
2008/11/04(火) 18:34:16あーconst参照でオブジェクトの寿命が引き伸ばせるんでしたっけ。
でも、なんかスタックに確保したオブジェクトの参照を保持するのは気持ち悪く思えます。
それならswap使う方法にしたいです。
0816デフォルトの名無しさん
2008/11/04(火) 18:37:06おいこら、参照を何だと思っているんだ、貴様は。
0817デフォルトの名無しさん
2008/11/04(火) 18:49:290818デフォルトの名無しさん
2008/11/04(火) 19:00:51メンバでは引き延ばせないし、今回の話とも関係ない。
0819デフォルトの名無しさん
2008/11/04(火) 19:55:29勘違いしていました。
const参照で寿命云々は一時オブジェクトのときの話でした。
参照をメンバとして持つのって、寿命管理の面で気持ち悪くないですか?
swapの方が自然だと思ったんですが。
0820デフォルトの名無しさん
2008/11/04(火) 20:17:12挿入も削除も要素アクセスもオールクリアも外からやりたい放題出来ていいの?
本当にそれでいいならpublicで全然問題ないんじゃね
特定のなんかのクラスがそういうことやるってならvec_は多分Hogeじゃなくてそいつの物だ
0821デフォルトの名無しさん
2008/11/04(火) 20:42:31メンバにしようって発想自体が
そもそも大失敗と推測されます
0822デフォルトの名無しさん
2008/11/04(火) 21:39:23vec_にデータつめるのは特定の場所(クラス)でやります。
「Hogeクラスにデータをセットする」という操作はおかしくないと思うのですが、swapじゃだめなんですか?
Hoge使うときにvec_が絶対必要になるし、Hogeの寿命がきれたらvec_の寿命もきれていいので、メンバにすればちょうどいいのかと思いました。
Hogeは複数のクラスから参照されるので、vec_をHogeのメンバにしないとなると、Hogeの他にvec_の参照も複数のクラスが持たないといけなくなるもよくないかなと。
0823デフォルトの名無しさん
2008/11/04(火) 21:40:530824デフォルトの名無しさん
2008/11/04(火) 22:09:510825デフォルトの名無しさん
2008/11/04(火) 22:27:25structで宣言してメンバを直接触らせている
例えば何かのファイルヘッダを読み込んだ結果とか
いちいち get, set関数を用意するのがうざいだけ
0826デフォルトの名無しさん
2008/11/04(火) 23:07:57UMLはほとんど知識なくてまともに書けないです。
>>824
ただのsetterですめばいいんですが、vectorはコピーにコストかかるからswapにしようかと。
>>825
データの保持が主体というわけではないです。
データを詰める作業がHogeの外なこと以外は、普通のメンバと一緒だと思うんですけど、うーん・・。
0827デフォルトの名無しさん
2008/11/05(水) 00:56:17データを詰める時に、vector<int>じゃなくてHogeのvec_アクセス関数を直接読んじゃダメなの?
operator[]かpush_backあたりを1個作れば終わるような気がしなくもないんだが
0828デフォルトの名無しさん
2008/11/05(水) 01:01:290829デフォルトの名無しさん
2008/11/05(水) 02:20:41なんか追加するだけならHoge::push_backかなんか作ればいいだけだし
一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし
vec_に元々入ってるデータも使って複雑に中身をとっかえひっかえするなら
やっぱりHogeじゃなくてそれをやるクラスの物だと思うし
0830デフォルトの名無しさん
2008/11/05(水) 15:04:25push_backがあれば必要最低限ですが、データの追加はできて削除はできないの?とか、
要素の並びにも意味があるので、ソートもできた方がいいんじゃないかとか多すぎて・・。
で、最初に考えたのが、参照で返すことによってvectorの機能丸ごと使えるようししようと思いました。
> 一から丸ごとvectorを構築するならHoge::vec_swapかなんか作ればいいだろうし
今考えてるのはまさにこれです。
Hogeの外で自由にvectorにデータ詰めて、それをHogeに渡してswapでHogeのメンバvec_に移す方法です。
この方法にします。
ありがとうございました。
0831デフォルトの名無しさん
2008/11/05(水) 15:33:37コスト気にしないなら単純にコピーでいいんじゃ
0832デフォルトの名無しさん
2008/11/05(水) 17:52:58それって結局削除とかソート、というか特にソートか
外部でコード書いてやらんといかんくなるんでしょ?
>>810にある考え方と矛盾してる気がしてしょうがないけどまぁいいか・・・
0833デフォルトの名無しさん
2008/11/05(水) 18:00:150834デフォルトの名無しさん
2008/11/05(水) 18:01:19考え直した方がいいような気がする
そもそもvectorの要素の削除だのソートだのというのは低レベルな操作であって外様に見せるもんじゃない
もっと何かそれ以上の意味のある操作のまとまりとして外に提供しないとクラスで包む意味がない
(それの内部処理が結局の所vectorの操作に過ぎないとしてもだ)
0835デフォルトの名無しさん
2008/11/05(水) 18:46:410836801
2008/11/05(水) 19:17:21HogeはBoost.Graphのadjacency_listのようなものと思ってください。
adjacency_listは、イテレータで複数のEdgeを受け取るコンストラクタの他に、
add、remove、remove_if、clearなどの関数でEdgeの追加/削除を行えるようになっていますが、
今回のケースではこれに加え、要素の並びにも意味があるので、
insertやsortなども必要になり、結局vectorの機能全部なんじゃないかと思うわけです。
そこで、Hogeの外で自由にvectorいじってもらって、完成したvectorを受け取ってswapするのが良いと思いました。
0837デフォルトの名無しさん
2008/11/05(水) 19:19:51> 考え直した方がいいような気がする
考え直す気はないよ
swapしてみたいだけだもん
0838デフォルトの名無しさん
2008/11/05(水) 19:28:08参照やpublicと大差ないと思うけど
まぁ自分しか使わないなら好きなようにやったんでいいと思う
0839デフォルトの名無しさん
2008/11/05(水) 22:50:590840デフォルトの名無しさん
2008/11/05(水) 22:58:570841デフォルトの名無しさん
2008/11/06(木) 00:01:34#define <文字列1> <文字列2>
の<文字列2>が存在しないんですが、
これはどういった意味になるのでしょうか?
0842デフォルトの名無しさん
2008/11/06(木) 00:03:22#ifdef なんかではちゃんと読まれる
文中に書けば無視される
0843デフォルトの名無しさん
2008/11/06(木) 00:05:47再定義の無いやつか。
#ifdef/#ifndef〜#else〜#endifでコンパイラ制御に使う。
0844843
2008/11/06(木) 00:06:490845デフォルトの名無しさん
2008/11/06(木) 00:19:250846デフォルトの名無しさん
2008/11/06(木) 00:26:04#ifdef
と書いたら必ず
#endif // defined(hogehoge)
みたいなコメントを後ろに書いてる
我ながら整合性ねーよなw
0847デフォルトの名無しさん
2008/11/06(木) 01:02:30<文字列1>
が消滅する効果もあるじゃない
0848デフォルトの名無しさん
2008/11/06(木) 01:53:46例えば、C++には本来restrictはないけれどコンパイルオプションで使えるケースもあるから役に立つ。
#if defined(USE_RESTRICT)
# define RESTRICT restrict
#else
# define RESTRICT
#endif
0849デフォルトの名無しさん
2008/11/06(木) 02:05:220850デフォルトの名無しさん
2008/11/06(木) 02:07:510851デフォルトの名無しさん
2008/11/06(木) 02:29:27なにに?
0852デフォルトの名無しさん
2008/11/06(木) 12:13:28(*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;
}
0853デフォルトの名無しさん
2008/11/06(木) 12:25:59classの作り方がおかしい。継承は間違っている。コンポジションにすべき。
0854デフォルトの名無しさん
2008/11/06(木) 12:30:50nullぽに書きこもうとしてSEGVってるな
俺iostreamを作るならboost::iostreamを使うのがおぬぬめ
標準だけで作るのは結構面倒だったと思う
0855852
2008/11/06(木) 12:37:41template <class STREAM>
class Formatedstream:public STREAM {
. . . .
}
Formatedstream<ofstream> ofs
みたいな感じで、どんなストリームでもOKよ。という風にしたかったんですが、そもそもそんなの無理ですか?
0856デフォルトの名無しさん
2008/11/06(木) 12:39:30俺iostreamを作る時もそれに倣った方がいいと思うが
0857デフォルトの名無しさん
2008/11/06(木) 13:19:39std::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よ
0858デフォルトの名無しさん
2008/11/06(木) 14:27:12>853
>857
コンポジションだと演算子やらその他ストリームの便利機能を書かなきゃならんのですが、それくらい面倒くさがるなってことですかね。
>854
なるほ
>856
もっと根元からやれってことですね。
0859852
2008/11/06(木) 15:49:00単語の意味合い的になんか微妙ですが。
どうもでした。
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;
}
0860デフォルトの名無しさん
2008/11/06(木) 16:32:02Fname1 = 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);
}
・
・
・
あらかじめテキストファイルに数行に渡って読み込みたいファイルのパスが書いて
あり、上のように作って読み込むプログラムを作ってみたのですがうまくいきません。
アドバイスお願いします。
0861デフォルトの名無しさん
2008/11/06(木) 16:43:260862860
2008/11/06(木) 16:55:11テキストにはフルパスで書いてあります。。
0863デフォルトの名無しさん
2008/11/06(木) 16:57:29オープン直前でファイル名表示させてみては
0864デフォルトの名無しさん
2008/11/06(木) 18:07:080865デフォルトの名無しさん
2008/11/06(木) 18:51:560866デフォルトの名無しさん
2008/11/06(木) 19:52:570867デフォルトの名無しさん
2008/11/06(木) 20:24:22ここにあるプログラムで擬似乱数が作成できるらしいんですが、
どうやって乱数を出すのか分かりません。
どなたか教えていただけませんか?
0868デフォルトの名無しさん
2008/11/06(木) 20:30:50そのアルゴリズムの説明は一言じゃすまないつーか普通の人には無理だ
かなり数学の知識が・・・・
メルセンヌツイスタの論文は公開されてるからためしに見てみればいい、きっと意味がわからない
0869デフォルトの名無しさん
2008/11/06(木) 20:34:120870デフォルトの名無しさん
2008/11/06(木) 20:43:46MT19937ならboostから持ってきた方が便利だし
0871デフォルトの名無しさん
2008/11/06(木) 20:44:19アルゴリズムの解読ではなく、
実際にこのアルゴリズムを使って乱数を出すにはどうしたらいいのかを聞きたいのです。。
説明下手ですみません。
>>869
その通りです。。
0872867
2008/11/06(木) 20:47:11とりあえず、1〜50までの乱数を取り出すようにしたいのですが・・・。
>>870
ごめんなさい。
全く意味が分かりません・・・
0873デフォルトの名無しさん
2008/11/06(木) 20:50:060874デフォルトの名無しさん
2008/11/06(木) 20:53:51本家を使えばいい
マニュアル載ってるし、CでコンパイルしてCリンケージでリンクするだけ
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/bin/dl/dl.cgi?SFMT:dSFMT-src-2.0.zip
それも面倒なら下の関数をコピペして、適当に構造体に直す
状態変数の命名規則に気をつけて、tに適当な種をやれば十分使える
unsigned long xor128(){
static unsigned long x=123456789,y=362436069,z=521288629,w=88675123;
unsigned long t;
t=(x^(x<<11));x=y;y=z;z=w; return( w=(w^(w>>19))^(t^(t>>8)) );
}
0875デフォルトの名無しさん
2008/11/06(木) 21:10:580876867
2008/11/06(木) 21:24:06解説ページは見たところ無かったのですが・・・
>>874
本家の方を見てみました。
cファイル、hファイルをプロジェクトに追加したのですが、
後はrand()と打てば乱数を取り出せるのでしょうか?
>>875
再配布とかはしないので大丈夫だと思います
0877デフォルトの名無しさん
2008/11/06(木) 21:32:19それが使い方の見本にもなっている。
もちろん自分のプログラムに組み込むときには、
そのmainは削除かコメントアウトする必要がある。
0878デフォルトの名無しさん
2008/11/06(木) 21:44:44ググれば一発で使い方でてくるし
0879デフォルトの名無しさん
2008/11/06(木) 23:34:35(1)ではコピーコンストラクタ呼ばれないってリップマンが言ってた.
0880デフォルトの名無しさん
2008/11/07(金) 00:01:48ファイルに書き込む順番と、読み込む順番が違っていた事でした
そういったものを無くすような工夫とかは何かあるんでしょうか?
やっぱ、気をつけるしかないんですかね orz
0881デフォルトの名無しさん
2008/11/07(金) 00:09:230882デフォルトの名無しさん
2008/11/07(金) 00:52:460883デフォルトの名無しさん
2008/11/07(金) 09:47:420884デフォルトの名無しさん
2008/11/07(金) 10:56:450885デフォルトの名無しさん
2008/11/07(金) 11:37:01freetypeの初期化と解放とかそういうの?
0886デフォルトの名無しさん
2008/11/07(金) 12:38:360887デフォルトの名無しさん
2008/11/07(金) 13:04:210888デフォルトの名無しさん
2008/11/07(金) 14:44:290889デフォルトの名無しさん
2008/11/07(金) 16:35:080890デフォルトの名無しさん
2008/11/07(金) 17:36:59あるクラスの中のコンストラクタに、以下の記述がありました。
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分だけ確保されるんでしょうか?
0891デフォルトの名無しさん
2008/11/07(金) 17:43:290892デフォルトの名無しさん
2008/11/07(金) 17:56:50new int(100)
とかしたら領域確保されるからそれと同様に
new CMfLayout(size)
でもなりそうな気がしたんですが…
0893デフォルトの名無しさん
2008/11/07(金) 17:58:01class __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;
}
0894デフォルトの名無しさん
2008/11/07(金) 18:05:32なんかC++の文法を思いっきり勘違いしてるみたいだから、まともな入門書読むことからやり直すことを勧める。
0895デフォルトの名無しさん
2008/11/07(金) 18:16:57#include "afx.h"
エラー発生
1>LINK : fatal error LNK1104: ファイル 'uafxcw.lib' を開くことができません。」
Program Files検索してみたが64用しかなかった
uafxcw.libはどこでダウンッロードできる?
0896デフォルトの名無しさん
2008/11/07(金) 18:25:050897デフォルトの名無しさん
2008/11/07(金) 18:28:47MFCって有料なのか
express editionには入ってないのね
0898デフォルトの名無しさん
2008/11/08(土) 00:12:180899デフォルトの名無しさん
2008/11/08(土) 00:16:340900デフォルトの名無しさん
2008/11/08(土) 01:25:44CStringはMFCにベッタリ依存してる
0901デフォルトの名無しさん
2008/11/08(土) 01:27:230902デフォルトの名無しさん
2008/11/08(土) 01:36:090903デフォルトの名無しさん
2008/11/08(土) 01:59:280904デフォルトの名無しさん
2008/11/08(土) 02:05:39CStringだって五十歩百歩だろ
0905デフォルトの名無しさん
2008/11/08(土) 03:54:380906デフォルトの名無しさん
2008/11/08(土) 04:13:000907デフォルトの名無しさん
2008/11/08(土) 07:32:09実際にはどちらもATL::CSimpleStringT<T>から派生したATL::CStringT<T>のtypedef
自分の使ってるフレームワークについてくらい
もうちょい勉強しような
0908デフォルトの名無しさん
2008/11/08(土) 08:44:580909デフォルトの名無しさん
2008/11/08(土) 10:59:04こっちもExpressでは使えないけど。
そう言えば、std::basic_stringもstd::vectorみたいに要素数連続の保障を加えるって話なかったっけ?
それとstring-wstring間の変換関数があれば、
もう自分にとってCStringを使う理由がほとんどなくなるんだけどな。
0910デフォルトの名無しさん
2008/11/08(土) 15:44:020911デフォルトの名無しさん
2008/11/08(土) 15:51:01俺はstringsteam使うけど
0912デフォルトの名無しさん
2008/11/08(土) 15:57:020913デフォルトの名無しさん
2008/11/08(土) 15:57:34http://hw001.gate01.com/eggplant/tcf/cpp/strcnv.hpp
0914909
2008/11/08(土) 16:08:010915デフォルトの名無しさん
2008/11/08(土) 21:35:040916デフォルトの名無しさん
2008/11/08(土) 21:52:43trは知らん
0917デフォルトの名無しさん
2008/11/09(日) 04:58:24{
bool MF( void *p ) return p == this;
};
Type *p = new Type;
bool result = p->MF( p );
これ、trueになるって保証されてる?環境依存?
0918デフォルトの名無しさん
2008/11/09(日) 05:03:17とりあえずコンパイルエラーなわけだが、 Type* → void* の変換は1対1だから
たぶん心配してるような問題は無いよ。
0919デフォルトの名無しさん
2008/11/09(日) 05:56:48Type 以外の型のポインタから void* に変換されている場合は
アドレスが異なったりするから true になるとは限らない。
つか、なんだその構文はw
0920デフォルトの名無しさん
2008/11/09(日) 11:57:040921デフォルトの名無しさん
2008/11/09(日) 12:04:01標準またはユーザ定義の operator new が、どのようにメモリ割付を実装しているかによる
自動的な解放を行う実装と、行わない実装の、両方に互換性のある書き方は言うまでもあるまい
0922デフォルトの名無しさん
2008/11/09(日) 12:06:18Windows では、プロセスを強制終了するとシステムが不安定になる旨の警告をしてくるだろ
0923デフォルトの名無しさん
2008/11/09(日) 12:11:56少なくともVxWorksは解放してくれない。
それに組み込みで再起動はありえない。
0924デフォルトの名無しさん
2008/11/09(日) 12:13:20そのWindowsでは、強制終了してもメモリは解放される。
0925デフォルトの名無しさん
2008/11/09(日) 12:17:4516bit Windows辺りだったかな?
0926デフォルトの名無しさん
2008/11/09(日) 12:21:040927デフォルトの名無しさん
2008/11/09(日) 12:25:480928デフォルトの名無しさん
2008/11/09(日) 12:28:30スレ違い
0929デフォルトの名無しさん
2008/11/09(日) 12:29:43何の限定をしようとしているんだ?
0930デフォルトの名無しさん
2008/11/09(日) 13:11:440931デフォルトの名無しさん
2008/11/09(日) 13:20:48そうとは限らない。
共有メモリを使うようなプログラムであれば、
どんなOSであれ気をつけなければならない
0932デフォルトの名無しさん
2008/11/09(日) 14:29:540933デフォルトの名無しさん
2008/11/09(日) 17:58:22どこから手をつけるべきなの?
0934デフォルトの名無しさん
2008/11/09(日) 18:02:290935デフォルトの名無しさん
2008/11/09(日) 18:06:030936デフォルトの名無しさん
2008/11/09(日) 18:14:52Visual C++ の 64 ビットへの移行に関する一般的な問題
http://msdn.microsoft.com/ja-jp/library/3b2e7499(VS.80).aspx
0937デフォルトの名無しさん
2008/11/09(日) 20:08:15>>919
thx.
継承元とかにキャストしちゃってvoid* pに渡すと、
offsetがずれたまま渡されちゃうのね。
newした型でvoid*するとoffset変更なしでアドレスも同じ。と。
助かったーまぢさんすこ
0938デフォルトの名無しさん
2008/11/09(日) 21:44:41新スレ乙
0939デフォルトの名無しさん
2008/11/09(日) 21:49:580940デフォルトの名無しさん
2008/11/09(日) 22:16:010941デフォルトの名無しさん
2008/11/09(日) 22:16:47int i;
union {
int x;
int y;
struct {
int a;
int b;
};
};
};
こういう構造体はC++で禁止されてますが
Foo f;
f.a;f.b;とアクセスでき、かつ同じような構造になるようなものは
どうしたら定義できますか?
0942デフォルトの名無しさん
2008/11/09(日) 22:23:160943デフォルトの名無しさん
2008/11/09(日) 22:24:22無名構造体の中のやつらはcharです
0944デフォルトの名無しさん
2008/11/09(日) 22:37:430945デフォルトの名無しさん
2008/11/09(日) 22:43:28struct Foo {
int i;
union {
int x;
int y;
struct {
char a;
char b;
} z;
};
};
Foo f;
f.z.a; // valid
0946デフォルトの名無しさん
2008/11/09(日) 23:33:32union { int x; char a; };
union { int y; char b; };
がやりたいのと違うか?
0947デフォルトの名無しさん
2008/11/12(水) 11:36:07標準出力への出力文字列を全部ostringstreamに受け取るには
どうすればよいでしょうか?
0948デフォルトの名無しさん
2008/11/12(水) 12:17:450949デフォルトの名無しさん
2008/11/12(水) 12:46:38最終ステップで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());
}
0950デフォルトの名無しさん
2008/11/12(水) 13:14:160951デフォルトの名無しさん
2008/11/12(水) 13:39:04#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;
}
0952949
2008/11/12(水) 13:44:12#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)
0953デフォルトの名無しさん
2008/11/12(水) 19:09:52次スレ>>33
import_featuresのために必要な.libファイルをリンクしてないだけかと。
0954デフォルトの名無しさん
2008/11/12(水) 20:46:31そんな行儀悪いことするよりも、文字列出力を行う関数の引数に
int func(int a, int b, ostream& os = cout)
とかしておいて、必要に応じて引数にストリーム与えたほうがいいよ。
オブジェクトの寿命とかちゃんと管理しておかないとミスの元だから
0955デフォルトの名無しさん
2008/11/12(水) 21:36:09enum test{ a }
とした場合、test::a でも単に a としてもアクセスできてしまい悩んでいます
test::aに限定したくてtestクラスに含めて見たのですが、そうすると列挙を受け取る
引数の型などに test::test としなければならず悩んでいます。
何かいいやり方はないでしょうか?
諦めてクラスにstatic const int aとでもするべきでしょうか・・・
0956デフォルトの名無しさん
2008/11/12(水) 21:56:30名前空間を使えば?
namespace test の中に enum を定義し、この enum を指定するクラスや
関数も同じ名前空間内に入れれば、それらの型部分に修飾は不要。
これらを使用する側は using namespace test を書くまで test:: を省略出来ない。
namespace 内に enum ではなく、直に定数を定義すれば、更に目的に近いかも。
0957デフォルトの名無しさん
2008/11/12(水) 23:39:51bool operator < (const HOGE &value) const { ...}
と教わったのですが、
最後の"const"の文法的な意味、また必要性がわかりません。
どなたか教えて頂けないでしょうか?
0958デフォルトの名無しさん
2008/11/12(水) 23:41:31C++プライマー買え
全部載ってる
0959デフォルトの名無しさん
2008/11/12(水) 23:44:41糞本薦めるな
>>957
その関数内でいかなる変数もクラスも変更しないという意味
mutableを付けるとconstの意味を壊せるがお勧めしない
0960デフォルトの名無しさん
2008/11/12(水) 23:48:34>>959
さん、ありがとうございます。
なるほど、では、引数にあるconstは冗長で、
bool operator < (const HOGE &value) const { ...}
でなく、
bool operator < (HOGE &value) const { ...}
としても同じだということですか?
0961デフォルトの名無しさん
2008/11/12(水) 23:52:15違うからきちんと位置と意味づけ考えろ
0962デフォルトの名無しさん
2008/11/12(水) 23:52:53*this が const になるしるし
class Hoge {
int x;
void foo() const {
x = 1; // できない
}
void bar() {
x = 2; // できる
}
};
const Hoge *hoge;
hoge->foo(); // 呼べる
hoge->bar(); // 呼べない
0963デフォルトの名無しさん
2008/11/13(木) 00:00:41大抵の場合、比較演算子はインスタンス変数を変更せずに実装できるので、constを付けておいた方がいい。
最後のconstを付けないと、例えばその比較演算子を定義したクラスのconstオブジェクトで比較演算が行えない。
組み込み型と動作を合わせると言う意味で、オブジェクトの比較演算はそのオブジェクトがconstか非constかに関わらず行えることが望ましい。
0964デフォルトの名無しさん
2008/11/13(木) 00:07:04>>963
さん、ありがとうございます。
目から鱗です。大変よくわかりました!
比較演算子のオーバーロードのサイトを見ていると、
最後のconstが無いところがほとんどで、ハテナマークがでてました。
ありがとうございます!
0965デフォルトの名無しさん
2008/11/13(木) 00:45:542008/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
0966デフォルトの名無しさん
2008/11/13(木) 19:29:46unsigned char* をunsigned int*に清く正しく型変換するのどうするんですか?
unsigned int* PUINT = (unsigned int*)PUCHAR; じゃないですよね。
0967デフォルトの名無しさん
2008/11/13(木) 19:36:11C++的にはreinterpret_castの方がいいかもしれんが
0968デフォルトの名無しさん
2008/11/13(木) 21:00:140969デフォルトの名無しさん
2008/11/13(木) 21:36:38reinterpret_castって、下記のように関連のないのに変換する場合使うんですよね。
unsigned int INT = reinterpret_cast<unsigned int>PUCHAR
ポインタ同士の場合ポインタで関連があるから。
unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
じゃないんですか?
0970デフォルトの名無しさん
2008/11/13(木) 22:31:090971デフォルトの名無しさん
2008/11/14(金) 01:10:500972デフォルトの名無しさん
2008/11/14(金) 01:27:53鶏の卵と蛇の卵くらいの違いがあるんだ。 みんなそうだと思ってた。
0973デフォルトの名無しさん
2008/11/14(金) 01:54:49可能な状況でかつその必要があるからやるんだろ
0974デフォルトの名無しさん
2008/11/14(金) 02:16:310975デフォルトの名無しさん
2008/11/14(金) 06:43:00なら通る
0976デフォルトの名無しさん
2008/11/14(金) 07:00:480977デフォルトの名無しさん
2008/11/14(金) 07:12:330978デフォルトの名無しさん
2008/11/14(金) 07:20:230979デフォルトの名無しさん
2008/11/14(金) 07:24:45unsigned int* PUINT = static_cast<unsigned int*>PUCHAR
だとどうして駄目なの?
0980デフォルトの名無しさん
2008/11/14(金) 07:32:350981デフォルトの名無しさん
2008/11/14(金) 10:18:02たとえば中身がchar s [1] だったとして十分危険だろ?
0982966
2008/11/14(金) 19:11:32>>975、>>980 そういうことなんですか。ありがとうございました。
暗黙変換が可能なケースが?ですけど、staticの場合、暗黙に変換出来るもの
じゃなければ変換不可で、ポインタ間変換ではX*→void*とvoid*→X*しか
暗黙変換出来ないから、それ以外のポインタ間変換はreinterpretで行うと。
えらく賢くなったv
0983デフォルトの名無しさん
2008/11/14(金) 20:15:51暗黙変換できるのは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);
0984デフォルトの名無しさん
2008/11/14(金) 20:16:46template <typename T>
inline T ptr_cast(void *p)
{
return static_cast<T>(p);
}
0985デフォルトの名無しさん
2008/11/14(金) 21:34:210986デフォルトの名無しさん
2008/11/14(金) 21:49:38それはどういう意味なのか教えていただけませんか?
0987デフォルトの名無しさん
2008/11/14(金) 21:51:08どう書いたら動きますか?
struct feature **features = new struct feature*[CATEGORY];
for(i = 0; i < CATEGORY; i++) features[i] = new struct feature[CANDIDATES];
0988デフォルトの名無しさん
2008/11/14(金) 21:52:330989デフォルトの名無しさん
2008/11/14(金) 21:59:18unsigned 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*>をつけるのか不思議です。
0990デフォルトの名無しさん
2008/11/14(金) 22:02:11いやまあ今でも>>989みたいな書き方はできるよもちろん。
http://ml.tietew.jp/cppll/cppll/article/1071
0991デフォルトの名無しさん
2008/11/14(金) 22:11:24ありがとうございます。やっぱり出来るんですか、メモメモ
新しいのは、後ろじゃなく前のほうを略すですか。
0992989
2008/11/14(金) 23:33:43これで、ポインタ間変換以外はエラーで且つ、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 () { ... }
0993デフォルトの名無しさん
2008/11/14(金) 23:37:14operator int(){...}
とかのテンプレート版。
0994989
2008/11/14(金) 23:54:02auto_cast_type(T* x) : value(x) {} は
auto_cast_type(T* x) { value = static_cast<void*>(x); }
が良いですか?
>>993
つまり U u =(U)自分; の変換法を記しているですか
0995デフォルトの名無しさん
2008/11/15(土) 06:04:18初期化リストで書けるものは初期化リストで書く
auto_cast_type(T* x) : value(static_cast<void*>(x)) {}
まあvoid*へは暗黙変換できるんだしなくてもいいと思うが
0996デフォルトの名無しさん
2008/11/15(土) 20:50:060997デフォルトの名無しさん
2008/11/15(土) 21:09:450998デフォルトの名無しさん
2008/11/15(土) 21:15:54・newした時の型の、仮想デストラクタを持つ基底クラスへのポインタ
の時だけかな
0999デフォルトの名無しさん
2008/11/15(土) 21:48:31/ _ -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 .:|
1000デフォルトの名無しさん
2008/11/15(土) 21:52:33_,,-'''´ `'-,,
/ `ヽ
/ \
. / ヽ
/ ヘ
/. 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 `''-,,,,___,,,,-'' /
. \ ,,-''
`''- ,,_ _,, -'''´
 ̄''''''''''''''' ̄
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。