1 :
v(^・^)v :
03/09/05 00:51 C++に関する質問はこちらへどうぞ。
ただし質問の前にFAQに一通り目を通してください。
また、テンプレートライブラリ(STL含む)に関する質問は
専用の別スレへどうぞ。
過去スレ、関連スレ、関連リンクなどはこちら
>>2-77
2 :
v(^・^)v :03/09/05 00:51
3 :
v(^・^)v :03/09/05 00:52
おう、乙。でも前スレageたのはよくないね!
5 :
v(^・^)v :03/09/05 00:53
6 :
v(^・^)v :03/09/05 00:54
7 :
v(^・^)v :03/09/05 01:00
8 :
v(^・^)v :03/09/05 01:01
9 :
v(^・^)v :03/09/05 01:11
10 :
デフォルトの名無しさん :03/09/05 01:11
完了〜 連投規制イクナイ!
v(^・^)v ↑何すか?これ
>>12 そういや以前別の顔文字にしようって案があったような
c(+_+)
c(*p p)
あ、書いてから分かった
>>15 はそういう意味か
わいの完敗や
>>1 乙。
でも 2ch の boost スレって、もう無いよね。
VC++7.1、とうとうboostのRegression testsで PPass100%(warning 0), Fail0%(0)達成か。
>>18 templateスレに統合したんじゃなかったっけ?
typedef struct { int a } hoge_t; // ソース内 { hoge_t h; if( h ) cout << "hit" << endl; } のように if( h ) を適応させるには どうすればいいのでしょうか? (オーバーロードする演算子は何か?) 現在は bool operator!=( hoge_t a ); で演算子を定義してますが、 if( h != NULL ) となっています。
ミスを訂正 >現在は >bool operator!=( hoge_t a ); で演算子を定義してますが、 >if( h != NULL ) となっています。 bool operator!=( hoge_t a, int val ); でした。
>>21 基本はoperator bool();だが、整数への暗黙のキャストを排除したいなら
関数ポインタへのキャスト演算子を使う。
>>23 参考書は 一通り目を通したのですが、operator bool() については
書かれていなかったので、ググってみます。
ありがとうございました。
bool operator!=( hoge_t &a int val ) ← & が抜けてました。
整数の暗黙のキャストですが、
#define NULL 0 を利用しただけで、特にキャストの意図はないです。
>>24 operator boolつーかキャスト演算子だな。
整数型への変換云々つーのはboolへのキャスト演算子が定義されてると
{
Hoge moge;
int hage = moge;
}
みたいのなのが通ってしまうつー話。
>>25 なるほど、副作用もあるのですね。
修行が足りてませんでした。
てっきり
bool operator!=( hoge_t &a, int val ) {
if( obj.a == val )
return false;
return true;
}
まで 見透かされてると思った次第です。
どっちにしろ 話がかみ合ってませんね^^;
もう少し詳しい参考書を購入します。
関数ポインタへのキャスト演算子とブール代数へのキャスト演算子を 定義したクラスだと、operator [] を定義できなくならない? class ClassA { operator FuncPtr() const; ValueType operator []( int index ); }; ClassA objA; ClassA::ValueType val = objA[1]; // operator[] が特定できない?
う(汗。ClassA 修正。 class ClassA { ... public: operator FuncPtr() const; ValueType operator []( int index ); };
29 :
デフォルトの名無しさん :03/09/06 12:28
クラスの宣言の中のメンバ関数なんですけど、 inline をつけなくても問題ないですか?
ないです。
>>29 そうですよね。そんな気がしてました。
ありがとうございます。
inline化したくないときはどうすればいいんだろ?
って、普通に宣言すればいいだけか
>>28 publicかprivateかは作用対象の解釈には影響ない。
よって
>>27 のままでも質問としては成り立っている。
ところで、objA[1]という式の解釈にはどんな候補があると言いたいんだ?
objA.operator[](1)
までなら解るが
objA.operator bool()[1]
objA.operator Funcptr()[1]
はないだろ?
>>28 の質問の意図がサッパリわからん。
そんな変な演算子オーバーライドしたらソース読めなくなるぞ。
しかも[]で返すべきはリファレンスだろ。
> operator [] を定義できなくならない? こんなの、やってみれば解決だろ。放置一択。
38 :
デフォルトの名無しさん :03/09/06 13:47
39 :
デフォルトの名無しさん :03/09/06 14:02
便乗で質問です。 operatorってvirtualにできるんですか?
> operatorってvirtualにできるんですか? こんなの、やってみれば解決だろ。放置一択。
こんなの、やってみれば解決だろ。放置一択。
こんなの、やってみれば解決だろ。放置一択。
43 :
デフォルトの名無しさん :03/09/06 15:12
なんで(void*)0;はだめなんだろう
そんなの、やってみれば解決だろ。放置一択。
日下部ポインターなんて過去の遺物さ。
47 :
デフォルトの名無しさん :03/09/06 15:25
>>44 'void *' から 'char *' に変換することはできません。
と出ました
これだけだとわかりません
詳しく教えてください
C++ではvoid*はジェネリックなポインタじゃないのさ。 アブノーマルなポインタなのさ。
>>47 void* vp = 12345;
char* cp = 0;
cp = (char*)vp
>>47 ダウンキャストが暗黙にはできないのと基本的には同じことだ。
そのポインタが指し示す先にchar型オブジェクトがあることを
コンパイラは勝手には仮定しない。
C++の標準関数で、同じ符号か、異符号かを返す関数ありませんか? 関数にするとこんな感じだと思うのですが。 bool func (int a, int b) { return ((a>=0 && b>=0))|| ((a < 0 )&&< (b < 0)) ? true : false; }
>>51 標準関数は知らないが、
return (a >= 0) == (b >= 0);
でいいのか?
それとも、
return a * b >= 0;
か?
inline bool same_sign(int x,int y){return(x<0)?(y<0):!(y<0);}
引数に0があった場合の結果はどうなればいいんだろう?
>>52-54 ありがとうございます。
関数テンプレートにして使わせていただきます。
0が来た場合は正で処理するつもりです。
>51 最上位ビットが符号ビットで処理系に限って、 (a ^ b) >= 0
条件を変更。 「符号ビットが存在する処理系に限って」 (a ^ b) >= 0
>>57 符号ビットが0のとき>=0を表すという条件も必要だな。
59 :
デフォルトの名無しさん :03/09/07 00:15
論理XORって inline bool exclusive_or(bool x,bool y){return x?!y:y;} こんな関数つくんないとダメ? 演算子だけで綺麗に書ける?
>>60 それが
>>59 にくらべて優れたコードを生成するかどうかは結局CPU依存だから、
コンパイラが実装できるように言語仕様に含まれるべきではないかと思います。
bool operator ^^ (bool,bool);
とか。
うぉ?漏れ、なんかヘンなこと逝ってるのか?
x != y; って言語仕様に含まれてないの?
(mona == giko) != (sine == wara) 確かにキモいぞ
!=を論理XORの代わりにするには両方をboolにキャストする必要があります。 なので、あんまり綺麗には書けなかったりします。
てか,
>>27 に対する結論は結局何だったんすか? コンパイラのバグ?
VC++5.0 でも gcc 3.2 でも問題なかったけど
>>68 キャストせんでも使える。ちゃんと試してから反論しろよ厨房。
ていうかbool型以外に論理XORなんか適用するなよ。
operatorだの暗黙変換は 主観の産物って知ってた?
>>71 たとえば LessThanComparable の要件では、式 a < b の型は
bool ではなく、"convertible to bool" となっている。
これを != で比較しても論理XORの意味になるとは限らない。
似たような話で、Cのライブラリ関数 isupper を使って
isupper(a) != isupper(b) と書いても
論理XORを実装したことにはならない。
> ていうかbool型以外に論理XORなんか適用するなよ
論理値に比較演算子はよいと申すか?
潔癖性?
>>74 うるせータコ
!!a!=!!b
これでも使ってろ
!a != !bで十分だろ
>>76 !isupper(a) != !isupper(b)でも
59が求める論理XORをもつ言語って何があるのかな。
違った a xor b
81 :
デフォルトの名無しさん :03/09/07 05:32
にこにこ顔に見えるから
確かにデバッグ中にそんな顔が見えたらムカつくな
for (; ;)//~~~
while(T_T)
86 :
デフォルトの名無しさん :03/09/07 14:50
GoF本に気になる記述があったので、ちと疑問がわいたのですが、 さぁって、privateメンバ関数を公開しちゃうぞー、ええと… friend Aには、このメソッドのみ公開 friend Bには、同クラスのこのメソッドのみ公開 なんて振り分けはできませんよね?
出来ない。
>>87 ですよねぇ、GoFめ…ちょっと期待しちゃいましたよ
レスサンクスです
>>86 friend class のことじゃないかな?
まぁそれでも意味不明だが
>>86 GoF今手元にないので、ちょっとずらして
相手ごとに一部を公開するにはって話として。
class Hoge {
private:
void ForA();
class HogeForA {
Hoge& hoge;
private:
HogeForA(Hoge& h):hoge(h) {}
void ForA() { h.ForA(); }
friend class A;
};
public:
HogeForA& FromA() { return HogeForA(*this); }
...
};
のように相手ごとにproxyとしてインナークラス作って
そちらにfriendつけてやるってことは出来るよね。
(hoge.FromA().ForA(); みたいに使う)
こんなC++はいやだ int n; cin(n); cout("こんにちは") (n) (0.123) (0xfffff); coutのストリーム入出力がoperator ()で実装されている
>>91 読みやすいですね。
cout にも括弧をつけるとなお良し。
今某サイトのC++初心者講座を読んでいたのですが、 ビット演算のところでその難しさにぶつかりました。 一応基本的な意味は理解したつもりなのですが、 上手くプログラムの中に組みこめるかと言われたらたぶん無理っぽいです。 実際にビット演算ってどのように使うのでしょうか? ビット演算の応用というか実用例などを教えてもらえませんか?
環境で用意されるフラグの処理に必要なこともあるが 基本的にはわざわざ使わなくていいよ
>>94 おまい59じゃないだろうな
てか2進数勉強しなはれ
必要だから使うのであって、必要でないところに使う必要は無い。
>>94 例えば非同期ファイルI/OしようとするとOS固有のシステムコールを使うことになるが、
そのときオープンモードやシェリングモードの指定にビット演算をよく使う。
組み込みではICにコマンドを送るときにデータバスのmona番をH、giko番をLにする
てなパターンがよく出てくる。
どーせ最適化されてるよ♥ とタカをくくってたある日、なんか遅いんで
コンパイル結果のアセンブラ見たら16で割ってやがったなんてこともよくある。
try{ char *p = NULL; printf("\s", p); }catch(...){ for(; ;)//~~~ printf("ぬるぽ"); }
応用は上級者の領域っぽいですね。正直言って難しいです。
今読んでいる講座にあった、
「44は44、81は84、というように、その数以上の4の倍数のうち最も小さい数を求める式を作って下さい。」
と言う問題の解答が、「(x + 3) & ~3」
なんとなく意味はわかるのですが、自分でこういう物を発想するのは難しいですね。
勉強して行けばこういう物も自力で考え出せる様になるのでしょうか?
既に才能が無いと思って諦めるべき?
>>96 59ではないです。2進数も一応分かってますよ。
>>100 加算器とかの仕組み勉強していじくりまわすとイメージしやすくなるかも。
あとはモノクロのグラフィック処理を行うときにはイメージが必要になってたけど
最近そんな用事あんまりないか?
>>94 >「(x + 3) & ~3」
コンパイル通らんぞ・・・
スマン ^ じゃなく~だな
OH 俺もタイポか・・・逝ってくる
上の
>>103 は俺な
103は私ではありません。
>>101 加算器ぐぐって勉強してみます。
解説には、ビットマップを扱う時に必要になる実用ルーチンだと書いてありました。
良く意味はわかりませんが、
色々やろうとするとこういうビット演算の修得も必要とされるみたいですね。
頑張れる所まで頑張ってみます。
>>105 タイ━━━||Φ|(|´|゚|ω|゚|`)|Φ||━━━ポ!!!
108 :
デフォルトの名無しさん :03/09/07 20:54
初心者質問ですがよいですか? クラスのpublic:の中に hogehoge() : known1(""),known2(""),known3(""),unknown1(""),unknown2(""){munyamunya();} といった記述があったのですが、このように関数の後にコロン一つで 区切って複数の関数名?を並べているのはどういう意味があるので しょうか?本見てもそれっぽい記述が見つからないものですから・・・ すいません。
>108 調べるべきキーワードは「コンストラクタ」、「初期化」。
111 :
デフォルトの名無しさん :03/09/07 21:08
お二方、ありがとうございます
int& a; int &a; 皆さんはどっち派ですか?
>>112 どっちでもいいから
このスレで意味無し論争を巻き起こそうとか思わないでくれ
スレ違いだ
RType f(T v); の実体(定義)としてコンパイラが RType f(const T v) {....} を使うのは仕様で決まっているのですか?
int* p; int *p;
#include <stdio.h> int hage(int i); int main() { hage(0); return 0; } /* オーバーロードに非ず。int hage(int i) の定義なり。*/ int hage(const int i) { printf("%s\n", "禿はドキュン"); }
>>118 foo(int);
foo(const int);
がそれぞれ定義できるとして
それらをどうやって呼び分けることができると思ってんの?
>>144 v=vができなくなるわけか。そいつは初耳だな
>>144 いや、そのクラスの構造は美しくないと思うよ。
基本的にソースってのは書きやすさ(タイプ数の少なさ)より
読みやすさを優先すべきだし。
あと、細かいことだけど、その場合mutableを使うより
constをつけない方がいいんじゃないかな。
>>123 ここは mutable を使うべきだろ・・・と思うが好みの問題?
127 :
デフォルトの名無しさん :03/09/08 03:04
バッファ管理をuint8_tなvectorでやるのってあり?
あり
129 :
デフォルトの名無しさん :03/09/08 16:53
Cで手軽にエラーチェックといえばassertですが、 C++にも、C++らしいassertみたいなものは、あるのでしょうか?
>>129 Cと同様assertしかない。
例外投げるAssertとTraceクラス自前で作って使ってる。
>>130 レスありがとうございます。
当分はassertを使い、いずれ私も自前にチャレンジしてみます。
気になると先に進まないもので…助かりました。
あーあ・・・
うちのC++は獰猛で困っています。
136 :
デフォルトの名無しさん :03/09/08 21:35
C++ってなんですか?おしえてください。
私のC++は狂暴です。
マクロやだ。やっぱC++用のスコープが効く仕掛けがホスイ。
namespace + inline でFA
call by nameをサポートしたC++がホシゥィ
>>136 C++=チンプラプラ
まぁ大体の意味はこんな感じ。
>>140 ならC++なんて使うな。
Objective-Cでも使ってろ
C++を勉強している工房です。 AというクラスとBというクラスがあるとして、 それぞれが、それぞれを参照するのはC++的にOKなんでしょうか? 例: class A{ public: B m_b; } class B{ public: A m_a; } 友達に聞いた話だと、上のような場合、相互参照といってC++的によくないとかなんとか聞いたんですけど・・・ コンパイルは通るみたいなんですけど、どうなんでしょ?
C++的にはOKだが、設計としてよくない。
>>143 参照もしくはポインタならいいが、それは不可だ。
>>143 コンパイルはできても実行不可能な気が・・
>>144 C++的にも無理な気が・・・
Aの中にBの実体入ってるし、Bの中にAの実態入ってるよ。
ポインタとかにしてAやBの外部に出さないと・・・
構造的によくないのは同意。
>コンパイルは通るみたいなんですけど ほぅ コンパイラは何をご使用でしょうか?
コンパイルすら通らない気がするんだが。。。 コンパイルが通るって友達に聞いた話なら、騙されてないか?
教科書的な+演算子のオーバーロードです。 class Uint64 { int var; public: Uint64(int i) : var(i) {} }; Uint64 operator+(const Uint64& lhs, const Uint64& rhs) { Uint64 tmp(lhs); return tmp; } int main() { Uint64 u = 1; u = 2 + u; u = u + 3; }
これをテンプレート化すると、うまくいきません。 template <typename T> class UINT { T var; public: UINT(int i) : var(i) {} }; template <typename T> T operator+(const T& lhs, const T& rhs) { T tmp(lhs); return tmp; } typedef UINT<int>Uint64; int main() { Uint64 u = 1; u = 2 + u; u = u + 3; } エラー!
回避法は下記以外にスマートな方法がありますでしょうか? template <typename T> class UINT { T var; public: UINT(int i) : var(i) {} UINT operator+(const T& rhs){ T tmp(rhs); return tmp; } }; template <typename T> T operator+(int lhs, const T& rhs) { T tmp(lhs); return tmp; } typedef UINT<int>Uint64; int main() { Uint64 u = 1; u = 2 + u; u = u + 3; }
template <typename T> class UINT { T var; public: UINT(int i) : var(i) {} }; template <typename T> UINT<T> operator+(const UINT<T>& lhs, const UINT<T>& rhs) { UINT<T> tmp(lhs); return tmp; } こーじゃねーの?
template <typename T, typename U> T operator+(const T& lhs, const U& rhs) { T tmp(lhs); return tmp; }
>>154 ご回答ありがとうございます。
が、残念ながらそれでは状況は変わりませんです。
158 :
デフォルトの名無しさん :03/09/10 00:10
>>144 便乗ですが、やっぱり互いに知ってる状態が
出てくるようだと、設計として駄目なのでしょうか?
今自分のソース見たらそんなのばかりで…。
依存はなるべく少なくしようとは思ってるのですが、どうにも。
>>151-157 1: operator+ でなく operator+=( UINT<T> ) を定義して、
2: boost::addable で UINT<T>+UINT<T>, UINT<T>+T, T+UINT<T> を自動生成
UINTをimmutableにしたいってんだとツラいけど。
>>157 template <typename T> class UINT {
T var;
public:
UINT(int i) : var(i) {}
friend UINT<T> operator+(const UINT<T>& lhs, const UINT<T>& rhs)
{
UINT<T> tmp(lhs);
return tmp;
}
};
u = (Uint64)2 + u; u = u + (Uint64)3;
>>160 ありがとうございます!!
感激、感動、完動です。
friend関数のインライン展開??
実際にはreturnの前に
tmp += rhs;
を書くだけでOKですから、使えますね。
template <typename T> class UINT { T var; public: UINT(int i) : var(i) {} friend UINT operator+(const UINT& lhs, const UINT& rhs) { return UINT(lhs) += rhs; } };
>>163 おお、シェイプアップされてる!!
return文の一行とは素晴らしいです。ありがとうございます。
ちなみに提示した例ではOKですが、実際のプログラムでは、<T>の省略はダメでした。
実は
typedef unsigned intUINT32;
typedef UINT< UINT32 >UINT64;
typedef UINT< UINT64 >UINT128;
typedef UINT< UINT128 >UINT256;
なんてことして使うんですよ。もちろん学習&遊び用に作ったんですけどね。
すいません、気になりますが限界で…寝ます
166 :
デフォルトの名無しさん :03/09/10 06:33
168 :
デフォルトの名無しさん :03/09/10 11:45
169 :
デフォルトの名無しさん :03/09/10 13:38
a = 0のとき、 c = d + e; a = 1のとき、 c = 2 * d + e; ・・・ a = 255のとき c = d * (d + e); のように、aの値によって、cに入れたい式が非規則的に変わります。 if 文や switch 文でずらずら書くのを使用せずに、 早い速度でこれを行いたいのですが、うまい方法はないでしょうか? テーブルみたいなのを使用したいのですが、 値に式を持たせるのがわかりません。
170 :
デフォルトの名無しさん :03/09/10 13:55
172 :
デフォルトの名無しさん :03/09/10 14:08
boost::fsmで実装する
>>170 ネタだが。
>>169 速くてうまい方法などない。
単に字面が気に入らないだけなら
#define begin_eval() switch(a){
#define eval(n, exp) case n: c = exp; break;
#define end_eval() }
とでもやっておけ。激しくキモいが
174 :
デフォルトの名無しさん :03/09/10 15:05
inline int get_value() { return value; } のような、インライン指定した関数があったとして、 他の関数に 関数ポインタとして get_value を渡した場合、 1. get_value 関数が作成され、インライン展開されない 2. get_value 関数が作成されるものの、直接呼び出している 部分ではインライン展開される。 一般的なコンパイラはどういう処理をするのですか?
175 :
デフォルトの名無しさん :03/09/10 15:10
2
176 :
デフォルトの名無しさん :03/09/10 15:21
>>170 templateではコンパイル時にaの値が確定している必要があるし。。。むむむ
>169 実行速度という観点ならswitchが一番まともなコードを吐くコンパイラが多いと思う。 どうしてもってならこんな感じだが、いずれにせよ列挙しなきゃならないのは変わりないし、 switchと等速かそれより遅くなると思う。 int case_0(int d, int e) { return d + e; } int case_1(int d, int e) { return 2*d + e; } : int case_255(int d, int e) { return d*(d + e); } int (* funcTable[])(int, int) = { case_0, case_1, ..., case_255 }; c = funcTable[a](6, 4); まあ式は非規則的だけど、aの取りうる値より式の種類が少ないならswitchより 多少みてくれはいいかもしらんがね。
関数オブジェクトをテーブルで持ってみた。 関数ポインタよりインライン展開される分ましなはず。 ただしコンパイラを選ぶし実行速度も測ってない。 とりあえずCygwin GCC 3.2で動いた。 #include <iostream> #include <boost/function.hpp> template<int n> struct fn {}; struct fn<0> { int operator() (int d, int e) { return d + e; } }; struct fn<1> { int operator() (int d, int e) { return 2 * d + e; } }; struct fn<2> { int operator() (int d, int e) { return d * (d + e); } }; boost::function<int(int, int)> table[] = { fn<0>(), fn<1>(), fn<2>() }; int main (int argc, char** argv) { for (int i = 0; i < 3; ++i) { std::cout << table[i](5, 7) << std::endl; } }
>>169 普通にswitchで囲った方がいいんでない。
template<int N>
inline int DispachFunc(int d,int e);
class Nothing{};
int Selectfunc(int a,int d,int e)
{
int temp;
switch(a){
case 0:
temp = DispachFunc<0>(d,e); break;
case 1:
temp = DispachFunc<1>(d,e); break;
case 2:
temp = DispachFunc<2>(d,e); break;
default:
throw Nothing();
}
return temp;
}
180 :
デフォルトの名無しさん :03/09/10 17:29
問題やってもらえませんか? 1.要素が3つある整数型の配列 A[3] をプログラムの中で初期化( {3,5,7} )し、その配列と文字列 "TEST" を、ダイナミックアロケーションによって確保されたメモリへ格納する。何かキーを押されたら、プログラムを終了する。 2.次に示すような文字列の配列データを順にスタックへ格納し、取り出すプログラム。コマンドは、 "i" で格納、 "o" で出力、 "e" で終了とし、スタックを操作する際扱った文字列を画面に出力する。上下限を超えたらメッセージを出力し、エラー処理を行なう。 char *w[7]; w[0] = "Monday"; w[1] = "Tuesday"; w[2] = "Wednesday"; w[3] = "Thursday"; w[4] = "Friday"; w[5] = "Saturday"; w[6] = "Sunday";
>>180 宿題スレに書いたあとで、ここにも書くのかよ、いい度胸だな。
183 :
デフォルトの名無しさん :03/09/10 17:39
181のような煽りはスルーします。
いろいろ案をありがとうございます。
もともとはswitchでやっていたところでしたが、
>>177 の方法にしたら9割程度の速さになりました。
>>178 は私には理解不能でした。
>>181 1番だけな
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(){
int A[3]={3,5,7};
int *pt_i;
char *pt_c;
pt_i = (int *)malloc(sizeof(int)*4);
pt_c = (char *)malloc(sizeof(char)*5);
pt_i=A;
strcpy(pt_c,"TEST");
free(pt_i);
free(pt_c);
}
sizeof(char)キターーーーーーーーーーーーーーーーーーーーーーーーーーーーーッ!!
188 :
デフォルトの名無しさん :03/09/10 18:35
>>178 の方法は関数オブジェクトのインライン展開を利用したもので、
コンパイル時に<>内のパラメータが確定していればcall命令は生成
されないはず。
但しfor文を展開するなどの面倒な仕事をコンパイラがしなくてはいけ
ないし、いつもfor文とは限らない。
>>186 180のレベルにお似合いの低脳なソース。めでてえな。
charのサイズは固定です。
ID無しっておもろいな
ここは「C++相談室」です。 <stdio.h>な方、 mallocな方、strcpy()な方はお帰りください。
>>188 > コンパイル時に<>内のパラメータが確定していればcall命令は生成
> されないはず。
確定してないとコンパイル通らないし。
> 但しfor文を展開するなどの面倒な仕事をコンパイラがしなくてはいけ
> ないし、いつもfor文とは限らない。
たまたま実行例をforで書いただけで、テクニック自体はforは無関係。
それよかboost::functionのオーバーヘッドが気になるところ。
191==186
今度コンパイラをvisual c++に変えようとおもうのですが インストールの時に表示されるプロダクトIDには何と入力すればいいですか?
CDだかケースだかに書いてあるIDだよ。
探しましたが、書いてなかったんです。
199 :
デフォルトの名無しさん :03/09/10 20:26
ケースにシールが貼ってあるはずなんですが...
>>193 > それよかboost::functionのオーバーヘッドが気になるところ。
渡してるのが stateless_function_obj なので仮想関数不要で、
function::operator() ← inline展開を期待
(*function.invoker)()
fn<n>::operator() ← inline展開を期待
関数ポインタcall一発になるはず。うまく行けば。
ヨドバシ逝って製品版買って来い。大体すれ違い。
すいませんでした。
>>200 ども。関数ポインタテーブルとコスト的には変わらない様ですね。
fn<0> と fn<1> は別な型なのに無理矢理押し込めてる所為で、
boost::functionが何かやってるとおもったら、案の定。
>>204 今時こんな部落らで落ちるPCってあるのか?
>>205 「空き缶☆」は明らかに割れ厨だろ?
漏れは204はURLで透明アボーンになってて気づかなかったが。
>>186 は、よくも堂々と大間違いを書き込めるな。
eejan
>>175 なるほど。
コンパイラって結構賢いんですね。
ありがとう
コンパイラはなんていうかネ申
クラスのオーバーロードで定義した後置++が そのクラスが参照される前に呼び出されてるみたいなのですが これは仕様でしょうか? Var a(10); printf("%d\n", a++ + 1); ・・・ 12
自己解決しました。忘れてください。
前スレでお世話になったものです。 で、今回ちと compiler の bugっぽいものを発見したんだけど、 もしかして仕様の versionによる違いかなあ、とか思ったので 教えてくれろ。 問題は: class hoge { typedef enum {tako, ika} uni; struct huga {uni a; int b}; : }; となってるクラス定義がエラーになってしまうことです。 正確には hugaの行で "uniに accessするのはまかりならん" というような errorがでます。 compilerの bugやんけ、といいたいんですがなんか理由があったりするの かしらん? ちなみに VC++や GNU C++では通してくれました。
>>214 そのコンパイラが正しい。
11.8 -1-
"The members of a nested class have no special access to members of an enclosing class,
nor to classes or functions that have granted friendship to an enclosing class;
the usual access rules shall be obeyed.
The members of an enclosing class have no special access to members of a nested class;
the usual access rules shall be obeyed."
MSVC5.0なのですが、変数内の文字列置換はどうやってするのでしょうか? 教えて頂けると光栄です。
VC5.0ではできない。VC7.1ならできる。
219 :
デフォルトの名無しさん :03/09/12 15:53
質問です。 下のHogeクラスの内部構造体 Dataの set関数をクラス定義の外に書くにはどうすればいいでしょうか? set関数は、 引数_a を メンバー変数 a に代入する関数です。 class Hoge { public: struct Data { void set( int _a ); int a; }; };
220 :
デフォルトの名無しさん :03/09/12 16:02
>>219 void Hoge::Data::set(int _a)
221 :
デフォルトの名無しさん :03/09/12 17:48
template<typename T> class A{ long method(){ if( T = long){ ... }else if(T= float){ ... }else{ ... } } みたいな感じで 特定の型の時だけ、分岐したいのですが どうすればいいのでしょうか?
222 :
デフォルトの名無しさん :03/09/12 17:48
==でした
>>221 実行時に分岐したいならtypeidでできるかも
無駄としか思えないが
>>221 #include <iostream>
template <typename T> class A
{
public:
long method();
};
template <typename T> long A<T>::method()
{
return 0;
}
template <> long A<long>::method()
{
return 1;
}
int main()
{
std::cout << A<char>().method() << A<long>().method() << '\n';
}
これコンパイル通ったんだけど(VC7)、標準に準拠してる?<規格博士
>>221 特殊化するのが面倒ならば、
template< typename L, typename R >
struct comp_type{ enum{ value = false }; };
template< typename T >
struct comp_type< T, T >{ enum value = true }; };
を使ってみるとか。
モダンC++デザインの本に載ってた うらお2の本にもヒントのってた なんとなくわかった。 ありがd
>>215 バグともいいきれんのですね。むーん。
バグだとしてもすぐ直る訳はないので、
uniを外に出したりしてごまかすしかないのですが。
そんなことより、1よ、ちょっと聞いてくれよ。愚痴だけど。
今日は templateの instantiationではまってドキュメント
読むのに1日費やしちゃったよ。
結局 compile optionひとつつけて回避できたけど。
まあ、勉強にはなったけどな。そこらへん、実践的に
書いてある本でも読んでみるか。
232 :
デフォルトの名無しさん :03/09/13 01:14
class ってさ 宣言すると勝手にメソッド作られるだろ コピーコンストラクタとか operator= とか その他いろいろ。 それを全部知りたいのですが、 サンプルのソースか何か 掲載しているページでもいいです。 教えてください。
233 :
デフォルトの名無しさん :03/09/13 01:18
・からすが異常な時間に鳴く ・雲が地震雲と一致 ・ゴキブリの大移動 ・雷が雲の上に突き抜けたらしい・・ ・最近動物がうるさい ・FM波が大量発生 よって2辺とその間の角が等しいので 95%の確率で だ い じ し ん の予感・・ コピペしてチョ
・からすが異常な時間に鳴く ・雲が地震雲と一致 ・ゴキブリの大移動 ・雷が雲の上に突き抜けたらしい・・ ・最近動物がうるさい ・FM波が大量発生 よって2辺とその間の角が等しいので 95%の確率で だ い じ し ん の予感・・ コピペしてチョ
>>232 「ワンポイント・レッスン 最新Windowsプログラミングテクニック」の719ページを見れ。
>>235 ,236
いや、
大体知ってるんだよ。
でも、書くのめんどくさいんだよ
コピペさせてくれよ
>>237 知識はお金に換算できる。それを無料で教えてくれくれ君は基本的に
逝ってよし。
borlandC++のC++講座のHP無い?ほとんどがVC++の講座で困ってる。
すれちがい
borlandに拘っている理由による 単に無料だからって理由なら虫よすぎ
ちょっとC++をかじってみる程度だからフリーコンパイラ選んだんだが やっぱり金払ってVCをやるべき?
C++の雰囲気を感じたい程度ならVCなんぞいらんだろ。
雰囲気って言ってもなぁ。 使う側からすればC++はマスターしてる度合いで全然違う言語と化すぞ。
ジサクジエーンの宣伝
CustomVertex vertices[] = { { -1.0f,-1.0f, 0.0f, 0xffff0000, }, { 1.0f,-1.0f, 0.0f, 0xff00ffff, }, { 0.0f, 1.0f, 0.0f, 0xffffffff, }, }; HRESULT hr = d3ddev_->CreateVertexBuffer( 3*sizeof(CustomVertex),0, D3DFVF_XYZ | D3DFVF_DIFFUSE, D3DPOOL_DEFAULT, &d3dvb_, NULL); 3*sizeof(CustomVertex)がカッコ悪いので sizeofだけで済ませたいのですが、どうすれば配列の要素数が分かりますか?
>>249 sizeof(vertices)/sizeof(CustomVertex)
>>249 template<class T,int N> int alen(T (&)[N]){return N;}
alen(vertices);
C++の本を買おうと思うんだけどお勧めの本とかあったら教えて欲しいです。 ちなみに、自分はほぼ完全な初心者です。 ネットで基本的な事は大体調べましたが、 意味がちゃんと理解出来てるか怪しいレベルです。
>>252 まず英語を読める環境(自分も含めて)を整えて、規格書とboostドキュメントへgo。
本など要らぬ。
いやいや「相談室」の名にふさわしい相談だ
仕切りたがる奴がいるな
はぁ、ちょっと疲れたな・・・
>>252 >意味がちゃんと理解出来てるか怪しいレベルです。
ライバルを探せ。これ最強。
MSDNライブラリのオンラインヘルプを一括ダウソするソフトって需要ある?
Nothing
欲しい。クレ
>>265 作っていただけませんか?
できればフリーで。
ダウンロードしたものをクレ
C言語で文字列を解析する関数を作りたいんですけど、 char同士の代入のあたりでコアダンプしてしまいます。 どうすればいいか教えていただけませんか? $ cat whyerror.c #include <stdio.h> #include <stdlib.h> int test(char ** string_ptr, char * string) { int len = 0; *string_ptr = (char *)malloc(sizeof(char)); while (*string) { printf("%d: %c\n", ++len, *string++); *string_ptr = (char *)realloc(*string_ptr, sizeof(char) * (len + 1)); **string_ptr++ = *string++; /* ??? */ } **string_ptr = '\0'; return 0; } int main(void) { char * string; char * result; string = "this is test!"; test(&result, string); printf("result: %s\n", result); return 0; } $ gcc whyerror.c -Wall; ./a.exe 1: t 2: i Segmentation fault (core dumped)
>>269 スレタイ255回読み直してから出直してこい
>>270 ご、ごめんなさい。。。
ぜんぜん気付きませんでした。
逝ってきます。
>>270 がいいこと逝った。
文字列の解析とかCではやりたくない罠。
std::string / boost::regex とか使えば早いかも。
>>272 でもそれ以前に、/* ??? */ の一行が間違っていそうな気が
するんですが、何がどう間違っているかが分からないんです。
ポインタの扱い方を勘違いしているのかな?
charにcharってそのまま代入してもいいんですよね?
#どこで聞けばいいのか分からない・・・。
#宿題じゃないけど宿題スレにでも行こうかな。。。
277 :
デフォルトの名無しさん :03/09/19 14:22
あるクラスが継承クラスをコンパイル時に選択できるようなtemplateクラスって作れます?。 template<class T:public CA>class TCA{/**/};←こんなの?
>>277 可能。
どういう効用があるかはModern C++ Design参照。
template <class T, class B> class M : public B とかじゃなくて?
280 :
デフォルトの名無しさん :03/09/19 14:59
モダンですか・・・C++始めて3週間の私にはちょっと難しいですね。 class CA{}; class CB{}; template<class T>class TCA{ class T:public CB{}; }; main(){ TCA<CA> tca;/*じゃあ、こんなのは?*/ }
つーか、別に今すぐ覚えて使おうとせんでもいいと思うんだが。
283 :
デフォルトの名無しさん :03/09/19 15:17
文法的にエラーなのは解るんですが、そうではなくてtemplate引数としてあたえられた型情報に、 コンパイル時に継承クラスを付加できるか?ということなんです。 わかりにくい例ですいませんでした。
>>283 意味わかんないよ。
どういうふうに使いたいのか、使用例を書いてみるのはどうか。
しかし、テンプレートに与えられた型のほうの存在自体を修正するってこと?
だとしたらかなり無理があるが。
285 :
デフォルトの名無しさん :03/09/19 15:27
やっぱ無理そうですね。常識的に考えれば無理があるのは解ってるんですが、C++ぐらい自由度の高い 言語だと何かやりかたがありそうな気がしたんです。 静的な型付けされた型そのものを書き換えるわけにはいきませんよねぇ。 もしできたら、JAVAのObject型の無条件継承とかできるような気がしたんですが。
>>285 なんだか知らんが、勘違いをしているようだぞ。
ほんとうにやりたいことは、たいていできる。
しかし、やり方を間違えればできないものだ。
>>285 無条件継承? どういうことがいいたいのかまだよくわからないや。
template <T: CB> class TCA {
T t;
};
と書いたとき、クラスTCA<T>におけるメンバtの型Tは、
引数として与えられた型をCBの派生に修正して使う、ということ?
例えばここで class CC: public Object { ... }; というクラスがあったとき
TCA<CC> における t の型は
Objectの派生のCCであるだけでなく、さらにCBを派生元とするように
多重継承が追加された新たな型になっていることを期待しているってこと?
継承元にCBが含まれているクラスしかパラメータにすることを許さないとかならできるんだが。
template <typename T,typename Base> class hoge{ template <bool> class type; template <> class type<false>{ public: class type:public T,public Base{}; }; template <> class type<true>{ typedef T type; }; public: type<SUPERSUBCLASS(T,U)>::type t; }; これでHoge<T,Base>::t はBaseから派生してなければBaseを追加で継承したものになるし、そうでなければTそのものになる(Baseから2回派生しない) SUPERSUBCLASSはModern C++ Designかloki参照。
>>type<SUPERSUBCLASS(T,U)>::type t; type<SUPERSUBCLASS(Base,T)>::type t; だ。
>>285 こんなのは
class base{};
template<class T>
class sub : public T
{};
template<
template<class>class TSub,
class T = base>
class Test
{
public :
typedef TSub<T> InStruct;
};
int main()
{
typedef Test<sub>::InStruct MakeStruct;
return 0;
}
うわぁ〜。恥ぅいね。
掲示板を作ろうと思うんだけどC++でも出来る? perlとか言うのじゃないと無理?
>>292 できる。ていうか大抵の言語でできるよ。
294 :
デフォルトの名無しさん :03/09/20 03:59
operator->* ってなんですか?
>>293 thx
頑張ってみるよ。
ちなみに難易度としてはどれくらい?
@2ヶ月くらいで作りたいんだけど。
ちなみにほとんど初心者です。
HSPならシューティング〜RPGまで作れたんだけど
これじゃプラス要素にならないよね・・・_no
>>295 多分2ヶ月じゃ無理だと思う。
出来たとしても使い物にならない予感。
>>296 PHPちょっと調べてみたんだけど、
CGIより速くてサーバ負荷も小さいみたいな事が書かれてたんだけど
でもサーバの1機能として動作する、ってのが気になった。
フリーのHPスペースでPHP置ける所ってあるの?
そういう質問は板違い。
あ、スマソ。専用のスレ探してきます。
正直、なんだこりゃです。 class A { public: int operator->* (int a) // 引数と戻り値はなに? { return 50 + a; } }; #include <iostream> int main() { A a; int n = a->*(10); // いや、なにこれ? std::cout << n; return 0; }
何のために使うかというと、だいたいはスマートポインタ用なわけだよ。 struct A{ int i};として、 スマートポインタ ふつうのポインタ smart_ptr<A> pA(new A); A* pA=new A int A::* pi = &A::i; int A::* pi=&A::i; pA->*pi=40; pA->*pi=40; ~~~こいつが、operator->*
スマートポインタじゃなくて まずメンバ関数へのポインタだろ。
302をうけて、(operator ->* を実装するようなクラスは) だいたいスマートポインタ、という意味ですが。
306 :
デフォルトの名無しさん :03/09/20 10:34
#ifdef __cplusplus extern "C" { ってどういういみですか?
>>307 ネタじゃありません。
ソースの他のプログラムとかはわかるのですが、
そういったところの意味を理解せずにきてました。
C++はCに非ず
条件付コンパイルって奴ですな。 確かに、コンパイルそのものについて書かれている本は少ない。 VC++のプリコンパイルヘッダを見たときは 「何だコイツ、何がしたいんだ?」 と思ってた。 プログラミングのほとんどは独学でできるけど、 やっぱりすぐ得られるリソースは仕事仲間だと思う今日この頃。
追加:
CはC++に非ず
>>306 要するにコンパイラがCかC++かを判断する為
Bjarne Stroustrup って 何て読むんですか
はげ
ワラタ
とても嫌な デスクトップになったので やっぱり、やらなくていいです。
カタカナで教えてください 教えてくれないと 壁紙設定します。
C#って胸キュン? template使えるの? D言語って胸キュン? どんどん言語増やさないでください。 C++より劣ってたら怒ります
>>319 C# は俺的には萌え。
template (のようなもの)は来年に出るバージョン以降つかえるようになる。
D は俺的にはいまいち。
まあ、無理やり萌えれないこともない。
スレ違いにレスすんな
うるせー馬鹿
眠いので、もう寝ますね。 おやすみなさい。
OOの偉い人はみんなみごとなハゲだぞ! ハゲだけじゃ誰が誰だかわからないじゃないか!
偉くなるとハゲるのかー プログラマー辞めます。
ちょっと前だけどよー ザビエル頭の奴が電車にいて ハゲは嫌だなーと思って、なんとなく頭見てたら、 睨まれた。 睨まれたので「何、見とんねん」と言ってやったら、 「外見とるねん」と返された。 返す言葉がなかった。 むかつくので、電車降り際に後ろから膝蹴り居れてやったら。 「おまえ、さっき蹴ったやろ?蹴ったやろ?」 と、ホームで大声で騒ぐの。 「訴えてやる」とか言い出したの。 恥かしいったらありゃしない。 これだから、ハゲは嫌いなんだ。 コンプレックスもちすぎなんだよ。 マイナス思考過ぎるんだよ。 いつも、くだらないこと考えてそうなんだよ。 ちくしょう。 うるさいので、とりあえず、謝りました。 私の負けですか?そうですか。
こんなとこで、つぶやいてるだけと言うことでお前の大負け。
330 :
デフォルトの名無しさん :03/09/21 15:29
初歩的なことなんですが、 ファイル大きさを得る最適なコードを教えてください。 または、ファイルサイズを得なくても、許される限り、ファイルの終わりが来るまで バッファを拡張していきながらファイルから入力するコードを教えてください。 宜しくおねがいします。
>>330 最適の基準による。重視したいのは移植性、それとも 2GB over のファイルへの対応、
あるいは性能か?
>>330 >または、ファイルサイズを得なくても、許される限り、ファイルの終わりが来るまで
>バッファを拡張していきながらファイルから入力するコードを教えてください。
いいのがあるがスレ違いなので回答できない。
UNIXやWindowsなど特定の処理系の板かスレで聞くといい。
ぢゃあ、このスレ的な回答は、 void f(std::istream &i, std::string &s) { while(i){std::getline(i, s); s += '\n'} } ということでよろしいか?
>>334 STLPortのstd::stringは意外に小さいサイズでポッキリ逝っちゃうから
std::ropeを使った方がいいと思う。
336 :
デフォルトの名無しさん :03/09/21 20:21
プログラムを使わない会社っていっぱいあるよな?
ファイルサイズを得たいなら、末尾にfseek()してftell()、2GBを超えそうならfgetpos()でいいんでないの?
>>337 fpos_t の内部表現は実装依存だから、fgetpos() しても、一般的な方法では
そこからファイルサイズを取得できないぞ。
341 :
デフォルトの名無しさん :03/09/21 20:45
342 :
デフォルトの名無しさん :03/09/21 21:15
変な質問ですけど だいたいの人はテキストではなくborlandとかmicrosoftの開発支援ソフト つかってるんですよね?
>>343 windows付属のテキストエディタのみでプログラムを完成させるのが
一般的なのか、作成支援ソフトをつかって作ってるのが主流なのか聞きたいのです。
最低でも秀丸レベルは使ってるだろうなぁ>エディタ
edlin使ってます
ありがとう
>>344 うーん、言葉の定義がアレだが
MicrosoftやBorland, Metrowerksなどは統合開発環境を製品として売り、
コンパイラはその中のパーツでしかないので
それらを買った人は普通統合開発環境で使うが。
コンパイラだけが入手できるものならば(GCCやBCCなど)、
そのほかに自前で調達したエディタなどを使うのが普通。
>>344 開発ターゲットによる。
Windows アプリを C++ で書くなら VC++.net が大多数で、ついで Borland C++ Builder や
Intel C/C++ Compiler などが少数。エディタは統合開発環境のを使う人もいれば、
Vim, Emacs, 秀丸, MIFES とか使ってる人もいる。
Linux や *BSD だと、処理系は gcc が標準。数値計算をやる人は Intel C/C++ Compiler
使ってる人もいるみたい。標準的な統合開発環境がないので、だいたい好きなエディタを
使ってる。
便乗だけどcygwin+KDE+KDevelopとかの人居たりするのかな ちょっと気になって。
C++ BuilderがwxWindowsサポートするみたいだけど…
352 :
デフォルトの名無しさん :03/09/22 01:50
代入演算子って継承されないわりに、オーバロードする時にvirtualつけても コンパイル通るのはなぜですか?
>>353 さぁ、動かしてみないと(^^;
実験してみるか・・・
>>352 > 代入演算子って継承されない
意味不明。
struct B {
void operator=(const B&) { cout << "B" << endl; }
};
struct D : B {};
int main() {
D d1, d2;
d2 = d1;
}
で B と出るはずだが。
356 :
デフォルトの名無しさん :03/09/22 12:37
338 名前:デフォルトの名無しさん 投稿日:2003/09/21(日) 20:22
>>336 は?
は?・・・じゃねぇよカス
>>355 それは違うだろう。
> D d1, d2;
> d2 = d1;
で呼び出しているのはD::operator=(const D&)で
B::operator=(const B&)ではない。
D::operator=(const D&)はBから継承したのではない。
嘘だと思うなら、これをやってみろ。
int main() {
B d1;
D d2;
d2 = d1;
}
359 :
デフォルトの名無しさん :03/09/22 12:57
360 :
デフォルトの名無しさん :03/09/22 17:16
lpXXX->lCount のようなデリファレンス(?)がfor内で繰り返し使用される場合、 LONG lCount2; など変数に値をいれてそれをfor内で用いた方が 実行速度は速くなるのでしょうか?
>>360 誰も答えないね。
答えは、速くなる可能性はある。レジスタ変数に割り当てられたりとかでね。
ところで、デリファレンスって何よ? デリヘルの仲間?
私が聞いてるのは、継承されるかされないかってことじゃなくて、なんでvirtualつけてもいいのかってことなんです。 virtualつけてもコンパイル通るから、代入演算子が継承されると思っちゃう人が出て来るわけで、 かくいう私もそうだったし、そんなリスクを追ってでも許可する理由があるのかなと想像するわけです。
363 :
デフォルトの名無しさん :03/09/22 20:27
>>362 継承とは関係なく、オーバーライドの問題。
virtualありとなしでは違う動作するのはわかるよね?
使い道があるかどうかまでは知らん。
>>362 使い道はあるだろうけど、あんまり意味なさげ。
これに関しては出来ないほうがよかったのかもね。
>>362 virtual付ける事によって
「ああ、ここはオーバーライドするから代入の処理が違うんだー」
と、理解する事ができる。
366 :
デフォルトの名無しさん :03/09/22 20:53
地図を表示するプログラムを教えてください。
#include <iostream.h> int main( int argc, char** argv ){ cout << "地図" << endl; return 1; }
368 :
デフォルトの名無しさん :03/09/22 21:03
>>367 おいおい、ちゃんと教えてやれよ。
#include <iostream>
using namespase std;
int main(){
cout << "地図\n";
}
>>367-368 お前ら何書いてるんだ!!
main(){printf("地図");}
に決まってるじゃねーか
ヘッダファイル?
コンパイラに任せろ
370 :
デフォルトの名無しさん :03/09/22 21:09
┌─────┐ │ │ │ 北海道 │ │ │ ├────┬┘ この地図を表示できるプログラムを教えてください。 │青 森 └┐ ├──┬──┤ │秋田│岩手│ ┌──┐ ├──┼──┼┐ │石川│ │山形│宮城│└┐ ┌──┬──┬──┬┐ ├──┼──┬──┼──┼──┤ └┐ │山口│島根│鳥取│└┐│福井│富山│新潟│群馬│栃木│福島│ ┌──┬──┼┐ ├──┼──┤ └┬──┼──┼──┼──┼──┼──┼──┤ │佐賀│福岡│└┐│広島│岡山│兵庫│京都│滋賀│岐阜│長野│山梨│埼玉│茨城│ ├──┼──┤ └┼──┼──┤ ┌┴─┬┴─┬┴─┬┴─┬┴──┼──┼──┤ │長崎│熊本│大分│愛媛│香川├─┤大阪│奈良│愛知│静岡│神奈川│東京│千葉│ └─┬┴──┼──┼┐ ├──┤ └┬─┴─┬┴─┬┴──┴───┴──┴──┘ │鹿児島│宮崎│└─┤高知│徳島│和歌山│三重│ ┌──┼───┴──┘ └──┴──┴───┴──┘ │沖縄│ └──┘
371 :
デフォルトの名無しさん :03/09/22 21:10
>>369 C++スレなんで、ヘッダーまたはprintfのプロトタイプがないとエラーでコンパイルできないよ・・・
372 :
デフォルトの名無しさん :03/09/22 21:15
ほかの地図でもいいんですが何かいいアイディアありませんか?
ビットマップなり何なりを読んで表示すれば? ビットマップを読むライブラリはその辺に転がってるだろうし、 それを表示するのは簡単じゃん。
#include <iostream> using namespace std; int main(void){ cout << "地図" << endl; return 0; }
375 :
デフォルトの名無しさん :03/09/22 21:21
すいません。それを表示するレベルにも達していないので 表示するプログラムを教えてください。お願いします。
>>375 ・・・・・で、どうしてC++でなんですか?
378 :
デフォルトの名無しさん :03/09/22 21:25
学校の宿題で出てるんです。C++以外ならできますか?
だから宿題スレに逝けと Cの機能拡張版がC++ でC++の機能も気合いと根性があればCで代替できる でもってCのソースをC++って言いながら提出してもたぶん大丈夫 (うわめちゃくちゃな説明・・・)
どんなのでもいいなら 地図を"map.txt"に保存して #include <stdio.h> main(){ FILE* fin; char sTemp[ 4096 ]; fin = fopen( "map.txt", "r" ); while( feof( fin ) ){ fgets( sTemp, 4096, fin ); printf( "%s", sTemp ); } } コレで画面に表示される 制約条件として1行が4095文字(半角)以下である必要があるが
>>378 ほらよ。
#include <fstream>
#include <iostream>
#include <string>
int main()
{
std::fstream is("map.txt");
std::string s;
while (std::getline(is, s))
std::cout << s;
}
>>381 スマソ std::fstream は std::ifstream にしてくれ。
(std::fstreamのままでも動くことは動くが・・・・)
飽くまでテキストにこだわるんだなw まぁでも、地図って言っても実際には画像ファイルを読み込んで表示(出力) することには変わらんだろうから、概念的には一緒か。
でもこんな質問する香具師にgraphicなんか使ったところで質問攻めに合うだけだと思う
なんかさぁ、宿題丸投げする奴って死んで欲しいよね。 できません、わかりませんて言えよ。そして退学しろよ。 他にも人生の選択肢はたくさんあるだろうに。
んー 俺が同じ学校にいるなら商売にするよ? 特に自分が先輩だったらかつてやったことだし楽勝にできるはず コレは1回頼ると頼った奴がどんどん落ちこぼれ、 次も頼らざるを得なくなるという素晴らしい商売
お嫁サンバ
390 :
デフォルトの名無しさん :03/09/23 16:12
>>383 ラスタとベクタも知らない人は黙っててくださいね。
そんな人が 【概念的には】 なんて。
>>392 > エスパーの方ですか?
見りゃわかるだろ
394 :
デフォルトの名無しさん :03/09/23 17:00
>>392 >画像ファイル
↑これだけで十分かと。
ベクタだろうが何だろうが画像を保存してるなら画像ファイルじゃん
396 :
デフォルトの名無しさん :03/09/23 17:18
漏れはいちいちエロ画をラスタファイルとベクタファイルなんていい分けないぞ。 全部まとめてエロ画だろう?
ベクタなエロ画ってどんなのだ?
言われりゃあまりないな。 とりあえずフォントでぬくか?
おまんこの線画
アレだろ? メタファイルってのがベクタ画像なんだろ?
何を答えりゃいいんだ?
まぁ、あれだ少なくとも
>>383 がテキストと画像の違いが
分かってると言うことに1000ドット
ラスタとベクトルの違いが理解できていることに2000ピクセル
>>390 が「ラスタとピクセルというとてもとても難しい事を理解しているのは
自分ぐらいな物だ」と思っている厨であることに10億twip
>>404 ベクトルじゃなくてベクタだったな。
しかもラスタとピクセルっておなじじゃねぇか?
どうやら漏れは理解出来てない方に分類されるらしい。
twip=vb厨
408 :
デフォルトの名無しさん :03/09/23 20:04
#define do { 文・・・ } while(0) こういった場合の、do{}while(0) はなぜ書必要があるんでしょうか?
>>408 #define x {文…}
if(some_cond()) x;
else x;
これがどう展開されるか考えてみよ。
>>408 意味がわかりません。文の所を省かないで、元のまま、
使っているところも提示して、
日本語の文章は抜けがないか確認してからもう一度聞いてください。
411 :
デフォルトの名無しさん :03/09/23 20:18
#define do - while (0) は定期的に話題になるし(Cでは)有名なイディオムなんだが それすら知らない奴ばかりなんて(>409除く) さすが休日だな
>>410 たぶん
#define FOO do { ... } while (/* CONSTCOND */ 0)
だろう。
NetBSD のソースとか読んでると、良く出てくる。理由は
>>409 が言ってるとおり
だけど。
クラスにメンバ関数ポインタの配列をstaticで持たせたいのですが、 ヘッダファイル class Hoge{ public: Hoge(){} age(){} sage(){} typedef void (Hoge::*ActionPtr)(); static ActionPtr Act[2]; }; ソースファイル ActionPtr Hoge::Act[2] = {age, sage}; ってな風にすると型が無いだの再定義などのエラーが出てしまいます。 どうすれば良いのでしょうか?
× age(){} ○ void age(){} × sage(){} ○ void sage(){} × ActionPtr Hoge::Act[2] = {age, sage}; ○ Hoge::ActionPtr Hoge::Act[2] = {&Hoge::age, &Hoge::sage};
>>414 定期的に話題になる有名なイディオムも知らない者だが、結局理由はわからんかった。
本当言うと、そんなに興味はないんだが、どうせだから、もちょい詳しく教えてくんろ。
興味ないんなら関係ない。 他人のソース読むこともほとんどないだろうから。
バカにつける薬はないってことだよ
421 :
デフォルトの名無しさん :03/09/23 23:32
アドレスのアドレスを関数からもらって関数に渡し、その中身の中身を使おうとしたら エラーが出てしまいました #include<iostream> using namespace std; void show(int **a){ int i,j,n=9; cout<<endl; for(i=0;i<n;i++){ for(j=0;j<n;j++)cout<<*(*(a+i)+j); cout<<endl;} } int **m(){ int i,j,**pp,*p[9],a[9][9]; for(i=0;i<9;i++)p[i]=a[i]; pp=p; for(i=0;i<9;i++)for(j=0;j<9;j++)*(*(pp+i)+j)=(i+j)%10; for(i=0;i<9;i++){for(j=0;j<9;j++)cout<<*(*(pp+i)+j);cout<<endl;} show(pp); return pp; } int main(){ int **a; a=m(); show(a);//この部分でエラー return 0; } わかる方いたらお願いします
コンパイル、実行は出来たのですが 実行後mainの show(a); の部分で止まってしまいました。
m()の中の戻り値だね>423
>>422 >>421 も言っているけど、ppは関数m()を抜けた途端に消滅するので
そのアドレスを持ったaを使い回すのは刃物を振り回すのと同じ。
>>421 つーかppはmainに持っておいて、ポインタのリファレンスを使いなさい。
C++使いなら。
428が何を言いたいのかはわからんが、元の408の聞き方がおかしいのは事実だ。 408が知能の足りない奴だと思われても仕方がないだろう。
431 :
デフォルトの名無しさん :03/09/24 00:20
>408 ループから抜ける条件が要るからじゃん?
>>429 関係なくないだろ。
普通は#define for if(1) for
みたいな使い方以外は予約語を define する馬鹿はいない。
だから、
>>408 が書き間違えてるんだってば。
もう忘れろよ。
>>423 >ローカル変数の寿命。
ありがとうございます。
classのデストラクタが呼び出されちゃうみたいな感じですよね
関数の後にもそれが起こるのは知りませんでした。
>>426 >ポインタのリファレンス
というのははじめて聞きました。大体イメージがわくのですが、
void m(int &(**pp))
と書くと、エラーになってしまいます。
決まった書式か、書いてあるホームページを教えていただけるとありがたいです。
(自分でも検索したのですが見つけられませんでした)
#define XXX do {...} while(0) のXXXが抜けてるって揚げ足か。アホらし。
例えば、if ( a ) AAA; else printf( "false\n" ); こんな感じのプログラムを書きたいとする。 1.#define AAA b = 1; printf( "true\n" );の場合 if ( a ) b = 1; printf( "true\n" );; else printf( "false\n" ); コンパイル:通らない 2.#define AAA { b = 1; printf( "true\n" ) } の場合 if ( a ) { b = 1; printf( "true\n" ); }; else printf( "false\n" ); コンパイル:通らない 3.#define AAA do { b = 1; printf( "true\n" ); } while( 0 ) の場合 if ( a ) do { b = 1; printf( "true\n" ); } while( 0 ); else printf( "2\n" ); コンパイル:通る このように、複数の文や式を1つのマクロで実行したい場合に、 do{ ... } while( 0 )ではさむようにする。
438 :
デフォルトの名無しさん :03/09/24 00:54
頭悪そうなのが暴れてる変なスレage
引数をint **&にしたりグローバルにしたりもしたのですが 解決しませんでした。 #include<iostream> using namespace std; int **pp; void show(/*int **&pp*/){ int i,j,n=9; cout<<endl; for(i=0;i<n;i++){ for(j=0;j<n;j++)cout<<*(*(pp+i)+j); cout<<endl; } } int m(/*int **&pp*/){ int i,j,*p[9],a[9][9]; for(i=0;i<9;i++)p[i]=a[i]; pp=p; for(i=0;i<9;i++)for(j=0;j<9;j++)*(*(pp+i)+j)=(i+j)%10; for(i=0;i<9;i++){for(j=0;j<9;j++)cout<<*(*(pp+i)+j);cout<<endl;} show(); return 0; } int main(){ //int **pp; m(); show();//この部分でエラー return 0; }
全然わかってないな。 返してるのはppじゃなくてpのアドレスだろ。
int a[9][9]; の寿命が関数mを抜けた時に尽きてる。 っていうか、そのコーディングスタイルじゃあエラー発見できないと思うよ。 プログラム作法とか、コーディングスタイルに関する本とかWebのドキュメント嫁。
構造体のサイズを固定したいんですが。 typedef struct{ char head[4]; long version; char reserve[248]; }HOGE_INFO; この場合、reserveで 256バイトにあわせてるんですが データを追加した場合 reserve再計算するのがまんどくさいのです どうしたらいいでしょうか?
>>442 typedef union {
struct {
char head[4];
long version;
} a;
char b[ 256 ];
} HOGE_INFO;
メンバの構造体を無名にしてしまえば 今までと同じように扱えるしな。
>>443 ,444
なるほど
ありがとうございました。
>> 44 >int a[9][9]; >の寿命が関数mを抜けた時に尽きてる。 >っていうか、そのコーディングスタイルじゃあエラー発見できないと思うよ。 >プログラム作法とか、コーディングスタイルに関する本とかWebのドキュメント嫁。 わかりました。どうもありがとうございます m(_ _)m
447 :
デフォルトの名無しさん :03/09/24 13:23
猫でも分かるVC++と10日で覚えるVisual C++を読んで C++とVisual C++の使い方はマスタしました。 書籍に載っている課題レベルのものは、 答えをみずに、ほぼ楽勝で出来ます。 次なるレベルにいくには 何をすればよいですか?
なんか作ってみたら? エロ恋愛シミュレーションとか。
449 :
デフォルトの名無しさん :03/09/24 14:38
「猫でも分かるVC++」を買って、 うちのミケ(メス三歳)に VC++を教え込もうとしているのですが、 どうも上手く行きません。 これは俺の教え方が悪いのか、 うちのミケが頭悪いのか、 この本が悪いのかどっちでしょうか? ちなみに俺はプログラムはさっぱり分かりません。 宜しくお願いします m(_ _)m
ミケはkeyを上手に打つことは出来ますか?
マウスなら上手く扱えます
>>449 > ちなみに俺はプログラムはさっぱり分かりません。
明らかにこれが原因。
>>449 それミケちゃうねん
マイク(マッチョ三歳)やねん
455 :
デフォルトの名無しさん :03/09/24 22:08
>447 何か自分の作りたいものを作ってみる。 数独などのパズルを解くプログラムとか結構むずいよ。 あと、憂鬱な〜って本でソースのきれいな書き方を学ぶ。 ってかレベルアップが目的なの? 自分の作りたいもの作ってみたいとかじゃなくて? あと、「十日で覚える〜」とか「はじめての〜」系のは入門書だから、 ワンランク上の書籍もあるはず。 プログラミング関連の書評のページを見つければ、 お勧めの上級の本が書かれています。
はぁ、気持ちいい・・・
(*;´Д`*)ハァハァハァハァ
>>447 初心者用の本を2殺読んだだけでVC++をマスタ出来るとは、
さすが脳味噌の構造が違いますね。
漏れは3年ぐらいやってるが未だにMFCは言うこときかねぇし、
ATLは難しいし、COMは難解だし、
WindowsAPIどころか標準ライブラリの関数プロトタイプすらおぼつかねぇ。
アセンブラなんて追うことすら疑わしい。
漏れは向いてないんだろうか?
俺はいまだに、fseek(fp, pos, SEEK_SET) か、fseek(fp, SEEK_SET,pos)か迷うナ。 SEEK_SETも時々思い出せないときがある。
printfの書式指定 全部覚えられるか? 漏れには出来そうにない。 MSDN様々だぜ。
こういっちゃなんだが、自分を語りたいだけにみえる 447は確かに大言壮語だが
pro*c/c++の質問はここでいいのですか? FETCHした値を入れる構造体にstringを使いたかったのですが、 stringは標準ライブラリ関数なので使えません。 stringの替りになるものはあるのでしょうか?
464 :
デフォルトの名無しさん :03/09/25 11:29
pgmの読み書きを扱うclassを探しています。 自分用のファイルで参考にしたいので,ググってみましたがダメでした。 ご存知の方がおられましたら,よろしくお願いします。
>>464 pgmって何? グレイスケール画像ファイルフォーマットの.pgm?
>>pgmって何? グレイスケール画像ファイルフォーマットの.pgm? はい、グレイスケールになります。 pbm(2値), pgm(グレースケール), ppm(カラー)の画像フォーマット の一つで、3つの総称した名前をpnmと呼んでいます。 pgmの見本が簡単そうでいいのですが,その他ファイル形式でも, 見本になるclassがあれば良いのですが・・。
>>447 クラスを作ってみよう。テンプレートの。 (ListとかStackとか。
下手に初期化できないから、見ものだよ。
千里眼養えるかもしれないし。
#これを習得はじめから10日のレベルでできたら拍手だ。うん。
以前、別スレで答えてもらった方法でもうまくいかなかったんですが、 ・仮想関数を持ったクラスAを継承して、クラスBを作ったとします。 ・クラスBでは仮想関数を上書きしています。 ・Bで上書きされたものを=演算子で、また別に確保したクラスAに上書きしたい。 というものです。 「オペレータ =」を使った方法か何かで、こういうことって可能ですか?(環境はVC6です。 ...VFTableを無理やりゴニョゴニョってしなきゃだめなのかな・・・。 { classA A; classB B;//classAを継承していて、仮想関数の内容は上書きされている。 A=B;//仮想関数もコピーしたい。 }
class A { virtual int f() { return 0; } }; class B { int c; virtual int f() { return c; } }; スライシングが起きて、結果がどうなるかわかるだろ。 メンバcの代わりに仮想関数でも作って呼んでりゃ、もっとひどいことになる。
コンパイラ徹の?
>>468 struct A{
virtual void foo(){ std::cout<<"A\n"; }
};
struct B : public A{
virtual void foo(){ std::cout<<"B\n"; }
};
A a;
B b;
std::memcpy(&a,&b,sizeof(A));
これで仮想関数テーブルへのポインタもコピーされるから仮想関数が上書きされる
この際
a.foo();
と呼び出しても駄目だ。
なぜならa.foo();は本来コンパイル時に解決できるから、仮想関数経由で呼び出されない。
したがって
A *p=&a;
p->foo();
このようにワザと動的になるようにしてやる必要がある。
(ただし、最適化によっては、これでも静的に結合される場合もある)
結論は、こんなことやめとけってことか
>>472 先生('А`)、便乗質問。
A a;
B b;
std::memcpy(&a,&b,sizeof(A));
a.foo();
A *p=&a;
p->foo();
最適化されて、単にAのfoo()が呼ばれるってことはないでつか?
ポインタ経由だと、必ず仮想関数テーブル参照するという仕様?
あ。。。ちゃんと書いてるやん 逝ってきまーす。
継承した仮想関数をコピーして使いたいなんてのは、99%間違いなく実装継承だから 「やめとけ。設計がおかしい。」としか。
>>469-472 レスThx!
勉強になります。
>>472 かなり怪しい方法ですな。助言のとおり、やめることにします。
>>470 そういう用途ではありませんが、
もし、メンバを呼ぶだけの関数なら、怪しい参照で死亡ってことですよね。
--
今回の目的は、スタック等での渡されたデータの保持を考えていたのです。
完全コピーして保持できればいいなーと。
(型はテンプレート<T>です。なので、クラス側に実装したかった。
でも、安全にやるのは無理っぽいので、参照&ポインタ保持に切り替えます。
皆さんThx!
>>466 pgmってチラッと調べてみたら、すげぇ単純なフォーマットじゃん。
その程度のプログラムも組めないんじゃ、もっと簡単なものから練習しな。
>476 なんで、dup()メソッドを実装しない?
>>466 pnmって総称することを知っているくらいなら、libpnmのソースくらい探せるだろ?
classにはなってないが、構造体と関数の仕様を睨めっこすればclassライブラリにするのはすぐだ。
>>479 クラスの仮想関数がコピーできないから。ってことになるのかな??
...と、思ったけど、そっか。
今いろいろ考えてたら、コードが沸いてきたよ!
ありがとう!!
以下は即興で書いてみた。こんな感じ?(テストはしてない。
template<class T>
T* Dup(T& Item){//何でもコピーできる予定。あ、でも文字列は無理だ。
T *D = new T;
*D = Item//オペレータ任せ
return D;
}
>>481 一旦デフォルトで初期化してコピーではなく
コピーコンストラクタを使うほうが効率的だよ。
T *D = new T(Item);
あとディープコピーは
>>479 でも言われているように
オブジェクト自身が上記の文を持つ複製メソッドを持つほうが確実ね。
(ただし派生ごとにいちいち再定義が必要)
templateだとそこをコンパイルする時点でみなされている型で処理するから、
実際の型が違うとき(親クラスの参照などで処理してるとき)は
ディープコピーにならない。
>>482 レスThx!
なるほど、少々面倒ですね。
うーん。今回のは継承先->基底の一方通行なので、まだ良いですが。
あと...。
実は、コピーコントラクタの意味を知らなかったです。
言葉だけ知っててかなり謎めいていました。(汗
いや、勉強になります。
オブジェクト指向でゲームを作るのはシンドイですか?
別にしんどくないよ。
change classしてみそ
487 :
デフォルトの名無しさん :03/09/27 00:28
SomeClass hoge; std::string test = hoge; 上のようにクラスを特定の型にキャストすることが出来たと思うのですが どのように定義すればいいのでしょうか?
・SomeClass型の引数一つ(参照ならばconst付き)のコンストラクタを string側に用意 ・operator string()を SomeClass側に用意 どちらも 意図しない型変換をしてしまったり 勝手に一時変数を作って期待通り動作しない などの原因になるので、注意深く扱う
VC++の割れ使ってる方おられますか? 本体はあるのですが、ヘルプファイルは出回っていないようです・・・ ヘルプ無しでもプログラムできるでしょうか? ヨロシクお願いします
アカの手先のおフェラ豚め! ぶっ殺されたいか!?
492 :
デフォルトの名無しさん :03/09/27 05:38
>>490 >ヘルプ無しでもプログラムできるでしょうか?
そういうことはヘルプに書いてある
>>491 ジョンクリーズみたいな口調ですね
>アカの手先
アカってことは共産主義ですよね?
共産主義ならすべての人が平等であるべきなので
ファイルを共有することはその理念に当てはまると思うのですが・・・
>のおフェラ
私は女性が好きですのでフェラはしません。
>豚
一応これでも人間です
>>492 ってことは、ヘルプが手に入らないとプログラムできるかわからないんですね。
今でもVC++販売してるのでしょうか?
できれば、持っているヘルプファイル放流してもらえませんか?
↑490
>>494 共有しているのか?貰うだけではないのか?
なぜ自分が出来るか出来ないかの判断を他人に仰ぐ
>>404 フェラはアナルセックスと同じく病み付きになるよ。やってみ♥
500 :
デフォルトの名無しさん :03/09/27 07:22
500ゲット
お前らまとめてスレ違い。 って、漏れもか。
学生で赤版買って使ってます。卒業してからも しばらく使うつもりですが、伺か?
>>494 なんでてめぇにピーコしてやらなきゃならねぇんだよ。
>>494 割れ廚は氏ね。
取り敢えず板違いだと忠告しておく。ダウソ板に(・∀・)カエレ!
プログラム板全体に言えることだけど あからさまのネタに対する食いつきっぷりがいいね オサーンばっかりなのか?wwwwwwwwww
>>506 いいから氏ねって。
お前なんか社会から必要とされてないだろ?
邪魔なだけなんだから、今すぐ回線切って首吊って氏ねよ。
>>506 プログラムをなりわいとする俺に取っては割れ廚はホントに氏んで
欲しいの一心。
>490 ハートマン軍曹も知らないようでは、ネタ師として3流だヨ
相手にしても何も生み出さないのでスルーしようよ
この板、年齢層って何ぼよ
>490 MSDN Library?
513 :
デフォルトの名無しさん :03/09/27 18:56
クリティカルなパフォーマンスが要求され、 高速にインスタンスを取得する必要がある場合、シングルトンよりもグローバル変数の方が高速ですか?
グローバル変数もシングルトンの一実装なんだが。 そうでなくてもインスタンス取得するメソッドをinlineにしとけば実質同じ。
>516 今下水に流してきました
>>515 inline hoge& getInstance()
{
if(instance == NULL)
instance = new hoge();
retrun instance;
}
これの分遅くなるんじゃないの?
if(instance == NULL)
×inline hoge& getInstance() ○inline static hoge& getInstance()
>>518 関数内static変数にしておいても
コンパイラが同じようなコード吐くしな。
>>518 それと、グローバル変数だとリンク時にアドレスが確定するが、実行時に new
すると実行時までアドレスが確定しないので、間接参照一回分のペナルティが
発生する。
といっても、それが問題になることなど、現実にはまず無いと思うが。
つーか、どーしても速度が必要ならローカル変数に取っておくだろ
プログラムって難しいね
526 :
デフォルトの名無しさん :03/09/27 21:06
C/C++の考え方の伝統では何事も実行時決定よりもコンパイル時決定が良いっていうのが Effective C++とかにも書いてあるけど、 最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。 そのへんみんなどう思ってるの。
C++にもRTTIあるだろ
テスト環境が問題なく確立できるなら実行時寄りになっても 痛くないってことじゃないですかね? C/C++では、テストがうまく動かせない環境が多いから、 コンパイル時決定を重視するべきだと思ってます。
cppunitあるだろ
あれってクロス環境で使えるの?
コンパイル時決定だとパフォーマンスが良い
C++の実行時はヘタクソ
virtualやデリファレンス分だけ遅いって話だろ。
コンパイル時決定だと階乗計算とか速いよね。
>>530 オリジナルの CppUnit はやや辛いが、CppUnit-x だとホスト環境に対する要求が
軽めだから、ちょっといじってやれば大抵の環境で使えるよ。
> 最近のオブジェクト指向の考え方って実行時決定寄りだよね?デザインパターン本とか読むと。 すんごい誤読だと思う。
539 :
デフォルトの名無しさん :03/09/27 22:47
そう?どの辺が?
そもそもデザインパターンは最近か?
541 :
デフォルトの名無しさん :03/09/27 22:56
まあ最近かどうかは譲ってもいいよ
というか文法やライブラリであっさり実装できたらデザパタにならないだろ。 C++で直接記述しにくいものが(特に生成系)デザパタになったんだろ。
544 :
デフォルトの名無しさん :03/09/28 02:53
型情報は未だに自前の変なマクロで実装してます・・・。 特定のクラスだけにRTTIつけられたらいいんですが。 コンパイラはVC2003のなんですけど。 そもそもC++の仕様じゃないんでしょうか?
545 :
デフォルトの名無しさん :03/09/28 02:55
いいものは金を出す
悪い物は金出さない
代金と商品の質が釣りあってないのが悪いんだよ
特に
>>508 のようにSEの言われるがまま糞プログラム作ってる香具師の
ソフトには金払いたくない
どうせ、DQN会社向けの幼稚なプログラムしかしないんだろ?
ところで、MSDNまだぁ?
>>546 お前自分で言ってて矛盾に気づかないのか?
「いいものは金を出す、悪いものは金を出さない」
そしたら、VC++とかMSDNってお前にとっては悪い
ものなのか?
いっぺん警察に捕まって臭い飯食って頭冷やしてこい。
つーかMSDN Libraryって最新のが既にネットに流れてるし。
>>546 自分の仕事道具の一つも買えない超貧乏人の犯罪者のお前よりましさ。
>>549 その辺にしといてやれ。
>>546 は無職なんだからあまり追いつ
めると逆切れして新聞に載る事件でもやらかしかねん。
何必死になってんだかww
おまいに迷惑かけた覚えはないがな
>>548 情報サンクス、それだけでプログラミングできるのか?
おれはVBすらしたことないんだが
ny用の自作ツール作りたいんだよ
>>551 > それだけでプログラミングできるのか?
道具が揃っても、使う人間の能力が不足してると、どうにもならんぞ。
プログラムなんて誰でもできんだろ? 猿じゃあるまいし、道具さえそろえたらなんとかなるよ で、MSDNあればできるのか? 一応「C++わか〜る」はもうすでに落としているのだが
>>545 基本的に実行時の型情報は要らない設計だから。
デバック用の例外クラスと一部のバリアントに仮想関数を持たせてるだけです。
全部に標準の型情報つけた方がいいと思いますか?
答えになってなかった。 何故RTTIに問題あるのか・・・。 オーバーヘッド。 だから個別につけることはできないのか聞いたんですけど。
今日、tchar.h をみていたら、 #ifdef _cplusplus extern "C" { というのがありましたが、これは具体的にどういったものなんでしょうか?
manglingされない/しないことの宣言、かな。
>>553 > で、MSDNあればできるのか?
この板見ててわからないんだったら、たぶん一生無理だな。(ケケッ
いい加減相手してるヤツがうざいな
>>561 うそぉ。これ見て初めて知ったんだけど、vtableってデフォルトで絶対作られるもんだったの?
仮想関数なしならテーブルもなしだとばっかり・・・。アホですた。
オーバーヘッドのことだけど、CPUのソフトエミュレーションしてて、サイズというより速度の問題かな。
コンストラクトの度にポインタ作るバイトコード実行してたら遅そうだから。
あと、文字列切り刻みまくりのリンクリストマニアだったりするので。
とりあえずありがとう。
>>562 > vtableってデフォルトで絶対作られるもんだったの?
どこにそんなこと書いてありますか?
ん?純粋インターフェイスクラス? またもの凄い勘違いをしてしまったかも。
ATLを使ったCOMオブジェクトクラスのように、 直接インスタンスを生成せず継承されることを前提としているクラスの、 vtableを作らないことでサイズをほんのちょっぴり節約するためのほとんど無意味なオプションだよ
>>564 じゃない
>>563 。
で、結局、RTTIを個別につけるのは無理ということでしょうか。
だって、インターフェイスクラス限定なら、インターフェイスを定義するだけで
何もしないコードを組まない限り、RTTIはついてしまうよね?間違ってますか?
>>566 ランタイムで人がいるのが嬉しいぃ。
銭ゲバメモリゲバの漏れなので、次から指定しますw
つーか4バイト単位とかで節約したいならC++使わないでCとかアセンブラ使っとけ。
時間的な話かとおもってた
>>568 > ランタイム
違和感
時間はRTTI ONだろうとOFFだろうとdynamic_castやtypeid使わなきゃ変わらないだろ。
RTTIとかけてみますた
>>571 何の時間?
そもそもdynamic_castもtypeidも使ってないよ。
>571 てゆーかOFFだと使えなくないか?
>>558 みましたが、
#ifdef __cplusplus
っていうのは、もちろん、コンパイラがC++であれば、っていう意味なのは明かなので、
ここの部分だけ解説されていてもしかたないです。
extern "C" {
}
これの部分が理解できないので。こっちのほうの意味をおしえてください。
どういう場合に、なぜ、こう書かなきゃならないのか。
>>575 google あたりで extern "C" で検索すると、すぐに出てくると思うんだが……。
一言でまとめると C++ 以外の言語から C++ の関数を呼び出したい場合に
つける。
C++ だと関数オーバーロード (同じ名前の関数で引数型だけ違う) を実現するために、
シンボル名に型情報が含められる。たとえば俺の手元のコンパイラで void func(void)
をコンパイルすると オブジェクトファイルでは __Z4funcv というシンボル名になり、
void func(int) をコンパイルすると __Z4funci となる。
これを name mangling というんだが、name mangling の方法はコンパイラによって
バラバラで標準がない。そこで C や VB などから C++ 関数を呼び出す場合には
extern "C" を使って「この関数は name mangling するな」と指定する。副作用と
して関数オーバーロードができなくなる。
>>576 無視っていうより、manglingを知らないから情報だと思わなかったと思われ
(知ってたらこんな質問自体しないはずだし(笑))
>>575 > これの部分が理解できないので。こっちのほうの意味をおしえてください。
だったらなぜはじめからそう書かないんだ ?
教えたのに、「そっちは明らかだ。」とか言われるとすごくむかつくんだが。
>>575 上で行われている与太話は実装の事だから無視していい
単にextern "C"はCリンケージの指定。
>>577 >副作用として関数オーバーロード出来なくなる
って、当たり前じゃん。
別に! ただ当たり前の事言ったまで。
556は初心者道の茶帯 もっと傲慢に振る舞わないと黒帯は難しい
伝説の水野女史には遠く及ばないな。
>>587 状況的にはかなりかわいそう(SDKもまともに理解してないのにエクセルをオートメーションで操作しなければならない)
なんだが、そうとは思わせない傍若無人さがステキ。
いろいろありがとうございました。 要するに、 extern "C" { } の {} で囲まれた中は、コンパイラがC++でも、 Cの機能のみをもってしてコンパイルするように、という意味だったんですね。 ありがとうございます。
>>589 えーと、Cの機能のみっていうとかなり拡大解釈っぽいが。
変化するのはリンク時のシンボルの名前であって、中身はC++フルに書ける
例えば extern "C" { } の内部だと関数の多重定義がうまくコンパイルできない事がある。
>>591 だよな。
extern "FORTRAN" とか書くこともできる処理系もあるし。
どの処理系でも書くことはできる
彼女にちんこが臭いって言われたんですけどどうすればいいですか? 自分ではちゃんと洗ってる筈なんですけど 年中皮被ってる状態なのがいけないのかな?
オマエって満国際的な女だよなっていい返す
>>598 そんなことを言ったら嫌われちゃいます。
彼女は60億人いる中で私を愛してくれた数少ない逸材なんです。
嫌われたくありません。でも珍国際のは嫌です
じゃあ、もう死ぬしかないね。
ちんこ切り落とすことに決めました。 彼女も僕のちんこ目当てに付き合ってるわけないですし(それほどの物でもないし) 僕のフィンガーテクニックでなんとかフォローします。 明日病院行って来ます いろいろ、相談に乗って頂いてありがとうございました。
マイクラなんぞ喰らわんぞ。
マイクラ・・・マインドクラッシャーの略。日本語で言うと精神破壊。
実際の
>>603 は炉画像なのである意味マイクラといえないことも無いだろう。
>>603 つーか、この画像かなり笑えるんだがw
矢口のぶッというんこをこんな風に頬張りたい
607 :
デフォルトの名無しさん :03/09/29 00:54
class OK; void OK(); template<typename T> class NG; void NG(); g++(3.3.1 cygming)だと、 OKは両方いけるんだけど、NGは"redeclared as different kind of symbol"になります。 こういう言語仕様なんでしょうか?
>>607 その環境手元にないけど、
エラーメッセージの通りだろ。
NGはすでに宣言されてるだけ。
>>607 14.2
A template-declaration can appear only as a namespace scope or class scope declaration.
In a function template declaration, the declarator-id shall be a template-name
(i.e., not a template-id).
つまりテンプレートに使われるシンボル名は同じ名前空間もしくはクラス空間内では
唯一でなければならない。従ってエラー。
>>607 スマソこっちみたい。
14.5
A class template shall not have the same name as any other template, class,
function, object, enumeration, enumerator, namespace, or type in the same scope
(basic.scope), except as specified in (temp.class.spec).
Except that a function template can be overloaded either by (non-template)
functions with the same name or by other function templates with the same name
(temp.over), a template name declared in namespace scope or in class scope shall be
unique in that scope.
>>608 OKは、規格の3.3.7 Name Hidingによってクラスの方の名前が隠される。
しかし、14-5でテンプレートクラス名は、ほかの関数やオブジェクトなどの名前とは
一緒に出来ない。よってNGはNG。
先に出てた・・・(鬱
>>608-612 ありがとうございます。
ところでC++の規格にはRationaleは無いのでしょうか?
今回の件も、根拠がわからんないです。
615 :
デフォルトの名無しさん :03/09/29 14:53
クラスのメンバ関数の定義で引数リストに何も指定しないというのは 暗黙のうちにintを1つ取る関数として定義されるのでしょうか? それとも定義未定とされるのでしょうか? もしくはvoidとみなされるのでしょうか? class Foo { public: void Func(); };
>>615 void。
ちょっと基本すぎるので、入門書ぐらい買って詠んだほうがよいかと。
class Foo { public: virtual void Func() = 0; }; class Ber1 { public: virtual void Func(void) {} // OK }; class Ber2 { public: virtual void Func(int i) {} //コンパイルエラー }; と言う事でvoidな事がわかりました。板よごしてすまそ。
>>615 Fooから派生するの忘れた。
逝ってきます。
どうでもいいことだが、foo ときたら普通 bar だぞ
じゃあhogeときたら?
hage
622 :
デフォルトの名無しさん :03/09/30 01:54
_ト ̄|○・・・あぁ、どうしても出来ない!
>>614 > ところでC++の規格にはRationaleは無いのでしょうか?
そういえば無いなぁ。なんでだろう。
fuga
hogera
hidebu
628 :
デフォルトの名無しさん :03/09/30 21:37
fstreamを用いてファイルの先頭に文字を挿入する方法はありますか? 後ろに挿入する場合は ofstream fout(FilePath,ios::out|ios::app|ios::ate); でできるんですけど、前はどうもうまくいきません・・・ 何か良い知恵がありましたらよろしくお願いします。
無理
ママー、vector<bool>だとバッファへのポインター採れないね。
632 :
デフォルトの名無しさん :03/09/30 21:54
C++の実践的な技術を身につけたいんですが どんな本を買えばいいですか?お勧めとかあったら教えてください。 幼稚な質問ですいません。
>630 boolのvectorは作ったらだめだったんじゃなかったっけ?
>>628 先に文字を追加したファイルを作り、そこへアペンドモードで元のファイル
を追加して元のファイルを削除してリネーム。
>>634 ダメってことはないが……
ただ specialization されてるので bool 以外の vector<T> で使えるメソッドでも
vector<bool> で使えないメソッドがいくつかあったりして、現実には非常に使い
づらい。bitset 使った方が良いよ。
>>635 やっぱりその方法しかないですか・・・
分かりました。ありがとうございました。
実はその方法でもう実装は済んでるんですけど、
もっとエレガントな方法はないかなぁ、と思っていたんで。
>>636 むしろ Boost::dynamic_bitset 使った方がいいかも。
>>628 ではないんだが、
本当にファイルの前に追加する方法ってないのか?
>>640 そうか。とすると、テキストエディタとか作るのは
実は結構たいへんだね。
>>641 うん、大変だよ。
作ったことないみたいだねw
>>642 普通はつくらんでしょう、そんなもの(w
>>643 エディタやコンパイラって学生のときに結構作るような。結構勉強になる
今までのファイルの内容を新しく追加するサイズ分移動して、 その後に先頭から追加分を書く。 エレガントには程遠いが、ファイルは1つで済む。
>>645 言うほど簡単じゃない罠。
ファイルの内容を移動するって、具体的にどこからどこへ移動するか分かって書いてる?
>>641 テキストエディタなら、行ごとにリスト作るのが一般的。
行単位の編集しかしないエディタが多いのはそれが理由。
メモリ上でファイル全体のイメージを作っておいて、書き出すときは一気に先頭から書く、と。
メモリ上で取り込みきれないようなファイルを取り扱うエディタを書くのは、
その辺りも全て考慮しないといけないからどうしても一時ファイルが必要で、
だからMS-DOSの時代のエディタはどれもそういう作りになっていた。
ファイル内での中身の移動なんて、たいして難しくもないと思うけど… スピードは遅いし、確かにエレガントでは無いけど。
ファイルシステムレベルでいじれるなら、リンクリストの要領で先頭に挿入できる 気もするが。
649 :
デフォルトの名無しさん :03/10/01 14:28
C++的にはconst,enum,inlineでできるところは マクロを使わずに済ますべきですか? それともマクロを使うことで得られるメリットの ようなものがあるんでしょうか? コンパイラはg++を想定しています。Cのソースとして コンパイルするなどというセコイことは考えてません。
650 :
デフォルトの名無しさん :03/10/01 14:30
マクロでできることはマクロでやる。
651 :
デフォルトの名無しさん :03/10/01 14:34
・とあるクラスに、staticメンバが一つある ・そのクラスのインスタンスが一つでも存在しているならば、 そのstaticメンバは初期化されていなければならない。 ・そのstaticメンバを初期化するには、初期化関数を呼ばなければならない。 …のですが、これを綺麗に実装する方法はあるのでしょうか。 今はコンストラクタが呼ばれるたびに、初期化チェックをしていますが冗長な気がして…。
652 :
デフォルトの名無しさん :03/10/01 14:47
>>650 inline関数がある処理系のみを考えているのに、
函数マクロでそれを記述することにどんな意味があるんでしょう?
ってこれはCスレで聞くべきないようか。
653 :
デフォルトの名無しさん :03/10/01 14:53
>>651 コンストラクタでのチェックによるオーバーヘッドが無視できない程クリティカルな処理、
あるいは頻度の高い処理なら、ファクトリ関数をポインタで持っておいて1回目以降は
それを付け替えちゃえばいいんじゃない?
あとはクラスにそこまでのインテリジェンスを持たせずに、Open/Close 系のメソッドを
用意して使う側で適切に呼び出してもらうってのも悪くないと思う。Open されずにインス
タンスが生成されたときに適切なエラーを出せるなら。
>>653 1段目はええと…2回目からは空操作させるということですよね。
2段目はCoInitializeみたいなものでしょうか。
早速作り替えてみます、レスありがとうございました。
>>653 bool変数のチェックのコストが気になるような状況で
ポインタを介した関数呼び出しを薦めるのはいかがなものか。
656 :
デフォルトの名無しさん :03/10/01 21:36
657 :
デフォルトの名無しさん :03/10/01 21:41
float foo(){ union{ float f; int i; }; i=10; return f; } struct A{ float foo(){ union{ float f; int i; }; i=10; return f; } }; 上のfoo関数はコンパイルが通るのですが、下のfooメンバ関数のコンパイルが通りません。 そんな仕様があるのですか? 私の環境はVC7で、エラーメッセージは以下のとおりです。 error C2065: 'i' : 定義されていない識別子です。 error C2065: 'f' : 定義されていない識別子です。
>>658 サンクス。
コンパイラのバグっぽいのかな・・・
とりあえず以下のでいけたのでこれでいくことにします。
struct A{
float foo(){
union{ float f; int i; } e;
e.i=10;
return e.f;
}
};
レスリング部に所属している集団が部活帰りに 「ボクシングってダセェよな、シッシッ言っちゃってよ。」などと 言っているのが聞こえたので走って近づき、リーダー格の奴に、 右ボディを食らわせて前屈みにし、ワンツー連打から左フックでKOした。 オレはその場を立ち去る時に残りの高校生たちを指差し、 「お前らも灰になれるものを見つけろよ」と言った。 離れていく時に後ろから、「ボクシングっていいよな。」と声が聞こえた。
おい、お前。そう、お前だよ。 「このスレおもろいから見てみ」「2ちゃんの歴史に残る名スレだぜ」とか言われてホイホイと このhtml化されたスレを見にきた、お前のことだ。 どうだ?このスレおもしれーだろ。 でもな、お前はこのスレを読むだけで、参加することはできねーんだよ。 可愛そうにな、プププ。 俺は今、ライブでこのスレに参加してる。 すっげー貴重な経験したよ。この先いつまでも自慢できる。 まあ、お前みたいな出遅れ君は、html化されたこのスレを指くわえて眺めてろってこった。
>>660 不変表明になぜか違反するって事?
関数に入った時と出て行く時で,オブジェクトが変化してしまう,と。
オブジェクトを乱暴にいじるからだ。
適切に const は使ってる? mutable でどっか罠に引っかかってない?
explicit を適切に使わなかったから,つーのも意外に多い。
なるべく最新版のコンパイラを使って,ウォーニングを念入りにチェックするべきだ。
>>661 そうすると、グローバル変数になっちゃうんですけど・・・?
こ〜ゆ〜事 struct A { float foo(); }; float A::foo() { union{ float f; int i; }; i=10; return f; }
667 :
デフォルトの名無しさん :03/10/01 23:57
(^Д^)ギャハ!↑みなさん、この人のレスどう思いますか♪ なんてありきたりなんでしょうね♪ 誰もが皆、一瞬つけてみたくなる発想のレスです♪ しかし、賢明な人はその自らの短絡的思考を野放しにする事を嫌がり、 こういうレスは控えます♪ しかし、この人はしてしまったのです(^^;ワラ 「誰もが思い付くような事」を堂々と♪ この人にとってこのレスは何なのでしょうか♪ このレスをしている間にも時間は刻々と 過ぎ去っているのです♪ 正にこの人のした事は「無意味」「無駄」でしかありません♪ ああ・・・何ていう事でしょう(^^;ワラ 図星で泣いちゃうかも(^^;ワラ
つぼにはまったw 誤爆なのか狙ったのかはわからんが。 もし狙ったのなら面白すぎ。
これだけは確実だ。 667==668
670 :
デフォルトの名無しさん :03/10/02 15:46
669ってあたまわる〜いwww
どんぴしゃだった模様。 必死の煽りが泣かせます。 ↓負け犬の遠吠え
672 :
デフォルトの名無しさん :03/10/02 16:17
おまえらバカじゃないのか?ほんと自分は出来る風ですか? ほんとにバカ、オメーラ、みんな、ネット荒らしとどこが違うんだ!? ほんとな、おまえらはみんな、ここに来る資格ねーな!! デフォルトの名無しさんだっけ!!おまえしね!!人が謝ってのに何が あやしいっておまえみたいのがいるから日本がだめになるんだ!! 分かったバーカ!!もう荒らしでも何でもいいよ!! オメーラみたいなバカどもにつき合ってもしかたないから!! あんたらみたいのはもうこのよにもいらない !!
>>651 1) プログラムの最初で初期化
2) 最初のインスタンス化のときコンスタラクタが呼ばれる前に初期化
3) コンストラクタ内で初期化
綺麗にやるにはこれくらいしかなさそう。
しかも初期化をダイナミックに制御できるのは3だけだから、
結局今やってるやり方しかないかも。
ループ内で大量にインスタンスを作るような場合、
3だとオーバーヘッドが大きいなら、
2の方法でループの直前で初期化。
色んなとこでバラバラに生成する場合、
2だとコーディングがめんどくさすぎるので、1か3だと思う。
ケースバイケースということだね。
674 :
デフォルトの名無しさん :03/10/02 17:33
class Hash { public: string key; int val; int default_val; Hash(int def){default_val = def;} /*int& operator()(const string &arg){ cout << "Called as LHS" << endl; key = arg; return val; }*/ int operator()(const string &arg) const{ cout << "Called as RHS" << endl; if(key == arg){ return val; } else{ return default_val; } } }; int main(){ Hash h(-1); //h("a") = 1; cout << h("b") << endl; return 0; }
上記のソースで質問です。 まず、上記のソースはコンパイルすると当然 h("b")はint operator()(const string& arg) constの呼び出しになります。 ところが、コメントを外してコンパイルすると h("a"),h("b")の双方がint& operator()(const string& arg)の呼び出しになってしまいます。 つまり、左辺値としての呼び出しと右辺値としての呼び出しを区別して 関数をオーバーロードしたいんですが、どうすれば実現できますか? あと、疑問としてこの2つのoperator()は重複宣言になりそうに思いますが、 コメントを外してもコンパイラが通るのはなぜですか? 試した環境はVC++6.0とg++(2.xx)です。
>>675 const は「変更されない」ではなくて「変更できない」だから、
h は変更可能だから、たとえ変更されなくても常に LHS になる。
cout << const_cast< Hash const& >( h )("b") << endl;
で何とかなるかも。
>>675 HashNodeClass &Hash::operator()(....);
とやって
HashNodeClass::operator=(....);
HashNodeClass::operator<<(....);
を実装したら?
678 :
デフォルトの名無しさん :03/10/02 21:03
コンテナで異なるオブジェクトを一括して管理したいのですが、 (オブジェクトA、オブジェクトB、オブジェクトC、オブジェクトA・・・・) という具合に・・・ いい方法ありますか?
boost::any
681 :
デフォルトの名無しさん :03/10/02 21:37
質問です ClassA、ClassBという2つのクラスがあると仮定します。 ClassA(子クラス)はClassB(親クラス)を継承しています。 この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか? ClassA *pClassA; ClassB *pClassB; pClassA = new ClassA(); pClassB = pClassA; delete pClassB; どうかよろしくおねがいします
>>681 ClassBのデストラクタがvirtualなら。
>682 ありがとございました、これで安心して製作を続けることができます。
すいません、もう1つ質問させてください ClassA、ClassB、ClassCという3つのクラスがあると仮定します。 ClassB(子クラス)はClassC(親クラス)を継承しています。 ClassA(子クラス)はClassB(親クラス)を継承しています。 この場合に以下のプログラムは正常にdelete(開放)されるのでしょうか? ClassA *pClassA; ClassC *pClassC; pClassA = new ClassA(); pClassC = pClassA; delete pClassC; 先ほどと同じ考えでClassBとClassCのデストラクタがVirtualならOKなのでしょうか? また継承されるクラスが増えても継承されるクラスすべてのデストラクタに Virtualをつければよいのでしょうか?
>>684 ClassCのデストラクタがvirtualなら、そこから継承したクラスの
デストラクタからはvirtualキーワードが省略できる。(省略できる
だけでvirtualは付いているものとコンパイラは判断する。)
>>685 ということは継承される大元(上記の場合はClassC)のデストラクタに
Virtualがついていれば何個継承してもよいということですね。
悩みが解決しました、ありがとうございました。
>>676 constの付加にconst_castはつかわないでほしいです。
ところで皆さん、一時バッファってどうしてます?
いきなりなんの話だ?
>>676 ,677
なるほど。
いずれにせよ、簡単に右辺値か左辺値か見分けるのは難しそうですね。
ありがとう。
>>674 「More Effective C++」にそういうことを行うプロキシークラスがのってまつ。
692 :
デフォルトの名無しさん :03/10/03 10:10
とあるオブジェクトAと、それを操作したい 互いに独立したクラス(コールバックで独自に動くような)があります。 独立したクラスとは、メインのWindowクラスと、Dialogクラス×2の、3つです。 こういう場合どんな風に関連づけたら良いのでしょうか? 自分なりに考えたのでは 1、とりあえすWindowクラスにAをメンバとして持たせ、 GetA()系を用意して安易にそれを公開し、他のDialogクラスを賄う 2、メインウィンドウにAをメンバとして持たせ Window->func(){ A->func(); }みたいな物をいちいち用意する。
微妙にスレ違いな気もするけどお願いします。 スレッドセーフなDLL(非MFC)の作成は、 ・staticは使わない ・グローバルはTLSを使用する ・マルチスレッドDLLとぢてリンクする だけでOK?
>>692 ウィンドウクラスに A を持たせるのが、そもそも良くないような気がするけど。使い捨ての
小さなアプリならともかく、まじめに書くなら
データを管理するクラス
それを表示するクラス (ウィンドウ・ダイアログ)
データを操作するクラス
と 3 つに分けて管理する方が良いよ。いわゆる MVC パターンてヤツ。
その上で、データの変更をウィンドウ・ダイアログに通知するために Observer パターンを
組み合わせて使うのが一般的だと思われ。
>>696 こんなレスをお待ちしてました!
なーるほど、こんな良い方法が…、御陰様でObserverパターンにより
ViewとModel間は、素晴らしくスッキリした、依存の少ない形に出来そうです。
Cotroller(Windowsだと≒View?)とModelの間が、まだよくイメージ出来てないのですが、
要するにWM_LBUTTONDOWとかをイベントとして、Observerどもに通知するのかな…。
キーワード頂けたのでもう少し勉強してみます。
詳細なレスありがとうございました。
すいません。C++初心者ですが教えていただけないでしょうか? (ID、値)というデータが次々に入力されてくるとしますが、IDごとにそれぞれ 入力された順番を考慮して保持したいと考えます。ID番号ごとにqueueを作って、 既存のIDが入力されたらqueueにpushし、新規のIDが来たらそのIDに対応するqueueを 新たに作ってpushするという方法を考えました。 しかしどうやって書いたらいいかわかりません。後でID番号を基にそれぞれの queueの中身を参照できるようにするには、どのように書いたらいいのでしょう? どなたか、教えていただけませんか?
>>698 std::map<ID_type, std::queue<value_type> >
を使うか、場合によってはもっと簡潔に、
std::multimap<ID_type, value_type>
を使えばよい。
map<int, queue<int> >
>> 699,700 なるほど、mapを使ってキーと値(キュー)を保持するようにすればよいのですね。 すばやいお返事どうもありがとうございます。 ついでに、ふと疑問に思ったのですけど、mapとmultimapを使う場合に 値を検索する速度に違いはあるのでしょうか? 速度が問題となる場合には、どちらのほうがおすすめなのでしょうか? もしよかったら、この質問にも答えて下さるとありがたいのですが。
自分で試してベンチ取ればええやん
つか、multimapで同一キーを持つ要素が挿入順に並ぶことを期待して大丈夫なのか? mapを使うかmultimapを使うかは検索速度で決めるんじゃなくてデータ構造で決めるべし。
関数オブジェクトって実行時にコンストラクタが走りますよね? って事は、結果を保持したいとか、コンストラクタで初期化する 必要がある場合を除いて、グローバル関数使ったほうが速い/良い のでしょうか? struct func{ func(){std::cout << "Constructor!" << std::endl;} void operator()(){std::cout << "operator()!" << std::endl;} }; int main() { func()(); }
>>704 何故必要ないコンストラクタをわざわざ書いてパフォーマンスが落ちるとかほざく?
関数オブジェクト使ったほうが速い/良い
>>706 関数オブジェクトの方が速くなるのって、
テンプレートが絡んでるときだけじゃない?
>>707 関数オブジェクトのメンバーが全てインライン関数ならテンプレートと同じだと。
ついでにインライン関数でも同じになると思う。
>>704 速いかどうかは人に聞く前に実測しる。
ストップウォッチ計測もアセンブラソースも投げ出したまま
いくらきれい事を並べても所詮は空想論、論じる価値がない。
それからtemplateとinlineは別物。
template化したからといってそれでinline化を要求したことにはならない。
Bjarneくらいしっかり読んでおくことも
実測値から考察をするにあたって必要なことだ。
レス有難うございます。初心者なので傾向が知りたかったのです。
>>705 実際に走ってる事を確認するために書いただけです。
>>709 確かにそうですが、皆さんはどのように使い分けているのか教えていただけますか?
>>710 使い分けるも糞も必要なところで使って必要ないところで使わない、それだけだろ。
必要ないところで使うのはただの馬鹿だし、必要ないところで使わない選択肢はない。
>>710 もっとC++関係の書籍を読んで勉強しな。
そうすれば
>>711 の言ってることがわかるようになる日がくるかも。
来なければ、向いてなかったってことだ。
いや、一生来ないだろ ×必要ないところで使わない選択肢はない。 ○必要なところで使わない選択肢はない。
両方でコーディング可能な場合はどうしたらいいんですか?
>>714 文盲?
> 必要ないところで使うのはただの馬鹿
両方で出来る=関数で出来る=わざわざファンクタにする必要なし
テンプレートクラスの使い方が難しいね。 Modern〜の使い方みたいなスマートな奴を スパスパ思いつくぐらいになりたい。
より適当な方を選ぶ。
ボーランドのコンパイラだとファンクタとかインライン展開してくれなかったりしますか? なんかqsortの方がstd::sortより3倍速いんだけど。 一応下記のコードなんですが。 わざわざc_strとstrcmp使ってるのはoperator==よりこっちの方が速かったからなんですが… //qsort inline int personsortbynameproc(const void *a, const void *b) { return strcmp(((Person *)a)->GetName(0).c_str(), ((Person *)b)->GetName(0).c_str()); } //std::sort struct PersonNameComapare { inline operator ()(const Person &a, const Person& b) const { return strcmp(a.GetName(0).c_str(), b.GetName(0).c_str()) < 0; } };
>>715 どうも。関数>ファンクタって事ですね。
>>706 さんと矛盾してますが。
さらに質問。
template<class T>
struct less : public binary_function<T, T, bool> {
bool operator()(const T& x, const T& y) const;
};
は何故ファンクタにしてるんですか?関数でいいじゃないですか。
単に、binary_functionを継承したかったからですか?
そうです
>>720 ありがとうございます。すっきりしました。
アフォしかいないのかここは… とりあえずEffectiveSTLの6,7章を穴が空くまで読んどけ。
>>722 買ってきて読んでみます。でも相談室なんだから許してください。
そりゃ重要な局面で必要ないところで遊んだためにコケたらヴァカだろうけれど、 時間のある時にいろんな方法で遊んで手札を増やす事は、イカスとおもうズラ。 必要ないからってのは、解らん事から逃げる口実に使う言葉であって、 合理的に選択を絞る理由になってないんじゃない?(トカアオッテミルテスト
725 :
デフォルトの名無しさん :03/10/06 10:09
テンプレート関数のexportの実装方法を解説してるドキュメントは ないでしょうか?Cに慣れた頭には、これはどう実現してるのか さっぱり分りません。
>>719 1: 代わりに template<class T> bool less( const T& x, const T& y ); だとすると、
オーバーロードの関係で std::sort( v.begin(), v.end(), &less<T> ); と書けない。
std::sort( v.begin(), v.end(), static_cast<bool (*)(const int&,const int&>(&less<T>) );
…みたいに長ったらしくなる。
2: std::set や std::map などでは、比較基準としてファンクタを取れるように
設計しとく必要がある。(関数じゃなくてファンクタを使いたい場合も当然あるので。)
なので、デフォルトの比較基準である less<T> も関数でなくてファンクタとして
用意しとくのが自然。
3: template<template<class> class F = std::less> class { ... };
みたいに書いて、less<int> やら less<string> やら…の
具体的な関数を全て渡さなくても std::less というテンプレートを
比較ポリシーとして一気に渡す、みたいな手が使えるようになる。
etc.
> 何故ファンクタにしてるんですか?関数でいいじゃないですか。
もちろん、関数を使えば済むところをファンクタを使うのは無意味だ。
例えば、i < j で済むのを less<int>()(i, j) とか書いてたら変。
んだけど、特に大小比較のような他の演算のパラメータとして渡すことの
多い演算は、上に幾つか上げたようにファンクタにしとくと使い所が広がって嬉しい。
>>726 加えて、関数ポインタを使うとインライン展開できない処理系が大半だから。
ファンクタだったらどの処理系もインライン展開できるのか?
関数ポインタよりは可能性高そう
横からお邪魔して質問しますが、 実際にインライン化されてるかどうか知るには 呼び出しを大量にかけてベンチ取るしか方法はないですか?
>>731 あー、すんません。そういう技量はないんですよ。
>>730 私は大抵逆アセンブルコード見て…
って、よく考えたらmapファイルあたり吐かせたらそのあたり分からんかな?
うむ、何を言われているのかさっぱり分からん。 ただ一つ、もっと勉強せないかんということだけは分かりました。 修行してきます。。。お邪魔しました。
今mapファイル見てきたが。 どうやらinlineで埋め込まれちまった関数はmapファイルに出力されないらしい。 まあ至極当然なのは確かだが、せめてinlineとかって表示してくれれば便利なんだが。 …inlineはコンパイラの仕事でmapはリンカの仕事か? とすると無理か…? まあそのへんは詳しくないのでともかく。 というわけでmapファイル出力させて、 mapファイルを対象関数名で検索して出て来なかったら多分inline展開されてる。 でなきゃ、一回も呼び出してなかったせいで最適化の結果削除されたとかな。 が、もっともinline展開しても実体が作られる場合 (例えばその関数ポインタを使ってるとか)があるので、 mapファイルに出力されていてもinline展開されてるってことはあるかもしれず。 ちなみに確認したのはVC7.1。
どう考えたってアセンブラ出力を見るのが一番確実だろ
inline関数のアドレスを外部のモジュールに渡すときは どうなるんでしょうか?inline関数が基本は型付きマクロで ありながらポインタとしてやり取りできるとなると、どこまでが インライン化され、またそうでないのかが明確になっていないと だめですよね。
>>732 その時点で終わってる
インライン=アセンブラレベル
アセンブラをじっくり読んでみる気のない者は二度とインラインを口にするな
ハード屋とじっくり話してみる気のない者は二度と実行速度を口にするな
やる気のない者は業界を去れ
空想論ばっかりで汚れねえおこちゃまは公害だ
>>737 規格でどーなってるのかは知りませんが。
とある実装系では
「要所要所にinline展開しつつ、外部から呼ばれるための本体ももつ」
という実装がしてあったとかしてないとか。
聞いた話なんで鵜呑みにされても困りますけど…
もしこのようになってるとしたら、
関数ポインタ使ってるとmapファイルに載っちゃうんで、
mapからのinline判定はむりっぽそうですね。
とゆーのが735の
> inline展開しても実体が作られる場合
> (例えばその関数ポインタを使ってるとか)があるので、
の部分かな?
インライン展開されていても、それとは別に実体があることもある。 だから、関数のアドレスを外部に渡しているからといってインライン展開されない証拠にはならない。 使われない関数は実体がないこともある。 だから、マップファイルにシンボルがないからといってインライン展開される保証にはならない。
つーか全体としてのパフォーマンスに影響がなければinline展開されてようが されていまいがしったこっちゃないと思うが。asm読めないならなおさら。
逆に言えば、inline関数が関数としてインスタンス化されるのは どこなんでしょうか?関数のアドレスを取得した時点ではまだ実体は 必要ないんですよね。インスタンス化のためのなんらかの条件があるはずですが。。。
>>742 アドレス引いたらリンケージを確保するために実体化するんじゃないか?
>>743 なるほど。そう言われてみればそうですね。
inline指定されたからといって、inline展開されることが保証されるわけではない この時点で、742のような議論はすべて処理系依存であり、無意味。 自分で出力を確かめろと何度も言われている。 もちろん、その処理系のそのバージョン限定でしか通用しない知識だが。
746 :
デフォルトの名無しさん :03/10/07 10:02
コンテナのある一つの要素を、ずっと見張ったり操作する必要があるのですが、 iteratorをつかって、いつまでもその要素を参照しているというのは、ありなのでしょうか? (もちろんコンテナの順番が変わったりするまでですが) 今まで見たソースには、iteratorをそういう用途に 使っている物が、ひとつも無かったので不安でして…。 いまはコンテナをポインタ型で持ち、参照もiteratorではなく、 ポインタでやっているのですが、これだと管理が厳しくて。
要素を追加したり削除したりしないなら大丈夫
>>747 おお、ではこういう使い方もありなのですね。
実装依存とか変なのなくて安心しました。レスありがとうございました。
とりあえずVC6での話だけど通常の関数にインライン関数のポインタ渡したら関数が作られていた。 インライン関数にインライン関数のポインタ渡したら展開されていた。 両方がインライン関数、もしくはテンプレートなら展開されると推測・・・大体の場合だけど。
>>749 普通に考えてインライン関数のポインタなんか取れないから、通常の
関数にしていると推測。関数テンプレートも同じ。
>>750 749はソースコード上の事だと思はれ。
インライン化された関数じゃなくて、 inline 指定した関数ってことだろ。
>>746 コンテナ毎にどの操作でiteratorが無効になるかちゃんと定義されてる。
>インライン関数のポインタなんか取れないから 何が普通だ どアフォ templateなんか全然関係ねえんだよ 軽い気持ちでいっぺん氏んでこい
>>726 丁寧に書き込んで頂いて有難うございます。
Effective-STL買ってきて読み始めました。
ついでにプログラミング言語C++も買いました。
分厚くて1部分しか読んでないですが、関数オブジェクトの方が速いと書いてありました・・・
非業界人がC++使いこなせるようになるのでしょうか不安です^^;
>>755 非業界人の方が自由に使いこなせる。
業界人で組み込み系の部署につかされたら悲惨。iostremは使わないわ
変数の命名はハンガリアン記法でなくて会社独特の物だし、ヘッダファイ
ルもカスタマイズされたものだけだし、C++でなくてCで十分だと思える。
そうでなくてアプリを作る部署ならC++も生きてくるが、規格書作るのが
大変。クラスの定義は一番初めに決めなければならないし、そこから
子クラスを導出するデザインも全部決めなければならない。(UML)
boostはもちろん使えない。STLでも使えるのはstd::vectorのみに限られて
いたり、よくてstd::mapやstd::multimap止まり。
ファンクタはアルゴリズムから呼び出すのだけど、これも規格書の段階
で決めておかないと使用禁止。本当にうぜーわ。数人〜数十人でcvs
使うからそれくらい厳格にしておかないとバグ探すのが大変なんだよ。
#教訓。C++を「学ぶ」のと「飯の種にする」のとでは行って帰ってくるほどの
#差がある。
あ、もう一つね。 export template に対応したC++処理系は今の所仕事では使っていない。 そのためtemplateは複数の人で開発するのにほとんど無意味。従って 重要なテンプレートはすべてヘッダファイル入り。C++にしてからヘッダ ファイルを作るのにかかる時間がすごく延びた気がする。
>>755 大丈夫、業界人だって使いこなせてない香具師が多いから。
>>756 会社やプロジェクトによりけりだって。俺のトコロは STL も Boost も遠慮無く使う方針で
行ってる。
変数の寿命管理は原則としてスマートポインタ必須で生 delete 禁止。
スマートポインタとは古いな。時代はGCだろ。
C++にeclipseのようにgetterとsetterを自動で書いてくれるツールはありませんか? お勧めの物を教えて下さい。
>>761 全データメンバに洩れなくgetter/setterがついてるコードでも書く気か?
情報隠蔽の理念と根本的に対立する思想だな
>>763 eclipseの場合は変数ごとにgetter,setterのチェックボックスのツリーが出てきて
自由にgetterとsetterを追加削除できるんです。
getterだけ追加してreadonlyにする事も簡単に出来ます
C++ではset/getなんてしないよ。 コンストラクタ以外のメンバは全て全部privateにして、 通信する相手は友達だけにする。 のは冗談としても、普通に構造体で直にアクセスさせることも 多い。set/getなんてまどろっこしいことはあまりやらない。
C++でPascalのようなbegin/endが使えるようになるツールはありませんか? C++でAPLのように行列の計算が入出力込みで1行で書けるツールはありませんか? C++でCOBOLのようにPERFORM THRUが使えるツールはありませんか? C++でJavaのようにGCが使えるツールはありませんか? ↑ てめえで作れつーの
ちょっと面倒だがそれくらい自分で書いたほうがいいかも。 ツール使う方がかえって面倒になることがある(例:VC++のメンバの追加ダイアログ)
YAGNI,YAGNI、と云いつつ、広域置換を使う俺。
どうも無さそうですね。仕方ないんで自作して使います。
>>772 propertyの存在も知っています。
結局propertyにしてもgetとsetはありますよね。
>>767 getter/setterが必須だと思うのなら手間を惜しむな。
#本来全く考えなしにgetter/setterを書くべきではない。そうであるなら大した手間ではないだろう。
どうしても手間を惜しみたいならeclipseで書け。
まさかeclipseではJavaしか開発できないなんて思っているわけじゃないだろ?
>>774 CDTにプロパティ自動生成があればeclipse使うんですが、
JDTにしか無いんですよね。リファクタリング機能にしてもプロパティ自動生成にしても。
>>773 …。
では、setter/getterなんて本来必要なくて、直接そのオブジェクト自身にIOまで行わせるべきだという主張の存在は?
(クラス構造が静的だと辛いけど、後付け可能なら無茶な話じゃ無い)
>>776 そもそも動的型付け以前に、
C++のようなプリミティブ型が存在する言語にそのような理想論を持ち込まれても困るんですが。
Java厨にはかまうな。放置しろ。
>>778 なんでそこでJava厨が出てくるのか貴方の頭の構造が全く理解不能です。
「OOPLとしてC++を使っている」、と、 「Javaの言語機能という制限上で培われた流儀のOOPをC++でも行おうとしている」、の微妙な違いというか
OOPLならば(
>>767 )って言うくらいだから
Java/C++/C#/ObjectPascal etcの「なんちゃってOO言語」じゃなく
SmalltalkとかEifellとかの純粋なOOPLの事を言ってるんだろうね。
こういう生物をJava厨って呼ぶのか。
えー、本を読んでいるとメンバ変数はprivateに入れろと書かれていますが、 やっぱり時と場合によってpublicにする場合もあると言う議論でしょうか? このレベルだと翻訳して貰わないと良く理解できません。
話しそれて申し訳ないけど、外からは使えないのに 記述的に公開しているprivateって概念は、 糞だと思うが仕方ないんだよな…
>「privateメンバには対応するgetter/setterを設ける」
って誰が言ってるんだ?
>>763 ?
>>786 761。
ツール=機械と読んだ。
自動=機械的に=人情は関係なしと読んだ。
privateはお前が言い出した妄想。
791 :
デフォルトの名無しさん :03/10/10 21:46
以降の流れについて説明する「まとまった処理についてのコメント」と、 「ちょっとした補足コメント」を区別したいのですが、これ!という方法があったらぜひ教えてください。 ■気分的にはこんな感じです //まとまった処理についてのコメント{ //ちょっとした補足コメント //ちょっとした補足コメント } ■↓だと「「ちょっとした補足コメント」の方が、スペースや位置的書きづらくて… //これから、まとまった処理が始まるよ int hoge = 7; //hogeについての、ちょっとした補足だよ ■↓だと、両者の区別がいまいちしづらくて… //これから、まとまった処理が始まるよ //hogeについての、ちょっとした補足だよ int hoge = 7;
///////////////////////////////////////////////////////////// //まとまった処理についてのコメント ///////////////////////////////////////////////////////////// hage::hage() { //hogeについての、ちょっとした補足だよ int hoge = 7; }
>>792 にゃるほど!ちょっと大人しめにしてマクロ登録しますた
レス感謝!ありがとうございやした
いやまてよ、「まとまった処理は関数にしろや」というアイロニーも 込められてるっぽいな。お気遣いありがとう。
/** * まとまった処理についてのコメント * @param * @return */
796 :
デフォルトの名無しさん :03/10/10 23:30
>>784 つかう場面がわからない君がクソだと思うぞ
799 :
デフォルトの名無しさん :03/10/11 10:50
最近ようやく入門書を読み終えて関数やクラスの使い方が わかってきた初心者ですが、質問させてください。 入門書やWeb上に文字列を扱うクラスなどはよく載ってるんですが、 それ以外に、自分のしたい事が実現できるクラスはみなさんどーやって 探してるんでしょうか?ネット上を徘徊したり本を読み漁って、 偶然そのクラスが使われているサンプルを見つけるんでしょうか・・・? そうだとしても、最初に使った人はどーやって使い方を覚えたのか気になります。 C++のクラス一覧みたいなものがどこかにあったら教えてください。
>>799 意味分からんw
クラスライブラリのリンク集ならこのスレの始めに
あるぞ。使い方とか、最低限ドキュメントに目を通してから
言えよ。
>>799 使い方というか、アルゴリズムの解説してる本なら沢山ある。
アルゴリズムの解説を読んで、クラスは自分で書く。
あと、有名なアルゴリズムなら大体誰かがコード化してる。
問題は大半が英語なのと、C言語(非OOP)で書かれてる事が多いこと。
C++ のクラス一覧は MSDN でも嫁。
>>802 >C言語(非OOP)
洩れの知る限りCで書かれたライブラリの多くは充分にOOPだが何か?
C++で書かれたMFCなんぞよりもずっとマシだったりする
>>803 ああ、まあ、ライブラリと呼べるようなまともな奴は確かに OOP してるし、
MFC の方がよっぽど糞だけど。
逆に俺は C で OOP してるソース見ると、
素直に C++ 使えよというやるせない気持ちになる。
805 :
デフォルトの名無しさん :03/10/11 14:09
char *buf=new char[100]; などという感じで確保したメモリを解放するときは、 delete buf; と delete[] buf; のどちらを使えばいいのでしょうか。 とりあえずコンパイルはどちらも通るんですが。
入門書を穴が開くほど読め。 話はそれからだ。
>>805 これを試して見るべし。分からなければmyallocは気にしなくて良い。
#include <iostream>
struct myalloc_type{} myalloc;
void *operator new(size_t size, myalloc_type)
{
&nbap;&nbap;&nbap;&nbap;std::cout << "new\n";
&nbap;&nbap;&nbap;&nbap;return ::operator new(size);
}
void *operator new[](size_t size, myalloc_type)
{
&nbap;&nbap;&nbap;&nbap;std::cout << "new[]\n";
&nbap;&nbap;&nbap;&nbap;return ::operator new[](size);
}
int main()
{
&nbap;&nbap;&nbap;&nbap;char *buf = new(myalloc) char[100];
}
>>806 配列サイズが定数のときの挙動までは書いていない入門書もあると思われ。
ミスった。もう一回 #include <iostream> struct myalloc_type{} myalloc; void *operator new(size_t size, myalloc_type) { std::cout << "new\n"; return ::operator new(size); } void *operator new[](size_t size, myalloc_type) { std::cout << "new[]\n"; return ::operator new[](size); } int main() { char *buf = new(myalloc) char[100]; }
>>807 定数かどうかがどう関係あるんだろうか。
811 :
デフォルトの名無しさん :03/10/11 15:00
実行時にバンドルなんたらって出るエラーは、 どういうとき出るエラーか、誰か教えてくだされ。
newで配列を確保する場合、もしそれがクラスオブジェクトの配列ならば、 delete[]とdeleteのどちらでも、配列の要素すべてが解放される。 違いは、delete[]の場合全要素に対してデストラクタが呼ばれるのに対し、 deleteでは先頭要素のみデストラクタが呼ばれるということである。 と教科書に書いてあってびっくり。今まで知らなかった。
まさか、未定義だろ 各処理系でどうかは知ったことでないが
>>312 そんな教科書捨てろ
どこに嘘が書いてあるかわかったもんじゃない
C++の教科書は禿本かPrimerしかないと思ってるけど。 変に読者にこびったような本はダメぽ。
禿本って何?禿く分かるC++?(謎
禿々言うな。 お前等だって将来禿るかも知れないんだぞ?
うるせー禿
既につるっつるに剃りあげてますが何か?
まだあるのに自ら剃るなんてなんて罰当たりな
いやらしい程のM禿で、見るにみかねて、、、スレ違いスマソ
>>816 確かにあの二冊は読者に優しくないよな。
分厚くて重くて大きくて・・・・
>>823 私は禿本を風呂の中に持ち込んで読みましたが何か?
本は湯船につかってゆっくり読む習慣なので。
>>824 ああなるほど。水に浮かべれば浮力で重さが気にならなくなると。
>>823 私はあの本を見ながらオナニ○しましたがナニか?
「ハァハァ・・・・・vector
ハァハァ・・・・・string
ハァハァ・・・・・いてれーたぁー。」
と、このように。
最近VC++触りだした、浦島太郎ですが。 VCでの最初のスタートは下記のようですが。 _tMain(....) _tWinMain(....) 昔は main() WinMain() だったはず。 どういった理由や意味で変わったのでしょう? 「_t」て、なに? いろいろサーチしたけど、見つからなかったのでお願いします。
質問させて下さい。VC6.0です。 #include <iostream> #include <iterator> #include <sstream> #include <conio.h> void main() { std::wostringstream ss; std::ostream_iterator<wchar_t, wchar_t> it(ss, L","); *(it++) = L'A'; *(it++) = L'B'; *(it++) = L'C'; std::wcout << ss.str() << std::endl; getch(); } A,B,C, と表示されるのを期待してるんですけど、 wchar_tがshortとして扱われる為 65,66,67, と表示されてしまいます。 どうしたらいいんでしょう?
>828 さんありがとうございます。 確かに昔は内部コードはSJISだったかな、(うろ覚え 「_t」でソース内の日本語文字列がUNICODEになって オブジェクトになると考えていいですか?
>>629 wchar_tを正しくサポートするコンパイラを使う。
>>831 いい加減、VC++6ってのはもうダメだろ。金ないなら
.NETSDKにcl.exeついてくるんだからそれでもつかえと。
cygwinでもいいけどさ。
>>831-832 なるほど、VC6のせいでしたか。
boost::regex使ってて出た問題だったんですが、
これじゃ他の部分もまともに動いてるかどうか、わからないですね。
どうもありがとうございました。
>>830 自己レス。
main
_tmain (Win32
_tWinMain (MFC
でやってみたけど、EXEをHEXダンプで見たら、3つともSJISで
文字列入ってた、謎だ。
多分どこかが、UNICODEなんだろう、きっと・・・・・
何処なんだろうと、聞いてみる?^^;
WinMain(HINSTANCE, HINSTANCE, char*, int); wWinMain(HINSTANCE, HINSTANCE, wchar_t*, int);
>>834 828がUNICODEに対応させるとは書いたが、UNICODEになるとは誰も書いてない。
コンパイルオプション
>>833-837 さんいろいろありがとう。
いろいろやって見て、一応の理解ができました。
ちなみに、
>>829 のソースはVC++.NET2003ではA,B,Cと出ます。
みなさんありがとーー
>>834 そんなのどうでもいいから早くUnicodeでコンパイルする方法を調べろ
>>829 std::locale::global(std::locale("japanese"));
IDEとしてのVC6にはなんの不満もないので、cl.exeだけ差し替えて、
(バッチ使って別にコンパイルとかではなく)、そのまま使えないかなぁ…。
などと
>>832 見ながら思った秋の夜長…。
>IDEとしてのVC6 class宣言がマクロ化されてるとアウトなのはちょっと勘弁してほしい templateインスタンス型のメンバを保守できないとわかったときはズッコケた
ncbdj状態も頻度高杉
>>841 .NETSDKのcl.exeとPSDKとVC++6を組み合わせて使ってます。
特に問題ないです。
.NET SDK の cl.exe は最適化できないとか言ううわさを聞いた気がするんだけど その辺りどうなの?
>>845 できないといわれてるけど、/G[3-7]オプションはとおるよ。
versionは13.10.3077
/G[3-7]は単体で意味あんの? /O[1-2]と組み合わせないと意味無いんじゃないの?
>>847 Uni厨で済みませんでした。無知で恥かしいです。
$cl.exe /G6 /O2 test.c
Microsoft(R) 32-bit C/C++ Standard Compiler Version 13.10.3077 for 80x86
Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
cl : コマンド ライン warning D4029 : 標準の編集コンパイラでは最適化は使用できません。
test.c
Microsoft (R) Incremental Linker Version 7.10.3077
Copyright (C) Microsoft Corporation. All rights reserved.
/out:test.exe
つーかgccでも単体で-march=i686なんてやらないで-O2とか-O3と組み合わせて使うよね。
RDBで複数の項目にインデックスを貼って高速に検索できるのと同じように、 2種類以上の項目で対数時間で検索ができるようなコンテナはC++には無いですか? 分かりやすく言うと class Board { std::string name_; int id_; time_t time; //メソッド省略 //findByName(), findById(), findByTime() }; このようなクラスのインスタンスをたくさんコンテナに格納して、 findByName(), findById(), findByTime()のどれでも線形時間ではなく、 対数時間で結果のイテレータが帰ってくるようなコンテナが欲しいんですが。
852 :
デフォルトの名無しさん :03/10/13 15:10
後学のために伺いたいのですが、 「std::listの要素をサーチして、条件が一致したものをlistからeraseしていく」 …という作業を、普通に初期化した形のfor文で、 実現することは出来ないのでしょうか?
>>852 なぜforで? std::remove_ifじゃ駄目?
まあ、forで手書きするならこんな感じか:
typedef list<T> some_list_t;
some_list_t a_list;
for ( some_list_t::iterator p = a_list.begin(); p != a_list.end(); ) {
if ( 条件 ) {
p = a_list.erase(p);
} else {
++p;
}
}
下記のコードでなぜか最後の行が2回読み込まれてしまうようで、 最後の人が2人になってしまいます。 どう書き直せばいいのでしょうか? ifstream ifs("address.txt"); vector<Person*> vec; string name, address; while(ifs) { ifs >> name >> address; vec.push_back(new Person(name, address)); }
>>853 レスサンクスです。いえ、なんの変哲もない順次サーチ=for文、
みたいな固定観念ができてしまっていて…。
for文の例、およびremove_ifの提示ありがとうございました。
remove_if使ったこと無かったです。これから調べてみます。便利ですね。
>>855 あ、listには専用にメンバ関数としてremove_ifがあるから
それ使うよろし
自己解決しました。 こうやったらうまくいきました。 for(;;) { ifs >> id >> name; if(!ifs) break; boards_.push_back(BoardPtr(new Board(id, name))); }
間違えて元のコードを晒してしまいました…
>>850 std::set<boost::shared_ptr<Board> > index_by_name(pred(BY_NAME));
みたいなのをインデックスにしたい項目の数だけ作って全部に登録、とか?
861 :
デフォルトの名無しさん :03/10/15 01:38
下記のコードですが、count_ifのところでsegfaultを起こしてしまいます。 どこがおかしいんでしょう? #include <iostream> #include <vector> #include <algorithm> static bool check_c(char input){ return input=='c'; } int main(){ vector<char> sequence; int c; for(int i =0; i < 2; i++) for(int j =0; j < 5; j++) sequence.push_back( 'a' + j ); cout<<sequence.begin()<<endl; cout<<endl; c = count_if<vector<char>::iterator, bool(char)>(sequence.begin(), sequence.end(), check_c); c = count<vector<char>::iterator, char>(sequence.begin(), sequence.end(), 'c'); cout<<c<<endl; }
>>861 segfault以前にコンパイル通らないはずだから確かめてないけど。
> cout<<sequence.begin()<<endl;
ここだろうね。
不完全クラスに継承関係を明示する方法ってあります? 基底クラスのポインタに変換するのに、無理矢理reinterpret_castして、 とりあえず正常に動かすことは出来るのですが。
>>862 その行をコメントアウトしても変化はありません。
実は、そこはただの手抜きで…
デバッガから見て、char* だったのでつけ足しただけのものなんです。
c = count_if<vector<char>::iterator, bool(char)>(sequence.begin(), sequence.end(), check_c); を c = count_if( sequence.begin(), sequence.end(), check_c); にしてみる。
>>864 count_ifの中は追ってみたの?
なんにせよコンパイラもSTLの種類も示されないんじゃなんともね。
using namespace std;が抜けてるみたいだし。
>>861 count_if<vector<char>::iterator, bool(*)(char)>
bool(char)でコンパイル通るのが悪いと思うんだが。
>>867 bool(char)は正しい表記だったと思うよ
>>868 表記は正しいが、そのテンプレート引数だと関数型を値渡しすることになる。
関数型の値渡しができたっけ?
>>869 bool(char)はbool(*)(char)と同等だった気がする。
どこで見たのかは忘れたが。
>>867 それが正解でした。ありがとうございます。
コンパイラは、gcc-2.96-113 というRedhat Linuxのものです。
本来は通らないはずのコードだったのか…
gcc 3.3.1 (cygming) でテストしてみた。
↓は"redefinition of `int call(int (*)(int))'"
int call( int x(int) ){ return x(0); }
int call( int(*x)(int) ){ return x(0); }
↓はエラー無し
template< typename Function >
int call( Function x ){ return x(0); }
template int call<int(int)>( int(int) );
template int call<int(*)(int)>( int(*)(int) );
バグってるように見える。
>>861 はgccかな?
VC++7.1 template< typename T > char const* typename_of( T r ){ return typeid( r ).name(); } int main(){ std::cout << typename_of< bool(char) >( check_c ) << std::endl; std::cout << typename_of< bool(*)(char) >( check_c ) << std::endl; } 一つ目は関数が値渡しされてた。 式内ではどちらも関数ポインタとして扱われるもよう。
8.3.5 -3- より。
"After determining the type of each parameter, any parameter of type ``array of T'' or ``function returning T'' is adjusted to be ``pointer to T'' or ``pointer to function returning T,'' respectively."
というわけで、関数の引数においては
>>870 が正しいみたい。
14.8.2 -3- によると、
この変換がテンプレートのときにもいちおう関係はするようだが、
Noteとして書かれている
"f<int>(1) and f<const int>(1) call distinct functions even though both of the functions called have the same function type."
というのが怪しい。
変換後の仮引数がいっしょになるとしても、別々の関数としてコンパイルされるみたい。
で、gccで試したところでは、bool(*)(char)で実体化したほうは正しく動作するが、
bool(char)で実体化したほうのコードが死んでるっぽい。
仮引数リストは同じなので同じコードになるはずなのに、
bool(char)で実体化したときになんだかへんなコードが出る。クラッシュするコードかどうかは未確認。
バグ持ち(bool(char))とバグ無し(bool(*)(char))のアセンブラ出力をdiffで並べてみました。 スタックに積んでルーチン呼ぶまでは一緒ですが、確かにルーチン内の処理が各々で異なっています。 --- bug.s Wed Oct 15 03:14:53 2003 +++ non-bug.s Wed Oct 15 03:13:55 2003 @@ -17,25 +17,21 @@ movl %eax, %eax pushl %eax .LCFI10: - call count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type + call count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type ------------------------------------------(略)---------------------------------------------------- - .section .gnu.linkonce.t.count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,"ax",@progbits + .section .gnu.linkonce.t.count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,"ax",@progbits .align 4 - .weak count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type - .type count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,@function -count_if__H2ZPcZFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type: + .weak count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type + .type count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type,@function +count_if__H2ZPcZPFc_b_X01X01X11_Q2t15iterator_traits1ZX0115difference_type:
.LFB10: pushl %ebp .LCFI38: movl %esp, %ebp .LCFI39: - subl $24, %esp + subl $8, %esp .LCFI40: - movl 16(%ebp), %eax - movl 20(%ebp), %edx - movl %eax, -8(%ebp) - movl %edx, -4(%ebp) - movl $0, -12(%ebp) + movl $0, -4(%ebp) .p2align 2 .L54: movl 8(%ebp), %eax @@ -45,28 +41,28 @@ .p2align 2 .L57: subl $12, %esp - leal -8(%ebp), %edx movl 8(%ebp), %eax movsbl (%eax),%eax pushl %eax + movl 16(%ebp), %eax .LCFI41: - call *%edx + call *%eax
x86のアーキテクチャ調べて来たよん。 結局、lealで関数ポインタを二重参照しているのが原因とわかりました。 count_if(8(%ebp),12(%ebp),16(%ebp)){ movl 16(%ebp), %eax movl %eax, -8(%ebp) leal -8(%ebp), %edx call %edx } ↓省略 count_if(8(%ebp),12(%ebp),16(%ebp)){ leal 16(%ebp), %edx call *%edx } ↓C++風に。 count_if(*a,*b, void (*func)()){ *(&func)(); }
こっちも意見を聞かせてよ。 ソースがないから駄目なのか? <B.H> class B {}; <D.H> #include "B.H" class D : public B {}; <sub.cpp> #include "D.H" D dins; D *d = &dins; <main.cpp> #include "B.H" class D; void func(B *b) {} void main(void) { extern D *d; func(d); } func(d)をfunc(reinterpret_cast<B *>(d))にすれば、 とりあえずちゃんと動くけど そもそも不完全クラスの宣言に class D : public B; と言う意味を持たせて、reinterpret_castを使わずに済ます方法はないでしょうか?
>>879 D も B もわかって無いのに reinterpret_cast 以外のキャストをどうやって実行するの?
君の使ってるコンパイラが
static_cast< B* >( D* ) == reinterpret_cast< B* >( D* )
だとしても、他の環境でもそうとは限らない。
class D: public A, public B;
なら、多分君のコンパイラでも static_cast< B* >( D* ) するためには sizeof( A ) がわからないといけないはず。
>>879 D * dではなくて B * dでいいと思うけど。
そうすればmainからDについて知る必要ないし。
//base.h
class Base{public:
virtual void print()=0;
virtual ~Base(){}};
//Test.h
class Test:public Base{public:
void print();}:
//func.h
Base * CreateTest();
//sub.cpp
#include "Base.h"
#include "Test.h"
#include "func.h"
#include <iostream>
Base * CreateTest(){
return new Test;}
void Test::print(){
std::cout << "Test::print()" << std::endl;
}
//main.cpp
#include "Base.h"
#include "func.h"
int main(){ Base * p=CreateTest();
p->print();//Test::printが呼ばれる
delete p;
return 0;
}
まあ実際はboost::shared_ptrとかstd::auto_ptrとか使うだろうけど。
>881 ああそうか、自分の例で言うところの extern D *d; が、そもそもD *でなくてもB *で充分ですね。 何でこんな単純なことに気が付けなかったんだ? とにかくこれで安心して眠れます。ありがとうございました。
つかぬ事をお伺いしますが、ローカルにおける文字列リテラルが static constであることは言語規格上、保証されていますでしょうか?
禿々言うな。 お前等だって将来禿るかも知れないんだぞ?
C++のコードをJavaに書き直すことはできますか?
1394カメラをJavaで動かしたいんですけど、 Javaでの動かし方がよくわかりません。 そのカメラには、付属のアプリケーションが付いており、 そのソースコードも付いてました。(VCとC++) なので、そのコードをJavaに書き直してもらいたいのです。
すまん、禿...もといStroustrup本に書いてあった。 「文字列リテラルの型はconst char[N]であり... 静的に割り当てられる。」 char*への代入が許されるから、定数として扱うかはベンダ依存かと思ってた。 ISO/IEC14882:1998(E)の規格票は持っていない。 つか欲しいんだけどどこで手に入る?
JavaってIEEE1394というデバイスを叩けたっけ?
892 :
デフォルトの名無しさん :03/10/17 17:21
>>888 Linux とかならできるんじゃない?
Windows だと、そのへんは stream class mini driver をDirectShow の API が
ラッパするような形になってると思うんだけど、これは Java からは使えません。
894 :
デフォルトの名無しさん :03/10/17 20:12
複数種類のクラスをしまっておけるバッファを作る時、 class A; class B; class Buf { union { A a; B b; }; } コンストラクタのあるクラスだとunionは使えないんですが、何かいい手はないでしょうか? マクロかboostか何かでmax(sizeof(A), sizeof(B))を取ってやるしかないんでしょうか。
>>894 cvsからboostの最新版を落としてきてboost::variant。これ。
896 :
デフォルトの名無しさん :03/10/17 20:47
>>895 あれは使っているコンパイラでエラーが出ます。
読み込みたいテキストファイルの前半にに不必要な部分があるのですが、 その部分を除いてそのテキストファイルを読み込むことはできますか? c言語初心者です、お願いします。
899 :
デフォルトの名無しさん :03/10/17 21:28
【1:898】「C++」相談室 part23
むむ、オヌシ初心者だな。
c言語の本をまだ一冊しか読んでないので、 よくわからないのですが、どうしたら不必要な部分を 除いて読み込むことができるのですか?教えてください。
>>894 何でそんなことしたいのかが分からん。
自分で取ったバッファ内に A とか B のインスタンスを作りたいんだったら、
placement new 使え。
>>895 なるほど、そんなもんがあるんですか…
しかしcvsから取ってくるのはちょっと恐いなぁ。せめてリリースされてるのに入ってればいいんだけど…
>>906 通信回りのバッファの扱いとか、パフォーマンスを気にする時のメモリ管理とか、
結構色々使います。
要するにunionが使いたいところです。
>>907 ならやっぱりplacement newでいいんでは?
>>908 いや、placement newする前、どれくらいの大きさのバッファを確保するか、の方にからむ問題です。
>>909 template<int a, int b>
class Max
{
enum{Value = a > b ? a : b};
}
char buf[Max<sizeof(A), sizeof(B)>];
あっ、適当に書いたから間違いまくってるや・・・ template<int a, int b> class Max { public: enum{Value = a > b ? a : b}; } char buf[Max<sizeof(A), sizeof(B)>::Value];
>>910 そうですね、そんな感じでやるかなぁというのを894の最後に書いてみたんですが、
これだとちょっと嫌な点があって、アライメントで問題が起きる可能性があるんですよね。
まぁそれは、気にしながらclass Bufの中身の配置をするか、
複数クラスの入る場所の大きさにゆとりを持たせて先頭をちょっと調整するかだと思うんですが、
union的に扱えればずっと楽なのでそういうのないかなぁと。
あと、微妙に直観的じゃないのが嫌とか、実際には数10個のクラスを押し込むので
タイプリストを作って全体のMaxを取らなくちゃとか、微妙に腰が引ける感じが…
もちろんこちらは本質的な問題ではないんですけどね。
>>894 class A{};
class B{};
class Buf {
char buf[sizeof(A)>sizeof(B)?sizeof(A):sizeof(B)];
public:
A & GetA(){return *reinterpret_cast<A*>(buf);}
A & GetB(){return *reinterpret_cast<B*>(buf);}
template <typename T> T & Get{return *reinterpret_cast<T*>(buf);}
};
int main(){
Buf o;
new (&o.GetA()) A;
o.GetA().~A();
return 0;
}
//やや力押し気味、lokiのタイプリストとか使えば3つ以上のunionにも使えるだろうけど
classをバイナリコピーするの?
union で持たせるメリットが分からないなぁ。メモリ節約したいって話なら、 operator new を自前で書いて、使う側は void* ででも受けとけば良いん じゃないの?
>union で持たせるメリット だから、アライメントだろ?
>>915 うーん、節約したいというわけではないけど。例えば…
class UserBase {
int user_defined_info;
};
class A : public UserBase {}; // class Bも同様
class Elm {
Elm *next;
union {
A a;
B b;
};
};
Elmは自分が使う側、ユーザはAだのBだのを使う感じで、
Elmのリストの中からuser_defined_infoを拾ってくる場合とか。
Elmの中にUserBase *を埋めておくだけという実装も可能だけど、それだと遅くなるとか、
Elmのサイズが揃ってるとメモリ管理が容易になるとか、
ライトバリアのかかったページにしかオブジェクトをおいちゃダメとか(これは今思いついただけだけど)、
まぁそれなりに状況は考えられますね。
そこまでかつかつに効率を求めるならクラス化する必要は無いと思うが。
>>918 そいつはそうなんですけどね。
でもまぁ少しでも楽ができてかつバグの入りにくい形にしたいじゃないですか。
今のところ、単なるstructで逃げたり、char[MAX_SIZE]で逃げたり、
Base *で逃げたりしてるわけですけど、もう少し何とかならんかなぁと。
紹介してもらったboost::variantが早く標準にならないかなぁ。
variantはコンストラクタ・デストラクタはどういう扱いなのかな?
調べておくか…
class A{ std::vector<std::vector<double> > a; public: A(std::vector<std::vector<double> > b = std::vector<std::vector<double> >()) : a(b) {} }; という感じのクラスがあります。他にも関数がありますが、std::deque でも出来る操作しか使っていません。このクラスのコンテナを vectorとdequeから選んだり、コンテナの中の型をdouble以外の ものにしたりするためにテンプレートを使いたいのですが、 やり方が分かりません。どうか教えてくださいませ。。
>>918 ゲームでも作るんですか?
何かそれっぽい気がしたんですけど。
template<class T, typname U> class A{ T< T< U > > a; とかか?
>>920 その程度ならtypedefしとくだけで1行書き換えれば変更できるようになる。
template<template<typename> class Container, typename T>
class A{
Container<Container<T> > a;
public:
A(Container<Container<T> > b =
Container<Container<T> >()) : a(b) {}
};
A<std::vector, double> hoge; // のように使う
でも
>>923 が正解な気がする。
>>922 -924 有難うございます。
typedef std::vector Container;
typedef std::deque Container;
のどちらかを条件コンパイルするかコメントアウトするかして
クラス定義内でContainerを使うということですね。
ちなみに、Containerにstd::listを使いたいときは、
>>924 さんの
方法に部分特殊化を使えばいいのでしょうか?
>>917 > Elmの中にUserBase *を埋めておくだけという実装も可能だけど、それだと遅くなるとか、
本当に遅くなるか吟味した方が良いぞ。
特にキャッシュが少ない環境だと、大きなデータをリストでつなぐより、小さなインデクスを
配列にとってデータは void* の先においておく方がキャッシュミスが減ったりするし。
>>918 クラス化するなというか、コンストラクタ・デストラクタを自前で定義しなければ良いだけ
だよね。初期化用のメンバ関数を別に定義すれば良いだけ。
そういう形で使う以上、いずれにせよ A, B の確保・解放はユーザ側ではなく Elm 側で
行うんだろうし。
鈴木宗男氏が立候補を断念したそうだ。
930 :
デフォルトの名無しさん :03/10/18 18:14
Visual C++ Runtime Library の メッセージボックスが開いて、 Runtime Error! とメッセージを残して、強制終了(ノToT)ノ なぜだ〜
>>921 サーバとか、言語処理系とか、ゲームとか。
>>926 そうですね。まぁ
>>917 の例でAがでかくなったらUserBaseのみElmに入れて
A固有メンバはpimpleでしょうけど。
まプロファイル取らないとなんとも。
>>927 そうですね。その方法でいいと思いますが、
微妙に嫌なのは、デフォルトコンストラクタに相当するものが
void A::init() { UserBase::init(); ... }
と、必ずBaseクラスの初期化メソッドを明示的に呼ばなきゃいけない点かな。
c++のソフトはwinnyで落とそう。
933 :
デフォルトの名無しさん :03/10/18 21:28
クラスのメンバ関数で 引数に継承元のクラスのオブジェクトを入れたら 「シンタックスエラーerror C2061: 構文エラー : 識別子 'class1' がシンタックスエラーを起こしました。」 というエラーが出てしまいます。 何が原因なんでしょう? 後、シンタックスエラーって何ですか?
934 :
デフォルトの名無しさん :03/10/18 21:38
シンタックス=文法論 セマンティクス=意味論 つーか、ぐぐれよそんくらい
【演習】次の例文に含まれる、シンタックスエラーとセマンティクスエラーをなるべく多く指摘せよ。 C++のソフトを そんな悪いインターネットから落としたら 危険が危ないよ ↑
>>931 なぜ placement new を嫌がるのかさっぱりわからん。
class C
{
public:
C( bool is_A ) : is_A( is_A ){ is_A ? (void)new(buf)A : (void)new(buf)B; }
~C(void){ isA() ? (void)asA().~A(): (void)asB().~B(); }
A& asA(){ return *reinterpret_cast< A* >( buf ); }
B& asB(){ return *reinterpret_cast< B* >( buf ); }
A const& asA() const{ return *reinterpret_cast< A const* >( buf ); }
B const& asB() const{ return *reinterpret_cast< B const* >( buf ); }
bool isA() const{ return is_A; }
private:
bool is_A;
char buf[sizeof( A )>sizeof( B ) ? sizeof( A ) : sizeof( B )];
};
asA() 等の呼び出しは最適化で消えてなくなり、直接アクセスしたのと同じことになる(VC7.1で確認)。
無理やり union 使ってキモイ思いするよりはるかに良い。
つか、unionって使ったことない。 そんなにメモリの節約がしたいのか?
http://www.cs.wisc.edu/~ghost/gsview/get45.htm のコンパイルがうまくいきません。
readme.htmの指示どおりに調節したのですが、
"C:\Program Files\Microsoft Visual Studio\common\msdev98\bin\rc" -D_MSC_VER -D_Windows -D__WIN32__ -I"C:\Program Files\Microsoft Visual Studio\vc98\include" -i"C:\Program Files\Microsoft Visual Studio\vc98\include" -i".\src" -i".\srcwin" -i".\obj"
-i"en" -fo.\obj\gsvw32en.res .\srcwin\gvwin1.rc
指定されたパスが見つかりません。
というエラーが出ます。これはどうすればよいでしょうか?
>>939 指定したパスがあるかどうか確認したら?
>>937-938 いやだからplacement newは当然使えるし、必要なら使うんですよ。unionであっても。
問題はそこじゃないんですよ。
937の例でいうなら、もしAとかBにアライメントが必要な要素が入ってたらダメでしょ?
別にメモリの節約のために使ってるんじゃないんですよ。
>>942 アライメントの問題だと何回書かれたら分かるんだ?
>>944 それが、わからないから聞いてるんだ。
具体的にA、Bがどういう型のとき問題になるのか教えてちょ。
>>945 ちょっとアライメントを勉強したほうがいい
仮想関数もってるだけでダメになる場合もあるぞ
sizeof(A) って、アライメントとか仮想関数テーブルへのポインタ込みのサイズ返すんじゃないの?
>>948 じゃあ、何が問題なん?
普通に sizeof(A) 分のバッファ確保しとけば union なんて無くても placement new 出来るじゃん。
そのバッファのアライメントがAのアライメント要求を満たさなければならない。
>>949 937の例でいうと、char buf[]の先頭がアライメントを意識して置かれていない可能性があるのが問題です。
>>952 static void* operator new(size_t) を適切に定義しておけ。
>>953 もうオマエは黙ってろよと、見当違いもいい加減にシロ
と894は思ってるよ、多分
>>951 意味がわかりません。
仮に、「それ」が「コンパイラの制限」だとしたら、
「普通に sizeof(A) 分のバッファ確保しとけば placement new 出来る」ことになるのですか?
>>953 それで逃げる手が一つですね。ただしその場合は、Elm側からAにアクセスするたびに
必ずアライメント計算をしなくちゃならなくなります。
あ、もちろんbufのサイズは max(sizeof(A), sizeof(B))+アライメント分
にしておかないとダメです。
とりあえず
struct X {
char a;
char buf[8];
};
struct Y {
char a;
union {
char buf[8];
double d;
};
};
のsizeofでも見て、Y.dにアクセスしたい時の事を考えてみて下さい。
>>941 A とか B の placement new を、アライメント意識して書けば良いだけだと思うが……。
デフォルトだと「渡されたアドレスそのまま」返すことになってるけど、別にオフセット
調整しても良いんだし。
いちいちクラス毎に placement new 実装するのがダサイって話だと、そもそも
アライメント調整必須な段階で placement じゃない new も書き直す必要がある
(全部の処理系とはいわないが gcc 3.x とかはそう) から、手間は変わらないよ。
自動変数や static 変数だと、コンパイラ・リンカがよろしく取りはからってくれるけど、
new 使うとなると自前で工夫するのは大前提。
じゃあ、bufの前にintでもおいて、alignmentを意図すればいいじゃないか。 あるいは、charでなく、intでbufを確保する手もあるし。
え?なんでstatic void* operator new(size_t) を適切に定義することが回避方法になんの? char buf[5454]; new(buf) A; としてもその再定義したnewは呼ばれないぞ?
>>959 たぶん引数に void* を書き忘れてるんだと思うが。
>>958 世の中には8バイトアライメントや16バイトアライメントを必要とするものがあるのだよ
>>961 なら char を 7 つとか 15 とか挟んどけ。
>>957 see 956
>>958 , 962
see 912
>>959 その通りでした。文脈で明らかにplacement newの話だと思ったので
そう思い込んで返事しました。
>union的に扱えればずっと楽なのでそういうのないかなぁと。 結局、「ない」ってのが答えだろ。
>>895-965 みたいなのを全て考えた上で boost::variant が
あるんだから、素直に使うかせめてソース読むかしようよ…
と思うんだがどうか。 1.31に入ることは確定してるから待つんでもいいが。
>>907
>>963 そもそも 894 の段階で、A, B が特定のアライメントを要求するなら、暗黙の Buf::new(size_t) を
使って new Buf できなくなってるワケだが……。
>>966 おっしゃる通りです。私も別にboost::variantを使わないつもりはないのでそうします。
boostがどうやって回避してるか非常に興味深いし。
途中で「どうしてplacement newじゃダメなの?」とか言われたから
「まぁそういう疑問を持つ人も居るのかな?」とか思って返事したまでで。
特にゴネてるつもりはなかったんですが…
>>967 これ本当?unionなら大丈夫でしょ?そう信じて今まで書いてきたんだけど…
お前らが騒いでる間に任意のアラインメントに対応できるコード書いた。 長いのでどっか貼り付けてくるからまってれ。
>>968 > これ本当?unionなら大丈夫でしょ?
処理系・ライブラリ依存だと思うが、俺の環境 (gcc 3.2 にベンダーがローカルな
パッチを当てたもの) だとダメだった。new Buf すると、単に
void *p = ::operator new(sizeof(Buf))
でヒープからメモリを持ってきて、この p をオフセット調整なしで使う。
だから 32byte aligned なメモリが欲しければ Buf クラスの operator new を自前で
定義して 32byte aligned なメモリを持ってくるように書き直す必要がある。
自動変数ならばコンパイラがスタックフレームポインタ調整を入れるし、static, global
変数はリンク時にリンカがメモリを適切に割り当てるから問題ないんだけど。
>>970 それは単に class A と class B にアラインメントが必要ないからではなかろうか。
>>971 そんなことはない。ちょうど先日はまった話なんだが
class Foo {
u_char buf[1024] __attribute__((aligned(64))); // このメンバ変数は 64 バイトアライメント
};
といったクラスを用意して new Foo したら、buf か必ずしも 64 バイトアライメントされずに
困った。
アセンブラコードを出力させて調べたら
>>970 みたいな状況だったので、Foo クラス内に
static void* operator new(size_t n) { return memalign(64, n); }
// memalign は指定したアライメントでヒープからメモリを切り出す関数
と追加して事なきを得た次第。
>>972 PS2でつか?
struct aligned_t{};
namespace{ aligned_t aligned; }
void *operator new(size_t size,aligned_t,size_t n) {
return memalign(n,size);
}
int main(){
int *p=new(aligned,64) int;
}
こういう解決方法はどう?
>>974 > int *p=new(aligned,64) int;
それも良いアイデアだと思うけど、うっかり new(aligned, 64) Buf すべきところを new Buf しても
コンパイル時に検出できないのが悲しい。
C++ だと、ランタイムエラーよりはコンパイルエラーの方が何かと幸せだから。
CISCの派生CPUしか使った事がない 人ばかり見たいですね。このスレは。 でもその派生CPUでも高速化のためには 必要なんですけどね。 アライメント調整。
普通に struct A, struct B と const int MAX_SIZE = Max<sizeof(A), sizeof(B)>::Value; struct Buffer { enum{BUFFER_SIZE = MAX_SIZE / sizeof(int) + 1}; int buf[BUFFER_SIZE]; } とか定義しといたら、A も B も Buffer もその先頭が アライメント境界にくるように自動的に調整されないの? 調整されるんだったら、Buffer 型の配列作っといて、 それのアドレスを placement new に渡せば問題ないんじゃないの?
>>975 mallocで確保したメモリがどんなアライメント要求も満たすのが前提だから、
dlmallocにアライメント設定してmalloc置き換えるようにリンクさせればいいんじゃない?
>>977 Buffer はアラインメント境界に来るけど、それが A や B にとっても正しいとは限らない。
>>977 それだと、ふつうはintのアライメントを満たしてるだけだろな。
>>970-972 ぐは。そうなんですか。かなりショック。
mallocにはアライメントは無理だってのは知ってたけど、
C++はせっかくnewに型渡してるのに意味ないじゃん。
情報ありがとうございました。
とりあえず週明けにstroustrup本にでも仕様を聞いてみますかねぇ。家にはない…
>>981 禿本には gcc の独自拡張である __attribute__ が載っているのか?
>>978 > mallocで確保したメモリがどんなアライメント要求も満たすのが前提だから、
処理系が知っているオブジェクトに対してはね。
__attribute__((aligned(64))); なんて物まで考慮に入れられないだろ。きりがない。
つーか、入れられても困るし。
>>981 > C++はせっかくnewに型渡してるのに意味ないじゃん。
そもそもユーザが明示的にアライメントを指定するのは、ANSI C++ 規格の範疇から
外れてるから。
ANSI C++ だと new Foo で呼ばれる operator new の型が
void* operator new(size_t n);
と決まっているので、アライメント値を渡す余地がない。
>>975 private: static void* operator new(size_t);
でOK?
>>985 それなら
public: static void* operator new(size_t n) { return memalign(64, n); }
で良いような気が。
次スレだぁ〜
なに〜先越されたーーーーー
おれがスレ立てるからおまいらは、待っててください。
このまま頂上目指すのみ
まだ見ぬ次スレへのリンクが紫色なのなんでだろぉ
それはおとズレた事があるから
では閉じますか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。