C++相談室 part24

このエントリーをはてなブックマークに追加
217主婦(33歳)
C++オタがDelphiスレでウザイのですが、どうしたらいいのでしょう?
主婦なら主婦の仕事ちゃんとやってから質問しろ。
>>218
他の仕事の奴には言わないのに主婦だけ言うのなw
220デフォルトの名無しさん:03/10/22 08:15
日本の景気が悪いのは主婦がC++の勉強をしないからだ
221デフォルトの名無しさん:03/10/22 11:55
ゲーム用のキャラクタクラスで、今までこういう感じのつくりにしてました。

class Character
{
public
  // ↓実際はもっといっぱい列挙してます。各種状態異常のフラグとか、装備とか。
  enum PARAM{
    LEVEL,EXP,HP,MP,MHP,MMP,STR,INT,VIT,AGI,DEX,LUK,
    END};
  void SetParam(int i,int n){ param_[i] = n;}
  void AddParam(int i,int n){ param_[i] += n;}
  void SubParam(int i,int n){ param_[i] -= n;}
  int GetParam(int i){ return param_[i];}
  static int StatusBegin(void){return STR;}
  static int StatusEnd(void){return END;}
private:
  int param_[END];
}

全能力値に+10とか言う場合、
for (int i=Character::StatusBegin();i<Character::StatusEnd();++i){
  character_.AddParam(i,10);
}
という感じでかけて、製作過程でパラメータ数が変動しても
enumさえ変えればオッケーなので激しく楽……だと思ってたのですが、
デバッグのときにparam_[10]とかで確認せねばならず、すごく不便だと気づきました。
最初っからメンバ変数をint level_,exp_...;としておけばデバッグの時は
楽なんですけど、そうするとforでまわせなくて不便なのです……。
うまい解決策はないでしょうか?
222デフォルトの名無しさん:03/10/22 12:00
電卓の機能を模倣するプログラムを作成しなさい。
わかりません‥
どなたか教えていただきませんでしょうか‥
>>221
ステータスの変数を全てparamの配列にしてるのがそもそも間違い。
ちゃんと別々の変数にして、全能力値に+10とかやる場合は1つ1つ書いていく。
それからアイテムや魔法の効果は別のスクリプト書いてやるべき。
ハードコーディングは実験の時以外はやめた方がいい。
ああ、変数を別々にやる方法もやってたのか。
forで回せないなんて言ってるけど、高々10個程度の変数なら
そこにforを使ったぐらいでソースが短くなったりきれいになることはないからやめな。
>>221
デフォルトコンストラクタのデフォルト引数でも利用して最初に初期化。
226221:03/10/22 13:45
>>223-225
ありがとうございます。邪道ではありますけど、とりあえずの対処策を思いつけました。

class Character
{
public
  // ↓実際はもっといっぱい列挙してます。各種状態異常のフラグとか、装備とか。
  enum PARAM{
    LEVEL,EXP,HP,MP,MHP,MMP,STR,INT,VIT,AGI,DEX,LUK,
    END};
  void SetParam(int i,int n){ reinterpret_cast<int*>(this)[i] = n;}
  void AddParam(int i,int n){ reinterpret_cast<int*>(this)[i] += n;}
  void SubParam(int i,int n){ reinterpret_cast<int*>(this)[i] -= n;}
  int GetParam(int i){ return reinterpret_cast<int*>(this)[i];}
  static int StatusBegin(void){return STR;}
  static int StatusEnd(void){return END;}
private:
  int level_,exp_,hp_,mp_,mhp_,mmp_,str_,int_,vit_,agi_,dex_,luk_;
}

csvデータからバイナリデータに変換するツールでもこのヘッダを利用しますので、
enumを切るわけには行かなかったので、こうなりました。
無理やり感が漂ってますけど、ファイルからデータ読み込みしてみて
正常に動きましたので、とりあえずこれで行ってみようと思います。
(今はとにかく動かすのが優先な時期なので)
ちょっと怖いかも
内部union持たせた方が
228221:03/10/22 14:13
>>227
最初にunionでどうにかならないかと検討してたんですが、
配列のサイズをenum値で決定するところで詰まってしまったんです;;
うまくいく方法ってあります?
>>228
マジレスしていいか?
配列にするメリット、全然なし。やめろ。
class Character
{
  //...
private:
  union PARAM0{
    int RowParam[END];
    struct PARAM1 {
      int level_,exp_,hp_,mp_,mhp_,mmp_,str_,int_,vit_,agi_,dex_,luk_;
    } param;
  } param;
  struct PARAM2{
    int level_,exp_,hp_,mp_,mhp_,mmp_,str_,int_,vit_,agi_,dex_,luk_;
    int & operator[](int index){return *(reinterpret_cast<int *>(this)+index);
    int operator[](int index)const {return *(reinterpret_cast<int *>(this)+index);
  } param2;
  //ここからは気にしない方がいいと思う。
  typedef std::map<std::string,int> ContType;
  static ContType str2idobj;
  static void Init(){
    str2idobj["LEVEL"]=LEVEL;str2idobj["EXP"]=EXP;str2idobj["HP"]=HP;str2idobj["MP"]=MP;
    str2idobj["MHP"]=MHP;str2idobj["STR"]=HP;str2idobj["INT"]=MP;str2idobj["VIT"]=VIT;
    str2idobj["AGI"]=AGI;str2idobj["DEX"]=DEX;str2idobj["LUK"]=LUK;
  }
public:
  static int name2Id(const std::string & arg){
    ContType::iterator p=str2idobj.find(arg);
    if(p!=str2idobj.end()){return p->second;}
    assert(0);
  }
};
ところで >>221 よ、

"オブジェクト指向"

って言葉、理解しているか?
「理解しているか?」って質問もたいがい無意味だよな。
余計なターン消費しないでとっとと言いたいこと言え。
>>229
はい。ですから最終的には配列は消す予定です。今ほしいのは
とりあえずの急場をしのげる妥協案なので、配列のみバージョンとの
互換性を重視してます。

>>230
unionの記述方法、参考にさせていただきます。
あと、operator[]でリファレンス返せばいいんでしたね。そんなテクあったの忘れてました^^;
name2Idのほうは、csvからのデータ変換といっても、残念ながら"LEVEL"とかいう
文字列が入ってくるわけじゃないんです。
カンマ区切りの数字がどえーっと並んでて、このうち2列目〜5列目が能力値だから
数字の範囲は1-999,6列目〜10列目が状態異常フラグだから数字の範囲は0-1、
というようなときに、この2,5,6,10の代わりにヘッダのenum値を利用したい、という
ことなのです。この値が、わりと不定なので。
最終的にはこのenum値を利用しようとするのはあきらめることになりそうですけど。

>>231
厳密に議論しようとすると時間の無駄になる、とっても危険な単語である、
という程度までは理解できています。
とりあえず、なにがお気に触ったのかだけ教えてもらえればありがたいです。
>>232
今回も見事にあてはまりましたな
ふつうは素直にメンバ変数にしてアクセサをしこしこ書いて、
コンストラクタで設定してやればいいわな。
ファイルの書き出しメソッドも用意しとけば、呼び出し側で
ループする必要もないし。
なにより、仕様変更が起こって、パラメータの数や順序が
変わっても、メンバ変数とアクセサの追加、および書き出し
メソッドに少し手を加えるだけでいい。
データがどのように保持されているか考えなくて良い、という
のがオブジェクト指向の「情報隠蔽」のメリットなのだから、
仕様変更の度にパラメータとenumの値の対応を気にしている
現状は、とても、「オブジェクト指向」のメリットを利用して
いるとは、言えんわな。二次元配列にclassの皮がついているだけ。
うわあなんだこりゃ。
>>229
激しく同意
VS 2003 のC++のdynamic_castって正常に動作する?
ポインタ引数であっても(リファレンス引数じゃなくても)変換に失敗したとき例外を投げて、
Debug Errorメセージが出てストップしてしまう。
>>237
プロジェクトオプションの実行時型情報がデフォルトでオフだよ。
オンにしないと使えない
#include "stdafx.h"
#include <cstdio>
class A{
public:
A(){}
virtual int func(){ return 1; }
};
class B{
public:
B(){}
virtual int funcb(){ return 2;};
};
class C: public A, public B{
public:
C(){}
int func(){ return 3;};
};
int _tmain(int argc, _TCHAR* argv[])
{
C *CC = new C;
A *AA= CC;
B *BB;
fprintf(stderr, "%X\n", BB = dynamic_cast< B *>(AA));
return 0;
}
gcc ではちゃんとキャストできた。VC++ 7.01だとランタイムエラーで落ちる。
>>238
ありがとmOm
241デフォルトの名無しさん:03/10/22 18:06
A.copy( B )というメンバ関数があった場合
一般にBの内容をAにコピーするのでしょうか、それとも逆でしょうか。
242デフォルトの名無しさん:03/10/22 18:40
>>241
そこで迷うなら
そのような名前のメンバーは存在してはいけない
と思え
243231:03/10/22 18:43
>>233
>とりあえず、なにがお気に触ったのかだけ教えてもらえればありがたいです。

いや、別に藻前が悪いわけじゃない。
場数を踏めばそのうちにスタイルも変わってくるだろうし。
(ちなみに気に「サワル」のは「触る」ではなく「障る」だ。)

ただ、たとえばさ、今でも結構いるけど "VIP" と称して
10年以上前のセルシオやシーマをいじり倒して、
ローダウンさせたりゴテゴテ派手な部品を取り付けたりしている車が
あるけど、藻前、あれらを見てどう思う?

漏れはこのコードを見たとき、なんとなくああいう車を見せられた時
のような感じを受けただけの事。
年寄りの繰言だと思って聞き流してくれ。
>>226
「実際はもっといっぱい列挙」の部分に数十個列挙していて
その数に目を奪われがちかもしれないが
将来的にそれが数倍に増えても問題ないような構造を考えてこそ
スケーラビリティのあるプログラム
>>242
サンクス
246221:03/10/22 20:32
もうひっこむつもりだったのですが、気になったので確認させてください。

メンバ変数をたくさん取る代わりに配列で一括で用意したのは、
すべて型はintで済むという前提があるからです。
(突き詰めればフラグ関係はboolがいいんでしょうけど)

メンバ変数でそれぞれを用意すると、ヘッダでのメンバ変数の宣言順と
コンストラクタでの初期化順と書き出しメソッドでの出力順を対応させなければ
ならないという手間が発生します。
ですが、配列だと、初期化と出力はfor文で前からまわせばいいので、その手間は
発生しません。

さらにいま思いついたのですが、アクセサもtemplateを利用して、

template<int i> void SetParam(int n){ param_[i] = n;}

で汎用的なsetterにして、特殊なやつだけは

// 0以下をセットされても無視する。
template<> void SetParam<LEVEL>(int n){ if (n <= 0) return; param_[LEVEL];}

こうすれば、特殊化も容易です。アクセサをメンバ変数ぶんだけそろえることに比べたら、
圧倒的に少ない記述量になるはずです。

コンパイラが配列とenumの対応を認識できないという致命的な欠点を除けば、
この配列方式は十分なメリットがあるように思えるというか……思えたのですが。

結局のところ、若気の至りなんでしょうか……?

     / ユメヤブレテサンガリア!
|自宅| λ......
そもそも外から自由にSetParam出来る事自体おかしい。
外から自由にSetParamできるという事はそのCharacterに対する敵に対して、
俺のHPなんかどうでもいいから好きに弄ってくれと言っているような物だ。
配列の各要素にエイリアスを用意して、
int a[2];
int *hp = &a[0];
int *mp = &a[1];

a[0] = 33;
*mp = 42;
どっちでもいけるっぽく。
>>247
こいつの事だからどうせ特殊化してコンパイルエラーしろとか言い出すんだろ。
template<> void SetParam<HP>(int n);
>メンバ変数でそれぞれを用意すると、ヘッダでのメンバ変数の宣言順と
>コンストラクタでの初期化順と書き出しメソッドでの出力順を対応させなければ
>ならないという手間が発生します。
そんなわけない。
>>250
>ヘッダでのメンバ変数の宣言順とコンストラクタでの初期化順
ここまではやらないと余計な事で混乱するハメになるよ
そもそも
HP,MHP
MP,MMP
あたりの対応はテンプレートクラスにするべきだろう。
入出力の対応をとれば良いだけだから、内部の宣言順は気にする必要なし。
ファイルのフォーマットが変わっても、入出力メソッドの書き換えだけで済む。
template<typename T> class ValueHaveMax
{
private:
 T current_;
 T max_;
public:
 T getCurrent() const throw();
 T getMax() const throw();
 T setCurrent() throw(OutOfBoundsException);
 T setMax() throw();
 //(実装略)
};
>>254
void setCurrent(T current) throw(OutOfBoundsException);
void setMax(T max) throw();
Exceptinal C++ に Stack の Pop は例外安全にできないと書いてあったのですが、
参照を返すようにすれば大丈夫なんじゃないでしょうか。
>>256
そいつの実体は、誰がどのようしてに押えておくんだ?
>>257
Stack クラスの中のバッファでしょう。
>>258
popしたのに、まだ残ってるのか?
260デフォルトの名無しさん:03/10/22 22:19
>>256
39ページの脚注とか読む気はございませんか?
261256:03/10/22 22:21
>>260
その通りでした。すみません。
250ではないが
>251
> >ヘッダでのメンバ変数の宣言順とコンストラクタでの初期化順
> ここまではやらないと余計な事で混乱するハメになるよ

ただの組み込み変数の初期化に神経質になるのもどうかと。
俺、数が多いときは割とコンストラクタ内部で下のように書くけど。
level = hp = mp = ... = 0;
>>262
コンストラクタなら
Character::Character()
: level(1), hp(40), mp(10)
{
// 名前の登録とか?
}
でいいと思うのだが。勿論0でも使えるし。
264デフォルトの名無しさん:03/10/22 23:19
コンストラクタでマジックナンバーで与える初期値は0だろ
つーかデフォコンないメンバ入れるの?
組み込み型はデフォルトコンストラクタは存在するが自動的には呼ばれないぞ、と。
初期化がめんどいだけなら
inner structをメンバーにしてmemsetしちゃえばいいじゃん
267デフォルトの名無しさん:03/10/23 00:10
>memset
いたたた
>>memset
>いたたた
いたたw
memsetマンセー
そういやvirtualがあるとまずいんだっけか
inner structがPODなら大丈夫だろ
>>270
はぁ?
どうせ藻前裸は今PODを必死にぐぐってるんだろ。
レベルの低いスレだな。
w
Punipuni Oppai DQN
276266:03/10/23 00:45
class A {
 struct {
  int data1;
  int data2;
  ...
 } data;
public:
 A() {
  memset(&data, 0, sizeof(data));
 }
};
こういう意図で書いたんだけど、そんなに変かい?
std::fillでも使えってこと?
277デフォルトの名無しさん:03/10/23 00:45
情報隠蔽も結構だけど、データクラスなら 221 の最初(二番目か?)の設計みたいなので
別段構わないと思うけど。。。

>>221 のコードの問題は、データクラスっぽいクラスに Character なんていうアクターっぽい
名前をつけてること。 class CharacterSpec とか class CharacterAttribute とかにすべき。
>>276
変じゃない
とりあえずmemsetしとけ
>>267とか>>271
イタタタ
↑結局PODが分からなかった香具師
PODなんかで誇る方が正直恥ずかしい…
それさえも分からない香具師はもっと恥ずかしい
次スレ案
POD相談室 Part25
285デフォルトの名無しさん:03/10/23 01:16
せっかく禿がバスサイクルの問題に気がついてたのに
うわぁ、自分の尺度だけでしか香具師ガイルな。
C++厨の実力の知れるスレでつか?
>>300取ったら香具師がPODについて説明する事
>>280
確かに何をいまさらって感じではあるな
このスレくだらね
Perlでおなじみのドキュメンテーションのことだろ。
ひとりでアプリつくってんのに
情報隠蔽も抽象化も糞もあるかっての。ぼけ。
ひとりで作ってても十分利点はある。
低脳にはそれがわからんのです
俺なんかアドレス指定して書き換えちゃうもんねー。
もちろんアセンブラでプロセシ保護された空間をね。
>>292
君みたいな低能は君だけじゃないから気にするな
PODは、Modern C++ Designの49ページに書いてあるよ。


Cライクなstruct中にプリミティブ・データしか保持されていない場合、
つまり平凡な古いデータ(plain old data─以降、PODと略します)構造


だとさ。これ以外でPODって記述は見たことないから、
ぐぐっても見つけるのはつらいと思う。
POD C++ でおよその意味がわかるページは見つかりましたが。
PODでも整数型しかない場合以外はmemsetなんかで初期化するな。
>>297
ISOも読んだ事無いのかよ
>>299
PODの事分かってないだろ(プゲラッ
>>301
浮動小数点型が入っていたらPODじゃないの?
浮動小数点"数"型か。どうでもいいけど。
>>302
浮動小数点の事分かってないだろ(プゲラッチョ
>>304
もしかして全ビット0が0.0になると保証されていると思っているの?C++で。
>>305
指数部とか仮数部とか分かるか?(ワラ
little endianだろうがbig endianだろうが全ビット0の浮動小数点数は0だろ。
>305
え、memsetって全bitを0にするんじゃないの?
(それが0.0を表すかはともかく)
>>308
全ビットを0にするだけだからこそ、浮動小数点型に使って0.0になることを期待してはいけない。
>>309
それCのFAQだろ。C++だとポインタにしてもちゃんと0で埋めればぬるぽが入るだろ。
カ゚ッ
本物はあまりの恥ずかしさに逃げますた
>>313
本物ってなに?
>>311
本当に?
つーか、この中でついさっきまでDelスレで煽ってた香具師何人かいるだろ?
浮動少数のフォーマットはIEEE754だけじゃないぞ
0を代入すれば0.0になることは保証されているけど
0-fillしても0になることは保証されていない

実質外がないといえばそのとおりだが
整数は0で埋めると0になる保証あったっけ?
整数の0で埋めれば0になるだろ
memset相当だから
int a;//とか
for( int i = 0; i<sizeof( a ); ++i )
reinterpret_cast< char* >(&a)[i] = 0;
この場合。
memsetって1バイト毎に埋めるから遅くない?
DWORDとかで回すmemset無い?
>321
とりあえず手元のWindowsXP/VisualC++2003の環境だと
WindowsAPI(もしかするとマクロか?)のCopyMemoryが
32bitで回してくれてるみたいよ。
まあ、逆汗して確認しただけなんで
どの環境でもそう展開されるかどうかは知らないけど。
323322:03/10/23 18:55
マチガタ。コピーじゃなくて0初期化か…スマソ。
でも類似品に ZeroMemory() とかあるんでこれでどーかな。
確認してないけど。
>>322-323
ZeroMemoryもCopyMemoryもmemset呼んでるだけだバカ。
325321:03/10/23 19:55
VC7はサイズがn*sizeof(int)とかで、intとかのポインタ渡すと
rep stosdで回してくれるっぽいですね。
何か勘違いしてました。
というかそういう古くさい話はC++スレでやってくれません事?
C++スレ->Cスレ
>>327
ここがC++スレだが。
330329:03/10/23 20:36
328は修正だったのか(鬱
331デフォルトの名無しさん:03/10/23 21:00
お前らC++スレに行けってさ
どなたか教えてください
class person{
int no;
string name;
int age;
}
見たいなクラスがあるとして、それをlistに積んでいます。
このうち指定されたnoを検索するようなプログラムを組んでいますが

list<person> plist;
list<person>::iterator i;

for (i=plist.begin(); i!=plist.end; i++){
if (plist.getno()==N)
return i
}
みたいなのしか思いつきません。
もっと効率的な検索方法を探しています。
ネットで調べてみるとmapやsetを使うと検索が早いようなことを見かけますが、
そこにある例題だと単純なinttとかばかりで、このような場合どうやれば良いのかいまいちわかりません。
どなたか教えてくださ
>>327のような薄っぺらなガキ見てると気が滅入ってくる
何というか育て甲斐がなくてコレがずーんとやる気にひびくんだよ
>>332
struct PersonNoComparetor
{
 operator()(const person& a, const person& b) const { return a.getNo() > b.getNo(); }
};
typedef set<person, PersonNoComparetor> PersonSet;
PersonSet personSet;
PersonSet::iterator it;
it = personMap.find(N);
×it = personMap.find(N);
○it = personSet.find(N);
>>334
× Comparetor
○ Comparator
>>317
> 浮動少数のフォーマットはIEEE754だけじゃないぞ
とはいえ IEEE754 じゃないアーキテクチャを相手にすることを想定する必要があるかは、
書いてるプログラム次第だよな。俺の仕事だと IEEE754 以外は考えてない。

だいたい IEEE754 前提にしないと演算精度とかも変わってくる可能性があるわけで
(非正規化数が無いかもしれない)、やるならそこまで対応しないと意味ないし。
>>337
まあ、曲がりなりにもC++スレなんだからスケーラブルに逝くべきじゃない
ほんの少しのオブジェクト初期化コストを惜しんで
memsetするくらいなら組み込みコンストラクタに任せたりゼロを代入するべきだと思うな。
初期化コストが大きくてどうしようもないなら、必要になる前にプールすればいいんだから
浮動小数点って時点でどうあがいても近似値でしかない
>>332

332です
ありがとうございます
私のレベルでは難しくて、いまいち良く分からないのですが解析してみます。
>>339
アフォですか? そんなことは問題にしていないのだが。
じゃIEEE754でないことの何が問題なんだ?
このスレでわかったこと
どうでもいい事でもめるから会議は長いんだな〜と思った。
>>342
memsetで0フィルしたときに値が0.0である保証が無いかもしれないって話だった気がするが
で結局IEEE754じゃないアーキテクチャは相手にする必要はあるのか、ないのか?
どっかのバカタレがIEEE754以外を考えていないことや精度が一致しないことを公に必要はあるのか、ないのか?
「そこまで対応」する方法がちゃんと用意されているのに、なぜmemsetなんだ?
クスクス
「そこまで対応しなきゃいけないソース」はmemset使っちゃ駄目
「使われる環境がわかっているソース」はmemset使った方が楽
348デフォルトの名無しさん:03/10/23 23:18
自分で作ったヘッダファイルがインクルードできない・・・。
349デフォルトの名無しさん:03/10/23 23:21
ほほー。
350デフォルトの名無しさん:03/10/23 23:32
何で〜
わからーん。
開くことができないっていわれるのよ。
ただのmapコンテナのクラスをつくっただけなのにさ。
はじめたばっかだからよくわかんないよ
>>345
IEEE754と精度の話ってどこから出てきたんだ?
もひかひて8.3とか?
日本語のフォルダ名orファイル名とか?
空笑を呈している患者がいるな
折角コンパイラがデバッグしやすいように固定の初期値を入れてくれるオプションがあったりするのに、
わざわざ自分でmemset()でクリアしてしまってデバッグを困難にするのは理解できない。

ま、「そこに構造があるから取り敢えずmemset()」なんて香具師とはどっちみち話が合わないこと夥しいのだが。
>>355
 それはVC++だけの話じゃないか?
>>355
藻前はコンストラクタで初期化しないんですか?
そうか、どうも変だと思ったら
コンストラクタで初期化しない人だったのか。

そもそも始まりは(配列ではない)メンバーをまとめて初期化したいって話だったのに
しかも「IEEE754以外の場合は」とか言いながら
特定の処理系のコンパイルオプションまで持ち出して。
最近はコンパイルオプションもIEEEで標準化されつつある


と言ってみる
なんかこのスレ、ネチネチしてるね
日本のC++コミュニティはどこもネチっこいよ
まあここはレベル低いしな。
レベル高い日本のC++コミュニティはどこですか?
cppll以外で
cppllの話題に付いていけないからって妬むなよ
>>366
このへんがネチネチしてるね
あーあ
369デフォルトの名無しさん:03/10/24 01:45
いつまでもしつこくネチネチとか言うな
アイーン対応
あいーん754対応しますた!
やった!ついにアイーン対応だ!!

質問お願いします。下のを通す正当な手段はないのでしょうか。
class B{
public:
    B& operator=(const B& rhs){}
};

class D : private B {
};

int main(int argc, char* argv[]){
    B b;
    D d;
    b = d; //コンパイルエラー 変換は存在するがアクセス不能
    return 0;
}
public継承に汁
>>373
レスサンクスです。すいません、それ以外でひとつ…。
375372=374:03/10/24 03:45
いや、なんかこう眺めてたら抜け道ある気がしちゃいまして。
(キャストではなく、「基底クラスで〜があればいける!」みたいな)

やっぱり無理ですよねぇ。お騒がせ失礼、寝まする、アイーン
376デフォルトの名無しさん:03/10/24 03:46
http://wwwdoi.elec.nara-k.ac.jp/html/jisyu/dxm/cap2/index.html
のcap26.cppのプログラム実行結果をテキストに保存するプログラムをください。
どこに実行結果の数値をテキストに書き込む処理を入れれば、
いいのでしょうか?


377デフォルトの名無しさん:03/10/24 04:41
staticで確保したメンバ変数(正確にはSingletonです)の
デストラクタが、デバッガで見ていても一向に呼ばれた気配がなくて不安です。
こういうものなのでしょうか?
378377:03/10/24 04:44
すいません、トンチンカンなこと訊いてました。
そりゃ自分で呼ばなければですよね・・・。
>>374
protected継承に汁
つーか、private継承なんて使わんぞ
>>372
もう寝ちゃったみたいだけど、usingを使えば出来るんじゃないかな。
381デフォルトの名無しさん:03/10/24 08:13
b = d;

b = (B const &) d;
と書くとかって話か?
>>372
class D;
class B{
public:
B&operator=(const B&){return*this;}
B&operator=(const D&);
};
class D:private B{};
inline B&B::operator=(D const&d){return operator=((B const&)d);}
int main(int argc,char*argv[]){
B b;D d;
b=d;
return 0;
}
>>382
いやそれ、コンパイラは通してくれるだろうけど、C++プログラマの倫理観としては、ナシだろ?
って、それは372に言うべきか。
class B{
public:
    B& operator=(const B& rhs){return *this;}
};

class D : private B {
    inline friend int main(int argc, char* argv[]){
        B b;
        D d;
        b = d;
        return 0;
    }
};


mainをクラス内に書くのは妙な気分だね。
Javerですもの。
386デフォルトの名無しさん:03/10/24 15:23
>>385
 Javaerでもstatic void mainになるで、ちょっとおかしくない?
>>386
Javerは細かいことは気にしないのさ☆
そういえばJavaはvoid main()なんだね。
C/C++はint main()なのに。
>>388
Javaで世界が完結してるからリターンコードなんてたいしたことないのさ
>>384
さすが、friend最凶伝説。気持ちワル〜
391デフォルトの名無しさん:03/10/24 23:19
>>383
private継承しておきながら
型変換の明示 (>>381のようなもの) を行なわず
暗黙の型変換を利用しようとしてる時点で倫理は消えているので
382でも無罪
392372:03/10/25 01:22
ウホッ、情報イパーイ。コードの読み応え満点。
皆さんレスありがとうございました。

正当な手段があるわけない事がよく分かったので、protected継承にしておきつつ、
Javarの漢気を胸に刻んだり、小粋なテクニークを後世に伝えたりしながら生きて逝きます。感謝感激。
ISO/IEC 14882:2003が出たと少し前cppllで騒いでいたけど何なのよそれ。
394デフォルトの名無しさん:03/10/25 16:46
#define と enum ってどう違うんですか?

#define NONE 0
#define SPADES 1
#define HEARTS 2
#define DIAMS 3
#define CLUBS 4
も、
enum hoge {NONE = 0,SPADES,HEARTS,DIAMS,CLUBS}
も同じに見えるんですが。
#defineじゃなくてenumじゃないといけない例とかplz

#define NUM 10

struct A{
int NUM;
};

どうなるよ
VCだと名前で出るので便利
defineだと数字だけで(+д+)マズー
C++で定数値のためにを#defineを
使う利点ってあるのかなあ?
>>397
あんまり変らないと思うが。
 コンパイラで処理するかプリプロセッサで処理するかの
 好みの問題じゃない。
そうじゃないよ。
>>398 は知能の低さを露呈してしまいました。
401398:03/10/25 17:20
まあたしかに#defineじゃデバック情報はのこらないな。
>>398
395,396が指摘しているように
名前空間無視やデバッガのシンボルテーブルに
載らない点だけでも問題だと思うが。
403398:03/10/25 17:22
>>400
なさけない、あと1分早ければねぇ。
>>393
(ノ・ω・)ノ お前は cppll へ帰れー
(ノ・ω・)ノ cppll へ帰れー
(ノ・ω・)ノ 帰れー
C++でdefine定数値を使う奴は低脳だと、かなり前に結論付けられているはずだが?
#defineは条件付きコンパイルをするうえで必須だと思うが。
>>406
それは >>394 の例とはズレてるような。正確には

 整数型の const 定数の代わりに #define 使うヤツはバカ

かね。浮動小数点は template 実引数として渡せなかったり、クラススコープのメンバとして
インライン定義できなかったりと、扱い微妙だが。
>>406
はぁ?オマエの頭ではdefine全否定っていう流れになってんの?馬鹿か?
>>408
明らかなバカは放っておこうよ
>>408
>>405が全否定しているから。
ところでVC++7.1とか使ってる人はみんな
class A{
 static const int PI = 3.15;
};
って感じですか。6.0な俺はできないわけですが。
>>410
おまえは会話の流れを読まないから私生活でも浮いてるんだヽ(`Д´)ノ!
enumの利点
・定数を増やしたときにナンバリングしなおさなくていい
・enumからintへのcastは安全だがintからenumのcastは危険なので
 範囲チェックを省略できる(危険なキャストをする馬鹿がいないと仮定してだけど)

例:
enum TYPE {
 TYPE_A = 0,
 TYPE_B,
 TYPE_C,
 TYPE_D,
};

void SampleFunc(TYPE type) {
 switch (type) {
  TYPE_A:
   :
   :
  default:
   // この関数が別のプログラマに呼ばれても
   // ここにくることはないハズ
   // (まあ強引に整数型からキャストする馬鹿が居ればその限りじゃないが
 }
}

また、TYPE_B2が増えても、C、Dを手でナンバリングしなおす必要がない。
外部データに出力した場合、
明示的にナンバリングする必要が出る可能性もあるわけだが
>>410
>>405
>define「定数値」
と言っている。

>>413
>・enumからintへのcastは安全だがintからenumのcastは危険なので
nを最大の列挙子の値として
2^([log2 n]+1)-1 (^は累乗記号;[]はガウス記号)
以内の整数は安全にキャストできるからそうとも言えぬかと。
>>394
えーと、まあ。enumは型を形成するのに対して
#defineは単純な文字置換でしかない、というのが大きな違いだろうと思う。
確かに単に定数値を抽象化するだけの目的なら
「#defineではなくenum(もしくはconst整数型)でないとなにがどうあっても絶対ダメ」
ということは多分ないだろうが、コンパイラのチェックを受けられるかどうかとか
型として使えるかどうかの違いはそれなりに大きいのではないかな。

ちなみに定数値を抽象化する目的でないなら
「#defineじゃなくてenumじゃないといけない例」は
たとえばテンプレートあたり使ってるとででてきたと思う。
> nを最大の列挙子の値として〜以内の整数は安全にキャストできる
でたらめかな?
>>417
手元の入門書によると

> 整数型を列挙型に明示的にキャストするのは危険です。
> 整数型の値が列挙型の範囲を超える場合、または、
> 列挙型の要素の値が重複している場合のキャスト結果は
> 保証されません。

とのこと。
要するに重複してなくて範囲を超えない場合は安全なのかね?
> ISO/IEC 14882:2003
〜:1998 の改訂版。
変更はtypo修正と曖昧な文章の明確化のみで、
新たな言語仕様の追加・変更はなし。

余談だが、JIS規格のC++は〜:2003の方を訳したものになる。
420デフォルトの名無しさん:03/10/25 18:57
定数が常にintだとは限らないんだがな
>>420
それがどうした。
定数で有名なものといえば
光の速さ
自然対数の底
円周率
enumとconstの話に

 ス コ ー プ が 出 て こ な い

このスレはアフォばかり
>>423
どちらもクラスやネームスペース内で定義する事は可能だけど。enum も const
(暗黙のウチに static) 変数と同様にファイルローカルにしたければ、anonymous
namespace 内で定義すれば良いだけ。

そういう話じゃなくて、何かあるの?

const 変数と enum の最大の違いは

o const 変数は signed/unsigned など、複数の型を使える
o const 変数は定義と宣言を分離できる。enum は宣言 = 定義。

っつー点だと思われ。
>>424
なぜ「int/doubleなど」ではなく「signed/unsignedなど」なんだろう
器の小さい人間はsigned/unsignedといった小さな違いに目を奪われて
もっと大きな違いなんか思いもつかないものだ
> const 変数と enum の最大の違いは
最大の違いっていったら、enumが独自の型を形成する点だろ。
なんでこんな馬鹿ばっかりなんですか?
>>428
お前というとんでもない馬鹿がいるから他は見劣りするな。
>o const 変数は定義と宣言を分離できる。enum は宣言 = 定義。
定義と宣言を分離すると定数式じゃ使えなくなるがな。
>>424
#define との違いの話をしてるんじゃなかったのか。
432デフォルトの名無しさん:03/10/25 20:15
>>430
ヘッダーに
extern double const PI;
と宣言を記述して
どこかのファイルに
double const PI = 3.14;
と定義を書くような方法も不可能ではない
>>432
配列の大きさとかじゃねーの?
>>427
そういや、以前

 enum XXX_FLAG { X_READ, X_WRITE };
 int func(XXX_FLAG flag);
 ...
 func(X_READ | X_WRITE);

と書いてハマった経験がある。
435デフォルトの名無しさん:03/10/25 20:54
>>433
C時代の時代遅れな老人じゃあるまいし
vectorとかlist使え
>>435
それは言い過ぎ。

プログラムの内容によっては、固定長でバイト列を取りたい場合もある。
ぺりふぇらるとの通信用バッファとかさ。
リンカの仕事とコンパイラの仕事の区別が付かないお馬鹿さんばかりだね。
ここは。
>>436
>>435はたぶんreserveしてそこに無理やり書き込ませるんだろ
c_strで得たバッファのconstをためらいもなくはずす人種だ
>>432
> extern double const PI;
> と宣言を記述して

これは、定数値の宣言じゃないよ。
変更できない「変数」の宣言だよ。

extern double volatile const PI;

なんて宣言もできるんだからさ。
浮動少数点数がコンパイル時定数である必要性はあるのか?

いや無い。つまり変更できない変数で十分。
441デフォルトの名無しさん:03/10/25 22:57
immediateの意味で定数という言葉を使っている人と
constantの意味で定数という言葉を使っている人がいるようだ

// hoge.h
class Choge
{
private:
static const int T = 100;
int m_a[T];
};

ってのも書けるようになったの?
今使ってるコンパイラ、捨てようかな。
>>442
当然のように書けるよ。
444442:03/10/26 00:15
>>443
ありがとう! 捨てます。
>>442
具体的になにを捨てるの?
446422:03/10/26 00:42
>>447
Intelのものに?
>>411
そんなあなたにBOOST_STATIC_CONSTANT

#include <boost/config.hpp>

class A{
BOOST_STATIC_CONSTANT(int, PI = 3);
};
むしろboost使うならVC7.1が欲しい
VC++使ってるなら最新のコンパイラ買えよ。
GCC使ってるなら、3.4のパーサのデバッグしろよ。
ほんと、買えるものならVC++7.1Proだけで買いたいよ
453デフォルトの名無しさん:03/10/26 14:51
VC++使わずGCC使え
だってGCCはBoost100%じゃないんだもん。
Boostの犬かい
Web上で見かけたんだけど

class parent{
public:
virtual void func( void ){ cout << "parent\n"; }
};

class child: public parent{
public:
virtual void func( void ){ cout << "child\n"; }
};

void main()
{
child a;
parent b;
parent &c = ( true ) ? a : b;
parent &d = a;
c.func();
d.func();
}

結果
parent
child

はVC++6.0のバグ?
>>456
VC++6.0でこれだとどうなるの?

#include <iostream>
class parent{
int x;
public:
parent(int i):x(i){}
virtual void func(void){cout<<"parent "<<x<<"\n";}
};
class child:public parent{
public:
child(int i):parent(i){}
virtual void func(void){cout<<"child "<<x<<"\n";}
};
int main()
{
child a(1);
parent b(2);
parent&c=(true)?a:b;
parent&d=a;
c.func();
d.func();
}
いい加減VC++6.0は捨てろ。それにスレ違い。
459デフォルトの名無しさん:03/10/26 15:55
スレ違いではありませんので458を無視してください
460デフォルトの名無しさん:03/10/26 16:00
BCCでもそうだった。なんでなんで?
461デフォルトの名無しさん:03/10/26 16:09
virtual関数の実装が別コンパイル単位(ファイル)だったら起きない問題か。
クラス宣言内に実装があるので、可能ならインライン展開しようとするから
そんときのクラスの選択がバグってると。
さすがに >>457 の数字はちゃんと正しく(共に1が)出るんじゃないか。

VC6持ってる人検証キボン
参照だからじゃない
>>462
参照じゃなかったら文法違反だと思はれ。
464デフォルトの名無しさん:03/10/26 16:26
>>461
俺もinline化に関わるバグと思う
465デフォルトの名無しさん:03/10/26 16:33
vc6でやったよ。
xはprivateだからコンパイル通らんよ。
publicにしてさらに
//parent&c=(true)?a:b;
parent&c=a;
にしたら直ったよ。
466デフォルトの名無しさん:03/10/26 16:34
安心したければGCC使えということで
GCCかよ(笑
VC++6なんていう、ANSIC++以前のコンパイラが
ANSIC++に対応してないっていう話はいい加減やめれ。
そんなの当たり前もいいところ。
それを鬼の首でもとったかのように喜んでるのはただの知的障害者。
>>468
規格制定前にその規格を満たす実装は存在していないという妄想の例
470456:03/10/26 17:30
>457
> VC++6.0でこれだとどうなるの?
parent 1
child 1
三項演算子は正しくaを返してます。

>461
念のため関数定義を別のファイルにまで持っていきましたが再現したので
inlineは関係無いと思います


いろいろ試してみた結果、三項の部分は、どうも
parent &c = parent(( true ) ? a : b);
こんな風に解釈されているっぽいです。


ちなみに参照をポインタに変えたら、当然?期待通りに動いてくれます。
471デフォルトの名無しさん:03/10/26 17:32
>>470
コンストラクターの呼出し回数を数えてみるといいかも
472471:03/10/26 17:33
あ、その場合は
コピーコンストラクターを明示的に定義して
その中でカウントするなり、coutに向かって何かを書くなり
ANSIC++はある日突然現われたのではなく長い年月の議論の末に生まれているから
ANSIC++が確定する以前であってもANSIC++の概要を知ることは可能。
ANSIC++が確定する以前に作られたVC++6が
ANSIC++に書かれてあることの全てに対応できていなくても部分的に対応できていれば、
どこまで対応できているのかについての議論は今でも意味がある。
その議論そのものの存在意義を否定することができるのは
VC++6がANSIC++に書かれてあること全てに対応していない
ということが明確である場合だけとなる。

>>468
てことでVC++6はANSIC++に書かれてあること全てに対応していない
と言いたいということでよろしいか?
そんな古いコンパイラの話せずにおとなしくBoost100%のVC++7.1を使えばいいよ
>>463
ポインターってこと
parent* c = ( true ) ? &a : &b;
>>470
ということは、ポインタでなく値が式の結果となる三項演算子は
両者の型が違うときは共通化できる型に変換し、変換されるほうは
一時オブジェクトを生成して返してるってことになるのか。
VC++7.1 を使いたいのは山々なんだけど、いろいろなしがらみから現実には
まだまだ VC++6 をつかわにゃならんケースが多いんだろ。
実際問題、今現在でも VC++6 がもっとも使われている C++ コンパイラなんじゃないの?
478デフォルトの名無しさん:03/10/26 17:54
>>477
そんな統計あるならソース出せ
>>477
 winだけならな
>>474
いっとくけどvc7.1も>>456のもんだい解決できないぜ
481デフォルトの名無しさん:03/10/26 18:11
VC++はまずいよ。
こういうコンパイラーのおかしな動きで
システムに障害が出て
損害賠償請求されたらたまったもんじゃない。
>>481
納める前に動作確認するだろ。
>>482
馬具が必ず再現できるとは限らないよな
テスト至上主義には分からんか
>>483
まあそうだが、
コンパイラは規格に合致していることを契約しているわけではないので
従っていないことを理由に文句を付けることはできないよな。
コンパイラを選んだ時点で、現状のそのコンパイラの挙動に合わせて作る
しかない。
挙動を確認せずに間違って使ったほうが悪いんでは?
>>483
開発者の怠慢ですね
486463:03/10/26 18:17
child a;
parent b = a;
が通ったんだけど・・・

もしかして漏れとんでもない勘違いしてる?
その前にポリモーフィズムと言ったら普通ポインターでは
virtual関数周りの動作は実際に動いてみるまで分からないから怖い。
>>456のようなバグも
そのバグが発生しても日常的には問題がなくて気付かず、
珍しい条件が揃ってから初めて症状が出てくるようなシステムだと
動作確認で問題を見付けられないだろうな。
>>486
勉強し直し
>>484
一般的に、コンパイラーを選ぶのも開発側の責任に含まれることが多いから、
コンパイラーのバグが原因であっても、そうでなくても、
すべてひっくるめて動作の不具合は開発側の責任になって
開発側の負担にて修正することになる。
契約によっては損害賠償もあるだろう。
>>490
人命に関わるバグだったりすると・・・ね
492デフォルトの名無しさん:03/10/26 18:21
Windows上のシステムだと
コンパイラーの不具合でシステムが挙動不審になる確率より、
先にOSが勝手に落ちてくれる確率が高いから気にしない文化あり。

Windows以外の環境だと
VC++の選択はありえないのでこれまた問題ない。
>>492
別に開発環境のバグで起きたことについての損害賠償云々ってのはWindowsに限ったことではないんだが。
494デフォルトの名無しさん:03/10/26 18:29
結局>>456のサンプルはVC++6でも7.1でも駄目なのか?
>>494
自分で試せ
つーかVCの挙動が正しいんじゃないか?
497デフォルトの名無しさん:03/10/26 18:38
>>496
理由は?
VCが正しいとしても、constではない参照がテンポラリオブジェクトを指していることにならないか?
>>497
式'(true) ? a : b'の型はparent(parent &ではない)になるのが自然だと思われるから。
>>498
確かにそうだ。
VC7.0だと

これも
void foo(parent &){}
foo(parent());

これも
parent &c = parent(a);

コンパイル通るね。
Final Draftだから以後変わってるかもしれんが:
5.16 - Conditional operator [expr.cond]
の-3-の3個目では
if E1 and E2 have class type, (中略)
If the conversion is applied, E1 is changed to an rvalue of type T2 that
still refers to the original source class object (or the appropriate
subobject thereof). [Note: that is, no copy is made. ]

となってるみたいな。
>498
無名オブジェクトの、参照による延命ってやつ?では。

>499
(式) ? a : b;
のaとbが同じ型の場合だと、テンポラリは作られなかった。から正しくない。
>>499
> 式'(true) ? a : b'の型はparent(parent &ではない)になるのが自然だと思われるから。

まったく不自然なんだが。

parent & x = (true) ? a : b;
で、aとbが共にchildクラスだった場合もここでテンポラリー生成が自然?
となると
parent & x = a;
の場合もテンポラリー生成が自然ということになる。
505デフォルトの名無しさん:03/10/26 19:20
499がどのように感じても、VCの動きは規格的に間違いなので
「VCの挙動が正しい」という結論には繋がない
>>505
根拠は?
>>505
お前が作った規格で正しいと言われてもなぁ(藁
だれか>>502を和訳してくれ
最終Draftだから以後変わってるかもしれんが:5.16 ―条件付きのオペレーター[expr.cond] の(3)の3個目ではE1とE2がクラス・タイプ(中略)を持っている場合、
転換が適用される場合、E1は、オリジナルの出所クラス・オブジェクト(あるいはそれの適切なサブオブジェクト)にまだ言及するタイプT2のrvalueに変更されます。[注:すなわち、コピーは作られません。]となってるみたいな。
>>509
おお、ありがとう
511デフォルトの名無しさん:03/10/26 19:50
>>507
502の規格を作った人が505なのか?
512デフォルトの名無しさん:03/10/26 19:51
>>505 == ANSIC++規格作者
ということで
つーかVCが正しいでしょ。
間違っているという奴は間違っている証拠を出せないんだし。
>>513
502が証拠では?
ANSI C++ と VC++ の挙動が違うということは分かった。
しかし ANSI C++ が正しいという証拠はない。
ANSI C++ が間違いで VC++ が正しいこともある。
>>515
ちょっと違う。正式なANSI C++の規格自体出ていない。
ふざけんなてめーら。
わざわざDraftなんか持ち出して嘘つきやがって。
ISOだとVC++が正しいじゃねーかよ。

― if E1 and E2 have class type, and the underlying class types are the same or one is a base class of
the other: E1 can be converted to match E2 if the class of T2 is the same type as, or a base class of,
the class of T1, and the cv-qualification of T2 is the same cv-qualification as, or a greater cv-qualification
than, the cv-qualification of T1. If the conversion is applied, E1 is changed to an
rvalue of type T2 that still refers to the original source class object (or the appropriate subobject
thereof). [Note: that is, no copy is made. ]
518デフォルトの名無しさん:03/10/26 20:07
てことはANSI C++が間違いなので、ていうか存在してないので、
VCが正しいのか
>>518
違う。Draft(草案)が変更になった。
どうやらM$叩きは失敗したようだ。
>>478-479
http://www.trickpalace.net/cgi-bin/cppll/enq.cgi?mode=enquete&number=5

母数が少ないが、VC++6 がもっとも使われている C++ コンパイラ
という話はそれなりに信憑性があると思うぞ。
>>517
ん? 同じ文じゃないの?
つーか、英語を読めないだけだろ。
524デフォルトの名無しさん:03/10/26 20:11
>>517
君の出してくれたISOはVC++の間違いを示してくれてるよ
>>521
少なすぎ。
いくらBoost100%でもこんなに簡単な所で間違えてるようじゃVC++もまだまだだな。
なんでプログラマって英語も読めない馬鹿が多いの?
>>527
ふーん。そうやってアメリカのいいなりになるのか。
529デフォルトの名無しさん:03/10/26 20:15
>>525
激しく大笑いしました。
530デフォルトの名無しさん:03/10/26 20:16
>>517
That is, That is, That is,

> If the conversion is applied,
> E1 is changed to an rvalue of type T2 that still refers to the original source class object
> (or the appropriate subobject thereof).
> [Note: that is, no copy is made. ]

no copy is made.
in other words,
refers to the original source class object.

VC++ made temporary object, in this case.
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2
E1 is changed to an rvalue of type T2

つーかさ、ISOの記述が曖昧すぎるんだよ。
532デフォルトの名無しさん:03/10/26 20:19
この件に関して
VC++の動きとISO C++の規格が不一致であることはずっと明確であるのだが、
VC++が正しいと言ってる連中は
VC++が正しくてISO C++が間違っていると言ってるわけだよな?
ISO/IEC 14882:2003ではMSの方が正しくなっているに違いない。
>>528
英語読めるだけでアメリカの言いなりだなんて。
お前は未だに敵国語は使うなの精神で生きているのか?(w
しかし低級2cherがISO/IEC 14882:2003を所持しているはずが無いので、
この問題は海の底へと消え去るのでした。
536デフォルトの名無しさん:03/10/26 20:21
>>531
> E1 is changed to an rvalue of type T2
> E1 is changed to an rvalue of type T2

もしかしてその続きが読めない人?
>>532
> VC++の動きとISO C++の規格が不一致であることはずっと明確であるのだが、
そこが間違っている。
539デフォルトの名無しさん:03/10/26 20:28
>>537
なぜ間違っていることになる?
540デフォルトの名無しさん:03/10/26 20:31
ISO C++ Draftによると、
コピーは作成されず元オブジェクトへの参照になると書かれている。
VC++の動作ではテンポラリーオブジェクトとしてコピーが作成されている。
確かにISO C++ Draft的にはVC++の動きが間違い
でドラフトがどうかしたのか?
ドラフトが規格と全く同じだとでも?
542デフォルトの名無しさん:03/10/26 20:36
いまだにVC++が正しいと信じて疑わない連中がいるようですが
そいつらとしては
「VC++的にはISO C++が間違い」
という結論になってるんですよね?
>>542
だからドラフトが違うんだってば。いい加減にしろよ。
まあBoostでさえ100%取れないGCCはそれ未満だけどな。
ちなみにその部分はドラフトも正式規格も同じ
>>545
ソースは?
>>543
ソースは?
>>538
http://webstore.ansi.org/ansidocstore/product.asp?sku=INCITS%2FISO%2FIEC+14882%2D1998
14882:1998(訂正が盛り込まれる前の規格)は18j。(昔から)
なんでこんなに違うんだろ?
必死で正式版を隠しているのが笑える。
550デフォルトの名無しさん:03/10/26 20:48
ISO C++を100%取れないVC++と
Boostを100%取れないGCCの闘い

ISO C++とBoost、どちらを選ぶ人が多いか
551デフォルトの名無しさん:03/10/26 20:52
どっちを選ぶもなにも、
PC-UNIXならGCCしかないし、
WindowsならVC++しかないし
Cコンパイラの選択肢なんて
あってないようなものです
>>550
GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
553デフォルトの名無しさん:03/10/26 20:59
>>552
ソースは?
>>553
えっ? Boost100%じゃないのにISO C++100%だとでも?
555デフォルトの名無しさん:03/10/26 21:03
>>552
いつから
「Boostが100%動けばISO C++100%」
というようになったんだ?
>>555
誰もそんなこと言って無いだろ。日本語読めないのか?
とりあえずここのレベル低い香具師らはexportも知らないんだろうな
558デフォルトの名無しさん:03/10/26 21:09
>>556
「ISOC++100%取れてないならばBoost100%動作ではない」が真で
「Boost100%動作ではないならばISOC++100%取れてない」が偽ですか
>>558
当たり前だ。ボケ。
560デフォルトの名無しさん:03/10/26 21:14
VC++を必死で擁護する人って
対偶もしらないアフォばかりということでよろしい?
>>558
逆っぽそうだけどなあ。
BoostはISOの機能の一部を使って実装されているものだし。
0%-----------Boost100%-------------ISO%

Boost 100%でもISO 100%にならないことはあるが、
Boost 100%になってないのにISO 100%になることはない。

563562 ちょっと修正:03/10/26 21:16
0%-----------Boost100%-------------ISO100%
>>556
いや、言ってるよ

> GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
というのは
Boost100%動いたらISOC++100%取れてると言ってるのと同じ意味
>>564 ははははは。お前真性馬鹿だろ。
566デフォルトの名無しさん:03/10/26 21:17
564さらしあげ
567デフォルトの名無しさん:03/10/26 21:18
564は釣りだろ釣りw。ブハァ
568デフォルトの名無しさん:03/10/26 21:18
「AでないならばBでない」というのは
「BならばAである」と言ってるのと同じ意味。


段々と感情論になってきてますよ。
牛乳飲んでカルシウム補給せよ。
Boostが100%取れてないGCCがISO 100%になるはずないな。

ところで>>564よ。VCはBoost 100%なのだが、
ISO 100%だと本気で思っているのかね?
571デフォルトの名無しさん:03/10/26 21:20
「ISOC++100%取れてないからBoost100%じゃない」
ってことが正しいなら
「Boost100%動いたらISOC++100%取れてる」
ってことになるのでは?
572デフォルトの名無しさん:03/10/26 21:21
>>568
違います。もう少し勉強してください。
573デフォルトの名無しさん:03/10/26 21:22
>>568
対偶だよね〜
>>571
なりません。もう少し勉強してください。
>>572
君がね
576デフォルトの名無しさん:03/10/26 21:24
相変わらずレベルの低いスレだな
>>576
これくらいレベルが低くないと、プログラマなんてやってられません
578デフォルトの名無しさん:03/10/26 21:26
>>568
> 「AでないならばBでない」というのは
> 「BならばAである」と言ってるのと同じ意味。
全然ちがう。1つ目が正しいなら2つ目は間違い。

>>571
> 「ISOC++100%取れてないからBoost100%じゃない」
> ってことが正しいなら
> 「Boost100%動いたらISOC++100%取れてる」
> ってことになるのでは?

1つ目は正しいが、2つ目は間違い。
GCCは「ISOC++100%取れてないからBoost100%じゃない」になる。
BoostもISOC++も100%じゃないGCCと、
Boostが100%だと分かっているVC++。
どちらが正しいか誰が見ても明らか。
0%---GCC------Boost100%-----VC------ISO100%

Boostが100%に達していないなら、ISOが100%に達することはないし、
Boostが100%に達していても、ISOが100%に達しないこともある。

Boostが100%に達していないGCCはISOが100%になることはない。
そしてBoostが100%だからといってVCがISO 100%だと言っている奴もいない。

一人、Boost 100%ゆえにISO 100%と勘違いしている馬鹿がいるみたいだが(藁
(´д`)
581デフォルトの名無しさん:03/10/26 21:28
>>579
違います。
VC++はBoost 100%だから当然ISO C++100%になります。
みなさん幸せなんですね。
こんなにもくだらない事で盛り上がれるなんて。
>>578
ネタの可能性が高いけどマジレス。
「AでないならばBでない」ということは、Bという集合はAからはみ出だしていないことになる。
つまりBはAに含まれる訳だ。
このことから「BならばAである」は正しい。
>>581
もうそろそろ諦めたらどうだ。GCCはISOを100%満たしていないし
GCCはVCよりも劣るのだよ。
585デフォルトの名無しさん:03/10/26 21:31
>>584
たとえばお前とか
VC擁護してる馬鹿連中って根拠ないし、非論理的。
586デフォルトの名無しさん:03/10/26 21:33
>>583
> 「AでないならばBでない」ということは、Bという集合はAからはみ出だしていないことになる。
> つまりBはAに含まれる訳だ。
> このことから「BならばAである」は正しい。

ネタだろうけど、A=バナナ、B=リンゴに当てはめてみたよ(w

「バナナでないならばリンゴでない」ということは、リンゴという集合はバナナからはみ出だしていないことになる。
つまりリンゴはバナナに含まれる訳だ。
このことから「リンゴならばバナナである」は正しい。
>>552
> GCCもISOC++100%取れてないからBoost100%じゃないんだろ。

GCC叩きたくて必死らしいけど
そんな分かりやすい嘘をついてまで叩かなければならないのか?
0%---GCC------Boost100%-----VC------ISO100%

この図が真実を表している。だれも反論する奴はいないだろう。
>>586
ネタだろうけど、
「バナナでないならばリンゴでない」
は真ではないので、その推論は間違い。
おまえら、スレ違いですよ。
それにISO100%ってなんですか?どうやって確認するんですか?
ISOがテストプログラムでも用意してくれてるんですか?
>>587
どの点がウソだと?
>>586
>バナナでないならばリンゴでない
そもそもこれが間違っているだろ。
前提として「AでないならばBでない」が正しければ、
「BならばAである」が正しいと言っているわけで・・・
>>589
その通り。583の言っていることはめちゃくちゃ。
>>592
俺に反論するなよ。俺は単にA=バナナ、B=リンゴに置き換えただけだ。
583の言っていることがおかしいんだよ。
前提が間違っているなら、どんな命題も真って
直感に反するよな。
0%---GCC------Boost100%-----VC------ISO100%

この図が真実を表している。だれも反論する奴はいないだろう。
597デフォルトの名無しさん:03/10/26 21:38
 ←────→ISO 100%


│    GCC
↓VC++
Boost 100%
ここまでのまとめ。

550 :デフォルトの名無しさん :03/10/26 20:48
ISO C++を100%取れないVC++と
Boostを100%取れないGCCの闘い

ISO C++とBoost、どちらを選ぶ人が多いか


552 :デフォルトの名無しさん :03/10/26 20:53
>>550
GCCもISOC++100%取れてないからBoost100%じゃないんだろ。


555 :デフォルトの名無しさん :03/10/26 21:03
>>552
いつから
「Boostが100%動けばISO C++100%」
というようになったんだ?

556 :デフォルトの名無しさん :03/10/26 21:07
>>555
誰もそんなこと言って無いだろ。日本語読めないのか?
0%---GCC------Boost100%-----VC------ISO100%

この図が真実を表している。だれも反論する奴はいないだろう。
600デフォルトの名無しさん:03/10/26 21:42
質問です。
mmintrin.h の組み込み関数使いたいんけど、
このファイル、VCのSP5についてなかったっけ?

SP5入れたのに mmintrin.h が見つからない・・・。
ProcessorPackじゃないとダメとか?
うへ〜、とりあえず論理的な間違いだけは落ち着いてちゃんと理解しようよ。

A: (x > 5)
B: (x > 7)

「AでないならBでない」: (x <= 5)なら(x <= 7)
「BならばA」: (x > 7)なら(x > 5)

対偶の真偽は常に一致。

ではISO C++とBoostの話をどうぞ。
602デフォルトの名無しさん:03/10/26 21:42
>>600
雰囲気嫁馬鹿
552=556=VCマンセーによるGCC叩き
604デフォルトの名無しさん:03/10/26 21:44
要するにISO 100%取れないだけのVCと
ISOもBoostも100%取れないGCCってことだろ。
GCCコンパイル遅いよね
対偶しらない中学生に説明してるみたいだな・・・
たとえば
「辛くなければ唐辛子ではない」これが正しければ、
「唐辛子は辛い」が成り立つ。

同じように
「バナナでないならばリンゴでない」これが正しければ、
「リンゴならばバナナである」も正しい。

ただし、「バナナでないならばリンゴでない」これが間違っているのは
明らかなので「リンゴならばバナナである」は正しくない。
ISOの100%ってなに?どうやって確かめるの?
そんなにISO100%にしたければ自分でコンパイラ作れ
609デフォルトの名無しさん:03/10/26 21:48
>>601
0%---GCC------Boost100%-----VC------ISO100%
これをAとBに代入すると

Boost100%: (x > 5)
ISO100%: (x > 7)

「Boost100%でないならISO100%でない」
「ISO100%ならばBoost100%」

うむ。間違いではない。ところでISO100%と言った奴は誰かいるのか?
VCとGCCがそれぞれが何パーセント準拠しているのか分からんが
今回のバグ問題のようにいざってとき裏切ってくれるから
(ていうか今まで痛い目に会いすぎてるから)
漏れ的にはVCを信用しなかったりする
611デフォルトの名無しさん:03/10/26 21:49
つまり、Boost100%でないGCCは
当然ISOも100%ではないわけだ。
>>550
 > ISO C++を100%取れないVC++と
 > Boostを100%取れないGCCの闘い
 >
 > ISO C++とBoost、どちらを選ぶ人が多いか
に対するレスとしての>>552
 > GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
を読んで>>564
 > > GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
 > というのは
 > Boost100%動いたらISOC++100%取れてると言ってるのと同じ意味
みたいに解釈したり >>568
 > 「AでないならばBでない」
みたいにどこからともなく"ならば"を召還したりできる人がいるらしいが、

552の発言って>>570
 > Boostが100%取れてないGCCがISO 100%になるはずないな。
と同じ意味だろ。
とりあえずおまいら必要充分条件から出直せ
子供の中には「対偶も真なり」を直感的に受けつけてくれない奴もいるようだ
対偶からも証明されているように、これが正しい。
0%---GCC------Boost100%-----VC------ISO100%
616デフォルトの名無しさん:03/10/26 21:57
俺分かった。

ここにはVCはBoost100%(GCCは100%じゃない)だと知らない奴がいる。
617デフォルトの名無しさん:03/10/26 21:59
>>615
Boostへの対応度とISO C++への対応度は別次元では?
>>617
Boostは、次期ISO C++(C++0x)のライブラリ案を目的として
ISO C++の仕様を前提にして実装されているものなわけだが
>>617
Boostって何か知っている?
C++の機能(テンプレート)を使ったライブラリだよ。
BoostのテストってのはC++のテンプレートが正しく
実装されていれば100%とれる。
>>619
ろくにBoost知らないくせにそんな適当な事書いて恥ずかしくないの?
Boostは100%であるVCだがISOは100%でない。
Boostは100%でないGCCはISOも100%でない。
それだけのことなのに何でこんなにレスついてんだ?(w
>>621
みんな暇なんです。
>>620
言いたい事はそれだけのようですね。
間違いがないから指摘できないのでしょうが。
>>621
GCC LOVEなんです。
なあ、boostのリグレッションテストって日々増えてるんだよな?
http://boost.sourceforge.net/regression-logs/
100%なんて数字は今はどこにも書いてないわけだが。
>>623
boost::preprocessorはテンプレートで実装されてるんですか。そうですか。
>>623のような無知は怖いな

>>456 は?
--------------
今日の名(迷)言
--------------

**************************************************

Boostって何か知っている?
C++の機能(テンプレート)を使ったライブラリだよ。
BoostのテストってのはC++のテンプレートが正しく
実装されていれば100%とれる。



                             by >>619
**************************************************



いい加減、VC++6は
>>618
たまにコンパイラ依存 (ANSI C++ だと実装依存とされるやつ) のコードが発見されて、
修正が入ったりするけど。まぁ、かなり希だが。
>>629
いいから反論(w
>>630
一世代前のVCがどうかしましたか?
>>634
二世代前ですが
二世代前ではなかろうか。
>>634
二世代前なんじゃないかな
ケコーン >>635-636
>>626
boost::preprocessorは何で作られていると思ってるんだ?(w
Boostがテンプレートで作られていようが作られていまいが、
Boostで100%を取れないGCCはクソなわけだが。
641デフォルトの名無しさん:03/10/26 22:24
ようするに標準C++への対応度から言えば
GCC < VCということですね。
boost100%って強調するけど、現時点じゃ100%じゃないし、
それにGCCだって98%(Failが6個)は達成してる。
おまえらそんなに奇抜なコード書いてるのか?

>>640
大してかわらんだろ。
>>642
GCCが具体的なのに比べて、VCは具体的じゃありませんね。
>>643
は?
は? じゃなくてw
646デフォルトの名無しさん:03/10/26 22:35
なんでくだらない議論になってるんだよ。
おまえら厨房の集まりだな。
ここは質問スレだろ!
激しくスレ違いなチャットなんてしてるんじゃねぇよ!!
>>645
は?
なんかのびてるから読んでみたんだけど

>>552 が
「Boost100%でないならISO100%でない」
「ISO100%ならばBoost100%」
こう言ったのを


>>555 の馬鹿が
「Boost100%でないならISO100%でない」
「Boost100%ならばISO100%」
と捉えて大騒ぎしてる。


ということでいいですよね?

649 ◆qZ/VDjzu96 :03/10/26 22:41
とりあえず Boost100%ならIso100%である事を誰か証明してくれ。(漏れはよく知らん)
でなきゃ>>601は証明されない。

(例)
A : x > 4
B : abs(x) > 4
「A なら B」 は成立するが、「BならA」は成立しない。
>>649
>Boost100%ならIso100%である

だから、誰もそんなこと言ってないんだよボケ死ね
651デフォルトの名無しさん:03/10/26 22:44
結局のところ、対偶を知らない中学生が
対偶を前堤にした意見に拒絶反応を示したということか
>>648
はい。そして現時点ではboost100%のコンパイラはないので、
boostリグレッションテストの項目がISOC++の規格的に満たされる
べきものならば、現時点でのISOC++100%のコンパイラはなさそうだということ。
653デフォルトの名無しさん:03/10/26 22:53
>>648
> >>552 が
> 「Boost100%でないならISO100%でない」
> 「ISO100%ならばBoost100%」
> こう言ったのを

全然逆ですな

> 552 :デフォルトの名無しさん:03/10/26 20:53
> >>550
> GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
リンゴとバナナが入ったおかげでスレの流れがよう分からんでよ。
藻前らそんなに暇なのか
もういいじゃん。
VCはBoost100%。GCCはBoost100%じゃない。
VCはISO 100%じゃない。GCCも当然ISO 100%じゃない。
それだけ。
657デフォルトの名無しさん:03/10/26 22:57
552=648=652
必死すぎ
>>657
そういうセリフは下げて言わなきゃw
659sage:03/10/26 23:00
sage路線でいきましょう
660sage:03/10/26 23:00
今時sage厨ははヤンねェヨ
661デフォルトの名無しさん:03/10/26 23:02
オレのおかげで見事に荒れたな。ウヒャヒャヒャヒャヒャヒャ
662648:03/10/26 23:05
>>653
確かに「Boost100%でないならISO100%でない」 とは言ってないもよう。
途中のレスが混ざってしもた、削ろう

>>552 が
「ISO100%ならばBoost100%」
こう言ったのを


>>555 の馬鹿が
「Boost100%ならばISO100%」
と捉えて大騒ぎしてる。


ということでいいですよね?
>>662
うん。そして対偶とかいろいろ言って誤魔化しているがことごとく論破されている。
>>656
VC++も今はboost100%ではないんですが。。。
一番テスト項目をパスしてることは確かだとしても。
どこのコンパイラメーカーも自分勝手な独自仕様は入れるのに、
本分たる仕様をちゃんと実装しないその様は、俺の仕事ぶりとよく似ている。
>>662
> >>552 が
> 「ISO100%ならばBoost100%」
> こう言ったのを

いや、言ってないし

> 552 :デフォルトの名無しさん:03/10/26 20:53
> >>550
> GCCもISOC++100%取れてないからBoost100%じゃないんだろ。
>>666
「GCCもISOC++100%取れてないからBoost100%じゃない」 == 「ISO100%ならばBoost100%」

じゃないの?
>>655
俺は暇である。
つまり暇でなければ俺でない。
>>667
それは対偶ではなく裏ですな
違うものになる
>>666
> いや、言ってないし
そう。言って無いのに、

>>555 の馬鹿が
「Boost100%ならばISO100%」
と言っていると思い込んだんだろ。
みんな楽しそうだなw
漏れも混ぜてー。(・∀・)ノ
555が馬鹿 555が馬鹿 555が馬鹿 555が馬鹿
555が馬鹿 555が馬鹿 555が馬鹿 555が馬鹿
555が馬鹿 555が馬鹿 555が馬鹿 555が馬鹿
673649 ◆qZ/VDjzu96 :03/10/26 23:25
>>650
Oh!ボケてました。(でも死ぬのだけは勘弁な)
正しくはBoost100% < Iso100% であるかないかを証明するソースをくれ、ですな。
要するに>>562の図は正しいのかと。
でなきゃ正しいのか間違ってるのか判断できませんがな。
674555:03/10/26 23:25
キモヲタがうるせえな。
おまえらあんま調子になってっと頃すよ?
>>673
boostがISOC++の仕様のグレーゾーンを明らかにすることはあるだろう
>「AでないならばBでない」というのは
>「BならばAである」と言ってるのと同じ意味。

これは分かる。分かりやすく言い換えると
「動物で無いなら猫ではない」
「猫ならば動物である」
だからね。

しかし
>「ISOC++100%取れてないからBoost100%じゃない」
>「Boost100%動いたらISOC++100%取れてる」

これは分からない。そもそも↑この文は

>「AでないならばBでない」
>「BならばAである」

という形とは異なってるしさぁ。
●→逆
↓  ↓
裏→対偶
さっきから対偶対偶って言っているやつって
何が対偶でそれがどう関係するのか一言も言って無いんだよな。
こいつ対偶自体良く分かってないのかもしれない。
>これは分かる。分かりやすく言い換えると
>「動物で無いなら猫ではない」
>「猫ならば動物である」
>だからね。

未だ生を知らず、いずくんぞ死を知らん(論語)
死を知れば生を知ったということですか?
>>679
自分で何が言いたいのか説明できないこと言わない。
>「AでないならばBでない」というのは
>「BならばAである」と言ってるのと同じ意味。
これ自体間違い。
>>680
具体例を当てはめても
それで何かを説明したことにはならんということ
683 ◆qZ/VDjzu96 :03/10/26 23:42
>>676
それは「AはBを含む」という前提での話でしょう。
猫と動物を逆にしてみ。

「猫で無いなら動物でない」 : 正しい
「動物ならば猫である」 : 間違い
正直大愚よくしらんから、調べたんだけど、それとりあえず書いとくね


たいぐう 0 【対偶】

(名)スル
(1)対(つい)になっていること。対称をなすこと。
「此雲の変幻出没と彼水の寂静不動と―す/日本風景論(重昂)」
(2)修辞上、対比的な語句を対称して配置すること。漢詩文などで多用される。対句。
(3)〔数・論〕〔contraposition〕一つの命題「 p ならば q である」に対して、その後件の否定を前件とし、前件の否定を後件とする命題「 q でなければ p でない」をいう。ある命題が真ならば、その対偶も必ず真である。
一つの命題「 p ならば q である」に対して、
その後件の否定を前件とし、
前件の否定を後件とする命題「 q でなければ p でない」をいう。
ある命題が真ならば、その対偶も必ず真である。
調べて思ったんだけど、最初に対偶言い出した奴も馬鹿ってことですか?
>>683
> 「猫で無いなら動物でない」 : 正しい
茶でも飲んでおちけつ。
C++からかなり遠い話題になったな。
まぁ、こんな風に走り出したら止まらないのも分かるが、ほどほどに・・・
どっかにスレ変えたら?
まあ、>>555が馬鹿ってことですな。

552 :デフォルトの名無しさん :03/10/26 20:53
>>550
GCCもISOC++100%取れてないからBoost100%じゃないんだろ。

555 :デフォルトの名無しさん :03/10/26 21:03
>>552
いつから
「Boostが100%動けばISO C++100%」
というようになったんだ?
>>683
AならばBってのは、Aが成立するものはすべてBであることが成立するっていうことなので
「猫でないなら動物でない」ってのは
「猫でないすべてのものは動物ではない」と言っていることになるヨ
691689:03/10/26 23:51
これは対偶と似ているようで対偶とは関係ない。
>>686
その通り。
>>689
仮に、
「GCCもISOC++100%取れてないからBoost100%じゃない」これが真なら
「Boostが100%動けばISO C++100%」これも真。
と俺も思う。
正しくは、
「GCCもBoost100%取れてないからISOC++100%じゃない」だろう。
695555:03/10/26 23:59
あれからまだ続いてるのかよ
>>674
わざわざ他人を騙る必要があるのか?
(^¬^)(^∀^)(^∃^)(^∧^)(^∨^)(^→^)
697デフォルトの名無しさん:03/10/27 00:06
> 552 :デフォルトの名無しさん:03/10/26 20:53
> >>550
> GCCもISOC++100%取れてないからBoost100%じゃないんだろ。

> 555 :デフォルトの名無しさん:03/10/26 21:03
> >>552
> いつから
> 「Boostが100%動けばISO C++100%」
> というようになったんだ?


「ISOC++100%取れる」をA
「Boost100%動作」をBとする。

>>552
「GCCもISOC++100%取れてないからBoost100%じゃないんだろ」
と発言している。この内容は
「GCCがBoost100%動作しない理由は『ISOC++100%取れてないから』である」
という意味であり、
ここには『ISOC++100%取れてない』ならば『Boost100%動作しない』
という前堤があることを暗示している。
すなわち552は、ここにて
「AでないならばBでない」と言っているものとみなされる。
これが真ならば、その対偶の「BならばAである」も真となる。

>>555の発言は、その対偶そのものに対して
いつからそのような前堤が成立するようになったのかを確認している。
やっと理解できた

「GCCもISOC++100%取れてないからBoost100%じゃない」

この文は間違ってる。しかし俺は「ISOC++100%取れるならBoost100%とれる」とムリヤリ解釈した。

つまり馬鹿は俺だ。
>>698=552
君の勘違いのおかげでこのスレ壊れちゃったよ
そんなことより
【初心者歓迎】C/C++室【環境依存OK】
http://pc2.2ch.net/test/read.cgi/tech/1059041347/
の次スレ誰か立ててくれよ。
701698:03/10/27 00:12
てへ、ごめんね。でも552とは別人だよ。
702デフォルトの名無しさん:03/10/27 00:13
456のコードすらまともに動作しないVC++6.0とVC++7.1は
捨てましょうというのが結論
そんな下らんことで146レスも消費したのか。
704デフォルトの名無しさん:03/10/27 00:16
698、552両名が勘違いして555を叩き続けて
146レス消費した結果が「テヘ」かよ
でも、>>552の間違いを指摘するために、いきなり対偶を持ち出したら、混乱してもしょうが無いと思う。
>>704
俺は648からの数レスだけだよ
Boostの犬になると正常な判断を失うので
まずはBoost100%などという目眩ましに
騙されないようにすることから始めよう。
>>705
「対偶も真なり」に対して直感的におかしいと感じる子供もいるらしいが、
そういうアフォを前堤にC++の話をしてもつまんなくない?
>>705
552のように真とも偽とも区別つきにくい発言
(何をもって100%と言っているのか意味不明状態)
に対しては、その対偶を突きつけて
それに対して意見させるのも、良くある検証方法だと思われ
ところでrefman2003.pdfってどっからゲットできるの?
>>709
そんなつまらん話よりC++の話をしろ!
やっべ、なんだこのスレ進行。面白すぎだ。
おまいら、もっとガンガン続けちゃってください。
>>709 >>710
2chのようなあまり推敲されてない文章が大量にある場所だと
多少おかしな文章も頭の中で自動的に意味の通る文に補正しちゃうことあるでしょ?
それを踏まえるとちょっと唐突すぎないかなと。
715デフォルトの名無しさん:03/10/27 00:29
このコードは各処理系でどのように動作する?

#include <iostream>
class parent{
public:
int x;
parent(parent const &i):x(i.x){cout<<"C parent (parent "<<x<<")\n";}
parent(int i):x(i){cout<<"C parent ("<<x<<")\n";}
virtual void func(void){cout<<"F parent "<<x<<"\n";}
};
class child:public parent{
public:
child(child const &i):parent(i.x){cout<<"C child (child "<<x<<")\n";}
child(int i):parent(i){cout<<"C child ("<<x<<")\n";}
virtual void func(void){cout<<"F child "<<x<<"\n";}
};
int main()
{
child a(1);
parent b(2);
parent &c=(true)?a:b;
parent &d=a;
c.func();
d.func();
}
対偶しらねー馬鹿厨は
C++いじる前に日本語勉強してこいっつーこった
>>715
とりあえずstd namespace指定がないので大抵コンパイルエラーかも(笑)
そのへん補正よろしく >>717
GCCだと

C parent (1)
C child (1)
C parent (2)
F child 1
F child 1
C parent (1)
C child (1)
C parent (2)
C parent (parent 1)
C parent (parent 1)
F parent 1
F child 1

VC7.0
結局VC7.0も駄目か
WindowsでGCC使えればなあ
>>721
7.0は7.1と大違い
といってもこの件は同じ結果になるような予感もするが
723デフォルトの名無しさん:03/10/27 00:41
VC++7.0って
parent & c = (true) ? a : b;

parent & c = parent ((true) ? parent (a) : b);
と解釈するの?
C parent (1)
C child (1)
C parent (2)
C parent (parent 1)
C parent (parent 1)
F parent 1
F child 1

VC7.1
対偶って (A ⇒B ) ⇒ (not B ⇒ not A) って事か?
それよりド・モルガンの法則勉強しておいた方がC++には役立つぜ。
(A and B) == not(not A or not B) ってな。
(A or B) == not(not A and not B) も。
>>721
Mingw が使える。ただ UNICODE 関連やリソース作成、デバッグなどがメンドイから、
コンソールアプリ以外では使用をお薦めしない。
>>725
矢印が違うぞ。
>>727
⇔だったっけ?
>>698
罰としておまえのハンドルはこれから「バナナ」だ。
バナナ以外での出入りを禁止する。

アセンブラコード見たけど
漏れのgcc だと (true)?a:b; を最適化しちゃうね。
-O0 オプションつけてもだめだった。

つまり
>Otherwise, if the second and third operand have different types,
> and either has (possibly cv-qualified) class type
すら判定していないのだから、その後の型変換だの、
コピーだのが起こりようがない。
> つまり
> >Otherwise, if the second and third operand have different types,
> > and either has (possibly cv-qualified) class type
> すら判定していない

んなこたーない。
俺がプログラマーを始めたころはドモルガンとか常識だったし
and or not xorが複雑に入り組んでいても混乱しないやつらばかりだった。
そうじゃないとCとアセンブリ言語のmixed language programmingの
環境についてこれない。

最近の若いやつらは
not (not a or b) と a and not b
a and not (a and b) と a and not b
の置き換えすら満足に思考できない。
論理式の合理化ができないから無意味にネストしたif文を大量に連ねる。
たまに置き換えをやろうとすると高確率で間違ってバグを作ってくれる。
「この一連のif文の意図は何ですか?」「私にも分かりません」

あと2進数が分からないし分かりたくもないと胸を張るやつらもいる。
そんなやつらが俺が若かった頃よりも多く稼いでることを考えると
酒がまずくなる。

酔いも回ってきたころだし、寝るか
なんでこのスレこんなに早いんだよ…
突然 対偶が出てきてソレを理解できない厨によって
スレがどんどん脱線し、混乱して 収束した
ということでOKですか?
734バナナ:03/10/27 01:10
お礼外にも馬鹿なこと言ってる奴大勢居たのにどこいった?
735デフォルトの名無しさん:03/10/27 01:13
>>730
最適化とは違う話

parent &c=(true)?a:b;
parent &d=a;
c.func();
d.func();



for(int i=0;i<2;i++){
parent &c=(i)?a:b;
parent &d=a;
c.func();
d.func();
}

に変えても動きの本質は変わらない
>>734
バナナさんが最後だったんですよ。
いわゆるババ抜きのババを引いたときにゲーム終了って感じですね
>>731
漏れんとこは以下ですがねぇ。

g++ -g -O0 -o main main.cpp

parent &c=(true)?a:b;
lea 0xffffffe8(%ebp),%eax
mov %eax,0xffffffd4(%ebp)
parent &d=a;
lea 0xffffffe8(%ebp),%eax
mov %eax,0xffffffd0(%ebp)
738バナナ:03/10/27 01:17
>>736
そんなババナ
>>735
コンパイル通らない・・
full adder と half adder をC言語でエミュレートせよという宿題を
出された廚がいたので適当に答えておいた。あんなもん今じゃ
ほとんど忘れかけてるよ〜
>>735
gcc でこうなった

parent
child
child
child
>>737
なにがいいたいのですか?
>>740
昔はそういう宿題出されたら必死になって考えてたなあ。
今じゃネットで質問した方が早い。
そりゃ新卒もどんどん馬鹿になって小さくなるよ。
そのうち人間に肉として食われるようになるだろう。
よーし、今までの不手際を謝りながら、もう一度まとめさせてくれ
スマソスマソ
これでいいか?

#include <iostream>
using namespace std;
class parent{
public:
int x;
parent(parent const &i):x(i.x){cout<<"C parent (parent "<<x<<")\n";}
parent(int i):x(i){cout<<"C parent ("<<x<<")\n";}
virtual void func(void){cout<<"F parent "<<x<<"\n";}
};
class child:public parent{
public:
child(child const &i):parent(i.x){cout<<"C child (child "<<x<<")\n";}
child(int i):parent(i){cout<<"C child ("<<x<<")\n";}
virtual void func(void){cout<<"F child "<<x<<"\n";}
};
int main()
{
cout<<"<1>";child a(1);
cout<<"<2>";parent b(2);
for(int i=0;i<2;i++)
{
cout<<"<2>";parent &c=(i)?a:b;
cout<<"<3>";parent &d=a;
cout<<"<4>";c.func();
cout<<"<5>";d.func();
}
}
スレ違いだけど店頭PCにいたずらスレより。
このプログラムを .js の拡張子で保存し、走らせてみよう。
俺が悩んでいるのはjavascriptにsleep()がないために、
無駄にCPUを食うことだ。

var IE;
var ti = 2000;
for (i = 0; i < 5; i++) { // ここを適当に修正
IE = WScript.CreateObject("InternetExplorer.Application");
IE.Visible = true;
IE.Width = 1280; IE.Height = 930;
IE.Navigate("http://members.aol.com/pethumor/insane.swf");
var dstart = (new Date()).getTime();
while (1)
if((new Date()).getTime() >= dstart + ti) break;
ti = ti * 2 + 1000;
}
>>745
せめてC++に移植してからにしてくれ
>>746
わかった。C++ならWin32も使えるし簡単。まあ店頭へのいたずら
なのでjavascriptの方がお手軽だから使っただけ。
748737:03/10/27 01:37
>>735 でワカータよ。
731==742 タンゴメソ。吊っ(ry
 ∧||∧
>>748
さてはおまえバナナだな?
>>744
<1>C parent (1)
C child (1)
<2>C parent (2)
<2><3><4>F parent 2
<5>F child 1
<2><3><4>F child 1
<5>F child 1

GCCです
どうせコピーコンストラクターが呼ばれないから
参考にならないかもしれませんが参考のため
751デフォルトの名無しさん:03/10/27 01:41
バナナ=間違いをすぐ認める素直なアフォ
752デフォルトの名無しさん:03/10/27 01:58
555のようなものをエサと言うんだよな

驚くほど沢山の馬鹿が釣り上げられたこと
そんなババナ
ここはバナナの気持ちが分かるインターネッツですね
>744
VC++6.0
(略)ループから
<2>C parent (parent 2)
<3><4>F parent 2
<5>F child 1
<2>C parent (parent 1)
C parent (parent 1)
<3><4>F parent 1
<5>F child 1

ちなみに ((i)?a:b) にピリオドを打つとインテリセンスが働きやがります。
そしてこう書き換えても
parent &c=(i)?a:8;
問題なくコンパイルが通り、こうなった
<2>C parent (8)
C child (8)
C parent (8)
C child (child 8)
<3><4>F child 8
<5>F child 1
<2>C parent (1)
C child (child 1)
<3><4>F child 1
<5>F child 1

面白いなぁ。
しかし、演算子オーバーロードもできない三項演算子で、
オブジェクトそのものを扱うなってことか。
確かborlandC++だと3項演算子にバグがあって
コンストラクタが呼ばれてないのにデストラクタが呼ばれるとか
そんな変な動作をするような話を聞いた。

今のところ、オブジェクトの実体を3項演算子に渡すのは
避けといた方が無難なんだろうね。
特異な書き方をする奴が悪いということでFA
758デフォルトの名無しさん:03/10/27 08:39
VC酷いな
C parent (parent 1)
C child (child 1)
この二つの出現はありえない。

VCの三項でクラスを扱うと高確率でバグを産む気がする。
とりあえず三項禁止してif文にしようと思ったが
コンストラクターでのメンバー初期化のときはどうしようか。
759デフォルトの名無しさん:03/10/27 08:43
スレ違い申し訳ありません。
yahooの投票、みんなで「その他」に入れてみよーよ!
http://sports.yahoo.co.jp/baseball/jps/event/
面白くなるぞー!!時間がありませんのでよろしくお願いします。
一人1票です。
>>744
VC7.1

<1>C parent (1)
C child (1)
<2>C parent (2)
<2>C parent (parent 2)
<3><4>F parent 2
<5>F child 1
<2>C parent (parent 1)
C parent (parent 1)
<3><4>F parent 1
<5>F child 1

ちなみに3項演算子を以下のように参照に先にcastすると
cout<<"<2>";parent &c=(i)? static_cast<parent&>(a):b;

<1>C parent (1)
C child (1)
<2>C parent (2)
<2><3><4>F parent 2
<5>F child 1
<2><3><4>F child 1
<5>F child 1
>>758
> C parent (parent 1)
> C child (child 1)
> この二つの出現はありえない。

なんで?
762デフォルトの名無しさん:03/10/27 12:51
ログ嫁
763デフォルトの名無しさん:03/10/27 19:20
C++でマウスをプログラムで操作するにはどうすればいいんですか?
C++では出来ません。該当プラットフォームのスレに行ってください。
同じように言ってやりたい奴らが
まずマウスに車輪などの区動機をつけてください
話はそれからです
ロボットコンテストを目指してるのか
GCCもISOC++100%取れてないからBoost100%じゃない
の意味すら分からない低能スレはここですか?
時間の流れが他人と半日以上もずれた超人のいるスレはここですか?
>>769
GCC擁護必死だな
↑超人がキレた
ワラタ
♪ルンルン♪o(^0^o)♪~(o^0^)o ~♪♪~o(^0^o)~♪(o^0^)o~♪ランラン♪
家を壊すぜo(^0^o)♪ 橋を壊すぜ~(o^0^)o ~♪ ビルを壊すぜ~o(^0^o)~♪ 東へ西へ(o^0^)o~♪
good job
ttp://support.microsoft.com/default.aspx?scid=kb;EN-US;216715
こんなのしか見つからないな。
これをFIXしてあんなコードが出来たのか?
結局VCを叩いてた555の馬鹿は論破されたので
結論としてはVCが正しかったということですか
MS叩きの厨房はしつこかったな
今回MSはLoki/boost対応に主眼を置いて実際完全対応したけど、
やれば出来るじゃんっつーか、今までやってこなかったのは怠慢も甚だしいだろっつーか。
なんで7.0->7.1で出来ることを6.0->7.0時代にやらなかったんだ?
6.0->7.0間でもテンプレートとSTL相当良くなってたじゃん。
そうそう。んで7.0のバグフィックスして7.1になったからこれだけイクナったんじゃないの?
6.0のSTLはヤバすぎるので皆STLPort使ってたしな。
std::fstream hoge;
hoge.open("aaa.txt");
std::vector<double> vec;
while(hoge){
hoge >> vec;
}
ってやったら最終行が2回読み込まれるんだけど何で?
コードが悪いから
修正。
std::fstream hoge;
hoge.open("aaa.txt");
std::vector<double> vec;
while(hoge){
double tmp;
hoge >> tmp;
vec.push_back(tmp);
}
>>782 >>784
push_back()する直前にhogeをチェキすべし。
>>784
std::istreamはCと同じで読み込んでみて初めてエラーかどうかわかる。

while (true) {
 double temp;
 hoge >> tmp;
 if (hoge) break;
 vec.push_back(tmp);
}
あらら
×temp
○tmp
>>785>>786 おお!感謝!
>>778
6.0>7.0で対応目指したんだが間に合わなかったから7.1に回されたらしい。
while(1){
double tmp;
hoge >> tmp;
if(!hoge)break;
vec.push_back(tmp);
}

double tmp;
while(hoge>>tmp){
vec.push_back(tmp);
}
でwhileの外にtmpを宣言するのが気持ち悪かったので
前者で対応しました。>>785>>786さんサンクス。
その2択で前者はありえないと思た。
for (double temp; hoge >> temp; ) {
vec.push_back(temp);
}

だとダメ?
>>792 をを!いい!
>>791 理由を言ってくれるとありがたいです。.
>>792 for(double temp;hoge>>temp;vec.push_back(temp)){}
ってダメですかね?今コンパイル環境がないんでためしてないですけど。
>>794
おれは791氏じゃないけど、791が普通の感覚だとおもう。
まぁ、コンパイラの最適化次第でどうせ同じになるような気もするので、
どうでもいいっちゃどうでもいいけど。
>>795 理由を教えてください。
>>796
791でも795でもないけど、
せっかく条件を記入できるようにしてるところを殺して、わざわざ終了条件をわかりにくくすることはあるまいよ。
変数のスコープを制限したいのならその周りをさらに{}で囲めばいいだけなんだし。
>>797 言わんとする感覚は分かりました。明瞭な回答有難うございます。
なんで
for(;;){}
↑ここのスコープはブロックの中なのに
do{}while()
     ↑ここはブロックの外なんだ?
わざわざ外に変数作るのすげー邪魔くさいんだけど。
プログラム中で別プログラムを実行する場合はどうしたらいいんでしょうか。

pthread_createあたりで別スレッドを起動するぐらいしか自分は思い浮かばないんですが、
他に方法は無いでしょうか。
801800:03/10/30 06:37
ああースレッドでは関数は起動できるけど別プログラムは無理なのかな。
となるとfork()〜exec()をやればいいのかな・・・
別プログラムを起動して何をしたいのかにもよるけど、
system() とか popen() とか。>>800
803デフォルトの名無しさん:03/10/30 12:35
VC6で正規表現を使いたくてBREGEXP.DLLを使ってみました。
  char *pTarget=new char[1000];
  char *pKey=new char[1000];
  char *pMsg=new char[100];
  BREGEXP *pcRegExp=NULL;
  strcpy(pTarget, "The Test of BREGEXP.DLL 2003/10/29");
  strcpy(pKey, "/2003/2004");
  int iResult=BSubst(pKey, pTarget, pTarget+strlen(pTarget), &pcRegExp, pMsg);

とやってみましたが、pTarget[]の文字列は置換されていませんでした。
2003を2004に置換するにはどのように入力したらよいでしょうか?
>>799
両方とも、
{for(;;){}}
{do{}while()}
こう書いたときと等価なんだから、別におかしいとは思わない。
等価じゃありません。
806VBまん:03/10/30 13:22
VBをつかってブラウザを起動(もしくは作る)しHPのFORMタグに自動的に
ID,パスワードなどを入力させるプログラムを作りたいのですが、
資料がなく困っています。いい資料orHPなど参考になるものを
知っている方教えてください。
(ブラウザを起動することはできます。)
>>805
なんかちがうとこあるの?まさか;
>>804
おかしいかどうかは知らないけど
do
{
 bool succeeded = いろいろ;
}while(succeeded);

とか出来ないのサイアクじゃない?
809VBまん:03/10/30 13:44
すみません。書くところまちがえました。
C++のすれでしたね(T_T)
>>808
while(いろいろ(...)){} でいいじゃん。
>>810
論点ずらすくらいならレスしなほうがいいと思うよ。
アフォは、放置。
テキストファイルから1行ずつ文字列を読み込んで、特定の単語を抜き出し
配列に格納するルーチンはどう設計したらいいでしょうか?
#define UNKO 1000000000000000

Cの場合これでUNKOが100000000000000に置き換えられるのですが、
これはC++でも使えるのでしょうか?
コンパイルエラーが出るので、ひょっとしたら使えないんじゃないかと思うんですが・・・

>>814
コンパイラのunsigned long intの範囲を超えたんじゃないの?
816デフォルトの名無しさん:03/10/31 03:25
C++ではあるクラスのstaticなメソッドからそのクラスの
インスタンスのprivate/protectedなメンバは操作できなんでしょうか?

class A{
private:
 int Val;
public:
 static void doSomething(A *a){
  a->Val=10;
 }
};

みたいな感じで。
出来ます
>>816
そういうのは試してみてから物を言ってください。
819816:03/10/31 03:47
>>817,818
いや、VC++6で試してるんだが、protectedメンバにアクセスできない、ってエラーが出る。
具体的にはclass Aのスタティックメソッドからclass Aの親の親クラスの
protectedメンバを参照してるんだけど、これは無理?
無理です
821816:03/10/31 03:51
ショボーン

ありがとうございました。
822デフォルトの名無しさん:03/10/31 05:32
STLを使うとビルドが遅くなってしまう。
ヘッダにそれ関連を含めただけでもビルドが遅く・・・

みんな、どのように解決してる?
>816
無理矢理、やってやれないこともない
class A
{
protected:
enum {ANUM = 10};
};
class AA : public A
{
public:
static void sf(A *a){cout << static_cast<AA *>(a)->ANUM << endl;}
};
void main()
{
A a;
AA::sf(&a);
}
>>823 pimpl
>>823
速いマシンを買え
ビルド・・・
時代だなぁ。
>>823
プリコンパイルヘッダ使え
>>827
時代だねぇ
BCCもVC7.1もプリコンパイルヘッダ標準装備だし、あとgccが
プリコンパイルヘッダを装備したら、もうコンパイルの遅さを
コンパイラのせいにはできないぞよ。
んなもん、内部処理の出来不出来でいくらでも早くも遅くも出来るじゃん。
>>823
遅くなるって、何十分も何時間も遅くなるわけじゃないから、
たいした問題ではない。
>>823
マシン買い換えるのが一番手っ取り早い。
VC++の場合、コンパイル済みヘッダを使ってもテンプレートはあまり速くならない
コンパイル速度云々という話が出るたびに
PCなんて安いんだからいいの買えよって思う。
PCなんて安いんだから・・・
時代だなぁ。
5マソもあれば、アポロにのって月へ行ったマシンよりも
良いCPUの乗ったマシンがかえるもんな。
まぁファミコンのほうが性能がよかったらしいが
ファミコンといったら任天堂。
Play-Stationといったらsony。
次はどこのメーカーの次世代ゲーム機がヒットするのかな。
チュートリアルのテキストエディタの作成に失敗しました。
>>839
それはあなたが呪われているからです。
三日以内にテキストエディタを完成できないと(以下略
841デフォルトの名無しさん:03/10/31 19:56
>>839
金輪際プログラミングはしないと誓って、あとはファミコンで遊んでてください。
さもなくば一生呪われるでしょう。
VCのコンパイル時間はほぼCPUのスペックに比例
メモリやHDDが貧弱すぎなければの話だが

P3/550で5分
豚25で1.5分
843842:03/10/31 21:16
反比例だなスマソ
>>823 pimpl

↑めんどくさいよー。
それに外向けのサービス関数に、STLのコンテンツへの参照渡しなどに
したい場合、結局、ヘッダにSTL絡みのヘッダをincludeするはめになるし。
>>844
トレードオフってやつですよ。
>コンパイル速度云々という話が出るたびに
>PCなんて安いんだからいいの買えよって思う。
いや、だから、3.2GHz程度のPCでは速度的に足りなくて不満だから
別の解決方法を模索してるのに・・・。
847846:03/11/01 01:49
完全ビルドに45分かかってる。
仮に数年後に10GHzなCPUが登場してもなお、15分前後はかかる計算に。
しかも、ソースファイル数が100にも届かない初期段階。
おそらく開発後半は2時間かかるかも。

完全ビルドになりにくいようなヘッダファイルを構築する工夫があるが
これはこれで手間時間というコストがじわりじわりと効いてくるし
そもそも本質からは離れた作業。

「じゃ、テンプレート捨てろよ」と言われても、今更捨てられない。
捨ててしまう犠牲は計り知れない。

はてさて、どうしたものか。
各ヘッダでincludeするのやめろよ。先行宣言だけにせえ。
ヘッダ間の依存関係を極力なくせよ。
>>各ヘッダでincludeするのやめろよ。先行宣言だけにせえ。
横からつっこみ入れるけど、返却値だとか引数にSTLなどの
テンプレート使った時点で、それら標準ヘッダファイルをincludeせねば
ならない。仮に参照渡しやポインタ渡しのみ必要な場面であっても
先行宣言(存在仮宣言)だけが記述されたヘッダファイルというのは
STLには存在しない。

ヘッダ間の依存関係を極力なくしても、避けられない共通モジュールで
STLを使っていたら、全ての苦労が水の泡。

CPUパワーが100倍近く足りないという感には激しく同意。

小物ツールでよいならば、それこそ500MHz程度のPCで十分んなのだが。
HDD速い方が効果的なような
>>847
> 完全ビルドに45分かかってる。
どういうコードをビルドしてるんだ?

俺が今仕事でいじってるのは C++ とアセンブラで合計 7 万行程度のプログラムだが、
これでも gcc でフルビルドに要する時間は 2 分程度だぞ。CPU 8 つ使ってるけど。
>俺が今仕事でいじってるのは C++ とアセンブラで合計 7 万行程度のプログラムだが、
>これでも gcc でフルビルドに要する時間は 2 分程度だぞ。CPU 8 つ使ってるけど。

ん、それ、x8なら単一CPUで流したら、16分かかるでしょ?
C++というより、テンプレ使うか否かがボーダーラインだし。
仮に847のプロジェクトが20万行程度の規模だったら丁度、45分だろ。
ありえない話でもない。
gccが異様に遅いのが悪因なわけだが。
>>852
> ん、それ、x8なら単一CPUで流したら、16分かかるでしょ?
CPU に比例してリニアには延びないよ。gcc だとリンク時間も長くなりがちだし、dual
processor のマシン一台でもせいぜい 6 分程度。コンパイルだとファイル I/O 待ち
時間がかなり多くなりがちだから、

o 複数のファイルを同時にコンパイルし、入出力をオーバーラップさせる。経験上、
 プロセッサ1つにつき 2 - 3 ファイルを並列ビルドするのが良い。
o 主記憶を多めにとって、ファイルを極力キャッシュに載せる。ディスク入出力を
 可能な限り少なくする。分散ファイルシステムを使っている場合にはパラメタ
 要調整。

といった対策を取ると、コンパイル速度が向上する。

ちなみに俺のトコロだと Athlon MP 2100+ * 2, DDR SDRAM 2100 1GB というマシンを
4 台ネットワーク上に並べて分散ビルドしてる。だいたい、各マシンで同時に 4 ファイル
並列コンパイルするように設定。
GCCなら-pipeオプションや、/tmpをメモリ上に配置するだけで
かなり速くなる。VC++でも中間ファイルをディスクに書き込まない
設定とかあるんじゃないのか?VCが遅いとか言ってるのは
使い方がおかしい気がするが。メモリを沢山積めばソースファイルは
ディスクキャッシュが効いて、メモリ上に貼り付けになるしな。
まあ、どうでもいいがスレ違いだ。
>>855
> VCが遅いとか言ってるのは使い方がおかしい気がするが。
ありがちなのが pch の設定ミスだね。

> まあ、どうでもいいがスレ違いだ。
そうかも。
とりあえず iosfwd みたいなのが STL にも欲しいよな。
858831:03/11/01 15:40
>>857
同意
iosfwdしか先行宣言ヘッダがないのは標準の片手落ちな感じ。
859857:03/11/01 17:02
g++ について来るヘッダには bits/stringfwd.h ってのがあるなぁ。
あとは containerfwd.h とかってモンでも自分で作ればいいか。
なんか今までは「メンドイからいいや」とか思ってたけど、ちょいと作ればいいだけじゃねぇか。
gccでおそいって言ってる人に聞きたいんですが、デバッグ情報生成させてますか?
こんぱいるor実行 速度
どっちの話だ?
862860:03/11/01 17:51
ん?コンパイルの話ですよ。
g++で遅いって話はテンプレ使ってるからだろうってことでスレ違いになったよ。
>>1 周辺を読んでね
テンプレートと既成のテンプレートライブラリは別だろ。
gccはもともと速いコンパイラじゃないだろ
>>865
遅いと言うのは相対するものがないと言えないんだがなんと比べてるんだ?
>>864
別ですが。それで何?
>>866
時期時期で一般的なコンパイラ
TC/SC/MSC全盛の時代からgccが一番遅かったし
他プラットフォームの事情は知らんけど。
GCCってコンパイラの最低基準じゃないのか?
断罪されるべきはあれよりヘボイ物作っておきながら
金取ってる連中だろ。
コンパイラ間の比較はそれぞれが持っている機能に差がありすぎて
比較のしようがないような。。。
>>869
だからBCCも無料になったんだろ
>>869
> GCCってコンパイラの最低基準じゃないのか?
そういう問題じゃないだろう。

gcc はコンパイル環境・ターゲット環境ともマルチプラットホーム前提、場合によっては
コンパイルだけは gcc を使うがアセンブラやリンカは binutils を使わずベンダのものを
使う事もある、と汎用性を最重視している。

他のコンパイラは、また別のトコロに重きを置いている。プラットホーム固有の最適化
だったり、ウィンドウアプリケーション開発のための統合開発環境だったり。評価軸が
違うから、いちがいにどっちが良い悪いとは言えない。
>>868-869
香ばしすぎ!
>>873
何と比べて遅いか聞かれたから答えただけだが
どこが同おかしいのか説明してくれ
>>874
カキコしてから>>868はそうなのかもしれんとおもた。ゴメン。
同じソース行数で比較した場合、vc++がgccに比べて最低でも5倍は
速い。ただし、生成されるコードの速度に関しては特にその差は見られなかった。
Windows系はwindows.hという巨大ヘッダが立ちはだかってるから
早期からプリコンパイルヘッダが要求され、実装されてたもんな。
>>876
optimizerの設定は?
>Windows系はwindows.hという巨大ヘッダが立ちはだかってるから
>早期からプリコンパイルヘッダが要求され、実装されてたもんな。
そうだね。このあたり、小さなプログラムばかりをターゲットとしてた
gccは完全に遅れをとってる、というか未だに工事中な機能だしね。

インラインマクロを修正して、その挙動を確認するのに
全ビルドになってしまい、1時間かかってしまうこともあるからなぁ。
さらに、その1時間、別のことをしていて、なにを検証確認すべきかも
うっかり忘れてしまうこともあったりして。

1分なら待てるけど。
となると、やはりPen4換算で、180GHz のマシンは欲しい。
えっと、CPUパワーが60倍になるのにどれくらいだろ?
10年はかからないと思うけど、5年はかかるよね?
>>880
開発中にインラインなんて使わんだろ。何考えてんだ。
インラインにするかどうかは最終段階でプロファイル見て決めるんだよ。
Pen4の3GHzのマシンで1時間もかかるもの書いてるならコンパイラ変えたら。
インラインマクロって何だ?
>>880
ムーアの法則 http://e-words.jp/w/E383A0E383BCE382A2E381AEE6B395E58987.html
によると、大体 21ヶ月で4倍だから...

(log 60 / log 4) * 21 ≒ 62ヶ月 ≒ 5.2年 ぐらいかな。
>>883
処理手順のマクロのことじゃね?
>>885
全然意味がわかんない。
こんなマクロの事だろ

BEGIN_MSG_MAP(CMainFrame)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
COMMAND_ID_HANDLER(ID_APP_EXIT, OnFileExit)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
NOTIFY_CODE_HANDLER(LVN_COLUMNCLICK, OnListViewColumnClick)
END_MSG_MAP()
マクロっていつでもインラインでは。
>>881
インラインぐらい開発中でも使えよ。
>>889
880の例があるように、結構コストが高いのですよ。
>>890
それは各モジュールの独立性がほとんど確保できてなかったり
短くてもインラインにすべきでない関数の判断ができてないのが問題だと思うけど。
>>891
容易に判断を誤るものを「インラインぐらい」というのがおかしい。
>>892
そんなに容易に判断を誤るものなのか?
>>893
"Inlines are the third most-misused C++ feature (after inheritance and overloading),
used far more often than any practical criterion could justify,
just because it is more covenient to write them in place.
Anything that encourages their use beyond strict engineering merit is detrimental."
inline にも export みたいな仕様が欲しいな...。
そして、仕様に入ってるだけじゃなくて、ちゃんと実装してホスィ...。
>>894
どっからの引用かは知らんが、だから何?
>>896
容易に判断を誤るわけですよ。
そういうもんなのか。
漏れは最初は容易に判断を誤っても、
すぐに慣れるもんだと思ってたんだけど、
みんなは容易に判断を誤っちゃうのか。
>>898
お前も間違って判断してるだろ。そんなもんだ。
900デフォルトの名無しさん:03/11/02 15:33
900get & さらしあげ
>>899
覚えたてのころはよく誤ってたけど、
少なくとも最近は誤った覚えはないぞ。
>>901
だから何?
>>902
「容易に判断を誤る」ってことに懐疑的なだけ。
なんで誤ってないと核心できるんだろう
>>904
主観による判断でなにかいけませんか?
>>904は釣り
漏れの1メートルが正しい!
判断基準を明記せずに「誤ってない」とかいっても無意味。

謝った結果の悪影響には、実装の変更による再ビルドの影響、
パフォーマンスの悪化、そして出力コードサイズの増大なんかが
あるが、これらをどんなバランスで重要視するかだよな。

モジュール数が多い開発になるなら、実装の変更による再ビルドの
悪影響が耐えがたいほどになるため基本は非inline。pimplにするもいい。

パフォーマンスについては、ほとんどの場面でinlineにしても大して効果がなく
実際に大きな効果がある場所の判断は熟練してても間違いやすいので計測で。
>>908
ほぼ同意するが、結局はそれも主観。
雑談するならC言語スレに逝けよ
いや、ここでいい。
inlineな話題の延長だからな。
低脳ほどくだらんネタに拘るからな。
誰かにカマって欲しいならラウンジにでもいってこいよ。
>>912
ふーん、君はラウンジにお友達がいるんだ(w
↑すげー論理の飛躍
↑行間を読めないヤシ
インライン関数は.inlに書いて、リリース時はヘッダにインクルード
デバック時はソースにインクルードする手法が一般的になりましたが
さていかがお過ごしですか、みなさま。
そんな手法は一般的じゃありません
じゃあ、今からは取り入れて快適なC++ライフをお過ごしくださいね。
だからわざわざそんな面倒くさいアプローチとらにゃならんほどは
間違えないんだって。
別に大してメンドクサクも内ですよ。一度試してみてはいかがですか?
>>920
仮に間違えたってそのロスはビルドしなおす時間分だけで済み、
且つ実際には一度も間違えないのに、無駄に作業ステップを増やすことはないだろ。
少なくとも漏れにとってそれはチャリの補助輪と同じ。
一度チャリに乗りなれたら邪魔なだけ。
C++の質問なら私にきいてもいいよ♪お兄ちゃん♪
http://www.ichigobbs.net/cgi/readres.cgi?bo=proglam&vi=0069&rm=50
>>921
> 仮に間違えたってそのロスはビルドしなおす時間分だけで済み、
それが問題だというのがスレの流れ。前提を破壊するなよ。
>>923
日本語読めない子は放っておけ。
>>923
じゃぁ、そのだけ無視すれば。
assertion系マクロを有効/無効をチェンジするにも、
全部ビルドせねばならないし。開発後半、この切り替えは
重くのしかかってくるよ。

実装判断が間違えてなくても、厳しい例があるってこと。
>>926
ビルドディレクトリ分けてないの?
>>仮に間違えたってそのロスはビルドしなおす時間分だけで済み、
えっと、2chなのでいろんな環境の人が混じってるので、前提条件も
様変わりする思うのですが〜、とりあえず、ビルドしなおす時間が
数時間にわたるケースも決して珍しくないという点。

全ビルドをなるべく避けたい現場ってのがある場合、どういう工夫がある?
というのが流れ。
>>926
コンパイルオプションで部分的に有効にできるようになってればいいのにね。
なんでそんな構造になってるの?
>>928
>>881 に過剰に反応してしまったけど、
そういう意味でなら了解。
>>926
>全部ビルドせねばならない

いたたた
確かにデバッグゴードをマクロでラップしてる場合は、
完全ビルドだね。これはもう避けられないのでは?
実際、ソースコードとしてはなんら問題ない書き方なんだし
933デフォルトの名無しさん:03/11/03 00:26
>>932
ええ〜、本当に?
934r:03/11/03 01:01
つまり、ヘッダファイルと本体ファイルが別れてる、つか、
コンパイル済みのファイル(objファイルとか)から、
ヘッダファイルの情報が完全に無くなっている、
プリプロセッサなんてモノのある言語は糞だと。

そういうことか?
>>932
ふつー、デバッグビルドとリリースビルドは出力ディレクトリを変えておかないか?
すげー。そこまで言い切るんだ…
937デフォルトの名無しさん:03/11/03 01:24
>>936 == >>
>>932
完全ビルドってのは最初の1回だけで、
以降は変更したとこだけでしょ。
ピンプルってなに??
pointer implement
ピンクパイナップル
なんやねんそれは
得ろゲーのアニメ作ってる会社だったと思った
ひとり、やねうらをが混じってるな。
[OVA]新体操(仮)の内容はともかく歌はいいよな。
946デフォルトの名無しさん:03/11/03 08:15
みんな、だいたいどのくらいの数のファイルをコンパイルしてるんだろう。
うちのプロジェクトは、大体150個の.cppファイルと
それと同じくらいの数の.hファイルなんだけど、
Pentium3-1GHzのマシンでフルビルドが5分くらい。
VC++.NET 2002を使ってる。


コンパイルって、他のファイルのコンパイル結果を知らなくてもできるよね?
ってことは、めっさ分散処理向きだと思うのですが、
暇そうにしてるパソコンのCPUを使用する、
setiっぽいコンパイラって無いかな。
地球のみんな!オラのソースをコンパイルする為に力を貸してくれ!
Mac OSXの開発環境は分散コンパイル対応じゃなかったか。
ただまぁ、コンパイル速度ってCPUもさることながらI/Oの性能にも
かなり依存してるとこがあると思うんだが。
RAM512MB以上とATA66以上だと
ほぼCPUが律速段階と言い切ってもよさそう
SETI(Sokono Eroi-pc Tetsudae Imasugu-compile)プロジェクト始動!
>>946
> 暇そうにしてるパソコンのCPUを使用する、
> setiっぽいコンパイラって無いかな。
UNIX だと distcc とか PMVGmake とか。
>ただまぁ、コンパイル速度ってCPUもさることながらI/Oの性能にも
>かなり依存してるとこがあると思うんだが。
自分もそう思ってた口なんだが、実測してみると
I/Oはほとんど影響ないみたい。

>>952
分散コンパイルにするとネットワークを介してファイルや何かをやりとりするから、
そこがボトルネックになりがち。ローカルディスクだと話が違ってくる。
>>分散コンパイルにするとネットワークを介してファイルや何かをやりとりするから
設定次第だけど、タイムスタンプ比較でキャッシングするので
ネットワーク越しに限らず、その負荷は無視できるほど小さいケースが
多いっすよ。
>>うちのプロジェクトは、大体150個の.cppファイルと
何行くらいのファイル?
150個というと、かなり小規模プロジェクトかもしれないけど
ポリシーによって上下するのでなんともいえない。
>>954
> 設定次第だけど
うーむ、ネットワーク管理部門に NFS の設定を見直してもらうかなぁ。ちなみに
キーになりそうな設定項目が何か分かる?

俺のトコロだと C++ でソースをコンパイルする場合、単一プロセスだと CPU 使用率
(ユーザ時間 + システム時間 / 実時間) は 60% 程度。複数のファイルを並列で
コンパイルすると 100% 近く行くけど。
分散コンパイルをするためのwikiページ
http://acapulco.dyndns.org/pukiwiki/pukiwiki.php?distcc
distccの本家はこちら。
http://distcc.samba.org/
>うーむ、ネットワーク管理部門に NFS の設定を見直してもらうかなぁ。
>ちなみにキーになりそうな設定項目が何か分かる?
samba経由(linux上)にソース置いてるので、sambaでの設定なら分かるけど
NFSは不明。
山田うどんのホームページがつながらないよ!!
http://www.yamada-udon.com/
961デフォルトの名無しさん:03/11/04 17:40
Boostのregexを使ってみたのですが、関数内で

  boost::reg_expression<wchar_t> strRegExp=m_pwcRegStr;
  boost::match_results<std::wstring::const_iterator> cResult;
  BOOL bRes=boost::regex_search(stdStr, cResult, strRegExp);

とあり、この関数が2度以上呼ばれるとメモリーリーク起こすようなのですが
どのように対処すればよいですか?あと、正規表現自体の文法エラーを

  catch(boost::bad_expression){}    ・・・(1)

で、キャッチしているのですが、MFCだと

  catch(CMemoryException *pE){ pE->delete(); return -1; }

みたいなことが必要なので(1)でもdelete()処理をする必要があったりはしないのですか?
>>961
後半だけ、よく見比べれば飛んでるのがポインタかそうでないかの違いがあることに気づくはず。
963961:03/11/04 17:57
>>962
ぐぐってみると、
 catch(boost::bad_expression *e){}
 catch(boost::bad_expression&){}
なんてものがヒットしたんで混乱してます。・・・どちらにせよ例外時のメモリ解放処理は
ヒットしないので必要なさそうではあるのですが
> とあり、この関数が2度以上呼ばれるとメモリーリーク起こすようなのですが
> どのように対処すればよいですか?
boostのバグトラックかregexの作者さんに
メール投げるかするとよいと思われ。
>>964
分かったから次スレ立てて
966964:03/11/04 21:36
>>965
わかったけど今テンプレを連張りするとアクセス禁止くらいそうだから、
そんときは続きをよろしく。
967964:03/11/04 21:45
968デフォルトの名無しさん:03/11/05 10:41
山田うどん復活!!
969デフォルトの名無しさん:03/11/06 15:30
オメ!!
970デフォルトの名無しさん:03/11/09 00:27
ちゃんと最後まで埋めなさい!
埋めるならageるな
拡張子のcppとcc、どちらかに統一しなさい!
>>972
cxxやCは不許可ですか?
         v――.、
      /  !     \
       /   ,イ      ヽ
     /  _,,,ノ !)ノリハ    i                                        
    i  jr三ミ__r;三ミ_   ヽ     
    l  ,iヾ二ノ ヽ二 ハ   ノ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ヽ、.l  ,.r、_,っ、  !_,    <  >>1 糞スレ立てんな、蛆虫、氏ね。
       !  rrrrrrrァi! L.     \______________
       ゝ、^'ー=~''"' ;,∧入
   ,r‐‐'"/ >、__,r‐ツ./   ヽ_
  /  /  i" i, ..:  /  /  ヽ-、   
 ./  ヽ> l    /   i     \

         v――.、
      /  !     \
       /   ,イ      ヽ
     /  _,,,ノ !)ノリハ    i                                        
    i  jr三ミ__r;三ミ_   ヽ     
    l  ,iヾ二ノ ヽ二 ハ   ノ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ヽ、.l  ,.r、_,っ、  !_,    <  >>1 糞スレ立てんな、蛆虫、氏ね。
       !  rrrrrrrァi! L.     \______________
       ゝ、^'ー=~''"' ;,∧入
   ,r‐‐'"/ >、__,r‐ツ./   ヽ_
  /  /  i" i, ..:  /  /  ヽ-、   
 ./  ヽ> l    /   i     \

976デフォルトの名無しさん:03/11/09 19:39
大文字のCなんていう拡張子使うのか?
977デフォルトの名無しさん:03/11/09 19:41
>>976
はじめの頃はそれを使っていたとか。
でもWindowsみたいにファイル名の大文字小文字を区別しないOSで問題が出るからやめたとか。
C++ Primerか何かで読んだ。
978デフォルトの名無しさん:03/11/09 19:45
へぇーへぇー
979デフォルトの名無しさん:03/11/09 22:37
C++でcinに文字バッファが残っているかどうかってどうやって調べるんですか?
もし残っていたら特定の処理がしたいので、if分の条件式に入れたいと思っています。
cin.rdbuf()->in_avail()
 め
  る
   ぞ
986デフォルトの名無しさん:03/11/10 14:01
ロマサガ2をやろうかな

         v――.、
      /  !     \
       /   ,イ      ヽ
     /  _,,,ノ !)ノリハ    i                                        
    i  jr三ミ__r;三ミ_   ヽ     
    l  ,iヾ二ノ ヽ二 ハ   ノ   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    ヽ、.l  ,.r、_,っ、  !_,    <  >>1 糞スレ立てんな、蛆虫、氏ね。
       !  rrrrrrrァi! L.     \______________
       ゝ、^'ー=~''"' ;,∧入
   ,r‐‐'"/ >、__,r‐ツ./   ヽ_
  /  /  i" i, ..:  /  /  ヽ-、   
 ./  ヽ> l    /   i     \
988デフォルトの名無しさん:03/11/10 23:48
捕手新党が自民党に吸収されたってね。
ただのヘタレ政党じゃん。
そろそろC--の時代じゃないか?
時代じゃありません。
そろそろC//の時代じゃないか?
992デフォルトの名無しさん:03/11/11 00:54
記念カキコ v(^-^=)
ずさっと
しかしよく続くねぇ>このスレ
5秒前
4秒前
(プゲラッチョ
sage
(rァ゚Д゚)rァ 死刑! >999
1000取得
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。