C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。
過去スレ、関連スレ、関連リンクなどは
>>2-20 あたり
10 :
デフォルトの名無しさん :04/08/31 22:24
続きはろうか
12 :
v(^・^)v :04/08/31 22:25
STLつかうと一気に実行ファイルサイズが10倍に?!
遅れた_| ̄|○
14 :
v(^・^)v :04/08/31 22:26
>>12 環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
15 :
v(^・^)v :04/08/31 22:26
>>14 すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
スマン。最新のスレじゃなかった。_| ̄|○ カコログカラ ソノママ モッテキチャッタヨ…
17 :
v(^・^)v :04/08/31 22:27
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
18 :
v(^・^)v :04/08/31 22:27
>>17 #include <stdafx.h>
後死ね。
>>18 言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
20 :
デフォルトの名無しさん :04/08/31 22:30
完了だな
>>20 つまり
∧∧ _ ドスッ
( ,,)┌─┴┴─┐
/ つ. 終 了 │
〜′ /´ └─┬┬─┘
∪ ∪ ││
゛゛'゛'゛
ということだな?
22 :
デフォルトの名無しさん :04/09/01 05:23
どっちが本家?
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば 紹介していただけないでしょうか?
996 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/31 20:08
namespaceってウンコだよね。
ライブラリ作ってる香具師がバカだとglobal namespaceになんでも詰め込みやがるから、
こっちで
namespace UnkoLib
{
#include <library.h>
}
とかやってもうまく動かないし。
1000 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/31 21:05
>>996 その場合ライブラリ作ってる香具師がウンコだよ。
>>23 boost::ublas
Blitz++
lapack
あれ?もしかして俺思いっきり釣られた?
つーかなんでハンドルがピンキーになってるんだよ?ゾヌのバグか?
29 :
デフォルトの名無しさん :04/09/01 09:45
漏れは、未だかつて名前衝突を経験したことがない。 名前重複する関数がヘッダーにソースごと貼ってあったら、 それをコピペして関数名変えて使ってしまうし。 名前空間が入り乱れた状態を経験した人って、 さぞや大きなプロジェクトに携わってるんだろうなぁ。 是非、そのエピソードを披露して頂きたいものだ。
std::pairってよく使いますか? たとえば、ストリームから整形しながら文字列を読むメソッドを作って、 文字列と読み込んだバイト数をpairでパックして返してるんですが、 mapの内部用クラスだから、直接使うべきじゃないとか言われたんですよ。 オブジェクトと付加情報を返したいときって、やっぱり汚くても引数で返すのがいいんでしょか?
>>30 そんな事ない。
本当に内部用クラスなら公開されてないし。
むしろ、std::pair使用時の一時オブジェクトのコピーコンストラクタの冗長性の有無を気にした方がいい。
32 :
デフォルトの名無しさん :04/09/01 10:48
あるfloat値x、y、zがあって、これらが-1.0f〜1.0fの値域にあるかないか判定したいとします。 普通に組むとこうなると思うんですが、 if( x <= -1.0f && x >= 1.0f && y <= -1.0f && y >= 1.0f && z <= -1.0f && z >= 1.0f) bHit = true; 野生の勘ですが、もっと最適化出来るような気がしてなりません。 どうでしょうか?
不等号が逆でした、失礼しました。
>>32 最適化じゃないけど、普通こう書くんじゃないかなぁ。
bHit |= ( x <= -1.0f && x >= 1.0f &&
y <= -1.0f && y >= 1.0f &&
z <= -1.0f && z >= 1.0f);
x*x <= 1.0f && y*y <= 1.0f && z*z <= 1.0f
#define FABS(x) ( *(int32_t*)&x & ~(1<<31) ) if (FABS(x) < 1.0f && FABS(y) < 1.0f && FABS(z) < 1.0f) bHit = true;
C99ならfabsfがあるだろ
&&より&のほうが速くなるんじゃないかとおもいます
>>37 最適化っつーんで、あえて最上位ビット反転を明示させるために書いてみただけ。
【テスト内容】
double x, y, z;
for(x=1.1, y=1.1, z=1.1;x<10000000.0; x+=0.01){
if( 条件式 ){
cout << "OK" << endl;
}
}
上記コードで、
>>32 ,
>>35 ,
>>36 を試した。
>>36 はcmathのfabs()を用いた。
使用環境はVC6.0。
【結果】
[単位=秒]
1回目 2回目
>>32 2.156 2.14
>>35 2.125 2.141
>>36 8.375 8.484
【評価】
>>35 は条件の範囲が正負で違う場合に修正が面倒。
>>36 のfabs()は論外。素直に
>>32 を使ってよいかと。
>>41 ご要望に答えて
>>36 のマクロでやってみた。但し、以下のようにintを使った。
#define FABS(x) ( *(int*)&x & ~(1<<31) )
【結果】
>>32 2.14
>>35 2.141
>>36 (fabs) 8.5
>>36 (FABS) 8.031
【評価】
>>36 のFABS(x)はfabsより若干速い。
あいかわらず
>>32 最強かと。
たぶん何も考えずに書いたコードの方がコンパイラも最適化しやすいのだろう。
そんな結果になるわきゃないと思うけどな…
>>42 確かに遅くなった。
FPUとALUのレジスタが違うから、メモリアクセスが頻発してるんだね。
>>40 CPUによっても違うんじゃないか?
P4系の浮動小数点ユニットはやたらとストールするからなぁ。
Athlon64とかでやってくれない誰か?Intelは一次キャッシュのポートが一つ しかなく同時に読み書きできないしFPUは貧弱だしで公平な比較ができん。 と言ってもデファクト・スタンダードがIntelというなら構わんけど。
>>44 、
>>46 当方の環境は、WinXP Pen4-3.0GHz HTオン。
VC6.0なので
>>46 の指摘が、気になるちゃぁ気になる。
VC++Toolkitあるけど、やる気なし。スマソ。
お答えありがとうございます!
>>32 が最強なんて意外です。つーか超勉強になりました。
>>40 fabsは確か組み込み関数の最適化フラグがありましたよね、
また&&と&の違いも気になりますね。
>>48 x86系+VC6が条件なら変わらないだろ
こういう簡単な比較が一番CPUのアーキテクチャによる差が出るんだよな。 俺もP4とAthlon系で随分と傾向が違うのを嫌ほど見てきた。
>>49 感謝されてなんですが、
>>47 の指摘を受けて、ループを変えました。
for(x=1.1, y=1.1, z=1.1;x<10000000.0; x+=0.01){
↓
for(x=1.1, y=1.1, z=1.1;x<1000000.0; x+=0.01, y+=0.01, z+=0.01){
結果が激変したわけで・・・・。
>>32 0.89
>>35 0.828
>>36 fabs 0.813
>>36 FABS 0.812
なんか、FABSマクロの挙動が可笑しい(x,y,z=1.25)。調べる気ゼロ。
間違ってるとかない?
【結果】
>>32 は最下位転落。残念。
&&連結なので、xだけ判定して、残りy,zを判定せずに処理したことが原因でしょう。
>>52 さん、ぬか喜びさせてすみませんでした。藁って許してね。
56 :
デフォルトの名無しさん :04/09/01 12:53
>>52 じゃなくて
>>51 さんへのレスでした。やばい、漏れテンパッてる。
でもテストは真っ当なものです。信じてちょ。
> なんか、FABSマクロの挙動が可笑しい(x,y,z=1.25) doubleのままあのマクロを使ってたりして
x, y, zがどれぐらいの割合で、-1〜1の範囲に収まるかによっても結果が違うよね。
最初のx >= -1の条件でほとんどはじかれるようなら、
>>32 が最速だろうし
ほとんど最後の条件まで判定するようなら他のだろうし。
x, y, zがよっぽど偏ってない限り、小細工はいらないと思うけどね…。
>>58 もちろん、doubleのまま。やっぱ駄目かね。薄々気付いてたけど。
sizeof(double)=8 sizeof(float)=4 sizeof(int)=4 だね、Win32。
んじゃ、doubleをfloatにして試してみるか・・・。ループ変更
for(x=1.1f, y=1.1f, z=1.1f;x<250000.0f; x+=0.01f, y+=0.01f, z+=0.01f){
でやってみた。
【結果】
0.218
0.188
0.172
0.187
【評価】
cmath のfabsが最強ですた。
FABSマクロも正常稼動。
もう勘弁して下さい。(涙
今度こそ、ファイナル!
>>59 の指摘をうけて、ちゃんと条件領域を通過するようにした。
#define LIMITER2.0f
#define DELTA0.0000001f
#define LOOP()for(x=-LIMITER, y=-LIMITER, z=-LIMITER;x<LIMITER; x+=DELTA, y+=DELTA, z+=DELTA)
で、実際のコードは以下のような使い回し。
float x,y,z;
LOOP(){
if( 条件式 ){
// なんらかの処理(低負荷)
}
}
【結果】
0.391
0.312
0.297
0.141
【評価】
FABSマクロが最強。
自分のことさえ信じられない。もう勘弁。
Cスレ逝ってやれYO
>>40 自分もやってみました!
【式】
timer.Start();
for( x=-10000.0 , y=-10000.0, z=-10000.0; x<=10000.0; x+=0.01, y+=0.01, z+=0.01)
{
if( なんらかの式)bHit = true;
}
timer.Stop();
stream << "なんらかの式 : " << timer.GetLatestSecond() << endl;
【結果】
x <= -1.0 && x >= 1.0 && y <= -1.0 && y >= 1.0 && z <= -1.0 && z >= 1.0 : 0.000994819
x <= -1.0 & x >= 1.0 & y <= -1.0 & y >= 1.0 & z <= -1.0 & z >= 1.0 : 0.00571274
x * x <= 1.0 && y * y <= 1.0 && z * z <= 1.0 : 0.00557529
fabs(x) < 1.0f && fabs(y) < 1.0f && fabs(z) < 1.0f : 0.00560937
FABS(x) < 1.0f && FABS(y) < 1.0f && FABS(z) < 1.0f : 0.00557557
x <= -1.0 && x >= 1.0 && y <= -1.0 && y >= 1.0 && z <= -1.0 && z >= 1.0 : 0.00567754
x <= -1.0 & x >= 1.0 & y <= -1.0 & y >= 1.0 & z <= -1.0 & z >= 1.0 : 0.00583258
x * x <= 1.0 && y * y <= 1.0 && z * z <= 1.0 : 0.00557613
fabs(x) < 1.0f && fabs(y) < 1.0f && fabs(z) < 1.0f : 0.00577951
FABS(x) < 1.0f && FABS(y) < 1.0f && FABS(z) < 1.0f : 0.00604825
【評価】
自分の結果だと
>>32 がダントツでトップになりました。残りは誤差程度の差に収まってしまいました。
&&と&ですが、これは&&の方が早いようです。理由は
>>59 さんの指摘によるものだと思います。
&& : 0.000994819
& : 0.00571274
65 :
あっちの住人 :04/09/01 13:32
相変わらず不等号が逆だな
>>64 は間違ってます・・信用しないで下さい・・
逝ってきます失礼しました・・
無駄に疲れた。
このアフォな労力は一体・・・。
>>65 漏れは、素直に
>>62 に謝りたい。関係ない人には不快だったかも。
>>66 漏れは、不等号をちゃんと修正してやってますた。
70 :
あっちの住人 :04/09/01 13:40
Cスレに誘導するなという意味なんだが。
FABSが最強に遅いです。なんか定説が覆された感じです。
メモリアクセスが発生するから
*(int32_t*)&x
遅レス失礼
>>30 >mapの内部用クラスだから、直接使うべきじゃないとか言われたんですよ。
std::pairはちゃんと公開されています.対応するヘッダは<utility>になります.
みなさん、処理速度について質問する時は、 質問前に自分で計時測定しましょう。論より証拠です。
76 :
デフォルトの名無しさん :04/09/01 16:52
age
>>75 最低でもOSとハードウェア構成は暗黙の内に初めから書いて欲しい。
そうでないとベンチマークテストなんて何の意味がある?
78 :
デフォルトの名無しさん :04/09/01 16:57
コンパイラもね
79 :
デフォルトの名無しさん :04/09/01 17:02
リンカは?
コンパイルオプションは? ↓っじゃ次の質問どぞ。
あるfloat値xがあって、これらが0.0f〜1.0fの値域にクランプしたいのですが。 普通に組むとこうなると思うんですが、 if(x<0)x=0; else if(x>1)x=1; 野生の勘ですが、もっと最適化出来るような気がしてなりません。 どうでしょうか?
>>81 x<0になる頻度とx>0になる頻度のどちらが多いかで順番を決める…くらい?
>>81 君の野生の勘は、残念ながら大した事ないようだね。
終了
やっぱお前らには思いつかないか
浮動小数点にCMOVccみたいのはないのか。 アセンブラスレ向けのネタだな。
Hacker's delightになんか書いてなかった? 漏れはfloating使わないからその章は飛ばしちゃった。
そもそもC++ネタじゃないし。
アセンブラなら分岐なしで書けるYO!
89 :
デフォルトの名無しさん :04/09/02 00:53
コンストラクタを書いたクラスを配列で動的に確保したいので, 思いつきで次のように書いたのですが newのところでコンパイラに弾かれてしまいます. これもダメなのでしょうか? HogeClass *myhoge; myhoge = (HogeClass *)malloc(sizeof(HogeClass) * 10); myhoge[0] = new HogeClass(hikisu); myhoge[1] = new HogeClass(hikisu); ・・・ 環境はBCB6.0です.
vector<HogeClass*> に入れれ
HogeClass** myhoge = new HogeClass*[10]; myhoge[0] = new HogeClass(hikisu); myhoge[1] = new HogeClass(hikisu); ・・・
>>89 エラーメッセージ読め。
それでわかんなかったらエラーメッセージ貼れ。
>>91 さんの方法で動きましたが,
>>90 さんの方法も後で試してみたいと思います.
ありがとうございました.
>>93 どうしてスマートな方法を採用しないんだろう
>>94 まずコピペして試すからだろう。
↓これなら採用されたかもな。
#include <vector>
std::vector<HogeClass*> myhoge(10);
myhoge[0] = new HogeClass(hikisu);
関数(への参照)を引数にして関数を呼び出すときに関する質問です。 ソースは↓です。 #include <iostream> void g(double &a, double b, double (&f)(double d) ) { a=f(b); } double k(double p) { return 5.0*p; } class C { public: C(double y): x(y) {} double m(double p) { return x*p; } private: double x; }; int main() { C c(10.0); double z; g(z, 3.0, k); // (#1a) cout << z << endl ; // (#1b) // g(z, 3.0, c.m); // (#2a) // cout << z << endl; // (#2b) return 0; }
>>96 のプログラムでは (#1a) のように関数を引数として計算し、
(#1b) では 30.0 という望みの出力が得られます。
これをクラス中の関数にも適用できるようにしたいのですが、
単純に (#2a) のようにやったのでは
not maches converting function 'm' to type 'double (&)(double)'
というエラーが出ます。
これをクラス内で定義された関数を引数としても動くようにする方法をご教授ください。
なお、コンパイラは g++ 2.95 です。
失礼、(#1b) で得られる出力は 15.0 です。 (#2b) で得たい出力が 30.0 です。 すみません。
>>99 さん、ありがとうございます。
メンバ関数版をテンプレートで作り、非メンバ関数版をオーバーロードしました。
template<typename T>
void g(double &a, double b, T t, double (T::*f)(double d) ) { a=(t.*f)(b); }
g(z, 3.0, c, C::m); // (#2a)
という感じです。
ひとまずこれで動くようになりました。
インスタンス c とメンバ関数 C::m を別々の引数で与える仕様にしましたが、
これを単一の引数で与えることは不可能でしょうか?
>>100 boost::functionを使うと,
typedef boost::function <double (double)> Functor;
void g(double &a, double b, Functor f ) { a=f(b); }
g(z, 3.0, Functor (k)); // (#1a)
g(z, 3.0, boost::bind (&C::m, &c, _1)); // (#2a)
Loki::Functorを使うと,
typedef Loki::Functor <double, TYPELIST_1 (double)> Functor;
void g(double &a, double b, Functor f ) { a=f(b); }
g(z, 3.0, Functor (k)); // (#1a)
g(z, 3.0, Functor (&c, &C::m)); // (#2a)
みたいには書けます.
あと100は
g(z, 3.0, c, &C::m); // (#2a)
じゃないんでしたっけ? g++ 2.95は通るとしても.
>>101 御教授ありがとうございます。
結局のところ、 c と C::m の両方をどこかに書かなくてはいけないという点では
似たようなものですね。
ご指摘のように、& を付けた &C::m が適切です。
& が無いとコンパイラが文句を言います。
書き写すときに付け忘れました。
103 :
デフォルトの名無しさん :04/09/02 21:10
シリアル通信で16進数コードを送受信するプログラムを作成しています。 そこで質問なのですが char hexcode[] = {0x00,0x06,0x10}; というデータが入っているときにコンソールに 0x00 0x06 0x10 と表示させたくて for(int i = 0;i<3;i++) cout<<"0x"<<hex<<hexcode[i]<<" "; としたのですがうまくいきません(空白が出力される)。16進コードをそのまま 出力させるにはどのようにすればいいのでしょうか?
static_cast<int>(hexcode[i]) こう?
>>104 即レスどうもです。今は帰宅してプログラム出来る環境にないので
明日さっそく試してみます。
>>104 intだと0x80とかが0xffffff80みたいにされなかったっけ?
つまり for(int i = 0;i<3;i++) cout<<"0x"<<hex<<(hexcode[i]&0xFF)<<" "; にしろってことだな。
そうでしたね。iomanip で出力幅を調整するとか
してみてください
>>103
109 :
デフォルトの名無しさん :04/09/02 22:29
STL専用の別スレってどこですか。 自己定義のallocatorについて質問してもいい?
>>104-108 皆さん、有難う御座います。自分なりにそこそこ勉強したつもり
だったんですが基本的な部分の知識が欠落してました。出力
出力マニュピュレータにつて詳しく勉強してみます。
C++のcharは文字っぽい
昨日は有難う御座いました。本日試したところ無事に16進コードを 表示させる事が出来ました。当初の問題は解決したのですが、また 疑問が出来たので質問させて下さい。 char hexcode[] = {0x00,0x06,0x10}; というデータがある時 for(int i = 0;i<3;i++) cout<<"0x"<<hex<<(hexcode[i]&0xFF)<<" "; だと正常に出力出来て for(int i = 0;i<3;i++) cout<<"0x"<<hex<<hexcode[i]<<" "; だとうまくいかないのはナゼでしょう?charは8ビットなので0xFFで わざわざビットを取り出さなくても良い気がするのですが?
114 :
デフォルトの名無しさん :04/09/03 14:01
hexcode[i] <-これは char hexcode[i]&0xFF) <- これは int
>>113 for(int i = 0;i<3;i++) cout<<"0x"<<hex<<static_cast <int> (hexcode[i])<<" ";
116 :
デフォルトの名無しさん :04/09/03 14:14
C++の質問です。 オブジェクト自体をファイルに保存することってできるんでしょうか?
>>116 バイナリイメージをそのまま保存するようなことは、普通はやらないね。
118 :
デフォルトの名無しさん :04/09/03 14:40
では、オブジェクトに入ってるデータ?っていいしか思いつかないのですが、そういったデータはファイルに一つずつ書き込んでいくんですか?
オブジェクトのシリアライズ。
>118 「シリアライズ」や「直列化」と呼ばれる処理だね。ググってみるヨロシ。 いろいろ工夫する部分 (しなきゃいけない部分) があって面白い分野だ。
boost1.32にSerialization加わるから楽しみだ
>>113 >for(int i = 0;i<3;i++) cout<<"0x"<<hex<<(hexcode[i]&0xFF)<<" ";
>だと正常に出力出来て
整数の昇格とか汎整数拡張とか、インテグラルプロモーションとか
その辺をキーワードに調べてみると分かると思うんですが、要するに
式の中では int よりサイズの小さい型をもつ変数は、暗黙のうちに
int に変換されて、式の値も int になるんです。この性質を上手く
利用しているんでしょう。
そういうことなので、hexcode[i] & 0xFF という式の中では
hexcode[i] が char から int へ変換されますが、
>>106 氏が指摘
したように hexcode[i] == 0x80 のような場合だと int に拡張
されたとき 0xFFFFFF80 になってしまうんで、0xFF でマスクを
取る必要があるわけです。
>for(int i = 0;i<3;i++) cout<<"0x"<<hex<<hexcode[i]<<" ";
>だとうまくいかないのはナゼでしょう?
hexcode[i] が char のままなので文字出力用の operator<<() が
呼び出されてしまうからです。
>>121 ありがとうございました!!
勉強になりました
ビットマップの画素を扱う構造体としてRGBQUADというBYTEデータが4つのデータ型を定義します。 しかし構造体なので画素の加算などRGB別に3行コーディングしなければなりません。 そこでクラスにしてオペレーターを定義しました。 ところがこのクラス、リリース版でも遅いのです。約1.3倍ぐらい時間がかかります。 オペレーターの記述はごく普通のものです。開発環境は最新のVisualStudioですが、こんなに はっきり遅くなるものなのでしょうか?
127 :
デフォルトの名無しさん :04/09/03 16:27
プログラムが指定した数字以外は入力できないようにする(数字以外も)にはどうすれば良いでしょうか?
>>127 数字以外かどうかチェックすればいいと思います。
>>127 「入力できないい」の意味があいまいなので、誰も答えられないと思う。
少なくとも日本語(英語とかでもいいけど)で要求仕様を書けないようだと、
解決方法も得られない。
>>127 入力して欲しくないキーの上に画鋲を張っておくとか。
>>127 どういう状況で数字入力を禁止したいのか分かりませんが、
GUIなら特定のキー以外のイベントを無視するとか、
コンソールで対話的な動作なら、Enterキー入力後に再入力を求めるとか。
>>127 あ、そもそもC++の話題じゃないのかな?
>>130 そんなことされたら余計押したくなるだろ
>>127 入力して欲しくないキーを押したらハードディスクのフォーマットを開始すると
明示しておき、押されたら実際にフォーマットを開始すればよい。
>>123 式の値は常にintになるわけじゃないけどな。まあ、細かい話だが。
この例ではintになると考えていいだろう。
オーバーロードでcharを受け取る演算子が定義されていても無条件に プロモートが行われてintになってしまったら困るわけだが。 そもそも<<でchar型の単文字を表示できなくなって困るじゃないか。
>>127 押されたくないキーを1兆回くらい押して壊しておく。
138 :
デフォルトの名無しさん :04/09/03 18:57
Part34のほうで質問したほうがいいみたいですね。
にもかかわらず 場所を変えると流れも変わるのが不思議なところ
141 :
デフォルトの名無しさん :04/09/03 19:55
int型で1−10までの数字だけ入力でき、それ以外の数や文字では、「不正な数が入力された」 と表示されるようにしたいんですけど
142 :
デフォルトの名無しさん :04/09/03 20:00
そういう質問をするとCスレ誘導厨がわくからやめて。
>>141 if文の使い方わかってれば出来るだろう
printf( "1−10までの数字以外をいれたら自爆する" );
C++ スレに書いたって事は、そういうクラスの作り方を知りたいってことか?
>>89 HogeClass *myhoge;
↓
HogeClass **myhoge;
149 :
デフォルトの名無しさん :04/09/04 23:41
C++をはじめようと思って、ボーランドのフリーのコンパイラを インストールしたのですが、うまくコンパイルできません。 コマンドプロンプトで bcc32 hello.cpp(hello.cppはコンパイルしたいファイル名) と入力すると、'bcc32'は、内部コマンドまたは〜〜として認識されていません。 というエラーがでます。 コンパイラをマイドキュメントにフォルダを作ってそこにインストールしたのですが それがダメだったんでしょうか? ソースファイルもマイドキュメントに別フォルダを作ってそこに入れています。 アドバイスお願いします。
板違いでしたか・・・・ 向こうで聞いてきますね。 失礼しました。
つーかパス通ってねーだけだろ…
153 :
デフォルトの名無しさん :04/09/05 00:57
パスは通っています!! 勝手に決め付けないでください!
俺はパス。
↓お前はパンパース
│↑ └┘ ∩∧∧ ヽ(゚Д゚ ) \⊂\ O-、 )〜 ∪
質問ス class A { public: A(int v) {}; private: A(const A&) { puts("コピーコンストラクタ禁止"); } }; とやると { A a = A(1); } が"privateだから呼べない"コンパイルエラーになります。 ところが、privateをpublicにすると、コンパイルはとおりますが、 実行してもputs()が呼び出されるわけではありません。 どう解釈したらよいんでしょうか。
>A a = A(1); これは意味論上はコピーコンストラクタを呼び出しているが、 コンパイラは呼び出しを省略しても良いことになっている。 このほかにこういうことが起こるのは「戻り値の最適化」と呼ばれる場合。 この二つ以外なら確実にコピーコンストラクタが呼ばれる。
159 :
デフォルトの名無しさん :04/09/05 13:33
前方参照宣言ってコンパイル時のリソース消費量を軽くする以外になんか 意味があるんでしょうか?関数のプロトタイプ宣言なら、 型チェックの意味もあったりして便利だとは思うけど。 class CLASS;
>>159 意味はクラス型の宣言。それだけ。
コンパイル時のリソース〜はただそういう使い方ができるというだけ。
class CLASS; のあとに namespace CLASS とかできなくなる効果もあると言えるかもしれない。
>>159 前方宣言しないと、相互にポインタを持ち合うようなクラスが作れない。
struct B;
struct A { B* b; };
struct B { A* a; };
あとコンパイル速度は重要だと思うぞ。前方宣言せずにヘッダファイル中で
#include しまくると、すぐにヘッダファイルの依存関係が深くなる。一つの
ヘッダ書き換えただけで大量の再コンパイルが必要になって、生産性に
かなりの悪影響が出る。
>>158 なるほど、意味論上のチェックでもって弾かれるけど、
実際には呼び出されないということですね。
うーんややこしい。
ありがとうございました。
164 :
デフォルトの名無しさん :04/09/05 15:51
寒
そして時は動き出す
168 :
デフォルトの名無しさん :04/09/05 23:03
ある共通関数にarray stringというパラメタがあったのですが、 これは具体的にはどうのようなもんでっしょうか? stringはたぶんSTLで、arrayって????
>>168 具体的にっていう質問は、具体的なコード出してから言うもんだ。
170 :
デフォルトの名無しさん :04/09/05 23:32
int aaa(array string str) { } こんなかんじ
>>170 少なくとも標準ライブラリの範疇ではないので、ここで聞いても回答
得られんぞ。手元のコードからarray の定義を探してくれ。
>>170 そんなのコンパイル通るの?
#define array
だったら通るだろうけど。
ついでに
#define string int
だったらおもしろいのに。
STLのアルゴリズムに渡す関数、 テンプレートの具象化したモノのtypedefなんかは大域で 使えちゃうと気持ち悪いので名無しのnamespaceにぶち込むようにしている。 こんなnamespaceの使い方はアリなんだろうか。 まぁ関数だけならstatic宣言してもいいんだろうけど。
そりゃ立派な用途だと思うけど・・・
>>173 俺も同じコトやってる。*.cpp ローカルにしか使わない構造体とかは、基本的に
無名名前空間行き。特定クラスに強く結びついてるモノは nested class にする
けど。
C++ だと非グローバルスコープの構造体・クラスはテンプレート引数に渡せないっつー
制約があるから、他のソースコードとの名前重複を無視したければ無名名前空間に
入れるのが安全だよね。
なるほどね。 グローバルスコープを持つように見せかけつつ 名前重複を避けたい時に特に有効なのか。 ありがトン。
Cのモジュールローカルなstaticと同じように無名名前空間を使うのは常識でしょ
>>177 前スレ795-の話が少し気になる。
気にしてもしょうがないんだろうけど。
>>175 構造体やtypedefを無名名前空間に入れても意味無くないか?
これらは関数と違って名前が外部に出ないだろ?
void hoge() { int i = 0; // <----(a) { int i = 1; // ここで(a)のiにアクセスしたい } } 内側のスコープで::iと書くとグローバルのiを探しに行ってしまいます。 上記のようなことは出来ないのでしょうか?
つまんねー釣りだなおい
こういうあまりにくだらないのは放置しましょうねみなさん。
>>181-182 真面目に訊いているのですが…
C++始めたばかりなのですが、変な質問なのでしょうか?
日本語書けてる奴がこんな知障がするような質問するかよ
グローバル・・・・
>>181-182 なんとなく言いたいことがわかりました。
変数名を変えればいいじゃん、ってことですかね?
そうではなく
>>180 のような状況でも何かアクセスする手段があるのかなと疑問に思ったのです。
こいつよりチンパンジーがC++習った方が上達早そうだな
>>186 基礎からやり直した方が速いよ。もうこのスレに来んな。
こういう構ってチャンは放置が一番有効なんだよ
真面目に答えてくれる方がいないようなので他のところで訊いてみます…
>>191 そうですか…
自分は何を勘違いしてるのでしょうか?
それすらわかりません…
180は悪くないな。答えてるやつがたまたまドキュソなだけ。 結論から言うと、180が求めてるような機能はC++にはないな。
スタックのないマシンのコンパイラだったら自動変数もヒープに確保するでしょ。 コンパイラの拡張機能でiにアクセスできるかもよ。
何が勘違いなんだか。180も変なの絡まれて運が悪かったな。 まあ答えは一言、「残念ながらそんな機能はありません」で終わりなのは確かだが。
>>193 そうですか。無いとわかったのですっきりしました。
無いからといって困るわけではありませんが、気になって仕方が無かったので質問しました。
ありがとうございました。
自動変数とはhoge、もしくはそこからコールされた関数に 制御があるあいだだけ存続するというのは、仕様ですか?
勘違い言うぐらいなら言語の厳密な仕様ぐらいわかってるんだよな。 はよ、教えれ。
スレの流れが速いと思ったら、知障が沸いてたのか
だから*問題通りの*プログラム書いて質問しろよ。
いっとくが変数領域の存続期間と言語機能としてのスコープは別だからな
>>205 どこって、もちろん仕様書に書いてあるはずと思うぞ。
どうでもいいけど180の問題は解決しただろ。 これ以上何がやりたいんだ? 180を非難したいのか?
210 :
デフォルトの名無しさん :04/09/06 15:04
>>210 いや、「あれ」って言われてもな・・・
なんやら話が良くわからんから退散するわ。あしからず。
>>199 グローバルならアクセス可能だよ
#include <stdio.h>
int i = 111; //これがグローバル
int main(){
int i = 333; //ローカル
{
int i = 777; //ローカル
printf( "%d, %d", ::i, i );
}
return 0;
}
//実行結果
//111, 777
ってごめん俺も良く読んでなかった、ちゃんと分かってるね それじゃ煽ってる奴は、どこに突っかかってるんだ…
180の頭の悪さ
>>212 あーあネタばらしちゃった。まあいいや。
ところでローカル変数とグローバル変数を区別したければ、グローバル変数を
名前空間に入れておけばよい。
頭の良さ 180>>>>>>つっかかってるやつ>215
↓流れを変える一言
ぬるぽ
↓気を取り直してもう一言
>>215 ローカル変数は同名の変数によって完全に隠蔽されてしまうから
それは無理。
えんがちょ
224 :
デフォルトの名無しさん :04/09/06 15:36
,,、-'''"´ ̄  ̄`"''-、 / \ / ヽ | (●) (●) |、 / | ::::: \___/ ::: | \ (_/ヽ \/ /ヽ_) \ / -、、,,,,,__,,,,,、、- ( __) (__ _)
ところで喪前ら switch で case ラベルごとにブロックで囲ってる? 例えばこんな感じで switch( null ) { case p: { break; } case o: { break; } }
>>225 変数使うときだけ囲ってる。
switch( null )
{
case p:
{
char ga[] = "ガッ";
break;
}
case o:
break;
}
227 :
デフォルトの名無しさん :04/09/06 16:25
>>199 ノセラレテじゃじゃじゃじゃ〜ん
void hoge()
{
struct{
int i;
}my;
my.i = 10;
{
int i=100;
cout<<i<<' '<<my.i<<endl;
}
}
228 :
デフォルトの名無しさん :04/09/06 18:08
例えば構造体 ABC っていうのがあって この型の変数を定義する場合 ABC gABC; ABC new gABC; とnewをつける場合とつけない場合って どういう違いがあるのでしょうか?
メンバ変数に _ をサフィクスに使ってる人ってグローバルは何使ってます? やっぱり g_ のプリフィクス?
プリフィックスとサフィックスなら,互いに干渉しないじゃん。
>>231 漏れはメンバ変数には prefix に _ を使っています。
グローバル変数は使ったことありません。
定数なら全部大文字にしてるけど。
それより、クラス変数 (っていうんだっけ?) には
何を使えばいいんですか?(static Class::xxx)
自分で決めろ
234 :
デフォルトの名無しさん :04/09/06 23:41
_をprefixにするのは良くないらしいよ。システムが予約してるんだそうな。 まあ、GoFがこれやっちゃってる悪しき例なんだが。
>>230 globalは全部globalネームスペースに詰め込んで
global::
でアクセスします
237 :
デフォルトの名無しさん :04/09/07 02:15
#include <iostream> using namespace std; int main() { bool b1 = true , b2 = false , b3 = 0; if (b1 && (b2 || ++b3)) cout << "Kitty on your lap"; cout << b1 << b2 << b3 << b1 && (b2 || ++b3) << endl; return 0; } このコンテキストではオーバーロード'endl'が曖昧というエラーがでます。 << endl を省くとコンパイルできるのですが なぜ endl がダメなのか、わかりません。 コンパイラはBorland C++5.5.1です。 よろしくお願いします。
>>237 曖昧でないと言えるのか?
ごちゃごちゃ書いてあるけど、問題はこういうことだろ。
cout << b1 && b2 << endl;
239 :
デフォルトの名無しさん :04/09/07 02:44
TLSって必須じゃないですか? 何故C++はTLSをサポートしないのですか?
ギャルゲーはギャルゲー板で
で、thread local storageのことだとすると、 threadはC++の範囲外だからサポートも糞もないのよ。 そんだけ。
242 :
デフォルトの名無しさん :04/09/07 03:24
でもほとんどのコンパイラが独自拡張していますが、 それでも範囲外ですか?
標準であるべきと思うなら、規格を決めてる人たちに提案してみたら?
boost::threadがあるので次期標準になるかも
245 :
デフォルトの名無しさん :04/09/07 05:33
移植性ってそんなに重要じゃないですよね? Windowsで動けば充分ですよね?
主語がないよ
247 :
デフォルトの名無しさん :04/09/07 05:39
ソフトウエア(ソースコード)の移植性です。 よろしくお願いします。
依頼主に聞けよ・・・
249 :
デフォルトの名無しさん :04/09/07 10:04
>>239 >TLSって必須じゃないですか?
マルチスレッドのアプリいくつか作ったけど
TLS使ったことないよ
必須なの…?
Cのtime.hみたいな腐れた設計のライブラリでも使わない限りTLSなんか必要ないだろ。
251 :
デフォルトの名無しさん :04/09/07 11:01
istream::readでバイナリデータを読み書きするときにエンディアンを考慮して並べ替えないとだめですよね これは自前で並べ替えるのが常なんでしょうか? read( void*, size, ios::big_endian )みたいなのはないのかな? 用意されているのに自分で作るのもなんあので
エンディアンを理解してない質問に 見えるのは気のせい?
>>252 253に同意だが、とりあえず答えてやる。
「ない」
MFCでコーディングしているとどうしてもドキュメントクラスに処理が集中してしまうのだが どうしたらいいのだろうか。処理の意味的にビュークラスやアプリクラスには入れられない。 こういうものなのだろうか?
>>253 ,254
家のインテルマシンでリトルエンディアン仕様のファイルを読み込もうとしたのです。
上位桁から順番に並んでるデータを。
バイト列を読み込んでそのままキャストしたらだめなんですよね?
あれ?どういうふうに理解していないと思われたのでしょうか?
>「ない」
どうもです
リトルとビッグが逆でした↑
ios::big_endian がおかしいということか ios::endian_irekaete にしときます
あ、もしかして int a; short b; char c; stream.read(&a,sizeof(a),ios::big_endian); stream.read(&b,sizeof(b),ios::big_endian); stream.read(&c,sizeof(c),ios::big_endian); みたいな使い方をするという意味? ただ、そのインターフェースはいまいちな気がするなぁ。 (iostream自体がいまいちだという突っ込みは無しの方向で) read( int & ret, ios::big_endian ); read( short & ret, ios::big_endian ); read( char & ret, ios::big_endian ); の方が自然かと。 いずれにしても無いけど。
>>259 テンプレート使ってそんな感じにしておきました。どうも
261 :
デフォルトの名無しさん :04/09/07 16:52
例えば char型の変数を定義する場合 char* pszABC = new char[10]; char szDEF[10]; とnewをつける場合とつけない場合って どういう違いがあるのでしょうか?
262 :
デフォルトの名無しさん :04/09/07 16:54
264 :
デフォルトの名無しさん :04/09/07 16:57
>>262 そこらへん、もうちょっと詳しくお願いします。
char* pszABC = new char[10];
と宣言したpszABCは
delete pszABC;
しないとメモリーリークを起こしてしまいますよね?
char szDEF[10];
と宣言したszDEFは、特にメモリー解放しなくてもいいですよね。
なんで?
どちらも、メモリー上にchar型10桁分の領域は確保してはいるんですよね?
遅レス失礼 >235 >_をprefixにするのは良くないらしいよ。システムが予約してるんだそうな。 これは半分本当で半分間違い.予約されてる名前の規則は実はちょっと複雑. >まあ、GoFがこれやっちゃってる悪しき例なんだが。 GoFの名前の付け方は規格には違反してないと思います.
それを覚えるのが面倒だから_のプリフィクスを避けるべきなのでは?
>267 ですね.細かいことにこだわりすぎました.失礼.
>>252 炎ディ案が問題になるならバイナリで読み書きすることが間違い。
>>264 キーワードは規格に出てくる言葉にしたほうがいいかも。
自動変数 動的確保
>>235 先頭の_は、非グローバルでその次に大文字がこなければ使っても良い。
__と2連続で_が出てくる名前は使用不可。
>>270 既存のファイルフォーマットでエンディアン指定されたバイナリのフォーマットって沢山あるし・・・
そういうの読みたいときもあるじゃん。
>>271 なんと、その程度なんだ
使っていこうかなぁ…m_は好かないので
何も付けずにやってたけど、評判悪いし
>>264 char* pszABC = new char[10];と宣言したpszABCはdelete pszABC;
とすると未定義の振る舞い。delete[] pszABC;とせねば何が起きるか
分からない。
後ろにつければそんな事を知らない人でも自由に使える 前につけるのは混乱を呼ばないか?
class A { int _value; // OK int _Value; // NG int other_value; // OK int other__value; // NG }; int _value; // NG int _Value; // NG こんな感じかな?
前につけるのはOKかもしれないけど、とりあえず批判の対象となるので、 お勧めしない。 現にExceptional C++ではくそみそに非難されてた。
糞味噌って程じゃあ… まあ、漏れも_のprefixには反対だが
前につけることが禁止されてなければこれほど名前付けで楽できる事は無いのに。
ちなみに、#defineで_valueとかが使われる可能性があるので、クラスのメンバと言えども、OKではないです。
後ろにつければ?
>>282 この流れでいいかげんなこと言っちゃいけない。
>>282 プリプロセッサ用の予約名は大文字で始まるから問題ないんだよ。
いや、実際に
>>282 みたいな実装があるらしい。
Exceptional C++に書いてある。
287 :
デフォルトの名無しさん :04/09/07 23:21
プログラミング言語C++ 116ページより 先頭がアンダースコアになっている名前は、実装や実行時の環境の特別な機能のために 予約されているので、アプリケーションプログラムではそのような名前を定義しないように するべきである
>>286 うん、だからといってそれはC++でコードを書くときに使ってはいけない理由にならない。
標準以外のマクロや関数を提供してる処理系なんていくらでもあるんだし。
たとえば、VC++でmin/maxというマクロが設定されてるんだけど、
その名前を絶対に使うなってのは無茶ってものだ。
VC++ の min/max って何で inline にしないの? せめて ifdef __cplusplus で囲って欲しいのだが
理由の一つにはなるよ。 min/maxだって使わないのがいいだろうね。
アホか
>>287 FDIS 17.4.3.12 より
[Each name that contains a double underscore (__)]
or
[begins with an underscore followed by an upper-case letter]
is reserved implementation for any use
[Each name that begins with an underscore]
is reserved to the implementation for use as a name in the
*global namespace.*
>>290 VCじゃmin/maxつかわないほーがいいだろうけど、他の処理系使うときにまでそんな事言わないだろ。
282みたいな実装の処理系があるからと言って、関係ないところでそれを制限するのは筋違いだ。
>>292 そこは標準*ライブラリ*のページだね。
C++のページには予約語の説明ないのかな?
>>293 でも移植性はなくなる。
筋違いとは思わない。
C++の「言語」で予約してる名前はkeywordsにあるものだけ。
defineなんざundefすればokさ。
298 :
デフォルトの名無しさん :04/09/07 23:55
そうそう。 boostの中身はundefの嵐さ
話が複雑で良くわからないのだけど、 ・アンダースコアで始まる名前はグローバルのみで予約されている ・プログラミング言語C++は間違い ・それにもかかわらず、#defineで使っている処理系がある でいいの?
アンダースコア+upper-case letterはどこでも。
つまり要約すると使うなってことだ。
それを普通は思考停止と言う
じゃあ、勝手に思考停止しないで使って批判されててくれ。w 俺は止めないから。
批判する奴がバカなんだしどうでもええよ。
そう思ってるならお前がバカだ。
そう思ってるならお前がバカだ。そう思ってるならお前がバカだ。
批判する奴は正当なのを不当だと難癖つけるんだろ?バカじゃん。
308 :
デフォルトの名無しさん :04/09/08 00:26
この場合、言語規格によって、予約されているされていないはあんまり問題ではないと思うよ。 実際に#defineで使っている処理系がある以上、移植性がなくなるし 面倒に巻き込まれる可能性が出て来るのであれば、避けるべき。 思考停止できるということは、聞こえは悪いが、この場合に限っては利点だよ。
>>307 やっぱお前バカだ。
正当とか関係なく避けたほうがいいことはある。
そう思ってるならお前がバカだ。
311 :
デフォルトの名無しさん :04/09/08 00:42
プログラミング言語C++に書いてある(間違えてる?)ぐらいだしね。 どの処理系が#defineで使っているかまでは知らないけど、使わない方が 良いことは確かだね。
オレは使ってみるかなぁ、移植なんかしないし なんか魅力的なんだよな、_メンバ 魅力あるから話題になるんだろうし
お前様方ちょいと質問です。 template<typename _Type> static inline void endian(_Type & val) { std::reverse(reinterpret_cast<char *>(& val), reinterpret_cast<char *>(& val + 1)); } って定義があって、構造体のメンバに対して例えば struct Foo { double bar; int baz; } foo; endian(foo.bar); endian(foo.baz); ってな感じで使ってるコードがあるんですが、endian()の中で一体全体何が起きているのか 教えちゃあ貰えないでしょうかね。
ビッグエンディアンとリトルエンディアンを変換してるだけだろ。
>>308 >#defineで使っている処理系がある以上
そのシンボルだけ避ければ良い話じゃないか?
#defineで使われている可能性を論じるのなら
C++で認識可能なあらゆるシンボルが使えなくなってしまうし。
>>314 いやさ、そいつは判らない訳じゃあないんですが、どんな仕掛けになってるのかって処がよく判らないんでさ。
普通にCで書くならポインタとサイズを渡さないといけないわけで、それを巧いことやっつけてるってぇことは想像つくんですがね。
サイズの変わりに終了位置を渡してるじゃん
>>315 そうやっていちいち避けるのが面倒だから使わないようにするという話だろ。
実際問題、それ以外であまりに迷惑な#defineのされ方はしない。
>>316 val + 1でサイズ分移動するだろ。
>317の話でピンと来たんで調べてみたら、reinterpret_castってぇのはCのキャストと考えてもよさそうだってことですな。
つまりendian()の中身は
reverse((char *) &val, (char *) (&val + 1));
って感じだと。これで終了位置がわたるってぇことは、この場合のtemplateは<>で括らなくてもきちんと型情報が伝わってるってことですかい。
なにやら巧い仕組みですなぁ。
いやほんとにC++は面白いもんですな。てめぇで書くのはちょっとばっかし難儀しそうですがね。
>>314 、
>>317 、
>>318 いやぁ、忝い。
ん?別にC++じゃなくたって、何の型のポインタかわかっていれば、 val+1でポインタのアドレスはサイズ分移動するだろ。 templateは<>でくくらなくてもってのは意味不明。 templateで型情報がコンパイル時に伝わってるというのは ある意味正しいかもしれないが。
ま、この流れを見てもまだアンダースコアから始まる変数名つける奴は、 ぶっちゃけ「揉め事を起こしたい」だけだな。 よっぽどの使用価値を提示できない限りは。
ところで「名前_ 」派の人は構造体のフィールドも 「名前_ 」としますか。
俺はしない。
>>320 いやほら、vectorなんてぇのは<>で型を括るじゃあないですか。
なんとなくそんなイメージがあったんで、endian(foo.bar)だけで型が判るのかと思ったわけですよ。
>>321 関数名は?
そういやシンボル名といえば、昔 end ってシンボルを定義してハマったことがあるな。
その処理系だと、リンカが end ってシンボル予約してやがって、特定のタイミングで
メモリを壊すプログラムになってしまったという。(後で _end に変わってたけど)
>>324 クラステンプレートは型必須、関数テンプレートは引数から推測可能なら
型は省略できる。
>>324 まあそんな感じ。
コンパイラはendian(foo.bar)が使われているのを見ると、double用のendianが
使われているのがわかるから、double用のendianのコードを生成できる。
これ以上情報要らないだろ?
>>326 おっと合点承知の介。重ね重ね痛み入ります。
おっと、
>>327 さんもだ。遅れて申し訳ない。
では夜も更けてきたのでこれにて御免。
330 :
デフォルトの名無しさん :04/09/08 02:17
いずれ廃止する予定の変数などはorz_をprefixに使っている。
【法則】 廃止する予定の変数・関数はいつまで経っても廃止されない。
はいしどうどう はいどうどう
typedef void (Hoge::*HOGEP)(); const HOGEP[10] = { Hoge::A, Hoge::B, ・・・}; というのを一気に const void (Hoge::*HOGEP[10])() = { Hoge::A, Hoge::B, ・・・}; としたらvoidからconst voidに変換できないとコンパイラに言われました で行き当たりばったりにいろいろ試してみると void (Hoge::*const HOGEP[10])() = { Hoge::A, Hoge::B, ・・・}; でコンパイルが通ったのですが意味的におなじでしょうか?
>>333 おなじです。
(でもたぶん上のコードはコンパイルできない)
>>333 > const void (Hoge::*HOGEP[10])()
HOGEP は
Hoge クラスのメンバ関数へのポインタの配列で、
ポインタが指すメンバ関数の型は引数無し・戻り値 const void 型
(const は戻り値にかかってしまい HOGEP[0], HOGEP[1], ... は const ではない)
> void (Hoge::*const HOGEP[10])() = { Hoge::A, Hoge::B, ・・・};
Hoge クラスのメンバ関数への書き換え不可能なポインタの配列で
ポインタが指すメンバ関数の型は引数無し・戻り値 void 型
typedef で定義してるのと後者は同じ意味になる。前者は全然違う。
C/C++ の型定義は微妙に分かりづらいので、悩んだら素直に typedef
しとくのが吉だよ。
>>334 変数名を書き忘れていました
ただしくは
const HOGEP hogep[10] = { Hoge::A, Hoge::B, ・・・};
でした
レスありがとうございmす
338 :
デフォルトの名無しさん :04/09/08 08:10
マウスポインターの座標と押されたマウスボタンを検出するにはどうしたらいいのでしょうか ご教授おねがいします
int get_mouse_button_status(unsigned int* status) { /* 環境依存なので好きなコードを */ } int get_mouse_cursor_position(int* x, int* y); { /* 環境依存なのでお望みのコードを */ } unsigned int status; get_mouse_button_status(&status); int x, y; get_mouse_cursor_position(&x, &y);
340 :
デフォルトの名無しさん :04/09/08 08:47
>>157 に似た質問になるんすけど
operator=も省略の対象になるんでしょうか?
自分は全てのクラスにコピーコンストラクタとoperator=を入れるようにしているので
コピーコンストラクタと違って省略されないようだとパフォーマンスに無駄が出ますよね。
>>340 A a;
a = 1;
素直に考えると、 a = 1 が a.operator=(A(1)) になるわけだけど、
このうちのどこが「省略」できる?無理じゃない?
>>341 operator=の中身は普通に代入のみで
コピーコンストラクタと同様なのですが
コンパイラにそれはわかりませんよね。
やっぱり省略はされないんですね。
struct A
{
int a;
void A( const A& other) : a(other.a){}
A& operator=( const A& other){ a = other.a}
};
また、COMの関係上operator=が必要なクラスがあるのですが
その派生クラスにはoperator=のオーバーライドは必要になるのでしょうか?
struct B : public A
{
B& operator=( const B& other){ return A::operator=( other);} // 必要か?
};
>>342 > また、COMの関係上operator=が必要なクラスがあるのですが
> その派生クラスにはoperator=のオーバーライドは必要になるのでしょうか?
意味はわからないが、コードを見る限り要らない。
代入演算子の宣言が無く、基底クラスと各メンバの代入演算子が有効な場合は
それらを使ってデフォルトの代入演算子が定義される。
>>343 了解しました。
いろいろありがとうございました。
>>345 class Myrectangle1 : public Rectangle
{
public:
Myrectangle1();
} ←セミコロンが抜けてる。Myrectangle2も同様。
347 :
デフォルトの名無しさん :04/09/08 12:35
>>339 レスありがとうございます
VC++.netなんですがマウスポインターの座標と押されたマウスボタンを検出する
命令にはどんなのがあるんでしょうか?
348 :
デフォルトの名無しさん :04/09/08 12:44
クラスAのメンバ変数をクラスAでnewしてクラスBにポインタを渡す。 クラスB内でそのポインタをdeleteしても大丈夫なんでしょうか。
>>346 う。。。よくみたら抜けてますね。。。お恥ずかしい。。
ありがとうございました(泣
>>348 その後のクラス A からの間接参照や delete 等がなけりゃだいじょうぶっちゃあだいじょうぶだが
オブジェクト指向の流儀に反するんで一般的にはやらないほうがいい。
A が builder とか B の補助クラスとかなら別だけど。
>>351 レスありがとうございます
GetCursorPos, GetAsyncKeyStateについて調べてみます
>>354 気づきました。。
久しくforをつかってなかったのでこんなミスもわからなかった・・orz
スンマセン
>>355 質問には関係ないことだけど、コメントの書き方が良くない。
インデントもおかしいし。const int& にする意図も良く分からない。
int = 64bit pointer = 32bit 環境でパフォーマンスの問題が出にくいようにするためだろう。 逆のケースの方が多いけど
やーまいったまいった。 昨日は動的にメモリを確保しているクラスに 自前 operator= を定義していなかったせいで プログラムが変なところで止まって6時間悩んだし、 今日は外部から渡されたインスタンスを リファレンスで保持していたせいで たまたま生成元のインスタンスが 自分より逝ってしまう状況になった途端 プログラムが止まっちゃって3時間悩みました。 明日は何事もなければいいなぁ。。。 そうだ、今ならまだ _ を prefix から suffix にできる チャンスかも知れない。来週前半に置き換えよっと。
正規表現使えばすぐ出来るような気が。
絶対余計なものまで壊す
main() { int a; int* b; int& c = *b; b = &a; a = 69; std::cout << a << std::endl; std::cout << *b << std::endl; std::cout << c << std::endl; } しばらく考え込んでしまった・・・
mainにintが無い。
最初の*bは当然不定だし…うーん、笑い所が分からない
普通のことだと思うんだが…。俺も笑い所が分からない。
俺も笑いが止まらない。
366 :
デフォルトの名無しさん :04/09/09 13:42
C++つかうと一気に知力が10倍に?!
void main(void)にしろ
>>366 使い方によるだろ。
俺は拡張子に .c を指定して、極力 class や template を使用しないようにしているが、
例えば inline を使っても使わない時と比べてもほとんど知力は変わらない。
すげえ。オブジェクト指向設計もしないで知力が増えないとかいってるよ。この人。
370 :
デフォルトの名無しさん :04/09/09 15:08
delete this; これは何か問題になることがありますか?
クライアントがオブジェクトの削除されたタイミングを把握しづらいだけ
372 :
デフォルトの名無しさん :04/09/09 15:12
では、放任主義なら問題ありませんね。 どうもありがとうございました。
ローカル変数にしてもいいの?
いいわけない
375 :
デフォルトの名無しさん :04/09/09 15:49
>>373 ローカル変数ならdelete出来ないと思いますが。
newした後ポインタを保持しないサンプルソースは見たことがあります。
当然delete thisしています。
376 :
デフォルトの名無しさん :04/09/09 15:54
質問なんですが、 strdupという関数を使って、 char* a = strdup(name) nameは文字列 と、 char* a = new char[strlen(name) + 1] strcpy(a, name)は、 同じ働きなんですか?
>>370 知ってるかもしらんけど、デストラクタをprotectedやprivateにすると吉かも。
>>376 非標準な関数だから一概には言えんけど、newじゃなくてmallocでなかろうか。
378 :
デフォルトの名無しさん :04/09/09 16:08
>>377 そうなんですか〜 mallocっていう関数はまだ使った事がないんですよね。
文字列のコピーは今までnewして、strcpyでやってたもので・・・。
たまたま、今勉強しているところで、strdupっていうのが出てきて、
今まで通りのやり方でも出来るんじゃないか??って疑問に思ったんですよ。
ありがとうございました!
379 :
デフォルトの名無しさん :04/09/09 16:20
380 :
デフォルトの名無しさん :04/09/09 16:23
>>376 ふつうはstrcpyじゃなくてmemcpyを使う。
381 :
デフォルトの名無しさん :04/09/09 16:51
//テキストの表示 HDC hdc; LPTSTR lptStr = TEXT("111"); hdc = GetDC(hWnd); TextOut(hdc , 0 , 0 , lptStr , lstrlen(lptStr)); ReleaseDC(hWnd , hdc); これだと111が表示されるのですが 変数Aの内容を表示させたい時はどうすればいいのでしょうか?
スレ違い警報
>>381 sprintfと言いたいが_stprintfかwsprintfの方がいいだろうか。
384 :
デフォルトの名無しさん :04/09/09 23:11
配列を大きい順に並べ替えたいのですが どうすればいいですか?
意味がわからない(というか不明瞭)。
>>384 int array[100];
//hogehoge
std::sort(array, array + 100, std::greater<int>());
10万近いオブジェクトをnew-deleteしなきゃなのですが、 こういうのってそのままやっちゃって良いんですかねぇ。 フラグメンテーションが気になる、元ゲーム系…。
実際にやってみて問題があるならプールなり考えればよかろう
operator=()を下みたいに呼ぶときに、呼ばれた時点で相手のクラスのデストラクタが呼ばれていてエラーがでるのを うまく回避するにはどうすればいいですか? operator+()などでは自分自身を変えたくないので自動変数を使っています。 static A cNewA; みたいにすれば出来るには出来ましたが、再起処理の中で使うと収集つかなくなりそうです。 DWORD g_dwIndex=0; class A{ public: DWORD m_dwID; char *m_pcBuff; A(){ m_pcBuff=new char[1000]; m_dwID=g_dwIndex++; } A(LPCTSTR pStr){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, pStr); m_dwID=g_dwIndex++; } void SetString(LPCTSTR pStr){ strcpy(m_pcBuff, pStr); } ~A(){ delete [] m_pcBuff; TRACE("*******(%u)のデストラクタ*******\n", m_dwID); } void Add(LPCTSTR pStr){ strcat(m_pcBuff, pStr); } A& operator=(A& cTarget){ //(2)ここで引数内のバッファが消滅されてる strcpy(m_pcBuff, cTarget.m_pcBuff); return *this; } A& operator+(A& cTarget){ A cNewA(m_pcBuff); cNewA.Add(cTarget.m_pcBuff); return cNewA; //(1)ここまでは正常"ABC"+"DEF"→"ABCDEF"@cNewA } void Disp(){ TRACE("%s\n", m_pcBuff); }; };
つづき int main(){ A cA("ABC"), cB("DEF"), cC; cA.Disp(); cB.Disp(); cC=cA+cB; //ここでエラー cC.Disp(); }
>>390-391 DWORDとかLPCTSTRみたいなWin32な定数を全部C++標準で表現できる
基本型に直してから出直せ。
なにローカル変数の参照返してんだ
>>390 >(2)ここで引数内のバッファが消滅されてる
~~~~~~~~~
まともな日本語が話せるようになってからうpちまちょうね〜坊や( ´,_ゝ`)プッ
あ〜なんか窓達ムカついてきた
あっ、main()でreturn 0;するの忘れてる・・・
>>392 再度長々と書き込むのもあれなんでunsigned longとconst char *に読み替えてください
>>393 出来るのなら左辺側の参照かポインタでも得たいものですが、operator()でそういう手段ありました?
>>397 Effective C++ 23項
「オブジェクトを返さなければならないときに、リファレンスを返そうとがんばるのはやめよう」
A& operator+(A& cTarget)
↓
A operator+(A& cTarget)
この項には君が悩んでいる問題とほとんど同じ内容が書かれている。
もう一個。
Effective C++ 31項
「関数は、ローカルオブジェクトへのリファレンスや関数の中でnewで初期化したポインタの参照先
を返してはならない」
基本中の基本です。
>>393 さんが実はさらりと答えてくれてるけど。
operator+(const A& cTarget) constじゃないと。
コピーコンストラクタも忘れんなYO!
>>398 >>399 >>400 A operator+(A& cTarget) もやってみて駄目だったのですが、何でだろうと
悩んでいたところひょっとして自分と同じ方の参照を引数としたコンストラクタが
必要なのでは!?と下の行を追加してみました。
//追加したコンストラクタ
A(A& cTarget){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, cTarget.m_pcBuff); }
ビルドして実行してみたところ無事に実行できました。やっとこれで目的のクラスで演算子の
オーバーロードを搭載出来る目処が立ちました。どうもお世話になりました。
あとよくよく考えたらoperator=は戻り値必要ないですね
constを意識しろって
>>402 >あとよくよく考えたらoperator=は戻り値必要ないですね
cA = cB = cC; みたいな事をしないならばな。
>>405 それだけではない。度々済まないが
Effective C++ 15項
「operator=を書くときは、*thisへのリファレンスを返そう」
(a = b) = c; のような、実用上意味がなさそうだが文法に違反していない文を
正しく実行できるようにするためだとか。
>>403 そうなんだが一度に言うと混乱しそうだったから。
operator=()は参照返しでいいんですか。それなら戻り値付けた方がいいですね。 const ですが、ずいぶん前にconstをつけようとしていた時期がありましたが メソッドを呼び出せなくなってそれ以来constを付けるのを控えていたのですが 宣言の末尾に付ければ呼び出せることを今更ながら知ったので、これからはconstを 付けていくことが出来そうです
>>407 じゃなくて〜。const付けたのと付けないのの両方が厳密に言えば必要なのよ。
でも今の質問の流れから行ってそこまで説明する必要はないと思ったわけよ。
それと mutable についてもついでに調べておいてね。
operator=のconstは普通戻り値だけだ。 mutableは関係ない。
>A(A& cTarget){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, cTarget.m_pcBuff); } boundary-checkはどうした?
>>390 関係ないけど
#define UNICODE
されるとやばいんじゃないか
414 :
デフォルトの名無しさん :04/09/10 12:43
質問なんですが、自分はwindowsXPで、VC++を使って勉強しているのですが、 DOS画面って言うんだったかな?ビルドしたときの黒い画面なんですが、 漢字を使う事ができず、アルファベットだけしか使えません。 どうにかして使える方法はありませんか?
>>414 [Alt] + [半角/全角] でカナ漢字変換モードになると思うけど。
416 :
デフォルトの名無しさん :04/09/10 14:02
>>415 ありがとうございました!
そんな方法があったんですね☆
それも簡単に!
417 :
新米C++グラマー今日の疑問 :04/09/10 22:27:46
class HogeHogeClass { static Boolean fetchValue( const HogeInstance & instance, const String & key, String & value); }; とまあこんな関数があるとして、他のクラスからいちいち HogeHogeClass::fetchValue(instance, key, value); とクラス名を付けなくても呼び出せるようにするだけの目的で そのクラスに HogeHogeClass を private 継承させるのは DQN でしょうか? 他に何かうまい方法がありますか?
あ、ちなみに HogeHogeClass には static 関数しか入ってません。
staticメンバ関数しかないならclassにするな阿呆。
>>419 えー、普通の手法だと思ってたんですけど。
C++ではそういうことはしないんですか。。。
ほんじゃあクラスから出して代わりに
独自のnamespaceに入れるってのが
C++流の正しい解法なのでしょうか。
使いたいファイルでは using HogeHoge とすると。
>>417 間違いなくDQN。継承じゃなく包含を使え。
>>419 標準にもstaticしかメンバがないstd::numeric_limits<>という
classがあるわけだが。
>>421 たぶんstd::numeric_limits<>は引数としてやりとりできるようにclassになっているんだと思う。
それテンプレートクラスじゃん
>>424 テンプレートクラスがクラスでないと言うなら419の主張と符合するが・・・
テンプレートクラスじゃなくて、クラステンプレート
クラステンプレートの具現
皆さんご回答ありがとうございます。
>>421 >間違いなくDQN。継承じゃなく包含を使え。
包含っていうのは今回の場合はどういうことを指すのか
よく分からないのですが、
UhiClass {
// コンストラクタ等省略
static fetchValue((
const HogeInstance & instance,
const String & key,
String & value)
{
HogeHogeClass::fetchValue(instance, key, value);
}
};
としろ、ということでしょうか? 勘違いしていたらごめんなさい。
>>429 instance.fetchValue(key, val);
ってことじゃね?
431 :
デフォルトの名無しさん :04/09/10 23:58:52
基本的なことですが、メモリの解放で 分からないことがあるのでお教えください int *i,*j; i=new int[100]; j=i; delete [] j; ↑この場合はi=new int[100] で確保したメモリは解放されるのでしょうか?
>>432 どうもありがとうございます。
もうひとつよろしいでしょうか。
jは確保したメモリの先頭のアドレスだけ指しているのに、
100個連続して確保しているという情報はどこにあるのですか?
確保したメモリの先頭のアドレスの手前
>>434 長年の謎が解けました。ありがとうございます。
operator new[]やoperator delete[]をオーバーロードして 使ってる好例ってないでしょうか? 今の自分の知識では「触らぬ神に祟りなし」という感じがして使えていないので。
>>438 14882:2003(1998でも良いが)のどこにそんな事が書いてある?
それでは、私が抱いていた疑問の答えはどうなるのでしょうか?
>>436 あれは、テンプレートコンテナ開発者のためのデバッグインターフェイスにすぎない。
コンテナを「使う」側の人間が触る必要はない。
>>440 知るかヴォケェ、が正解。処理系作る人間でない限り知ったこっちゃないし、そうなら好きにすればいい
443 :
デフォルトの名無しさん :04/09/11 01:36:53
>>440 確保した順にサイズをスタックへ突っ込んで突っ込んで突っ込みまくる。
>>442 分かりました、とりあえずメモリの解放は
暗黙のうちにできてしまうと言うことですね。
>>443 順番に突っ込んで行ったら順不同でメモリ解放するとき
どうなってしまうのでしょうか。
実装に依存する
実装の一例として
>>434 の様なものもあり
だがそれに依存するコードを書くのはお勧めしない
>>445 それではとりあえずイメージとして
>>434 のように考えておけば安心できそうなので、
自分の中ではそれで納得してみます。
あくまでイメージなので
それに依存するようなことはしませんが。
>>446 ほんの一例だが
#include <iostream>
int main()
{
char* p = new char[100000];
std::cout << *reinterpret_cast<size_t*>(p - sizeof(size_t)) << std::endl;
delete p;
}
BCC5.6.4
100000
VC7.1
1574657
gcc3.4.1(MinGW)
524545
BCC5.6.4は
>>446 さんのイメージ通りの結果かもしれないが、VCやMinGWでは
どうも他の手段でサイズをストアしているようだ。これだけからは何とも言えないが、
少なくともこの機能に依存したプログラムは移植性がない事だけはわかる。
あ、悪い ×delete p; ○delete[] p;
そのサイズって実行時にわかる必要なくない? むしろ、BCCのように実行時にまで値をストアしてる処理系があったことの方が驚き。
まぁこのコードの場合は必要無いかもしれん。
int i,*p; std::cin>>i; p=new int[i]; のようにしたときは実行時にも どこかに確保したサイズ情報があることになると思うのですが。 それがどこにあるか分かれば、 メモリ解放するとき半分だけ解放のような 奇妙なことができるわけですか?
早速試す。 #include <iostream> int main() { int i; std::cin >> i; char* p = new char[i]; std::cout << *reinterpret_cast<size_t*>(p - sizeof(size_t)) << std::endl; delete[] p; } で、100000を入力。 BCC5.6.4 100000 VC7.1 1574657 gcc3.4.1(MinGW) 524545 結果は変化ありませんですた。
453 :
デフォルトの名無しさん :04/09/11 07:08:25
std::stringstreamに整数出力すると どうしても桁区切り文字がでちゃうんだけど 出さないようにするにはどうすればいい?
>>453 面白い処理系だな。それともロケールの問題か?
std::use_facetでctype_base::punctをマスクするとか。
>>454 なるほどーとか思って
std::locale::global( std::locale("") );
したらとりあえず消えました。thx
処理系はVC6+STLportなんだけど...
どっかでロケール変更されてるのかしら
>>455 はははイミワカンネorz
勉強してきまふ
>>456 STLportだと
std::cout.imbue(std::locale("En_US"));
でカンマが付くようになるな。どっかで指定されてない?それともデフォルトの
ロケールがおかしくなっているの鴨。
C++オブジェクトのマーシャリングってチマチマやるしかないんでしょうか?
>>458 ない。
特定のフレームワークに依存して良いなら、もう少し楽できることもある。
MFC 使うとか。
環境絞り込んで書いてみ?
>>388-389 遅くなったがレスサンクス
やっぱりこの苦行はしなきゃなのね
でもboost::poolとか使えば楽なのかな…
461 :
デフォルトの名無しさん :04/09/11 22:28:10
素人な質問ですいません、 ifstream i; char c[51]; i.open("test.txt") while(!(i.eof())){ i.getline(c,50); } でtest.txtに50字以上の行が含まれていると強制終了 してしまうようなんですがこれは仕様なんでしょうか? 前にどこかのサイトでこの場合50字だけ読み込んでくれる仕様だと 勉強した記憶があるのですがそのサイトがどこだったか忘れてしまい 自分の記憶にも自信がありませんで、ここに頼らせてもらうことにしてしまいました。 すいませんがよろしくお願いします。
std::stringとstd::getlineを使え。
>>461 getlineは指定した長さ以上のバッファには書き込まない。
>>461 それだとgetlineが読み込むのは49字。
そして行末に達する前に限度まで読み込むと i.fail()==true;になる。
これ以上は自分で調べなさい。
というか、ちゃんとした入門書なりリファレンスなりを手元においとかな
勉強にならんだろ。
すいません、やっぱりケチらずに本を買うことにします どうもありがとうございました。。
標準C++のstream周りはなぜあんなに複雑になってしまったのだろうか。
467 :
デフォルトの名無しさん :04/09/12 00:48:42
>>466 きっと作った本人たちも「や、やっちまった」と、後悔してると思います。
>>467 どうかね? あれを作ること自体が C++ の試運転であって、目的は果たせたんじゃないか?
良い結果も悪い結果もすべて C++ の仕様について検討するためのデータになればいいんであって、
その残りかすそのまま ISO 標準にされたのは禿にとってゴミを拾った奴らに勝手に献上されて恥をかいたって図式だと思うぞ。
俺に言わせれば言語仕様とライブラリが同一の規格になっていることこそ( ゚д゚)ハァ?な状況だ。
演算子のオーバーロードでこんなに凄い事が出来る事を示したかったが 失敗した。
そこでlexcal_castですよ
spirit か xpressive じゃね?
>>459 サンクス、なんかオープンなフレームワークあればな〜と思ったんですが、ちまちまやります。
struct A { int a; A() : a(0) {} A(const A& ref) { a = ref.a; } }; struct B : public A { int b; B() : b(0) {} B(const B& ref) { a = ref.a; b = ref.b; } }; B b1;b1.a=1;b1.b=2; B* b2 = new B(); A* a = b2; *a = b1; こんなことやりたいのですが、当然オブジェクトのスライシングがおきますよね。 コピーコンストラクタをvirtualにできるわけも無いですし、cloneメソッドを実装するしかないんですか?
474 :
デフォルトの名無しさん :04/09/12 15:58:12
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=1094971899&res=1 すみません。助けてください。
今、ハッシュでデータを管理して、それを二分探索木で検索するようなプログラムを作っているのですが、
削除する名前を検索して削除するっていうのをやりたいんですが、
それがなかなかうまくいきません。コメントアウトしているところが問題のところです。
エラー内容が
D:\TEST PROGRAM\基礎のプログラム\ハッシュ法\ハッシュ法(クラス).cpp(222) : error C2664: 'Node_smallest' : 2 番目の引数を 'const char *' から 'char *' に変換できません。 (新しい機能 ; ヘルプを参照)
変換で修飾子が失われます。
D:\TEST PROGRAM\基礎のプログラム\ハッシュ法\ハッシュ法(クラス).cpp(233) : error C2440: '=' : 'const char *' から 'char' に変換することはできません。(新しい動作 ; ヘルプを参照)
この変換には reinterpret_cast, C スタイル キャストまたは関数スタイルのキャストが必要です。
というやつです。考えは、削除したい所をpNext[1]の方の最小値を全て入れ替えて、削除するっていうやり方を
しようと思いました。他に良い方法があったら、その方法も教えていただければ嬉しいです。
若輩者ですが、ご指導お願いします。
>>474 エラーメッセージを読め。
それから、「コメントアウト」というのはコードの一部をコメントにすることだ。
>>474 - const char* pName;
+ char* pName;
- *pName = pNode->pName;
+ pName = pNode->pName;
477 :
474 :04/09/12 16:38:02
すみません。考えてみたんですが、わかりませんでした。。。 どうしたらいいのか、教えてもらえないでしょうか?
>>477 エラーメッセージ見てわかんないなら入門書から読み直しが必要だな。
479 :
474 :04/09/12 16:43:54
はい。そうします。
>>473 その場合コピーコンストラクタじゃなくて、代入演算子をvirtualじゃまいか
C++についてなのですが、ofstreamでcinでユーザーがタイプした文字列を テキストファイルに出力して、そのファイルをもう一度読み込み別の テキストファイルに出力するにはどうしたらよいでしょうか?
>>481 #include<iostream>
#include <fstream>
int main()
{
typedef std::istreambuf_iterator<char> isbi;
typedef std::ostreambuf_iterator<char> osbi;
std::fstream f1("file1", std::ios::in | std::ios::out | std::ios::trunc);
std::copy(isbi(std::cin), isbi(), osbi(f1));
std::ofstream f2("file2");
f1.seekg(0);
f1.clear();
std::copy(isbi(f1), isbi(), osbi(f2));
}
>>482 f1.clear()って必要あったっけ?
EOFまで読むとエラーフラグ立ちっぱなしになるのは知っているが・・・
>>483 いらなかったな。rewind()の感覚で書いてるもんでつい…
>>482 アドバイスありがとうございます。
私はC++始めたばかりなので難しすぎてよくわかりません。。
もう少し具体的に説明しますと
void Display_contact()
{
char cTemp[80], GivenName[20], FamilyName[20], Address[40], Phone[15],
EmailAddress[25], DateofBirth[20], TypeofContact[3];
ifstream ContactBook;
ContactBook.open("contact.txt",ios::beg);
clrscr();
cin.seekg(0);
cin.clear();
cout << "\t\t\tCONTACT MAINTENANCE SYSTEM\n" << endl;
cout << "\t\t\tALL CONTACTS\n" << endl;
if (!ContactBook)
{
cout << "cannot open file";
getche();
}
続き while( !ContactBook.eof() ) { ContactBook.getline(GivenName,20); ContactBook.getline(FamilyName,20); ContactBook.getline(Address,40); ContactBook.getline(Phone,15); ContactBook.getline(EmailAddress,25); ContactBook.getline(DateofBirth,20); ContactBook.getline(TypeofContact,3);
続き cout << GivenName << " " << FamilyName << "\t\t\t"; cout << EmailAddress<< "\t\t\t"; cout << TypeofContact<< "\t\t"; cout << Address << "\t\t"; cout << Phone << "\t"; cout << DateofBirth << "\n\n\n"; ↑のファンクションはすでに入力されたテキストファイルを読み込んでディスプレイするのですが こんな感じでcontact.txtを読み込んで下のcoutみたいに形を整えてもう一度別なファイル名で出力したいんです。 申し訳ないのですがもう一度アドバイスお願いできますか?
>>487 ofstream out("ファイル名");
として、coutの代わりにoutを使えば良い。
>>482 #include <iterator> が抜けてる。
copy + streambuf_iterator より、 operator<< + rdbuf() のほうがよくない?
>>488 その場合ofstream out("ファイル名");は出力ですよね?読み込みはどうすればよいのですか?
contact.txt から report.txtというファイルに出力したいのですが、その場合読み込みはどこら辺に
どうやって書けばいいですか?度々質問して申し訳ないですがお願いします。
>>491 一応動いたのですがテキストファイルが空っぽなんです。。
ofstream out("report.txt");
out << GivenName << " " << FamilyName << "\t\t\t";
out << EmailAddress<< "\t\t\t";
out << TypeofContact<< "\t\t";
out << Address << "\t\t";
out << Phone << "\t";
out << DateofBirth << "\n\n\n";
}
ContactBook.close();
}
これであってますか?
493 :
デフォルトの名無しさん :04/09/12 19:00:52
先ほど、ちょっとお世話になった
>>474 なんですが、
エラーの原因が構造体のconstってのはわかって、コンパイルできたんですけど、
ビルトすると、途中でエラー終了してしまいます。
あの、今回はマジで教えてもらえないでしょうか?
訂正
>>485-487 の一覧をディスプレイするプログラムです。
出力する方ではないです。
497 :
デフォルトの名無しさん :04/09/12 20:15:16
えっと、それなら諦めます。 質問なんですが、ハッシュ法で、二分探索木を使うよりも、双方向リストで挿入法を使うほうが早いですか? それとも、遅いですか?
>>497 だから挿入のほうが気持ちいいから!
終了!
挿入してからがあんまり早いとダメだな
挿入はすんなり、挿入してからはゆっくり。
VC++なんですが、販売終了しています。 どうやって学習したらいいのでしょうか?
>>501 VC++.Net 2003買え。VC++バージョン7相当だ。
>>501 Visual C++ Toolkit 2003使え。タダでVC++.NET2003Pro以上だ
newやmallocで確保した領域ってabortで強制終了された場合でもプログラム終了と同時に解放されるんでしょうか?
メモリ保護機能のないOSなんてッ!!
>>505 Win32 とか UNIX 使ってれば間違いないやね。
ただしデストラクタは呼ばれないから、共有メモリとか一時ファイルの類は
消えない可能性アリ。注意。
びっくりするほどリソースリーク びっくりするほどリソースリーク
あっとおどろくギャロップダイナ
511 :
虎夫 :04/09/13 01:18:47
現在作っているプログラムで、 割り込みによって一定時間ごとにデータを取得しております。 このとき割り込みの周波数を100[Hz]に設定すると、 プログラムは0.01秒毎にタスクを行います。 (PCのCPUが十分であると考えて) たとえばタスクA,B,Cを割り込みの1周期に1度行うとすれば、 Aのタスクは0.01秒ごとに遂行されます。 しかし、もしBというタスクが常に2秒かかるタスクだとすれば、 それぞれのタスクは2.01秒に1回しか遂行されません。 これはあれ程度しかたありません。 現在私の悩んでいる問題は、 A,Cというタスク(1回に1msもかからない)を0.01秒ごとに 遂行して、ある条件の時にBというタスクを行いたいとすると、 今のままでは、A,Cは普段0.01秒に1度タスクが遂行されますが、 Bが遂行されるときにはタスクが2秒(Bの遂行時間)待ちが生じます。 こんなとき、BをA,Cとは並列に遂行させ、 常にA,Cを0.01秒ごとに遂行させるにはどうすればよいでしょうか? (ここで、Bが遂行中に次のBの命令がくることはないとします。)
512 :
虎夫 :04/09/13 01:19:19
現在作っているプログラムで、 割り込みによって一定時間ごとにデータを取得しております。 このとき割り込みの周波数を100[Hz]に設定すると、 プログラムは0.01秒毎にタスクを行います。 (PCのCPUが十分であると考えて) たとえばタスクA,B,Cを割り込みの1周期に1度行うとすれば、 Aのタスクは0.01秒ごとに遂行されます。 しかし、もしBというタスクが常に2秒かかるタスクだとすれば、 それぞれのタスクは2.01秒に1回しか遂行されません。 これはあれ程度しかたありません。 現在私の悩んでいる問題は、 A,Cというタスク(1回に1msもかからない)を0.01秒ごとに 遂行して、ある条件の時にBというタスクを行いたいとすると、 今のままでは、A,Cは普段0.01秒に1度タスクが遂行されますが、 Bが遂行されるときにはタスクが2秒(Bの遂行時間)待ちが生じます。 こんなとき、BをA,Cとは並列に遂行させ、 常にA,Cを0.01秒ごとに遂行させるにはどうすればよいでしょうか? (ここで、Bが遂行中に次のBの命令がくることはないとします。)
513 :
虎夫 :04/09/13 01:20:13
すいません、2重になっちゃいました。
その質問はC++と関係ない
515 :
虎夫 :04/09/13 01:25:34
ヴィジュアルCつかってます。 書き忘れてました。
boost/preprocessor/stringize.hppを見てて疑問に思ったのですが # と先頭に#だけの行があります。 コメントみたいになにも効果はないみたいですが コンパイラにはどう解釈されているのでしょうか?
>>517 #の次にnew-line文字が来ていればその行は読み飛ばされる。
今やっているプロジェクト用にXML ファイルから C++ ファイルを 自動生成するツールを作りたいと思っています。 A.xml を読み込んで、A_Handler.cpp, A_Handler.h, A_Instance.cpp A_Instance.h, A_Test.cpp を生成するようなツールです。 ちなみに複雑な定義の場合はA_Handler_add.cpp といったファイルに 記述することにして、XML の中ではそのelementに対応する定義を 自動生成しないよう設定するなどして、あまり難しい処理はせずに 一発で自動生成できるようにします。 以前に別プロジェクトで A.xml を読み込んで A.cpp, A.h を 生成するツールを作ったので、それをリファクタリングして 抽象クラス等を抜き出して再利用したいと思っています。 しかし、なかなか難しいもので、どう設計すればいいか 悩んでいるところです。 (以下4レスほど続きます。)
現状のプログラム (OldGenCodeとします) は以下のような構成になっています。 <GRAMMAR> -> OldDataGrammar, <ELEMENT> -> OldDataElement, <TYPE> -> OldDataType といった具合に、一種類のタグにつき 一つのクラスを定義し、OldMain.cpp から以下のように呼び出しています。 OldDataGrammar grammar; grammar.load(xmlparser); grammar.printHeader(ostream_h); grammar.printCpp(ostream_cpp); DataGrammar の中では以下のようなメンバ関数を作っています。 void printHeader(ostream & os) const { printCopyrightNotice(os); printIncludeGuardBegin(os); printHeaderIncludeFiles(os); printUsingNamespaces(os); printNamespaceBegin(os); printClassDeclaration(os); printClassInlineDefinition(os); printNamespaceEnd(os); printIncludeGuardEnd(os); }
ヽ(・ω・)/ 今だ!ヨガテレポート!! \(.\ ノ ,,、
内部ではさらに void OldDataGrammar::printClassDeclaration(ostream & os) const { ... (略) ... for (int i = 0, n = elements_.size(); i < n; i++) { elements_[i].printGetterMethodDeclaration(os); } ... (略) ... } のように下位クラスを呼び出しています。呼び出された側ではこんな感じ。 void OldDataElement::printGetterMethodDeclaration(ostream & os) const { if (! needPrintGetterMethodDeclaration()) { return; } // endif ... (略) ... output << " const " << getTypeName() << " & get" << getMethodName() << "(void) const;" << endl; } 現状では Header と Cpp の二種類しか考えておらず、 Data* クラスの各階層に print* が山ほど散らばっています。 これを単純に五種類に増やせば破綻するのは目に見えています。 Data 部分と Print 部分を分ければいいのではと思うのですが、 どういう風に分ければいいのかあまりいいアイディアが浮かびません。
とりあえず Main から以下のように呼び出せる構造を考えてみました。 NewDataGrammar grammar; grammar.load(xmlparser); NewHandlerHeader handler_h(grammar); handler_h.print(ostream_handler_h); NewHandlerCpp handler_cpp(grammar); handler_cpp.print(ostream_handler_cpp); .... (略) ... この場合、これまでどおり一種類のXMLエレメントに対応する仕事は 一つのクラスに任せることにすると、 NewDataGrammar, NewDataElement, NewDataType... NewHandlerHeaderGrammar, NewHandlerHeaderElement... NewHandlerCppGrammar, NewHandlerCppElement... といった大量のクラスを作らなければいけなくなります。 うまく抽象化できているならそれでも構わないのですが、 その抽象化もなかなか難しいところです。 Header、Cpp それぞれで共通の構造を抜き出すことは多少は可能でしょうが、 DataElement::printGetterMethodDeclaration() // for Header DataElement::printGetterMethodDefinition() // for Cpp DataElement::printInlineGetterMethodDefinition() // for Header のようにCppとHeader、あるいはHandlerとInstanceでは操作や構造が異なります。 このあたりうまく抽象化、パターンの適用等はできないか考えているのですが、 なかなか解決できません。皆さんならどうされますか? アイディアや適用できるパターン等をご教示ください。よろしくお願いします。
漏れなら生成ルールを記述する適当な中間言語を用いるけど。 あるいは XSLT で C 寄りの文法の XML に直して、そこから C へ、と2段階で。
>>521 cppll にでも逝ってみれ。
あそこの管理人がむしゃぶりつきそうなネタだ。
ひょっとして、ネタ的に
>>521 自身があそこの管理人か?
ご回答ありがとうございます。
>>526 >生成ルールを記述する適当な中間言語
といいますと、たとえば……?
何かキーワードをいただければ調べてみます。
>XSLT で C 寄りの文法の XML に直して、そこから C へ、と2段階で
あまり汎用的になりすぎてしまっても時間的に厳しいような気がします。
現段階ではXMLで定義するのはデータが中心なので
比較的簡単にあらかじめ決めた枠内のC++コードに落とせるのですが。。
それとももしかしてそういう汎用ツールがどこかに転がっていたりしますか?
>>527 情報ありがとうございます。
GoogleしてMLの紹介ページを見てきたのですが、
ライブラリ関係のMLみたいでしたが。。。
επιστημηさんの名前は聞いたことはあります。
>>528 あのMLはスタンス的にはこのスレとほぼ同一だから、あそこで聞いてみれ。
ネタ的にほぼ確実にあそこ管理人が相談にのってくれるから。
>>529 MLなんて三年くらい参加してないし、恥ずかしいなぁ。。。
でも、これからメールアドレスを取得してML入会してきます。
あちらで質問することを決心したらここに書きますので、
それまでの間に何かアドバイスやアイディア等ありましたら
こちらへレスをいただければ幸いです。よろしくお願いします。
コンストラクタの初期化子でnewしてもいいんですか?
ええかー ええのんかー
class Test { public: Test(void) : test_(new Test) {}; virtual ~Test(void) {}; private: Test * test_; }
>>538 ???
普通にintとかをnewするのならOKですよね?
例外うんぬんはおいておいて
DOS攻撃だ!!!
>>538 おもしろいですねぇ〜。
#include <iostream>
class foo
{
public:
foo() : pF(new foo){}
private:
foo *pF;
};
int main()
{
try{
// ↓例外が起きる
//foo *fF = new foo;
// 例外が起きない
foo x;
}
catch(...)
{
std::cout << "例外" << std::endl;
}
}
>>541 なぜ?
foo x;でも結局 new foo が呼ばれて同じことじゃないの?
VC6で試したらどっちも例外おきましたよ???
コンストラクタに失敗したときのクリーンアップを安全に行いたいなら スマートポインタにしたほうが良い。
class A { private: Obj* p; public: A() try : p(new Obj) // ←例外が起きる { } catch(...) {} // ←握りつぶす }
>>545 握りつぶした後、そのAのインスタンスはもはや生存期間を
過ぎていることに注意しなければならない。だから、一切
触ってはいけない。一応書いておくが。
×catch(...) {} // ←握りつぶす ○catch(...) {} // ←握りつぶせない(暗黙のthrowが末尾につく)
準拠してるよ。 VC7.1だと通るよ。 BCCはショボイから通らないかもね。
>>552 ああ確かにVC7.1だと通った。switch文のcaseをまたぐブロックを入れるような感覚か。
ちなみにBCC5.6.4でも通らん。糞だなBCCは。
例のML、返事が来始めましたが…… むずいよう(;;)
warota あそこはオナニーMLだから、 C++の構文やいろんなライブラリを駆使した難解な答えがいくつも返ってくる。 その中から自分にあったものを拾うのがいいよ。
>>542 VC7.1でやったけど、例外起きませんでしたけどねぇ…。。。
ひょっとして最適化が働いたかな?
>>554 ''例のML'' はレベル高いですからねぇー。
>>556 自分で自分を作る無限連鎖って最適化で消されるもんなの?
>>558 無理です。BCB6使ってますから。
でもVC7.1もあるので文法はVC7.1もしくはgcc3.4.1(MinGW)で試しまつ。
#MinGW早くgcc3.4.2出してくれ〜。
bcb6のbcc32は5.5.1じゃなくて5.6.xだろ? 5.5.1なんていうからフリーのBCC使ってると思ったんだよ
3.4系のgccなんてバグだらけのモノよく使えるな。
関数tryブロックは標準の話です、コンパイラ依存の機能ではありません
>>560 5.5.1にBCPad組み合わせたものとBCC5.6.4(BCB6)の両方使ってます。
BCB6を立ち上げるのが面倒だったのでBCC5.5.1使いました。でも
BCC5.6.4使っても全く同じ結果でした。
>>561 まあそうですがgccは仕事には使ってないので。
>>562 >>563 スマソ。本当に文法に違反していると勘違いしたもので。私が悪かったです。
そんなにコンパイラに依存する文法なら代替コードを考えたほうがいいのではないだろうか。
std::list<Hoge*> hoge; を voif foo( const std::list<const Hoge*> & ); な関数にそのまま渡すことはできないのでしょうか? fooではHogeのconst付きの関数しか呼べないようにしたいのですが。
>>567 はスルーでよろ。
自環境での結果をろくに書かないのはただの荒らし。
569 :
デフォルトの名無しさん :04/09/15 08:39:23
そういう"解説"が必要であると判断する程度には 「ただの荒らしではない」と考えているわけですね? :-P
>>567 型が違うからできないな。
どうせコンパイラもそう言ってるだろ。
解決策は、あまり簡単なのは思いつかないなぁ。
reinterpret_cast で動くんだろうけど、それじゃダメだろうし。
>>569 ただの荒らしだと考えてるからこそスルーを要請したわけだが。
const付で呼びたい?なら勝手に呼べ。ってこった。
std::list<Hoge*>::const_iteratorを使って呼ぶべきだなこの場合
573 :
デフォルトの名無しさん :04/09/15 09:50:15
>>571 > ただの荒らしだと考えてる
本当にそう思っているなら、何も書かずにいればいいわけです。
要請などと言いつつ、いきなり自分自身が「スルーできてない人」になる必要は
まったく無い :-P
つまり、荒らしだと考えたというより、自分の美学(くすくす)に反する内容だったので
「これを皆が荒らしと見なす流れが欲しかった」だけでしょう。
でも実際のところは荒らしというほどではないので、放っておいたら
他の人はそう考えない。ちゃんと回答してしまう可能性が高い。それは嫌だ。
だからわざわざ「こういう風に荒らしなんですよ」と、蛇足感丸出しな"解説"なんぞをして、
「自分に乗っかる人を募った」わけですね。全然ダメだったようですが ;-)
デバッグ時にassertを使うのはよくやりますが、これだとassertが埋め込まれた 個所の呼び出し元までは特定できませんよね。 それでassertを呼ぶ代わりに例外を発生させるようにしてデバッグしてるのですが これはやらないほうがいいんでしょうか? 後に本当に発生すべき例外だと分かって、かつ戻り値の変更が難しい場合は 正規のコードとして残す事も考えてます。
>>574 環境依存だけどVCなら_ASSERTでファイル名と行番号が出る。
576 :
デフォルトの名無しさん :04/09/15 10:43:55
自動変数よりstatic変数の方が速いの?
577 :
マイク ◆yrBrqfF1Ew :04/09/15 10:51:24
早いよ。
嫌、遅い。 自動変数はほぼ確実にキャッシュに載ることが期待できるし。
>>575 そういう話じゃなくて、呼び出し元を知りたいんだから
スタックトレースとかしなきゃ駄目でしょ?
>>575 assertを上書きして、お望みの機能を付ければよろしい。
>>579 (VC のように) __FILE__ とか __LINE__ を使ったマクロで実装すればよい、ということでは?
インクルードの順番を気にせずヘッダファイルを インクルードする方法ってありませんか? 何度インクルードしてもいいように #ifndef _DATA_H_ #define _DATA_H_ #endif //_DATA_H_ で囲む方法は知っていますが。
インクルードの順番を気にすることなんてあるの?
[open.h] { [close.h] } [main.cpp] int main() #include "open.h" return 0; #include "close.h"
先生! newで作ったクラスのインスタンスを、自滅させた場合(delete this)、 後に外の関数で解放されたことを知るには、どのようにすればいいのでしょうか? 教えてください。。
>>585 デストラクタの最後の行でthis=NULL;
開放されたと言う情報を外に伝えるだけ
む、思ってたより単純な事みたいですね。 ありがとございまーす。
>>586 thisってconstじゃなかったか。
釣り?
そもそも破棄されたオブジェクトにアクセスする可能性のあるような プログラムではdelete this;をするべきじゃないと思うんだけど。 起動したらあとはなにも知らないで良いような自立したオブジェクトだけ delete this;するべきじゃないの?
591 :
デフォルトの名無しさん :04/09/15 19:44:34
するべきなのか
>>591 delete this; の前に自殺予告が出せるオブジェならありうるべ。
delete this;するべき状況は思い付かないな
windoze
WindowsのMFCやWTLなら使うこたぁある。
delete this;する関数名もほぼお決まりだな void desroy();
デスローイ!
pimplとかcloneとかselfとか、最初から決まってる方が 分かりやすくて名前考えなくて済むから楽でいいよね
600 :
デフォルトの名無しさん :04/09/16 00:41:31
>>572 それじゃ Hoge に const 付かないだろ。
お前ら、デストロイをすぐに入力できるかね? 漏れはなぜか、「destory」。何度やってもこうなってしまう。 destroyと入力できない。同じクセがあるヤシいる?
デストーリ?w
destroy
clientがclinetになってしまうのに似てる。 ただ、clientはしょっちゅう使うスペルなので慣れてしまうけど、 destroyはあまり使わないのでいつまでたっても変なまま。
∧_∧ デストローイ!! |\ΦДΦ) /| ○ < ζ) < ○ 人人 | > 旦 > | < ∧∧ キュワアアアアア!!! | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄| ヽ(゚Д゚ )ノ | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ | ( へ) | | く
おまえら何くだらねーこと言ってんだ。 俺もよくやる。
constがcosntってなる・・・
itn。。。
receiveとrecieve
コンストラクタへのポインタって使えますか? 数種類のクラスからランダムで1つを選ぶってので、ポインタをテーブルにいれといてそこから呼び出したいんですが
そういうときこそdestroyの逆でよく使われる、 createですよ。 詳しくはabstract factoryデザインパターンをごらんあれ。
614 :
デフォルトの名無しさん :04/09/16 10:18:45
>>612 オブジェクトを生成するstatic関数を定義すればOK。
で、生成用のstatic関数でオブジェクトの生成方法を選択する。
複数のクラスを生成するならば、基底クラスで生成メソッドを定義し、
そいつをキャストして返してやる。
あとは、そのポインタをdynamic_castなりしてやれば問題なし。
GoFで言えば、Builderになるのかな?
615 :
614 :04/09/16 10:20:26
>>612 ,613
かぶった…
abstract factoryか勘違いスマソ
617 :
デフォルトの名無しさん :04/09/16 13:07:23
>>602 自分も昔「destory」ってよくやってしまてたよ。
同様に
true→ture
label→lable
もよく間違ってったよ…
retrunを忘れるな。
pritnf
Drwa
>>612 コンストラクタのアドレスは取得できない
falseを「フェイルス」って発音する上司がいるんですけど、 どうしたら良いでしょう? それ聞くと噴出しそうになるので。
>>625 fail と混同してるんだろうなぁ・・・。
とりあず、2択だな。
1. ちゃんと正してあげる
2. 慣れる・自分も使う
fail→連続する母音は前の母音が二重母音化 false→eで終わる単語はその前の母音が二重母音化<alはallの如き発音に case→eで終わる単語はその前の母音が二重母音化 なまじ単語の知識がある人こそ填まりかねない罠。
>>625 warningを「ワーニング」って発音するやつが身の回りに20%くらいいるけどもう慣れたよ。
人前で話す機会には訂正してあげてる。
ウォーニン
630 :
デフォルトの名無しさん :04/09/17 01:43:36
英語なんて日本人がどんなに正確であろうと思われる発音しても nativeから見ればップって感じだからどうでもよくね?
マックスストア
Make your dream come false;
>>628 ワーニングであってるよ。厳密には、(ゥ)ワニング。
ウォーニングと発音するのは厨房。
Doom3でしょっちゅう聞いたよ、ワーニング。
活きた英語じゃなくて受験英語を目指すあたりが厨。 英語試験担当者(生粋の日本人)が喜んでとりあげそうなネタだ。 でも実態は違うというオチ。アメリカなら、ワーニングでいいよ。 お利巧さんは、イギリスにでも逝ってろってこった。
ウォーニングだろうが、ワーニングだろうがどっちにしろ 日本語発音なんだからどうでもいい。
hong kong king kong
あなたの夢を喜劇にしなさい。
643 :
デフォルトの名無しさん :04/09/17 16:44:11
falseの発音は「フォルス」でいいの?
「厳密には」とか言いながらカタカナ表記で、 しかも最後が「グ」なんて書く 頭の悪い人が後を勃たない。
厳密には、 頭の悪い人ではなく、バカが悪い人と書く。
true = トルエ false = ファルセ
ファールス
int=あいえぬてぃー double=だぶる char=きゃら float=ふろーと long=ろんぐ unsigned=あんさいんど true=とぅるー false=ふぁーるす class=くらす struct=すとらくと template=てんぷれーと stdio=えすてぃーでぃーあいおー stdlib=えすてぃーでぃーりぶ iostream=あいおーすとりーむ fstream=えふすとりーむ vector=べくたー deque=できゅー
cout=しーあうと cin=しーいん cerr=しーえらー
string=すとりんぐ wstring=だぶるすとりんぐ boost=ぶーすと stlport=えすてぃーえるぽーと
reinterpret_cast=れいんたーぷりときゃすと
operator=おぺれーた
cinco=チンコ
queue=きゅー find=ふぁいんど find_if=ふぁいんどいふ lower_bound=ろうあーばうんど upper_bound=あっぱーばうんど equal_range=いこーるれんじ remove=りむーぶ for_each=ふぉーいーち partition=ぱーてぃしょん nth_element=えぬてぃーえいちえれめんと iterator=いてれーた const=こんすと
int=いんと double=どうぶる char=ちゃー float=ふろーぁと long=ろんぐ unsigned=あんさいねど operator=おぺらーとぁ while=わいる
while=ほわいる
regex=れじぇっくす C++=しーぷらすぷらす
operator=おぺらとーる
.cppファイルと.hファイルの違いって何なんでしょう。 cppファイルが複数あった場合、コンパイル時どういう順で展開されるんでしょうか
別にあいえぬてぃーでも問題無いんじゃない? doubleをでぃーおーゆーびーえるいーとか読まれたら引くけど
663 :
デフォルトの名無しさん :04/09/17 17:53:23
4ヶ月ぶりぐらいにC++をやったら、プログラムを実行できなくなりました。 原因は全くわかりません。初心者丸出しの質問ですが、どなたか何が 原因と思われるかわかりませんか?
>>663 あなたが4ヶ月ぶりくらいにC++をやったこと
>>660 hファイルはコンパイル前にcppファイルに取り込まれる。
cppファイルは取り込んだhファイルごとコンパイラにかけられてオブジェクトファイルになる。
>>663 どんなプログラムでどんなエラーが吐き出されたとか
詳細を書かなければ誰も答えてくれませんよ
とマジレスしましたがネタですかね(?)
int = いんてじゃー
>>664 原因が何だか本当にわかりません。
ビルドの結果はエラーなしなのですが、実行すると、「プログラムを実行できません」と出ます。
マジで困ってます・・・OTL
1000 2000=せんにせん 2000 4000=にせんよんせん 5200=ごんに 3900=ざんく 1000=せんてん 7700=なななな
家のパソコンが夜な夜な勝手に動きまわるんです。 たすけてください
>>668 は僕です。
>>666 ネタじゃないです・・・。エラーは出てないんですが、実行ができません。
>>667 そこiいんてじゃーねとかいうとintegerって書かれるぞ
>>673 板違いなんですか・・・?確かにプログラム以前の問題だとは思いますが・・誰もわかりませんかね?
>>674 開発環境に沿ったスレで質問した方がきちんと答えてくれる人が
いると思われ。
そこでもう少し詳細を述べましょ
>>675 そうですか・・わかりました。ありがとうございます。
>>648 stdio=スタンダードアイオー
stdlib=スタンダードリブ
って言わないの?
俺だけ?
GUI=じーゆーあい CUI=しーゆーあい stdio=すとでぃお
GNU=ぐにゅ かっこつけるとき ぬー
GUI=ぐい CUI=くい GNU=じーえぬゆー
>>665 cppファイル1つに付き、オブジェクトファイル1つ作られるのでしょうか。それから、リンクってこと。??
GNUはグニューと決まっている。て言うかC++の話題マダ〜?
GUI=ぎゅい CUI=きゅい GNU=ぐぬぅ
ここはとても低レベルなインターネッツですね。
万個スレが削除された途端 こっちがネタスレになっちゃったな。
endl=えんどえる std=えすてぃーでぃー それはそうと cout << "Hello World" << endl; の << の読み方がわからん。 逆の>>も。
左!左!
NILはなんて読んだらいいの?
NULL=ぬる (void*)0=ぬるぽ
>>690 #define NULL (void*)0ならどうなるよ?
#define NULL (void*)0=しゃーぷでふぁいん ぬる ぬるぽ
こんにちは。わたくし、ぬるぬるぽと申します。
やけにスレが伸びてると思ったら。
695 :
デフォルトの名無しさん :04/09/17 20:56:58
696 :
デフォルトの名無しさん :04/09/17 21:50:18
大切な重複スレがゴミ箱に捨てられてしまった。
ゴミ箱って書けないんだっけ
698 :
デフォルトの名無しさん :04/09/18 00:46:50
質問です。 いまあるクラス用意します。たとえばこのクラスはファイルアクセスに関する単純な処理を提供します。 1バイトアクセスのReadByte、WriteByteがあるとします。このクラスをCBaseFileとします。 次にこれを使って用途がより限定的なクラスを作ります。 つまりCBaseFileでは処理が汎用的でコーディング量を節約できないためです。 そこでCMyFileを作成し、ReadLine、WriteLine(行;\r\nまでの単位を扱う)を提供したいとおもいます。 このときこのCMyFileはCBaseFileから継承したほうが良いのか、メンバに持つべきなのか、です。 Is AなのかHas Aなのかどっちにしたほうが良いのですか?
699 :
デフォルトの名無しさん :04/09/18 00:48:57
どっちでも好きなほうでいいんでない?
>>698 委譲で出来る事は全部委譲でやる。
委譲で出来なくてprivate継承で出来る事は全部private継承でやる。
それでもできなければprotected継承で。
それで無理なら考え直せ。
委譲って言葉をはじめて知りました。 メンバにもってその機能を使い、もう少し便利な形にして外に見せる、見たいな事でしょうか。 とりあえずメンバに持つやり方にします。 ありがとうございました。
>>698 iostreamの設計を見つめてください
自分の事は自分でやる...か。意味深な
すごい複雑でつね。こんな設計見習うべきか躊躇しまふ。
質問させて下さいな。 3桁毎に区切りが入った 2,234,713 のような10進文字列の取得は 皆さんどうやって実現してるんでしょうか?
,を全部無視するだけじゃないの?
sscanf(buff, "%d %d %d", &a,&b,&c); これは無理か?
>>706 std::string s = "70,145,123";
s.erase(std::remove(s.begin(), s.end(), ','), s.end());
int result = atoi(s.c_str());
無理だ。 int a,b,c; char buff[]="10 20 30"; sscanf(buff, "%d,%d,%d",&a,&b,&c); これでできたよ。。うちは
C++だた...
質問の仕方が悪かったみたいです。 やりたい事は、int → char*です。 snprintf()とか_itoa()とかでは実現できないみたいなので質問しました。 一時は自力でやるべきかと思いましたが、ロケール毎で区切り文字などが違うらしいので、 なにか良い方法はないものかと思いまして・・・。
>>711 >>708 をちょっと変えて
!isdigitでremove_ifすればいいじゃない?
区切りが数字なんて無いでしょ?
1,000,000 これが100万てことか。 例えば"1,000,000"ていう文字列を10進数に 直すって意味ではないのか。質問の意味が分からない。
>>715 ちょうど逆です。
1000000を"1,000,000"に変換したいのです。
なにか汎用的な方法とかあるんでしょうか?
あります
自作 AddComma( moneyStr, ',', 10000 ) void AddComma(char *str, char chr, int money); 力不足でごめん。
#include <iostream> #include <string> using namespace std; string insert_comma (string str) { int pos = (int)str.length() - 3; while (pos >= 1) { str.insert(pos, 1, ','); pos -= 3; } return str; } int main (int argc, char *argv[]) { cout << insert_comma("10") << endl; cout << insert_comma("100") << endl; cout << insert_comma("1000") << endl; cout << insert_comma("100000") << endl; cout << insert_comma("10000000000") << endl; return 0; }
メモリのプール化について説明してるサイトないですか?
>722 はあ?分かってないって何だよ。面白くねーなクソが。 あんた>717か?汎用的な方法ってやつの事か? マニピュレータでも定義するんなら、とっととコード書くなりヒント与えるなりしたらどうだ。 # 確か標準マニピュレータの中にはコンマを付加するやつは無かったと思うけどさ。 # あるんなら早くポインタ示してやれよ。
printf("%03d,%03d,%03d",(x%1000000000)/1000000,(x%1000000)/1000,(x%1000));
>>721 ご教示有難うございました。自作版ですね。
例えばWindowsでは、コントロールパネルの「地域と言語のオプション」から
各国毎の数値の表記方法が確認できるのですが、
アイスランド語やアゼルバイジャン語(50音順に並ぶ最初の2つの言語)は、
日本語の数値表記と違うみたいです。むしろ、日本と違う国がたくさんあるようです。
こういうのって、boostにあってもよさそうに思うのですが。
boostなんか使わなくてもちゃんとロケールが定義されてる環境なら標準C++でできます。
>>724 gccみたいなお馬鹿なコンパイラでは無理ですよ
ちなみにVC++7.1みたいな標準準拠度の高いコンパイラならOKです。
文法の質問?なのですが、 Class TestClass{ struct TestClass{ int a,b,c; char c,d,e; }; }; これって使えますか? つまり、クラスのメンバの構造体の名前が、クラス名と同じという書き方はできるんでしょうか?
他に誰も知らないみたいなのでそろそろ答えを出します。 #include <locale> #include <iostream> int main() { using namespace std; int i = 1500000; cout.imbue(locale("")); cout << i << endl; } 文字列に格納したければcoutの代わりにstringstreamを使えばOKです。 locale("")で使用環境のネイティブロケールを指定した事になります。
ちなみにさっき書き間違えましたが、 お馬鹿なのはlibstdc++でgccではないかもしれません。
>>730 早速、試してみました。有難うございました。
locale("")というのは、関数じゃなくてクラスのインスタンスなんですね。
標準C++は奥が深いなぁ。ちょっと目からウロコ。
>732 そうやって俺をイラつかせて、何をしたいんだ。 俺に恨みでもあるのか。それとも人をからかうのが好きなのか。 どちらにしても、お前は悪意をもって人を傷つけようとした。 こういう事はこれで最後にしろ。
>ロケール毎で区切り文字などが違うらしい だってこの質問文も読まないでカンマに固定してんだもん。
>735 は?>705では3桁区切りとしか書いてねーじゃん。 だから俺も3桁で区切るコード書いたんだよ。 で、何だ。俺が>711を読んだ上で>721のコードを書いてしまったとして お前はそれを「無知」つって笑うのか。これ、「無知」つーのか。 「不注意」じゃなくて。
そろそろウザい。2人とも消えろ。な? ↓何事もなかったかのように質問ドゾー
>>736 localeも知ってたんなら無知じゃなくて不注意でもいいけど、
locale自体知らなかったなら無知だろ。つーかどうでもいいよ。しつこいし。
741 :
デフォルトの名無しさん :04/09/18 11:30:16
自分の弁護に必死になるのは見苦しい。 相手が自分より良い方法を示してきたら素直に受け容れろ。
一言多い人って子供っぽい
はぁ
そもそも
>>721 が中途半端な知識をひけらかすから悪い。
知らないなら黙っていればよかったのに。
しかもいつまでも粘着するし。
747 :
デフォルトの名無しさん :04/09/18 14:11:23
以下のように動的に確保した2次元配列に関する質問です。 double** array2D(int imax,int jmax){ int i; double *Mi,**M; Mi=new double[imax*jmax]; M=new double*[imax]; for(i=0; i<imax; i++){ M[i]=Mi+i*jmax; } return M; } これを int main(void){ double **c; int i,j; c= array2D(2,4); for(i=0;i<2;i++){ for(j=0;j<4;j++){ c[i][j] = j+ 4*i; print_pointer2D( c+i ); } } } の様に用います。ここでprint_pointer2D関数は void print_pointer2D(double **c){ printf("%f \n", c[0][0]); } という風に、渡されたアドレスの先頭をprintするだけの関数です。 質問は、print_pointer2D(c+i)とすればc[0][0]の値やc[1][0]の値をprintすることはできるのですが、 c[1][1]やc[0][2]等も渡すようにするにはprint_pointer2D関数の引数をどのようにすればよいでしょうか?
いちいち相手して721の神経逆なでする事も無いじゃん
>>747 普通にこうしたらだめ?
void print_pointer2D(double c) {
printf("%f \n", c);
}
747は何か根本的にパーだから放置しる
レスのやり取りをみてると、721は何も悪くない。 730の方がスゲー感じ悪いよ。
753 :
デフォルトの名無しさん :04/09/18 15:55:41
>>749 いや、それでもいいのですが、それだと今までに作ったプログラムを結構書き換えなければ
ならないんですね。うーむ、うまい方法はないものでしょうか。
>>753 ならdouble**版とdouble版をオーバーロードしたらどうだ。
ただし周りを混乱させる諸刃の剣。
そういやvoid print_pointer2D(double c);なんて関数名と引数が合っていないな。
ますます混乱させる度合いが上がるぞ。
755 :
デフォルトの名無しさん :04/09/18 16:24:38
やっぱそれしかないですか。。 根性で今までのプログラム書き換えます。 どうもありがとうございました。
こういうのってリファクタリングツール使えば簡単に直せるんじゃないの? C++用ノリファクタリングツールがあるかどうかはしらんが。
>>731 これ,うちではうまく動きますよ.
環境はgccが3.3.4で,libstdc++はそれについてきてるやつかな?
Debian GNU/Linuxなもので,
gccとlibstdc++は別にパッケージしてあります.
パッケージのバージョン(リビジョン)は,
g++-3.3 3.3.4-6sarge1.2
libstdc++5 3.3.4-6sarge1.2
です.
gccでうまく動かないとおっしゃる731さんはどんな環境なのですか?
別方向から食いついてるな
>>757 とりあえずcygwinだと動かないよ。
でもcygwinはnewlibだったかな?
newlibはmingwか。
Rubydeすべてかいけつ。」 留byさいきょうげんご るびーーーーーーーーーーーー
間違えました、array[10]を指しているように見えるのですが、arrayは[10]で定義されているので最後尾が[9]までだと思うんです。 これって配列の最後尾より大きいところを指しているように見えるのですが。。
書き忘れました、何度もすみません。 このコードを実際に動かしてみるとしっかりとarray[9]を指していることが分かるのですが 最初に書いた例で行くと、point+1はhairetu[1]のアドレスを意味するのになぜこの場合はtmpint.array+10でarray[9]を意味するのでしょうか?
>>765 >この場合はtmpint.array+10でarray[9]を意味する
ここの理解が違います。tmpint.array+10はarray[10]のアドレスを指してます。
STLアルゴリズムの範囲の指定の仕方を調べて下さい。(答えは764。)
終了条件
質問の直後に出てる答えをスルーする質問者って多いな。
[ first, last ) これは高校数学を習ってないと分からないからな
>>770 高校数学じゃないって。大学の教養課程だ。
773 :
デフォルトの名無しさん :04/09/19 01:08:59
CSVファイルみたなテキストファイルからデータを読みたい時とか、
Cの標準ライブラリの場合はfgets()とsscanf()を使います。
C++の標準ライブラリの場合は行の読み込みではgetline()を使えますが
string型の文字列をカンマ単位で分けたい時なんかは
何か関数が用意されていたりしますでしょうか?
やっぱりsscanf()がよく使われているのでしょうか?
それとも1行の文字列からstringstreamを作り、get()で1文字ずつ読み込んで
区切り文字でないかどうか判定するループを組む処理のが一般に行われているのでしょうか?
例えばこのページの「文字列切り分け」のところのように。
http://cham.ne.jp/piro/p_cp.html
fscanfで正規表現のようなものが使えます ぐぐってみて
boost::tokenizer
776 :
デフォルトの名無しさん :04/09/19 01:16:12
BCB使ってるんでboostは使えません
777 :
デフォルトの名無しさん :04/09/19 01:16:39
777
>>776 boost::tokenizerは別に使えるようだが。
779 :
763 :04/09/19 01:20:58
レス遅れてすみません。 教えていただいた内容で調べてみることにします。 ありがとうございました。
780 :
763 :04/09/19 01:27:05
すみません、最後にどうしても気になったのでひとつ。 >>tmpint.array+10はarray[10]のアドレスを指してます 配列の最大を超える見たいですが、これに問題はないのでしょうか? もし問題がなければ配列の大きさなんて関係なしに[1]とか適当にやっておいて後から[2]とか適当に足していくことができるんですか?
>>780 > 配列の最大を超える見たいですが、これに問題はないのでしょうか?
int a[10]; と定義したら、読み書きして良いのは a[0] から a[9] まで。
ただし例外として &a[10]; (有効なアドレスの次のアドレス) は取得して OK。
もちろん a[10] を読み書きしたらアウト。
別にアドレスの取得自体は何を取得しても問題ないべ
783 :
763 :04/09/19 01:34:40
>>781 なるほど、そんな例外があったんですね。。
入門書をいろいろ読んできたのですが一度もそんな内容を見ていなかったのでわかりませんでした・・
となると、sortなどは1番目の引数に配列の先頭のアドレス、2番目に配列の最大より一つ大きいところのアドレスを指定する必要があるんですね。
boost の勉強にオススメな本って何かありますか?
>>782 規格上は &a[11] とかは未定義だよ。
ま、ふつーは問題ないけど 32bit アーキテクチャで &a[2ギガ] とかやると、
ポインタがオーバーフローして別の有効な変数のアドレスに一致したり
NULL と一致したりして泣くかも知れず。
>>772 は?
高校数学では、括弧に意味付けする記述は使わんだろ。
そうなの?私立だったから習ったのかな?
教科書には [, ] (, ) の説明はちゃんとしてある
高校では、「界」を抽象的には扱わんだろ。 わざわざ括弧での記述を教える意味がない。 扱うものが1次元の数値だけなので不等号で十分でしょが。 高校の教科書にホントに出てるの? あやしい。
>>791 あなたもしつこい人ですね
出てるったら出てるんです
数学の話は数学板でどうぞ
>>773 getlineではデリミタが指定できるんだが。
[]と()は開区間と閉区間の説明で、高校の教科書に出てくる。 ただ、説明だけが出てきてまったく使わないだけのこと。 少なくとも4年前には出てた。
797 :
773 :04/09/19 04:08:27
お答えありがとうございました。 getlineでデリミタ指定できるのは知りませんでした。 boostのtokenizerも知りませんでした。
C++相談室なのにCの話題書いてくる香具師大杉 生配列とか生charに関する質問はCスレでやれと言いたい
800 :
デフォルトの名無しさん :04/09/19 10:08:59
ちょっとお聞きしたいのですが… クラス x と、その派生クラス y があるとします。 また、これらのクラスを扱う DLL が 3 つあるとします。 ある DLL_A が、別の DLL_B に実装してある、y を new し x* で返す関数を呼び出し、 そのポインタを、別の DLL_C に実装してある、x* を引数に取る関数に渡した場合、 引数を受けた DLL_C は、x* を y* に dynamic_cast できますか? VC.NET で上記の DLL を作成したところ、うまくキャストできましたが、 違うコンパイラ/環境で作成した DLL だとまずいことになるでしょうか? DLL_A は x のヘッダのみインクルード、 DLL_B, DLL_C は x, y の実装されたライブラリをリンクしています。 DLL_A は、実行時に LoadLibrary で DLL_B, DLL_C を動的読み込みしています。
>>800 ABI,vtbl,RTTI,SEHの形式や使い方が違うコンパイラだったら
当然まずいんじゃないの?
>>799 「Cの」ではなく、CでもありC++でもある領域の問題だろが
CとC++の共通項はどちらでもいいし、C特有の問題はCスレ、C++特有の問題はC++スレで何の問題があるんだ?
C特有の問題でもC++的なアプローチを示せる可能性だってあるしねぇ
どっちでもいいじゃん
>>805 漏れもそう思う。
標準のC++クラスやboostを使うことにこだわるのとは意味がちがう。
C++的解決方法は他にもたくさんある。
template <class T> class DynamicPtr { public: T** data; UINT nInst; public: DynamicPtr(); ~DynamicPtr(); void Add(); //追加 }; template <class T> void DynamicPtr<T>::Add(){ nInst++; data = (T**)realloc( data, sizeof(T*)*nInst ); data[nInst-1] = new T; } DynamicPtr<MyData> dptr; Addメソッドで一つずつ動的に確保するクラス(コンストラクタ呼び出したいが為のダブルポインタ使用) なんですが、dataメンバを使う時、dptr.data[5]->メソッドてなるから 直接的にdptr[5]->メソッドていう風に手間を省きたい。 早く言えば、ATLの CComPtr<IDirect3DDevice> m_pd3dDevice みたいな事が実現したいです。m_pd3dDevice.data->メソッドとはなりませんよね。 変数名(dptr)そのものがT**になって欲しいという意味です。 長文ご免。
809 :
デフォルトの名無しさん :04/09/19 17:14:44
車輪をつくるな!!!
車輪がなきゃ走れないよ
811 :
デフォルトの名無しさん :04/09/19 17:17:11
走る必要なんてないよ
他人がどうこう言うこっちゃねぇ
きっとT* operator[](int)を定義するんだ
車輪の再発明は、プラモデル感覚が楽しいのは確かだ。 ただ、プラモデルを実務に導入するのはまずい。 実際に作って構造を理解するのには役立つが、それ以上のものであってはならない。
>>800 (例) MetrowerksCodeWarriorPro8.3forWinReleaseNotesより抜粋
* データメンバーを使う多重継承のクラスレイアウトはMSVCと完全互換ではありま
せん。異なるコンパイラでコンパイルされたモジュール間ではこの機能に使用し
てデータを共用することはしないでください。
こういうことがあるから、dll間でクラスのやり取りは基本的に無理だと考えておいた
ほうがよい。
>>808 メンバ関数にこれを追加
operator T**() {return data;}
Ruby >>>>>>>>>>>>> C++
ルビ厨が4年前からタイムスリップしてきたかのようだ。 懐かしいな。
boostっていつ標準C++に入るの? もう何個かは決まってるんでしょ? さっさとして欲しい
2009年くらい
>>820 あれは実は16進だから2015年までだったりして
16進だと何故2015年なんだろう…
0x ↓ 0x○ って事じゃないの?
ルビ厨が暴れてたころを知らんのだがどこみればいい?
0x9 == 9 のような気が
>>821 そもそも
0x1000
とかも出来るから何年にでも出来るんじゃないの?
2009ってlonghornよりも後じゃん…
日本語のページのみ検索するようにして次世代C++の呼び名でぐぐると 良く分かんないハングルのページばっかり引っかかるのはgoogleの嫌がらせか?
>>801 >>815 お答えいただきありがとうございました。
イベントクラスの、フレームワーク・外部モジュール間の受け渡しを考えていたんですが、
なかなか難しいようで…もうちょっと頭をひねってみます。
>>802 参考にさせていただきます。
>>831 thx. こりゃキッツー。勘違いルビ厨が暴れるのも分かるワ
833 :
デフォルトの名無しさん :04/09/19 23:34:13
Ruby>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++ ばーか。C++ユーザ死ねよ Ruby以外の言語は糞なんだよ。そんなことも分からないの?
SE「これからはRubyなんだ!Rubyの案件持ってきてくれよYO!」 営業「・・・」 課長「・・・」 部長「るびーって何だね?」 営業「おい、Rubyの案件なんてなかったぞ!」 SE「ちゃんと探してんのか?ゴルァ!!」 営業「それよりこっちのC++の見積り早く出してよ」 SE「・・・」 課長「プッ」 部長「るびーって何だね?」
簡単なsmtpクライアントを作ろうと思ったのですが日本語エンコードの問題に ぶち当たってしまいました。エンコード変換にはいろいろ方法があるようですが なんとか見慣れたstream系の書式のままエンコード変換→送信する方法はないでしょうか? コンパイラはminGW、socketのラッパーとしてgimite/socketというのを使ってます。
Rubydesubetekaiketu!
RubyではHTTPクライアントを作った事がありますが、 確かにC++に比べて全然簡単ですね(涙
>>835 そういうストリームクラス作ればいいじゃん。
いcおんv
iconvってcharベースじゃないですかw コレ使って内容書き換えるstreamクラス作るしかないのかなぁ なんかやろうとしてる事に対して大げさすぎる気が(汗 理想的にはiomanipみたいな感覚で stream << encode("Shift_JIS");ってできたらいいのになぁ。 誰か作ってないのかなぁ・・・。
レスありがとうございました。 よければ標準ライブラリで動的確保を行うクラス列挙してもらえませんか。みなさんがよく使われるモノ知りたいです
>>840 バッファに直接アクセスしにくいiostream系は応用面でオhル。
あまり当てにしないほうがいい。
いbm いcう
vectorクラスっての使ってみます。調べずに聞いてごめんなさい。
>>845 ぬお!まさに求めていたモノに近い(嬉
不安定そうな名前といやに多いマクロが心配ですが使ってみまつ。
ありがとう。
そいや昔BoostのMLで「コード変換ライブラリ欲しい」「iconvがあるじゃねぇか」「iconvはライセンス的にクソ」みたいなやりとりがあった気がするな。その後どうなったのか知らんが。
>>846 gimite/socketの作者も利用してるみたいだから
頼めば、gimite/socket に組み込んだモノを用意してくれかもしれんよ。
ライセンスが面倒なのでそこらへんは自作してるなぁ。>iconv
850 :
デフォルトの名無しさん :04/09/20 12:57:43
純粋仮想constメンバ関数は virtual void ConstFunction() const = 0; でいいのですか?
852 :
デフォルトの名無しさん :04/09/20 13:08:33
しらないならすなおにしりませんっていえよ 友達いねーだろw
Rubysaikyou!!!!!!!
854 :
デフォルトの名無しさん :04/09/20 13:17:57
ですねw
C++は最強──・ε・)・π・)・ι・)σ)・τ・)・η・)・μ・)・η・)──!!!
856 :
デフォルトの名無しさん :04/09/20 13:38:17
ですねw
>>850 const修飾の有無はどうでもいいことなのです
> virtual void ConstFunction() const = 0;
よろしい
ふと気になったのだけど、 draw_lineとdrawLine、アンダースコアでセパレートするのと小文字で始め大文字区切りにするのと、 C++ではどちらを好きな人が多いのかな?
Ruby <>>><<<<<<<<<<<<<<<<<<JMMMMMMMMMMMPOC+++++++++
関数や制御構造ローカル>draw_line それより大きいスコープ>DrawLine 3文字以下の名前>ABC どの名前も適さない一時変数>FILE* file/POINT point/int i/float f
862 :
デフォルトの名無しさん :04/09/20 22:09:54
俺はDrawLine派
>>859 Win32 系のプログラムだと API に合わせて DrawLine
でも STL や Boost だと draw_line
ま、何でも良いよ。
Win32系でboost使う場合は? ちなみに漏れは draw_line この方がなんか目に優しい感じがするから
質問なんですが、 void main() { } で、コンパイルエラーを出すのと出さないのでは何が違うのですか? エラーを出すコンパイラ gcc など gnu系(MinGWなど) エラーを出さず正常にコンパイルできるコンパイラ VisualStudio.Net 2003 Borland C++ compiler 5.5.1
ホントはdraw-lineと書きたい。
工エエェェ(´д`)ェェエエ工
draw_lineのほうがお肌に優しいと聞いた。
アンダースコアなーじっくりみないとスペースに見えてしまうんだよ。 アンダースコートならそれでいいんだけどなー。
>>866 mainエントリポイントの返り値にvoidが不正・・・だったはず
835です。 皆様のおかげでC++のstream書式で無事にsmtpクライアントを書くことができました。 babelはShift_JIS->iso-2022-jpへの直接変換ができないみたなので焦りましたがw。 また有名(?)なbare LF問題で小1時間悩んだり・・・ヘボくてすみません。 最後に質問させてください。 今ファイル添付の機能をつけようと思ってbase64変換ライブラリを探しているのですが、 gmite/socketやbabelと同様にstring or streamを操作するタイプのものを求めています。 cやPerlのものは結構見つかるのですが・・・良いのがあったら教えてください。お願いします。
>>874 それぐらいならその c や perl のヤツを元に自分で書き起こしてもいいんじゃない?
sf.net
boost::spirit が半端なく重いのですがどうしたらよいでしょうか
使わない
・CPUを速いのに変える ・CPUを増やす ・flex/bisonでがんばる
よろも何もboost::spiritが糞重いのは常識だと思うんだが。 サンプルコンパイルしてみりゃ分かる。 実用的な物を作りたいならflexとbison使うべき。
spiritとflex/bisonの組み合わせを比較したって意味ですよね? どれくらい差があったの? 若しくはどのサンプルが遅かったのか教えてください。
生成される実行ファイルも異様にでかいよね。spiritは。
まあspiritはc++の中で無理矢理完結させてるんだから、 外部ツールとして中で最適化でも完全ハッシュ生成でも 何でもやりほうだいのbisonやらyaccと比べるのはどうかと思うよ。
flexはC++に一応対応したけどbisonはC++未対応で、 bison++が全然更新されてないからなあ…
とりあえずnamespaceで包んでやればいいんでないの?
とりあえずやってみました。 test_files/Moments.cで100回平均して22ms (P3:800 VC7.1 Release) flex/bisonだと1msで収まるって感じなのかなぁ。
そもそもあれはflex/bisonがやる事の一部しかやってない
あれは->あのサンプルは
あれは.operator->(あのサンプルは)
ややCC? 結構C++って事か?
どちらかというとCC だろ
YayaCoshiya
cygwinのbisonをふつーにC++で使いまくってるんだが。 プレコンパイルヘッダが使えないのが微妙につらいが それ以外でなんか困ることある?
>889 これ(c_grammar.cpp)subrule使ってないですからね〜. subrule使ったときの改善度合いが知りたいですけれど・・・時間が無い. ていうか真剣にtypeof欲しいっ!ヽ(`Д´)ノ ウワァァン!!
class Final { private: Final(); //全てのコンストラクタをプライベートにする }; と宣言すると、Finalを継承したクラスを作ることは できなくなる、ということでいいんでしょうか?
書き忘れ。Final自体はfactory methodでコンストラクトできるという設定です。
902は900じゃなく901です。
なんでそうfinal使いたがるかな 仮想デストラクタを使わないだけじゃだめ?
違反しても文句言われない規則など意味ねーんだよ
それにしても継承禁止を明示する必要性ってのがわからん。
cppllに複雑な継承禁止パターンがあったと思う
>>906 この型は継承してはいけません、って書いておいても平気で継承して、
(例えばデストラクタが動作しないとかの)トラブルを引き起こす奴とかが
いるからじゃないか?
C(notC++)ライブラリの関数を可能な限りinline指定つきで再実装したいんだが 許されることなんだろうか?それとも無駄?
処理速度を上げたいんだったら、より上位のアルゴリズム最適化しる。 そんなことは既にやっていてプロセッサ固有命令を使いたいとかだったら 止めはしないけど、ただ単にコードをinline化するだけの小手先最適化だと コードサイズが増えて思ったほど性能向上しないけどね。 C++がろくに普及してない頃の話だけど、アセンブラとか持ち出してこっちの 命令のほうが数サイクル短いとか、フレーム作成コストが減るとかなんとか 言ってるやついたけど、ループの中で毎回無駄にやってたメモリアロケーションを 外に出しただけで性能が飛躍的に向上した、ってのがあったな。 今でも分岐予測の失敗とかキャッシュミスとかなんとか言うやついるけど、 いまどきのOS上では複数プロセスをビシバシ切り替えながら処理をまわしてる から、やっぱりいうほどの効果が出ないこと多いよ、ってこと、いいたいんだけどね。 まああれだ、 ほとんどの場合、小手先の最適化は捨てちゃっていいよ。 ほんとに遅い所がどこなのか計ってからチューニングをはじめような。
>>909 911 の人がいうようにあんまり意味無いと思います。
ちゃんとプロファイリングして、遅いところがメモリ沢山読むところなら
prefetch 入れるってくらいで十分では。
>>911 複数プロセスを切り替えているのは事実でも、
スライスタイム(20ms)間にどれだけの処理ができるんだろね。
411だけど、たしかにコンテキストスイッチの話は大げさだった。 安く見積もって1GHzでも、2000万サイクルくらいいけそうだな Netburstだと20段パイプラインだから、分岐予測のヒット率をρとすると 処理できる命令の数は2000万/((1-ρ)*20+ρ) P4のヒット率は大体95%だってうわさがあるから1000万命令くらい。 あとは、あれだ メモリのキャッシュミスのコストを差し引かなきゃいけないんだが 面倒になってきたので誰か続きよろしく。
90%という説も.. これだと690万命令/secくらい。
411じゃねえ、911だ。すれ違いなんで最後 パイプラインの分岐予測に失敗した場合、17段目までが破棄されるっぽいから 失敗した場合の無駄サイクル数が1+2+3+...+17で153 2000万/((1-ρ)*153+ρ)でヒット率90〜95%だと、120万〜230万命令/スライスタイムくらい。 やっぱこれでも結構な命令数いくのな。 ごめん
分岐予測のヒット率命令数/タイムスライスヒット率0.9に対する命令数の数 0.900 1,234,567.90 1.00 0.905 1,295,336.79 1.05 0.910 1,362,397.82 1.10 0.915 1,436,781.61 1.16 0.920 1,519,756.84 1.23 0.925 1,612,903.23 1.31 0.930 1,718,213.06 1.39 0.935 1,838,235.29 1.49 0.940 1,976,284.58 1.60 0.945 2,136,752.14 1.73 0.950 2,325,581.40 1.88 0.955 2,551,020.41 2.07 0.960 2,824,858.76 2.29 0.965 3,164,556.96 2.56 0.970 3,597,122.30 2.91 0.975 4,166,666.67 3.38 0.980 4,950,495.05 4.01 0.985 6,097,560.98 4.94 0.990 7,936,507.94 6.43 0.995 11,363,636.36 9.20 1.000 20,000,000.00 16.20 チューニングしてないときの分岐予測ヒット率を90%とすると、 チューニングした場合95%くらいで1.9倍、 カリカリチューニングして97%くらいで2.9倍かな。 でも100%->16倍はありえないだろ。 カリカリしたその先のチューニングの重みは非常に大きい。
結局fainalになってるんですか?
×fainal ○final
920 :
デフォルトの名無しさん :04/09/23 02:38:28
921 :
デフォルトの名無しさん :04/09/23 10:46:18
質問です。 inline関数を定義・使用しているa.h、a.cppがあるとします。 inline void ResetData( void ); inline unsigned short GetOrg( void ); inline unsigned short GetPls( void ); こんな感じでa.hでプロトタイプ宣言してそれ以外は省略。 a.cppでの↑の関数の内容は値を返すだけの内容です。 このインライン関数をb.cppで使いたいのですがGetPls()と記述して 呼び出そうとしたのですができませんでした。 インラインをとったら使えましたがインラインをつければ使えません。 どなたか助けてください。
>>921 inline の定義は .h に書かなきゃダメ。
ヘッダファイルに実装を書いてください。
かぶり具合が秒単位でわかるからおもろいなぁ。9秒か・・・。
925 :
デフォルトの名無しさん :04/09/23 11:27:40
インラインの定義って inline void ResetData( void ); inline unsigned short GetOrg( void ); inline unsigned short GetPls( void ); ですよね。 これは.hで記述しております。 その内容を.cppに書いてます。
inline unsigned short GetPls( void ) { // 内容 } ヘッダにこう書けつーこと
927 :
デフォルトの名無しさん :04/09/23 11:54:49
誠にありがとうございました。
>>925 既に遅いけど一応書いておきますね。
そいつは定義ではなくて宣言です。定義と宣言の区別をしっかりつけておかないと
C++の高い本を買っても正しく読めません。
C++でJAVAのパッケージの機能をエミュレートするにはどうすればいいですか?
良く分かんないけどnamespaceじゃ駄目なの?
931 :
デフォルトの名無しさん :04/09/24 18:03:08
今、C++勉強してるんですが、2次元(多次元)配列の扱い方がよく分からいので質問させてください 例えば、 class Sample { int x[2][3]; public: Sample(); // コンストラクタ (x[2][3]に初期値を代入する) ○○ GetSampleData(); // xへのポインタを返却する関数 }; ○○ Sample::GetsampleData() { return △△; // xへのポインタを返したい } 他のクラスでx[2][3]の値を使いたいのでGetSampleData関数を呼び出してxへのポインタを取得したいのですが、○○と△△の所をどう書いたらいいんでしょうか? xがprivateなので無理ですか?
const int (*GetSampleData())[3];
>>931 #include <iostream>
class Sample
{
int x[2][3];
public:
Sample(int y = 0); // コンストラクタ (x[2][3]に初期値を代入する)
int (*GetSampleData())[3];// xへのポインタを返却する関数
};
Sample::Sample(int y) {
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
x[i][j] = y;
}
int (*Sample::GetSampleData())[3]
{
return x; // xへのポインタを返したい
}
int main()
{
Sample s(1);
std::cout << s.GetSampleData()[0][0] << std::endl;
}
C++のクラスの学習初めには、意図的にthisを書いて勉強してみるのも いいかもしれない。 クラスでまず最初に引っかかるのはthisポインタだから。
>>935 初心者じゃなくても使うでしょ、this。
VC環境なら、this->を使うとインテリセンスが機能してくれるし。
同じ名前の関数がグローバルとクラスにある場合の混乱防止になるし、読みやすさが増す。
>934 いっそのこと構造体のメンバにしてしまうとか typedef struct { int x[2][3]; } SHoge; class CSample { SHoge m_hoge; SHoge* GetSampleData(); }; SHoge* CSample::GetSampleData() { return &m_hoge; }
>>936 そーゆー理由で this を書く人のことを「初心者」と呼ぶのでは?
クラス内のメンバ関数からメンバポインタを通して他のメンバ関数(非static)を呼び出すには ~~~~~~~~~~~~~~~~~~~~~~~ thisは省略できないっしょ。
942 :
デフォルトの名無しさん :04/09/24 19:13:31
>>938 それ分かりやすいです
とりあえず今回は構造体にしてプログラム作って見ます。
それか int (*)[2][3] を typedef するかだね。 Cの知識があればできるはず。後は暗黙のthisポインタとクラス名の修飾(Sample::) を忘れなければいい。
>>939 初心者専用だとは思わないのだが、釣りか?
保守性・明示性を犠牲にして他人の解析作業を妨害するのが上級者
という定義をもっているのであれば、正しいのかもしれないけど。
>同じ名前の関数がグローバルとクラスにある場合の混乱防止になるし、 これで混乱するほどの無知を棚に上げて読みやすさとかほざく居直り粘着されたチームに未来はない
たまに居るよな、2chで高尚な玄人ぶった無意味なこと主張する人(w
PMや同僚から煙たがられて干されたか、チームに居づらくんだろうな・・・。
>>946 は、そういうタイプの典型かもしれない。
初心者の人が途中で開発に加わるかもしれないことを想定できないチームに未来はないでしょ。
プログラミングが技巧よりむしろ力仕事であり対人関係の大事な仕事だと理解できずに、美学に酔いしれる人は負け組。
改めた方が良いと思われるが、本人がいい年してるので実社会では誰も指摘しない・できない。
C++を始めようと思ったのですが、参考書紹介サイトの解説によると 何の知識もない状態の人向けのC++入門書は、大体わかりやすいが 所々適切でない記述があるもの (コンパイルでエラーが出ますが問題ありませんと書いてあったり等) や誤字・誤植がいつまでたっても訂正されないものなど ちょっと問題がある本ばかりのようなのですが 問題なさそうな本でCから始め、Cの知識がある人用のC++本で C++にいくのはかなり遠回りになるでしょうか? 遠回りになっても、それなりに利点があるならそうしようかと思うのですが アドバイスをお願いします。
Cやってからの方がいいと思うけどな。 つか何の知識もないのなら、オライリーの「実践Cプログラミング」でも一冊買って読んでみたら。
950 :
デフォルトの名無しさん :04/09/24 20:35:55
いまからC++を覚える必要はないんじゃない? 正直言ってC++は古いよ C#にでもしとけ
>>947 ホープと癌の境は居直り
誰に見やすく書くのかさえ聞く耳を持たない反逆分子はもはや仲間じゃない
そんなのが稼げてない間食わせてやるなんざ論外中の論外
C++ Primerでいいんじゃない?
>>951 そうですね。同感です。気心の知れた仲間とだけ仕事してて下さい。
>>948 日本語能力を鍛えなおすのが近道だと思う。
ルールを統一するのは重要だが、初心者にあわせて作るのは何か違うだろ。
this->を使ってはいけないというルールも this->を使わなければいけないというルールも変。 針のメドを通すような俺様ルールを他人に押し付けるのは頂けない。
だから、いやなら出てけって 誰も止めないよ
this ってどうしてポインタなんだろう。 どうせ T* const で代入できないんだから、参照にすればよかったのに。 this->hoge より this.hoge のほうが見やすいし、 operator = とかで return this; と書けるし。 大したことじゃないと言われればそうなんだが。
大したことじゃない
>>960 確かthisが作られた頃の初期のC++にはまだ参照がなかったと思う。
#define this. this->
継承のデフォルトってどうして private なんだろう よく使うふつうの継承が public 継承で 変わった継承をしているところこそ明示的に書くべきなのに・・・ メソッドのデフォルトってどうして非 const なんだろう 許可は意図的に狙い打ちで与えるのが OOP の作法なのに・・・
>よく使うふつうの継承が public 継承で こんな事書いてるから継承厨って言われんだよ
>>966 じゃ勝手に private 継承しまくってろ
あ? protected 継承だったか??
どっちでもいいんだよ
ネズミがチューチュー喚いても関係ねえんだよ
失せろ汚物
ケツメド=けつのあな=肛門 なんだぞ。 知ってかおまえら?
971 :
デフォルトの名無しさん :04/09/25 03:10:08
針孔と書いてメドと読む。針の穴という意味。 針の針孔と書いてハリノメドと読む。針の針の穴という意味。 頭痛と書いてズツウと読む。頭の痛みという意味。 頭の頭痛と書いてアタマノズツウと読む。頭の頭の痛みという意味。
Factory Method と Abstract Factory の違いがよく分からないのですが…
Abstract FactoryはFactory Methodを集めたやつだ。
>>973 やっぱそれだけですか?
GoF本読んでて「Factory Method が増えただけ??」って思ったんで…
デザパタは Decorator が一番感動したなあ
感動と言うか Multicastが一番好きだ。
977 :
デフォルトの名無しさん :04/09/25 16:31:08
デザパタなんていうやつで本当に理解できている奴はいない
>>977 また脊髄反射レスかよ・・・・みっともないぜ
いつもの流れだな
>>978 脊髄反射でレスできるヒトはいません (プ
?(゚Д゚≡゚Д゚)? エ、オレ?
>>986 ここは馬鹿の集まりのインターネッツですね。
987 :
デフォルトの名無しさん :04/09/25 23:24:55
保護部ってどういう意味なんでしょうか?
STL周りは明らかにオブジェクト指向というより 関数型プログラミングの臭いがする。 そのへんのカオスつーかハイブリッド具合がC++っぽいんだろうけど。
カオス? 意味わかってんのかな? 多分覚えたの単語を使ってみただけだろうけど・・・
「勝利の方程式」みたいなもんでしょ。
>>990 お前にとっては、たかがカオスがずいぶん難解な単語なんだな。
ま、大方勝手に「物理学用語としてのカオス」あたりに限定しちゃってるって
とこだろうけど。
>>989 それは意図的なものだよ。
iostream系が惨い状況になってるのがわかるだろ?
あの反省にたってると思う。
オブジェクト指向にする・しないはユーザの自由裁量。
995 :
デフォルトの名無しさん :04/09/26 06:45:40
>>992 カオスが物理学に出てくるのは物理現象としてではないぞ
もうちょっと勉強しろよ
次スレがない
__ __ __ __ __ __ __ ∠__∠__∠__∠_.∠_../ | __∠__∠__∠l__ ∠__∠__∠__∠__∠__/| | ∠__∠__∠__∠__/.|_ . ∠__∠__∠__∠_.∠_./| |/| ∠__∠__∠__/ /| |/| . / / ./ / / /! |/| | | / / /| ̄ ̄| |/| | | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄| |/ |/| |_| ̄ ̄| ̄ ̄| |__|/| |/| __ _| |__|__|__|__|/| ̄ ̄| | ∠__|__|__l/ /| |/| | . / / | ̄ ̄| |_|/| | | |__|/| | | | | ̄ ̄| |/| |/ | ̄ ̄| ̄ .| |/| | | |__|/| | | |__|__|__|__|/| |/| . ___|__|__.| ̄ ̄| |_|/ | | |__|/ | | | | | |/| | . / / / | |/|. |__|/| .|__|__|__|__|/| |/ | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄| |. | | | .|_| | | |__|/ |__|__|__|__|/ |__|/ |__|__|/
>>995 お前一人でなにピント外れなレス書いてるんだ?w
1000鳥に行きます。
1000ゲト
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。