C++相談室 part35

このエントリーをはてなブックマークに追加
1v(^・^)v
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
テンプレートライブラリ(STL含む)に関する質問は
専用の別スレにお願いッス。

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり
2v(^・^)v:04/08/31 22:17
3v(^・^)v:04/08/31 22:17
4v(^・^)v:04/08/31 22:18
■基本■
[C++ FAQ]
 http://www.parashift.com/c++-faq-lite/
 http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****

[禿 Stroustrup]
 http://www.research.att.com/~bs/
[C++ International Standard]
 http://www.kuzbass.ru/docs/isocpp/
 http://www.kuzbass.ru/docs/ansi_iso_iec_14882_1998.pdf
 http://www.iso.org/iso/en/CatalogueDetailPage.CatalogueDetail?CSNUMBER=38110&ICS1=35&ICS2=60&ICS3=
[JTC1/SC22/WG21 - C++]
 http://std.dkuug.dk/jtc1/sc22/wg21/

[C/C++ Users Journal]
 http://www.cuj.com/
[cppll (ML)]
 http://www.trickpalace.net/cppll/ (日本語)
5v(^・^)v:04/08/31 22:18
6v(^・^)v:04/08/31 22:19
7v(^・^)v:04/08/31 22:19
■関連スレ■
【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/
C/C++の宿題を片づけ作戦指令 30代目
http://pc5.2ch.net/test/read.cgi/tech/1091954342/
C/C++でのWindowsPrograming議論スレ(質問お断り)
http://pc5.2ch.net/test/read.cgi/tech/1049790146/
managed C++ やろうぜ!!
http://pc5.2ch.net/test/read.cgi/tech/1014486422/
ATL 相談室
http://pc5.2ch.net/test/read.cgi/tech/1029029882/
COM の世界を斬る!
http://pc5.2ch.net/test/read.cgi/tech/981823340/
WTLお勉強スレッド
http://pc5.2ch.net/test/read.cgi/tech/1078150663/
■コンパイラスレ■
タダで最強!フリーC/C++コンパイラ
http://pc5.2ch.net/test/read.cgi/tech/1035882599/(html化待ち)
GCCについて part3
http://pc5.2ch.net/test/read.cgi/tech/1072484422/
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
タダで使えるBorland C++ Part3
http://pc5.2ch.net/test/read.cgi/tech/1054390397/
OpenWatcom C++
http://pc5.2ch.net/test/read.cgi/tech/1033433728/
"Code of the Nerds" Digital Mars C/C++
http://pc5.2ch.net/test/read.cgi/tech/1044210976/
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part13
http://pc5.2ch.net/test/read.cgi/tech/1089011118/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/

↓以下、お決まりのアレどうぞ。
10デフォルトの名無しさん:04/08/31 22:24
続きはろうか
11v(^・^)v:04/08/31 22:25
■開発環境スレ■
★初心者にVisual C++を教えるスレ★ Part14
http://pc5.2ch.net/test/read.cgi/tech/1093672937/
■MFC相談室 mfc11.dll■
http://pc5.2ch.net/test/read.cgi/tech/1088084875/
C++Builder相談室 Part10
http://pc5.2ch.net/test/read.cgi/tech/1089299158/
Borland C++ BuilderX
http://pc5.2ch.net/test/read.cgi/tech/1065260556/
12v(^・^)v:04/08/31 22:25
STLつかうと一気に実行ファイルサイズが10倍に?!
131,11:04/08/31 22:25
遅れた_| ̄|○
14v(^・^)v:04/08/31 22:26
>>12
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
15v(^・^)v:04/08/31 22:26
>>14
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
スマン。最新のスレじゃなかった。_| ̄|○

カコログカラ ソノママ モッテキチャッタヨ…
17v(^・^)v:04/08/31 22:27
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
18v(^・^)v:04/08/31 22:27
>>17
#include <stdafx.h>

後死ね。
>>18
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
20デフォルトの名無しさん:04/08/31 22:30
完了だな
>>20
つまり

     ∧∧     _ ドスッ
     (   ,,)┌─┴┴─┐
    /   つ.  終  了 │
  〜′ /´ └─┬┬─┘
   ∪ ∪      ││ 
            ゛゛'゛'゛
                   ということだな?
22デフォルトの名無しさん:04/09/01 05:23
どっちが本家?
行列計算用のライブラリで計算速度が速く使いやすいおすすめのものがあれば
紹介していただけないでしょうか?
24前スレより:04/09/01 09:18
996 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/31 20:08
 namespaceってウンコだよね。
 ライブラリ作ってる香具師がバカだとglobal namespaceになんでも詰め込みやがるから、
 こっちで
 namespace UnkoLib
 {
  #include <library.h>
 }
 とかやってもうまく動かないし。


1000 名前: デフォルトの名無しさん [sage] 投稿日: 04/08/31 21:05
 >>996
 その場合ライブラリ作ってる香具師がウンコだよ。
>>23
これも新しい地鎮祭の儀式?
>>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;

野生の勘ですが、もっと最適化出来るような気がしてなりません。
どうでしょうか?
3332:04/09/01 10:50
不等号が逆でした、失礼しました。
>>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を使ってよいかと。
>>40
なんでfabs()使うの?
4240:04/09/01 12:18
>>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最強かと。
たぶん何も考えずに書いたコードの方がコンパイラも最適化しやすいのだろう。
そんな結果になるわきゃないと思うけどな…
4536:04/09/01 12:28
>>42
確かに遅くなった。
FPUとALUのレジスタが違うから、メモリアクセスが頻発してるんだね。
>>40
CPUによっても違うんじゃないか?
P4系の浮動小数点ユニットはやたらとストールするからなぁ。
ちゅうか>>40のテスト内容ってどういうこと?
Athlon64とかでやってくれない誰か?Intelは一次キャッシュのポートが一つ
しかなく同時に読み書きできないしFPUは貧弱だしで公平な比較ができん。
と言ってもデファクト・スタンダードがIntelというなら構わんけど。
>>47
少し変だよね
5040,42:04/09/01 12:33
>>44>>46
当方の環境は、WinXP Pen4-3.0GHz HTオン。
VC6.0なので>>46の指摘が、気になるちゃぁ気になる。
VC++Toolkitあるけど、やる気なし。スマソ。
5132:04/09/01 12:35
お答えありがとうございます!
>>32が最強なんて意外です。つーか超勉強になりました。

>>40
fabsは確か組み込み関数の最適化フラグがありましたよね、
また&&と&の違いも気になりますね。
>>48
x86系+VC6が条件なら変わらないだろ
こういう簡単な比較が一番CPUのアーキテクチャによる差が出るんだよな。
俺もP4とAthlon系で随分と傾向が違うのを嫌ほど見てきた。
5440,42:04/09/01 12:45
>>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
>>36fabs  0.813
>>36FABS 0.812

なんか、FABSマクロの挙動が可笑しい(x,y,z=1.25)。調べる気ゼロ。
間違ってるとかない?

【結果】
>>32は最下位転落。残念。
5540,42:04/09/01 12:49
&&連結なので、xだけ判定して、残りy,zを判定せずに処理したことが原因でしょう。
>>52さん、ぬか喜びさせてすみませんでした。藁って許してね。
56デフォルトの名無しさん:04/09/01 12:53
>>54
君の環境で最下位だからといって(ry
5755: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がよっぽど偏ってない限り、小細工はいらないと思うけどね…。
6040,42:04/09/01 13:07
>>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マクロも正常稼動。
もう勘弁して下さい。(涙
6140,42:04/09/01 13:18
今度こそ、ファイナル!
>>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
6340,42:04/09/01 13:28
>>62
もう止めたから安心してくれ。>>59がFAかな。
6432:04/09/01 13:28
>>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
>>62
死ね
相変わらず不等号が逆だな
6732:04/09/01 13:34
>>64は間違ってます・・信用しないで下さい・・
逝ってきます失礼しました・・
6840,42:04/09/01 13:37
無駄に疲れた。
このアフォな労力は一体・・・。

>>65
漏れは、素直に>>62に謝りたい。関係ない人には不快だったかも。

>>66
漏れは、不等号をちゃんと修正してやってますた。
>>65
お前が氏ね
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
エラーメッセージ読め。
それでわかんなかったらエラーメッセージ貼れ。
9389:04/09/02 01:11
>>91さんの方法で動きましたが,
>>90さんの方法も後で試してみたいと思います.
ありがとうございました.
9490:04/09/02 02:01
>>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;
}
9796:04/09/02 03:39
>>96 のプログラムでは (#1a) のように関数を引数として計算し、
(#1b) では 30.0 という望みの出力が得られます。

これをクラス中の関数にも適用できるようにしたいのですが、
単純に (#2a) のようにやったのでは
not maches converting function 'm' to type 'double (&)(double)'
というエラーが出ます。
これをクラス内で定義された関数を引数としても動くようにする方法をご教授ください。

なお、コンパイラは g++ 2.95 です。
9896:04/09/02 03:40
失礼、(#1b) で得られる出力は 15.0 です。
(#2b) で得たい出力が 30.0 です。
すみません。
>>97
あなたのいう「クラスの中の関数」をC++ではメンバ関数と言う。
まず、メンバ関数への参照という型は存在しない。
でもメンバ関数へのポインタという型がある。
で、メンバ関数へのポインタは非メンバ関数へのポインタとはだいぶ扱いが違う。
ttp://www.google.co.jp/search?q=%E3%83%A1%E3%83%B3%E3%83%90%E9%96%A2%E6%95%B0+%E9%96%A2%E6%95%B0%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF
10096:04/09/02 11:23
>>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は通るとしても.
10296:04/09/02 12:17
>>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]) こう?
105103:04/09/02 21:19
>>104
即レスどうもです。今は帰宅してプログラム出来る環境にないので
明日さっそく試してみます。
>>104
intだと0x80とかが0xffffff80みたいにされなかったっけ?
つまり
for(int i = 0;i<3;i++) cout<<"0x"<<hex<<(hexcode[i]&0xFF)<<" ";
にしろってことだな。
108104:04/09/02 22:06
そうでしたね。iomanip で出力幅を調整するとか
してみてください>>103
109デフォルトの名無しさん:04/09/02 22:29
STL専用の別スレってどこですか。
自己定義のallocatorについて質問してもいい?
ここかな
【C++】template 統合スレ -- Part5
http://pc5.2ch.net/test/read.cgi/tech/1091522597/
111103:04/09/02 22:40
>>104-108
皆さん、有難う御座います。自分なりにそこそこ勉強したつもり
だったんですが基本的な部分の知識が欠落してました。出力
出力マニュピュレータにつて詳しく勉強してみます。
C++のcharは文字っぽい
113103:04/09/03 13:58
昨日は有難う御座いました。本日試したところ無事に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
そうだよ。
オブジェクトのシリアライズ。
>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<<() が
呼び出されてしまうからです。
124 :04/09/03 15:45
>>121
ありがとうございました!!
勉強になりました
ビットマップの画素を扱う構造体としてRGBQUADというBYTEデータが4つのデータ型を定義します。
しかし構造体なので画素の加算などRGB別に3行コーディングしなければなりません。

そこでクラスにしてオペレーターを定義しました。
ところがこのクラス、リリース版でも遅いのです。約1.3倍ぐらい時間がかかります。
オペレーターの記述はごく普通のものです。開発環境は最新のVisualStudioですが、こんなに
はっきり遅くなるものなのでしょうか?
>>125
インライン関数にしてみたら?
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のほうで質問したほうがいいみたいですね。
>>138
どっちみち回答者は同じだ罠。
にもかかわらず
場所を変えると流れも変わるのが不思議なところ
141デフォルトの名無しさん:04/09/03 19:55
int型で1−10までの数字だけ入力でき、それ以外の数や文字では、「不正な数が入力された」
と表示されるようにしたいんですけど
142デフォルトの名無しさん:04/09/03 20:00
そういう質問をするとCスレ誘導厨がわくからやめて。
>>141
if文の使い方わかってれば出来るだろう
printf( "1−10までの数字以外をいれたら自爆する" );
C++ スレに書いたって事は、そういうクラスの作り方を知りたいってことか?
>>141
ここでもお読みなさい。
http://www.kumei.ne.jp/c_lang/cpp/cpp_66.htm
何はともあれ、>>133は勇者
>>89
HogeClass *myhoge;

HogeClass **myhoge;
149デフォルトの名無しさん:04/09/04 23:41
C++をはじめようと思って、ボーランドのフリーのコンパイラを
インストールしたのですが、うまくコンパイルできません。

コマンドプロンプトで bcc32 hello.cpp(hello.cppはコンパイルしたいファイル名)
と入力すると、'bcc32'は、内部コマンドまたは〜〜として認識されていません。
というエラーがでます。

コンパイラをマイドキュメントにフォルダを作ってそこにインストールしたのですが
それがダメだったんでしょうか?
ソースファイルもマイドキュメントに別フォルダを作ってそこに入れています。

アドバイスお願いします。
>>149
タダで使えるBorland C++ Part4
http://pc5.2ch.net/test/read.cgi/tech/1091066805/
151498:04/09/04 23:51
板違いでしたか・・・・

向こうで聞いてきますね。
失礼しました。
つーかパス通ってねーだけだろ…
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
なるほど、意味論上のチェックでもって弾かれるけど、
実際には呼び出されないということですね。
うーんややこしい。
ありがとうございました。
>>160-161
なるほど・・・
164デフォルトの名無しさん:04/09/05 15:51
>>160-161
なるほど・・・
>>163-164
・・・ザ・ワールド
そして時は動き出す
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++ だと非グローバルスコープの構造体・クラスはテンプレート引数に渡せないっつー
制約があるから、他のソースコードとの名前重複を無視したければ無名名前空間に
入れるのが安全だよね。
176173:04/09/06 00:36
なるほどね。
グローバルスコープを持つように見せかけつつ
名前重複を避けたい時に特に有効なのか。
ありがトン。
Cのモジュールローカルなstaticと同じように無名名前空間を使うのは常識でしょ
>>177
前スレ795-の話が少し気になる。
気にしてもしょうがないんだろうけど。
>>175
構造体やtypedefを無名名前空間に入れても意味無くないか?

これらは関数と違って名前が外部に出ないだろ?
void hoge()
{
int i = 0; // <----(a)
{
int i = 1;
// ここで(a)のiにアクセスしたい
}
}

内側のスコープで::iと書くとグローバルのiを探しに行ってしまいます。
上記のようなことは出来ないのでしょうか?
つまんねー釣りだなおい
こういうあまりにくだらないのは放置しましょうねみなさん。
183180:04/09/06 13:37
>>181-182
真面目に訊いているのですが…
C++始めたばかりなのですが、変な質問なのでしょうか?
日本語書けてる奴がこんな知障がするような質問するかよ
グローバル・・・・
186180:04/09/06 13:52
>>181-182
なんとなく言いたいことがわかりました。
変数名を変えればいいじゃん、ってことですかね?
そうではなく>>180のような状況でも何かアクセスする手段があるのかなと疑問に思ったのです。
こいつよりチンパンジーがC++習った方が上達早そうだな
>>186
基礎からやり直した方が速いよ。もうこのスレに来んな。
こういう構ってチャンは放置が一番有効なんだよ
190180:04/09/06 14:35
真面目に答えてくれる方がいないようなので他のところで訊いてみます…
>>190
どこで聞いても同じだと思うが。
192180:04/09/06 14:39
>>191
そうですか…
自分は何を勘違いしてるのでしょうか?
それすらわかりません…
180は悪くないな。答えてるやつがたまたまドキュソなだけ。
結論から言うと、180が求めてるような機能はC++にはないな。
>>192
>>180の内容を100回声に出して読んでみな。
>>193
君も勘違いしてる。
スタックのないマシンのコンパイラだったら自動変数もヒープに確保するでしょ。
コンパイラの拡張機能でiにアクセスできるかもよ。
>>196
君も勘違いしてる。
何が勘違いなんだか。180も変なの絡まれて運が悪かったな。
まあ答えは一言、「残念ながらそんな機能はありません」で終わりなのは確かだが。
199180:04/09/06 14:55
>>193
そうですか。無いとわかったのですっきりしました。
無いからといって困るわけではありませんが、気になって仕方が無かったので質問しました。
ありがとうございました。
>>197
どう勘違いなの?
自動変数とはhoge、もしくはそこからコールされた関数に
制御があるあいだだけ存続するというのは、仕様ですか?
>>201
仕様です。
勘違い言うぐらいなら言語の厳密な仕様ぐらいわかってるんだよな。
はよ、教えれ。
スレの流れが速いと思ったら、知障が沸いてたのか
>>202
どこに書いてあんの?
だから*問題通りの*プログラム書いて質問しろよ。
いっとくが変数領域の存続期間と言語機能としてのスコープは別だからな
>>205
どこって、もちろん仕様書に書いてあるはずと思うぞ。
どうでもいいけど180の問題は解決しただろ。
これ以上何がやりたいんだ?
180を非難したいのか?
210デフォルトの名無しさん:04/09/06 15:04
>>208
だから、あれは仕様書じゃないってば。
>>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
213212:04/09/06 15:11
ってごめん俺も良く読んでなかった、ちゃんと分かってるね
それじゃ煽ってる奴は、どこに突っかかってるんだ…
180の頭の悪さ
>>212
あーあネタばらしちゃった。まあいいや。
ところでローカル変数とグローバル変数を区別したければ、グローバル変数を
名前空間に入れておけばよい。
頭の良さ
180>>>>>>つっかかってるやつ>215
>>216
もうええっちゅーのに。
↓流れを変える一言
ぬるぽ
↓気を取り直してもう一言
>>215
ローカル変数は同名の変数によって完全に隠蔽されてしまうから
それは無理。
>>221はスルーの方向でもう一言
えんがちょ
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をつける場合とつけない場合って
どういう違いがあるのでしょうか?
>>228
コンパイル通らねえだろソレ
メンバ変数に _ をサフィクスに使ってる人ってグローバルは何使ってます?
やっぱり g_ のプリフィクス?
プリフィックスとサフィックスなら,互いに干渉しないじゃん。
>>231
漏れはメンバ変数には prefix に _ を使っています。
グローバル変数は使ったことありません。
定数なら全部大文字にしてるけど。

それより、クラス変数 (っていうんだっけ?) には
何を使えばいいんですか?(static Class::xxx)
自分で決めろ
234デフォルトの名無しさん:04/09/06 23:41
>>232
m_*****
を使うのが普通では?
_を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をサポートしないのですか?
ギャルゲーはギャルゲー板で
241240:04/09/07 03:18
で、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
>>249
隠れていて気が付かないだけでは?
istream::readでバイナリデータを読み書きするときにエンディアンを考慮して並べ替えないとだめですよね
これは自前で並べ替えるのが常なんでしょうか?
read( void*, size, ios::big_endian )みたいなのはないのかな?
用意されているのに自分で作るのもなんあので
エンディアンを理解してない質問に
見えるのは気のせい?
>>252
253に同意だが、とりあえず答えてやる。
「ない」
MFCでコーディングしているとどうしてもドキュメントクラスに処理が集中してしまうのだが
どうしたらいいのだろうか。処理の意味的にビュークラスやアプリクラスには入れられない。
こういうものなのだろうか?
>>253,254
家のインテルマシンでリトルエンディアン仕様のファイルを読み込もうとしたのです。
上位桁から順番に並んでるデータを。
バイト列を読み込んでそのままキャストしたらだめなんですよね?
あれ?どういうふうに理解していないと思われたのでしょうか?

>「ない」
どうもです
リトルとビッグが逆でした↑
258252=256=257:04/09/07 11:33
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 );
の方が自然かと。

いずれにしても無いけど。
260252:04/09/07 12:26
>>259
テンプレート使ってそんな感じにしておきました。どうも
261デフォルトの名無しさん:04/09/07 16:52
例えば
char型の変数を定義する場合
char* pszABC = new char[10];
char szDEF[10];
とnewをつける場合とつけない場合って
どういう違いがあるのでしょうか?
262デフォルトの名無しさん:04/09/07 16:54
>>261
解放されるタイミングと型
>>261
下のサイズは常数のみ
264デフォルトの名無しさん:04/09/07 16:57
>>262
そこらへん、もうちょっと詳しくお願いします。
char* pszABC = new char[10];
と宣言したpszABCは
delete pszABC;
しないとメモリーリークを起こしてしまいますよね?
char szDEF[10];
と宣言したszDEFは、特にメモリー解放しなくてもいいですよね。
なんで?
どちらも、メモリー上にchar型10桁分の領域は確保してはいるんですよね?
>>264
キーワード
スタック ヒープ
遅レス失礼

>235
>_をprefixにするのは良くないらしいよ。システムが予約してるんだそうな。
これは半分本当で半分間違い.予約されてる名前の規則は実はちょっと複雑.

>まあ、GoFがこれやっちゃってる悪しき例なんだが。
GoFの名前の付け方は規格には違反してないと思います.
それを覚えるのが面倒だから_のプリフィクスを避けるべきなのでは?
>267
ですね.細かいことにこだわりすぎました.失礼.
>>252
炎ディ案が問題になるならバイナリで読み書きすることが間違い。
>>264
キーワードは規格に出てくる言葉にしたほうがいいかも。
自動変数 動的確保
>>235
先頭の_は、非グローバルでその次に大文字がこなければ使っても良い。
__と2連続で_が出てくる名前は使用不可。
>>270
既存のファイルフォーマットでエンディアン指定されたバイナリのフォーマットって沢山あるし・・・
そういうの読みたいときもあるじゃん。
273272:04/09/07 19:39
>>269 の間違いでしたゴメンナサイ!!
>>271
なんと、その程度なんだ

使っていこうかなぁ…m_は好かないので
何も付けずにやってたけど、評判悪いし
>>264
char* pszABC = new char[10];と宣言したpszABCはdelete pszABC;
とすると未定義の振る舞い。delete[] pszABC;とせねば何が起きるか
分からない。
後ろにつければそんな事を知らない人でも自由に使える
前につけるのは混乱を呼ばないか?
>>276
禿に文句いえYO
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++で認識可能なあらゆるシンボルが使えなくなってしまうし。
316313:04/09/08 01:09
>>314
いやさ、そいつは判らない訳じゃあないんですが、どんな仕掛けになってるのかって処がよく判らないんでさ。
普通にCで書くならポインタとサイズを渡さないといけないわけで、それを巧いことやっつけてるってぇことは想像つくんですがね。
サイズの変わりに終了位置を渡してるじゃん
>>315
そうやっていちいち避けるのが面倒だから使わないようにするという話だろ。
実際問題、それ以外であまりに迷惑な#defineのされ方はしない。
>>316
val + 1でサイズ分移動するだろ。
319313:04/09/08 01:40
>317の話でピンと来たんで調べてみたら、reinterpret_castってぇのはCのキャストと考えてもよさそうだってことですな。
つまりendian()の中身は
reverse((char *) &val, (char *) (&val + 1));
って感じだと。これで終了位置がわたるってぇことは、この場合のtemplateは<>で括らなくてもきちんと型情報が伝わってるってことですかい。
なにやら巧い仕組みですなぁ。
いやほんとにC++は面白いもんですな。てめぇで書くのはちょっとばっかし難儀しそうですがね。

>>314>>317>>318
いやぁ、忝い。
ん?別にC++じゃなくたって、何の型のポインタかわかっていれば、
val+1でポインタのアドレスはサイズ分移動するだろ。

templateは<>でくくらなくてもってのは意味不明。
templateで型情報がコンパイル時に伝わってるというのは
ある意味正しいかもしれないが。
ま、この流れを見てもまだアンダースコアから始まる変数名つける奴は、
ぶっちゃけ「揉め事を起こしたい」だけだな。
よっぽどの使用価値を提示できない限りは。
ところで「名前_ 」派の人は構造体のフィールドも
「名前_ 」としますか。
俺はしない。
324313:04/09/08 01:55
>>320
いやほら、vectorなんてぇのは<>で型を括るじゃあないですか。
なんとなくそんなイメージがあったんで、endian(foo.bar)だけで型が判るのかと思ったわけですよ。
>>321
関数名は?

そういやシンボル名といえば、昔 end ってシンボルを定義してハマったことがあるな。
その処理系だと、リンカが end ってシンボル予約してやがって、特定のタイミングで
メモリを壊すプログラムになってしまったという。(後で _end に変わってたけど)
>>324
クラステンプレートは型必須、関数テンプレートは引数から推測可能なら
型は省略できる。
>>324
まあそんな感じ。
コンパイラはendian(foo.bar)が使われているのを見ると、double用のendianが
使われているのがわかるから、double用のendianのコードを生成できる。
これ以上情報要らないだろ?
>>326
おっと合点承知の介。重ね重ね痛み入ります。
329313:04/09/08 02:06
おっと、>>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す
>>335
さらに詳しくありがとうございます
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)) になるわけだけど、
このうちのどこが「省略」できる?無理じゃない?
342340:04/09/08 09:26
>>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=のオーバーライドは必要になるのでしょうか?

意味はわからないが、コードを見る限り要らない。
代入演算子の宣言が無く、基底クラスと各メンバの代入演算子が有効な場合は
それらを使ってデフォルトの代入演算子が定義される。
344340:04/09/08 09:50
>>343
了解しました。
いろいろありがとうございました。
クラス関連の質問なのですが、コンストラクタの宣言に戻り値の型が含まれているとなり、コンパイルをすることができません。
書籍に載っているコードで、正誤表を確かめたのですが正誤表には載っておらず困っています。
使用しているソフトはVC++6.0です。

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_32/code.txt
>>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 の補助クラスとかなら別だけど。
>>347
Win32API質問箱 Build22
http://pc5.2ch.net/test/read.cgi/tech/1092524669/
 ↑
こっちで訊いた方がいいよ。ちなみに当該 API は、
現在の状態なら GetCursorPos, GetAsyncKeyState、
現在処理中のウィンドウメッセージが発生した時点の状態なら GetMessagePos, GetKeyState
>>351
レスありがとうございます
GetCursorPos, GetAsyncKeyStateについて調べてみます
353345:04/09/08 16:59
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_33/code.txt
上のコードのメインのfor文でなぜか画面に文字が表示されず困っています。
コンパイルは通るもの、どこが間違っているのか教えていただけないでしょうか。
>>353
forの条件式をよく見ろ。
355345:04/09/08 17:11
>>354
気づきました。。
久しくforをつかってなかったのでこんなミスもわからなかった・・orz
スンマセン
>>355
質問には関係ないことだけど、コメントの書き方が良くない。
インデントもおかしいし。const int& にする意図も良く分からない。
int = 64bit
pointer = 32bit
環境でパフォーマンスの問題が出にくいようにするためだろう。
逆のケースの方が多いけど
やーまいったまいった。

昨日は動的にメモリを確保しているクラスに
自前 operator= を定義していなかったせいで
プログラムが変なところで止まって6時間悩んだし、
今日は外部から渡されたインスタンスを
リファレンスで保持していたせいで
たまたま生成元のインスタンスが
自分より逝ってしまう状況になった途端
プログラムが止まっちゃって3時間悩みました。

明日は何事もなければいいなぁ。。。

そうだ、今ならまだ _ を prefix から suffix にできる
チャンスかも知れない。来週前半に置き換えよっと。
正規表現使えばすぐ出来るような気が。
絶対余計なものまで壊す
361本日の藁:04/09/09 06:46
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;
}
しばらく考え込んでしまった・・・
362マイク ◆yrBrqfF1Ew :04/09/09 07:40
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
>>377
なるほど、勉強になります。
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しなきゃなのですが、
こういうのってそのままやっちゃって良いんですかねぇ。

フラグメンテーションが気になる、元ゲーム系…。
実際にやってみて問題があるならプールなり考えればよかろう
>>387
そう思うならプールしろよ。
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++標準で表現できる
基本型に直してから出直せ。
なにローカル変数の参照返してんだ
>>392
プッ
>>390
>(2)ここで引数内のバッファが消滅されてる
                      ~~~~~~~~~
まともな日本語が話せるようになってからうpちまちょうね〜坊や( ´,_ゝ`)プッ
あ〜なんか窓達ムカついてきた
397390:04/09/10 01:13
あっ、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を意識しろって
>>401
まさにそれですた orz
>>402
>あとよくよく考えたらoperator=は戻り値必要ないですね

cA = cB = cC; みたいな事をしないならばな。
>>405
それだけではない。度々済まないが
Effective C++ 15項
「operator=を書くときは、*thisへのリファレンスを返そう」

(a = b) = c; のような、実用上意味がなさそうだが文法に違反していない文を
正しく実行できるようにするためだとか。

>>403
そうなんだが一度に言うと混乱しそうだったから。
407390:04/09/10 03:03
operator=()は参照返しでいいんですか。それなら戻り値付けた方がいいですね。

const ですが、ずいぶん前にconstをつけようとしていた時期がありましたが
メソッドを呼び出せなくなってそれ以来constを付けるのを控えていたのですが
宣言の末尾に付ければ呼び出せることを今更ながら知ったので、これからはconstを
付けていくことが出来そうです
>>407
じゃなくて〜。const付けたのと付けないのの両方が厳密に言えば必要なのよ。
でも今の質問の流れから行ってそこまで説明する必要はないと思ったわけよ。
それと mutable についてもついでに調べておいてね。
>>407よ、↓ここで修行してこい。

【C++】 const だけでメシが3杯食えちゃうスレ
http://pc5.2ch.net/test/read.cgi/tech/1078193971/
operator=のconstは普通戻り値だけだ。
mutableは関係ない。
411マイク ◆yrBrqfF1Ew :04/09/10 07:20
>A(A& cTarget){ m_pcBuff=new char[1000]; strcpy(m_pcBuff, cTarget.m_pcBuff); }

boundary-checkはどうした?
>>390
関係ないけど
#define UNICODE
されるとやばいんじゃないか
413381:04/09/10 09:04
>>382
>>383
すれ違いみたいなので他で聞いてきます
ありがとうございました
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 関数しか入ってません。
419デフォルトの名無しさん:04/09/10 22:37:45
staticメンバ関数しかないならclassにするな阿呆。
>>419
えー、普通の手法だと思ってたんですけど。
C++ではそういうことはしないんですか。。。

ほんじゃあクラスから出して代わりに
独自のnamespaceに入れるってのが
C++流の正しい解法なのでしょうか。

使いたいファイルでは using HogeHoge とすると。
421デフォルトの名無しさん:04/09/10 22:41:59
>>417
間違いなくDQN。継承じゃなく包含を使え。

>>419
標準にもstaticしかメンバがないstd::numeric_limits<>という
classがあるわけだが。
422デフォルトの名無しさん:04/09/10 22:45:32
>>421
たぶんstd::numeric_limits<>は引数としてやりとりできるようにclassになっているんだと思う。
423デフォルトの名無しさん:04/09/10 22:45:34
>>419
char_traits
424デフォルトの名無しさん:04/09/10 22:45:57
それテンプレートクラスじゃん
425デフォルトの名無しさん:04/09/10 22:50:59
>>424
テンプレートクラスがクラスでないと言うなら419の主張と符合するが・・・
426デフォルトの名無しさん:04/09/10 22:54:05
>>422 はぁ?
427デフォルトの名無しさん:04/09/10 22:54:10
テンプレートクラスじゃなくて、クラステンプレート
428デフォルトの名無しさん:04/09/10 23:02:16
クラステンプレートの具現
皆さんご回答ありがとうございます。

>>421
>間違いなくDQN。継承じゃなく包含を使え。
包含っていうのは今回の場合はどういうことを指すのか
よく分からないのですが、

UhiClass {
// コンストラクタ等省略

 static fetchValue((
  const HogeInstance & instance,
  const String & key,
  String & value)
 {
  HogeHogeClass::fetchValue(instance, key, value);
 }
};

としろ、ということでしょうか? 勘違いしていたらごめんなさい。
430デフォルトの名無しさん:04/09/10 23:57:28
>>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デフォルトの名無しさん:04/09/11 00:00:47
>>431 解放されますよ。
433431:04/09/11 00:05:30
>>432
どうもありがとうございます。
もうひとつよろしいでしょうか。
jは確保したメモリの先頭のアドレスだけ指しているのに、
100個連続して確保しているという情報はどこにあるのですか?
434デフォルトの名無しさん:04/09/11 00:06:16
確保したメモリの先頭のアドレスの手前
435431:04/09/11 00:10:06
>>434
長年の謎が解けました。ありがとうございます。
436デフォルトの名無しさん:04/09/11 00:51:30
operator new[]やoperator delete[]をオーバーロードして
使ってる好例ってないでしょうか?
今の自分の知識では「触らぬ神に祟りなし」という感じがして使えていないので。
437デフォルトの名無しさん:04/09/11 00:56:46
>>434-435
おいおい…
438433=431:04/09/11 01:04:09
>>437
あれ、違うのですか?
439デフォルトの名無しさん:04/09/11 01:17:41
>>438
14882:2003(1998でも良いが)のどこにそんな事が書いてある?
440433=431:04/09/11 01:19:46
それでは、私が抱いていた疑問の答えはどうなるのでしょうか?
441デフォルトの名無しさん:04/09/11 01:21:22
>>436
あれは、テンプレートコンテナ開発者のためのデバッグインターフェイスにすぎない。
コンテナを「使う」側の人間が触る必要はない。
442デフォルトの名無しさん:04/09/11 01:22:36
>>440
知るかヴォケェ、が正解。処理系作る人間でない限り知ったこっちゃないし、そうなら好きにすればいい
443デフォルトの名無しさん:04/09/11 01:36:53
>>440
確保した順にサイズをスタックへ突っ込んで突っ込んで突っ込みまくる。
444440:04/09/11 02:42:33
>>442
分かりました、とりあえずメモリの解放は
暗黙のうちにできてしまうと言うことですね。

>>443
順番に突っ込んで行ったら順不同でメモリ解放するとき
どうなってしまうのでしょうか。
445デフォルトの名無しさん:04/09/11 02:58:53
実装に依存する
実装の一例として>>434の様なものもあり
だがそれに依存するコードを書くのはお勧めしない
446440:04/09/11 03:08:30
>>445
それではとりあえずイメージとして
>>434のように考えておけば安心できそうなので、
自分の中ではそれで納得してみます。
あくまでイメージなので
それに依存するようなことはしませんが。
447デフォルトの名無しさん:04/09/11 03:23:29
>>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では
どうも他の手段でサイズをストアしているようだ。これだけからは何とも言えないが、
少なくともこの機能に依存したプログラムは移植性がない事だけはわかる。
448デフォルトの名無しさん:04/09/11 03:25:15
あ、悪い
×delete p;
○delete[] p;
449デフォルトの名無しさん:04/09/11 03:40:59
そのサイズって実行時にわかる必要なくない?
むしろ、BCCのように実行時にまで値をストアしてる処理系があったことの方が驚き。
450デフォルトの名無しさん:04/09/11 03:48:13
まぁこのコードの場合は必要無いかもしれん。
451440=446=431:04/09/11 04:16:13
int i,*p;
std::cin>>i;
p=new int[i];
のようにしたときは実行時にも
どこかに確保したサイズ情報があることになると思うのですが。
それがどこにあるか分かれば、
メモリ解放するとき半分だけ解放のような
奇妙なことができるわけですか?
452デフォルトの名無しさん:04/09/11 04:32:41
早速試す。
#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に整数出力すると
どうしても桁区切り文字がでちゃうんだけど
出さないようにするにはどうすればいい?
454デフォルトの名無しさん:04/09/11 08:04:04
>>453
面白い処理系だな。それともロケールの問題か?
455デフォルトの名無しさん:04/09/11 08:06:59
std::use_facetでctype_base::punctをマスクするとか。
456デフォルトの名無しさん:04/09/11 09:02:17
>>454
なるほどーとか思って
std::locale::global( std::locale("") );
したらとりあえず消えました。thx
処理系はVC6+STLportなんだけど...
どっかでロケール変更されてるのかしら

>>455
はははイミワカンネorz
勉強してきまふ
457デフォルトの名無しさん:04/09/11 10:25:00
>>456
STLportだと

std::cout.imbue(std::locale("En_US"));

でカンマが付くようになるな。どっかで指定されてない?それともデフォルトの
ロケールがおかしくなっているの鴨。
458デフォルトの名無しさん:04/09/11 12:02:55
C++オブジェクトのマーシャリングってチマチマやるしかないんでしょうか?
459デフォルトの名無しさん:04/09/11 12:37:02
>>458
ない。

特定のフレームワークに依存して良いなら、もう少し楽できることもある。
MFC 使うとか。

環境絞り込んで書いてみ?
460387:04/09/11 17:33:17
>>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字だけ読み込んでくれる仕様だと
勉強した記憶があるのですがそのサイトがどこだったか忘れてしまい
自分の記憶にも自信がありませんで、ここに頼らせてもらうことにしてしまいました。

すいませんがよろしくお願いします。
462デフォルトの名無しさん:04/09/11 23:02:24
std::stringとstd::getlineを使え。
463デフォルトの名無しさん:04/09/11 23:37:00
>>461
getlineは指定した長さ以上のバッファには書き込まない。
464デフォルトの名無しさん:04/09/11 23:43:34
>>461
それだとgetlineが読み込むのは49字。
そして行末に達する前に限度まで読み込むと i.fail()==true;になる。

これ以上は自分で調べなさい。
というか、ちゃんとした入門書なりリファレンスなりを手元においとかな
勉強にならんだろ。
465461:04/09/11 23:54:50
すいません、やっぱりケチらずに本を買うことにします
どうもありがとうございました。。
466デフォルトの名無しさん:04/09/11 23:59:19
標準C++のstream周りはなぜあんなに複雑になってしまったのだろうか。
467デフォルトの名無しさん:04/09/12 00:48:42
>>466
きっと作った本人たちも「や、やっちまった」と、後悔してると思います。
468デフォルトの名無しさん:04/09/12 02:10:17
>>467
どうかね? あれを作ること自体が C++ の試運転であって、目的は果たせたんじゃないか?
良い結果も悪い結果もすべて C++ の仕様について検討するためのデータになればいいんであって、
その残りかすそのまま ISO 標準にされたのは禿にとってゴミを拾った奴らに勝手に献上されて恥をかいたって図式だと思うぞ。
俺に言わせれば言語仕様とライブラリが同一の規格になっていることこそ( ゚д゚)ハァ?な状況だ。
469デフォルトの名無しさん:04/09/12 02:22:55
演算子のオーバーロードでこんなに凄い事が出来る事を示したかったが
失敗した。
470デフォルトの名無しさん:04/09/12 02:34:40
そこでlexcal_castですよ
471名無しさん@Vim%Chalice:04/09/12 02:47:40
spirit か xpressive じゃね?
472458:04/09/12 03:08:14
>>459
サンクス、なんかオープンなフレームワークあればな〜と思ったんですが、ちまちまやります。
473デフォルトの名無しさん:04/09/12 15:28:40
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]の方の最小値を全て入れ替えて、削除するっていうやり方を
しようと思いました。他に良い方法があったら、その方法も教えていただければ嬉しいです。
若輩者ですが、ご指導お願いします。
475デフォルトの名無しさん:04/09/12 16:08:31
>>474
エラーメッセージを読め。

それから、「コメントアウト」というのはコードの一部をコメントにすることだ。
476デフォルトの名無しさん:04/09/12 16:08:54
>>474
- const char* pName;
+ char* pName;

- *pName = pNode->pName;
+ pName = pNode->pName;

477474:04/09/12 16:38:02
すみません。考えてみたんですが、わかりませんでした。。。
どうしたらいいのか、教えてもらえないでしょうか?
478デフォルトの名無しさん:04/09/12 16:41:48
>>477
エラーメッセージ見てわかんないなら入門書から読み直しが必要だな。
479474:04/09/12 16:43:54
はい。そうします。
480デフォルトの名無しさん:04/09/12 16:46:19
>>473
その場合コピーコンストラクタじゃなくて、代入演算子をvirtualじゃまいか
481デフォルトの名無しさん:04/09/12 16:47:48
C++についてなのですが、ofstreamでcinでユーザーがタイプした文字列を
テキストファイルに出力して、そのファイルをもう一度読み込み別の
テキストファイルに出力するにはどうしたらよいでしょうか?
482デフォルトの名無しさん:04/09/12 17:20:34
>>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));
}
483デフォルトの名無しさん:04/09/12 17:26:34
>>482
f1.clear()って必要あったっけ?
EOFまで読むとエラーフラグ立ちっぱなしになるのは知っているが・・・
484デフォルトの名無しさん:04/09/12 17:31:58
>>483
いらなかったな。rewind()の感覚で書いてるもんでつい…
485デフォルトの名無しさん:04/09/12 17:36:22
>>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();
}
486デフォルトの名無しさん:04/09/12 17:36:44
続き


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);


487デフォルトの名無しさん:04/09/12 17:37:30
続き

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みたいに形を整えてもう一度別なファイル名で出力したいんです。
申し訳ないのですがもう一度アドバイスお願いできますか?

488デフォルトの名無しさん:04/09/12 17:43:58
>>487
ofstream out("ファイル名");
として、coutの代わりにoutを使えば良い。
489デフォルトの名無しさん:04/09/12 17:49:30
>>482
#include <iterator> が抜けてる。
copy + streambuf_iterator より、 operator<< + rdbuf() のほうがよくない?
490デフォルトの名無しさん:04/09/12 17:53:29
>>488
その場合ofstream out("ファイル名");は出力ですよね?読み込みはどうすればよいのですか?
contact.txt から report.txtというファイルに出力したいのですが、その場合読み込みはどこら辺に
どうやって書けばいいですか?度々質問して申し訳ないですがお願いします。
491デフォルトの名無しさん:04/09/12 18:11:39
>>489
確かにそうだ。

>>490
>>485-487の出力部分だけcoutからofstreamに書き換えればいいだろ。
492デフォルトの名無しさん:04/09/12 18:24:57
>>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ってのはわかって、コンパイルできたんですけど、
ビルトすると、途中でエラー終了してしまいます。
あの、今回はマジで教えてもらえないでしょうか?
494492:04/09/12 19:19:44
すでにあったcontact.txtを削除したら動きました!!
>>482 >>483 >>484 >>488 >>489 >>490
アドバイス本当に感謝です!!
あと一回に表示する件数を4件にしたいのですが
どうやったらいいでしょう?
495492:04/09/12 19:21:27
訂正
>>485-487の一覧をディスプレイするプログラムです。
出力する方ではないです。
496デフォルトの名無しさん:04/09/12 19:34:58
>>493
無理です。
497デフォルトの名無しさん:04/09/12 20:15:16
えっと、それなら諦めます。
質問なんですが、ハッシュ法で、二分探索木を使うよりも、双方向リストで挿入法を使うほうが早いですか?
それとも、遅いですか?
498デフォルトの名無しさん:04/09/12 21:06:46
>>497
だから挿入のほうが気持ちいいから!

終了!
499デフォルトの名無しさん:04/09/12 21:29:23
挿入してからがあんまり早いとダメだな
500デフォルトの名無しさん:04/09/12 21:30:57
挿入はすんなり、挿入してからはゆっくり。
501デフォルトの名無しさん:04/09/12 21:39:35
VC++なんですが、販売終了しています。
どうやって学習したらいいのでしょうか?
502デフォルトの名無しさん:04/09/12 21:43:15
>>501
VC++.Net 2003買え。VC++バージョン7相当だ。
503デフォルトの名無しさん:04/09/12 21:49:01
>>501
Visual C++ Toolkit 2003使え。タダでVC++.NET2003Pro以上だ
504デフォルトの名無しさん:04/09/12 22:56:14
newやmallocで確保した領域ってabortで強制終了された場合でもプログラム終了と同時に解放されるんでしょうか?
505デフォルトの名無しさん:04/09/12 23:29:31
>>504
OSによる。
506デフォルトの名無しさん:04/09/12 23:43:15
メモリ保護機能のないOSなんてッ!!
507デフォルトの名無しさん:04/09/12 23:56:14
>>505
Win32 とか UNIX 使ってれば間違いないやね。

ただしデストラクタは呼ばれないから、共有メモリとか一時ファイルの類は
消えない可能性アリ。注意。
508デフォルトの名無しさん:04/09/13 01:00:55
>>506-507
スレ違い
509デフォルトの名無しさん:04/09/13 01:08:20
びっくりするほどリソースリーク
びっくりするほどリソースリーク
510デフォルトの名無しさん:04/09/13 01:10:18
あっとおどろくギャロップダイナ
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重になっちゃいました。
514デフォルトの名無しさん:04/09/13 01:21:13
その質問はC++と関係ない
515虎夫:04/09/13 01:25:34
ヴィジュアルCつかってます。
書き忘れてました。
516デフォルトの名無しさん:04/09/13 01:27:53
517デフォルトの名無しさん:04/09/13 09:37:49
boost/preprocessor/stringize.hppを見てて疑問に思ったのですが

#

と先頭に#だけの行があります。
コメントみたいになにも効果はないみたいですが
コンパイラにはどう解釈されているのでしょうか?
518デフォルトの名無しさん:04/09/13 09:58:13
>>515
割り込み?ドライバ作ってるんなら
http://pc5.2ch.net/test/read.cgi/tech/1063453024/l50
あたりで、アプリケーションでやろうとしているのなら
http://pc5.2ch.net/test/read.cgi/tech/1037636153/l50
あたりでどうぞ。
519デフォルトの名無しさん:04/09/13 12:55:52
>>517
#の次にnew-line文字が来ていればその行は読み飛ばされる。
520517:04/09/14 14:12:09
>>519
遅くなりましたがありがとう。
521521:04/09/14 20:57:17
今やっているプロジェクト用に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レスほど続きます。)
522521:04/09/14 20:58:22
現状のプログラム (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);
}
523デフォルトの名無しさん:04/09/14 20:58:48

       ヽ(・ω・)/   今だ!ヨガテレポート!!
      \(.\ ノ
      ,,、
524521:04/09/14 21:00:18
内部ではさらに
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 部分を分ければいいのではと思うのですが、
どういう風に分ければいいのかあまりいいアイディアが浮かびません。
525521:04/09/14 21:02:37
とりあえず 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では操作や構造が異なります。

このあたりうまく抽象化、パターンの適用等はできないか考えているのですが、
なかなか解決できません。皆さんならどうされますか?
アイディアや適用できるパターン等をご教示ください。よろしくお願いします。
526デフォルトの名無しさん:04/09/14 21:15:01
漏れなら生成ルールを記述する適当な中間言語を用いるけど。
あるいは XSLT で C 寄りの文法の XML に直して、そこから C へ、と2段階で。
527デフォルトの名無しさん:04/09/14 21:24:50
>>521
cppll にでも逝ってみれ。
あそこの管理人がむしゃぶりつきそうなネタだ。

ひょっとして、ネタ的に >>521 自身があそこの管理人か?
528521:04/09/14 21:35:01
ご回答ありがとうございます。

>>526
>生成ルールを記述する適当な中間言語
といいますと、たとえば……?
何かキーワードをいただければ調べてみます。

>XSLT で C 寄りの文法の XML に直して、そこから C へ、と2段階で
あまり汎用的になりすぎてしまっても時間的に厳しいような気がします。
現段階ではXMLで定義するのはデータが中心なので
比較的簡単にあらかじめ決めた枠内のC++コードに落とせるのですが。。
それとももしかしてそういう汎用ツールがどこかに転がっていたりしますか?

>>527
情報ありがとうございます。
GoogleしてMLの紹介ページを見てきたのですが、
ライブラリ関係のMLみたいでしたが。。。
επιστημηさんの名前は聞いたことはあります。
529デフォルトの名無しさん:04/09/14 21:49:42
>>528
あのMLはスタンス的にはこのスレとほぼ同一だから、あそこで聞いてみれ。
ネタ的にほぼ確実にあそこ管理人が相談にのってくれるから。
530521:04/09/14 21:56:24
>>529
MLなんて三年くらい参加してないし、恥ずかしいなぁ。。。
でも、これからメールアドレスを取得してML入会してきます。
あちらで質問することを決心したらここに書きますので、
それまでの間に何かアドバイスやアイディア等ありましたら
こちらへレスをいただければ幸いです。よろしくお願いします。
531521:04/09/14 22:38:58
おし、それでは勇気を出して
http://www.freeml.com/ctrl/html/MLInfoForm/[email protected]
で質問してきます。皆様、ありがとうございました。
532デフォルトの名無しさん:04/09/14 22:42:33
>>531
たまにはこっちにも帰ってくるんだよ。
533デフォルトの名無しさん:04/09/14 23:02:54
コンストラクタの初期化子でnewしてもいいんですか?
534デフォルトの名無しさん:04/09/14 23:06:40
>>533
いいよ。
535デフォルトの名無しさん:04/09/14 23:11:32
ええかー ええのんかー
536533:04/09/14 23:11:46
>>534
thx!
537デフォルトの名無しさん:04/09/14 23:13:01
>>535
まずいの?
538デフォルトの名無しさん:04/09/14 23:18:18

class Test
{
public:

Test(void) : test_(new Test) {};

virtual ~Test(void) {};

private:

Test * test_;
}
539533:04/09/14 23:26:05
>>538
???
普通にintとかをnewするのならOKですよね?
例外うんぬんはおいておいて
540デフォルトの名無しさん:04/09/14 23:26:40
DOS攻撃だ!!!
541デフォルトの名無しさん:04/09/14 23:35:22
>>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;
 }
}
542533:04/09/14 23:48:42
>>541
なぜ?
foo x;でも結局 new foo が呼ばれて同じことじゃないの?
543533:04/09/14 23:52:26
VC6で試したらどっちも例外おきましたよ???
544デフォルトの名無しさん:04/09/14 23:54:56
コンストラクタに失敗したときのクリーンアップを安全に行いたいなら
スマートポインタにしたほうが良い。
545デフォルトの名無しさん:04/09/15 00:00:59
class A {
private:
 Obj* p;
public:
 A() try :
  p(new Obj) // ←例外が起きる
 { }
 catch(...) {} // ←握りつぶす
}
546デフォルトの名無しさん:04/09/15 00:17:17
>>545
握りつぶした後、そのAのインスタンスはもはや生存期間を
過ぎていることに注意しなければならない。だから、一切
触ってはいけない。一応書いておくが。
547デフォルトの名無しさん:04/09/15 00:19:47
×catch(...) {} // ←握りつぶす
○catch(...) {} // ←握りつぶせない(暗黙のthrowが末尾につく)
548デフォルトの名無しさん:04/09/15 00:31:43
>>545
コンパイル通らん
549デフォルトの名無しさん:04/09/15 00:39:56
>>548
VC6使うな
550デフォルトの名無しさん:04/09/15 00:47:11
>>549
BCC5.5.1なんですけど・・・・
551デフォルトの名無しさん:04/09/15 00:54:15
>>548
gcc3.4.1なら通るね。>>545ってC++の文法に準拠しているのか?
552デフォルトの名無しさん:04/09/15 00:56:03
準拠してるよ。
VC7.1だと通るよ。
BCCはショボイから通らないかもね。
553デフォルトの名無しさん:04/09/15 00:58:05
>>552
ああ確かにVC7.1だと通った。switch文のcaseをまたぐブロックを入れるような感覚か。
ちなみにBCC5.6.4でも通らん。糞だなBCCは。
554521:04/09/15 00:59:10
例のML、返事が来始めましたが……

むずいよう(;;)
555デフォルトの名無しさん:04/09/15 01:01:22
warota

あそこはオナニーMLだから、
C++の構文やいろんなライブラリを駆使した難解な答えがいくつも返ってくる。
その中から自分にあったものを拾うのがいいよ。
556デフォルトの名無しさん:04/09/15 01:03:40
>>542
VC7.1でやったけど、例外起きませんでしたけどねぇ…。。。
ひょっとして最適化が働いたかな?

>>554
''例のML'' はレベル高いですからねぇー。
557デフォルトの名無しさん:04/09/15 01:10:37
>>556
自分で自分を作る無限連鎖って最適化で消されるもんなの?
558デフォルトの名無しさん:04/09/15 01:10:52
>>550
さっさとBCCなんて捨ててvctk拾ってこいよ
タダで使えるVisual C++ $2
http://pc5.2ch.net/test/read.cgi/tech/1086287039/
559デフォルトの名無しさん:04/09/15 01:15:09
>>558
無理です。BCB6使ってますから。
でもVC7.1もあるので文法はVC7.1もしくはgcc3.4.1(MinGW)で試しまつ。
#MinGW早くgcc3.4.2出してくれ〜。
560デフォルトの名無しさん:04/09/15 01:21:32
bcb6のbcc32は5.5.1じゃなくて5.6.xだろ?
5.5.1なんていうからフリーのBCC使ってると思ったんだよ
561デフォルトの名無しさん:04/09/15 01:22:49
3.4系のgccなんてバグだらけのモノよく使えるな。
562デフォルトの名無しさん:04/09/15 01:23:30
ここは標準スレですコンパイラ比較スレではありませんコンパイラの比較は
【初心者歓迎】C/C++室 Ver.9【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1094494997/
でどうぞ
563デフォルトの名無しさん:04/09/15 01:26:29
関数tryブロックは標準の話です、コンパイラ依存の機能ではありません
564デフォルトの名無しさん:04/09/15 01:33:45
>>560
5.5.1にBCPad組み合わせたものとBCC5.6.4(BCB6)の両方使ってます。
BCB6を立ち上げるのが面倒だったのでBCC5.5.1使いました。でも
BCC5.6.4使っても全く同じ結果でした。
>>561
まあそうですがgccは仕事には使ってないので。
>>562>>563
スマソ。本当に文法に違反していると勘違いしたもので。私が悪かったです。
565デフォルトの名無しさん:04/09/15 02:33:13
そんなにコンパイラに依存する文法なら代替コードを考えたほうがいいのではないだろうか。
566デフォルトの名無しさん:04/09/15 02:36:53
>>565
俺は素直にauto_ptr使ってる。
567デフォルトの名無しさん:04/09/15 08:18:44
std::list<Hoge*> hoge;

voif foo( const std::list<const Hoge*> & );
な関数にそのまま渡すことはできないのでしょうか?
fooではHogeのconst付きの関数しか呼べないようにしたいのですが。
568デフォルトの名無しさん:04/09/15 08:28:05
>>567はスルーでよろ。
自環境での結果をろくに書かないのはただの荒らし。
569デフォルトの名無しさん:04/09/15 08:39:23
そういう"解説"が必要であると判断する程度には
「ただの荒らしではない」と考えているわけですね? :-P
570デフォルトの名無しさん:04/09/15 08:55:09
>>567
型が違うからできないな。
どうせコンパイラもそう言ってるだろ。

解決策は、あまり簡単なのは思いつかないなぁ。
reinterpret_cast で動くんだろうけど、それじゃダメだろうし。
571デフォルトの名無しさん:04/09/15 08:55:30
>>569
ただの荒らしだと考えてるからこそスルーを要請したわけだが。
const付で呼びたい?なら勝手に呼べ。ってこった。
572デフォルトの名無しさん:04/09/15 09:43:46
std::list<Hoge*>::const_iteratorを使って呼ぶべきだなこの場合
573デフォルトの名無しさん:04/09/15 09:50:15
>>571
> ただの荒らしだと考えてる
本当にそう思っているなら、何も書かずにいればいいわけです。
要請などと言いつつ、いきなり自分自身が「スルーできてない人」になる必要は
まったく無い :-P

つまり、荒らしだと考えたというより、自分の美学(くすくす)に反する内容だったので
「これを皆が荒らしと見なす流れが欲しかった」だけでしょう。
でも実際のところは荒らしというほどではないので、放っておいたら
他の人はそう考えない。ちゃんと回答してしまう可能性が高い。それは嫌だ。
だからわざわざ「こういう風に荒らしなんですよ」と、蛇足感丸出しな"解説"なんぞをして、
「自分に乗っかる人を募った」わけですね。全然ダメだったようですが ;-)
574デフォルトの名無しさん:04/09/15 10:18:24
デバッグ時にassertを使うのはよくやりますが、これだとassertが埋め込まれた
個所の呼び出し元までは特定できませんよね。
それでassertを呼ぶ代わりに例外を発生させるようにしてデバッグしてるのですが
これはやらないほうがいいんでしょうか?

後に本当に発生すべき例外だと分かって、かつ戻り値の変更が難しい場合は
正規のコードとして残す事も考えてます。
575デフォルトの名無しさん:04/09/15 10:27:04
>>574
環境依存だけどVCなら_ASSERTでファイル名と行番号が出る。
576デフォルトの名無しさん:04/09/15 10:43:55
自動変数よりstatic変数の方が速いの?
577マイク ◆yrBrqfF1Ew :04/09/15 10:51:24
早いよ。
578デフォルトの名無しさん:04/09/15 11:13:41
嫌、遅い。
自動変数はほぼ確実にキャッシュに載ることが期待できるし。
579 ◆FIcNi4f8js :04/09/15 13:58:00
>>575
そういう話じゃなくて、呼び出し元を知りたいんだから
スタックトレースとかしなきゃ駄目でしょ?
580デフォルトの名無しさん:04/09/15 14:12:26
>>575
assertを上書きして、お望みの機能を付ければよろしい。
581デフォルトの名無しさん:04/09/15 14:19:08
>>579
(VC のように) __FILE__ とか __LINE__ を使ったマクロで実装すればよい、ということでは?
582デフォルトの名無しさん:04/09/15 15:16:43
インクルードの順番を気にせずヘッダファイルを
インクルードする方法ってありませんか?

何度インクルードしてもいいように
#ifndef _DATA_H_
#define _DATA_H_

#endif //_DATA_H_
で囲む方法は知っていますが。
583デフォルトの名無しさん:04/09/15 15:26:11
インクルードの順番を気にすることなんてあるの?
584デフォルトの名無しさん:04/09/15 15:28:41
[open.h]
{

[close.h]
}

[main.cpp]
int main()
#include "open.h"
return 0;
#include "close.h"
585デフォルトの名無しさん:04/09/15 16:33:03
先生!
newで作ったクラスのインスタンスを、自滅させた場合(delete this)、
後に外の関数で解放されたことを知るには、どのようにすればいいのでしょうか?
教えてください。。
586デフォルトの名無しさん:04/09/15 16:36:29
>>585
デストラクタの最後の行でthis=NULL;
587デフォルトの名無しさん:04/09/15 16:36:48
開放されたと言う情報を外に伝えるだけ
588585:04/09/15 16:49:39
む、思ってたより単純な事みたいですね。
ありがとございまーす。
589デフォルトの名無しさん:04/09/15 17:05:03
>>586
thisってconstじゃなかったか。
釣り?
590デフォルトの名無しさん:04/09/15 17:10:15
そもそも破棄されたオブジェクトにアクセスする可能性のあるような
プログラムではdelete this;をするべきじゃないと思うんだけど。
起動したらあとはなにも知らないで良いような自立したオブジェクトだけ
delete this;するべきじゃないの?
591デフォルトの名無しさん:04/09/15 19:44:34
するべきなのか
592デフォルトの名無しさん:04/09/15 19:51:11
>>591
delete this; の前に自殺予告が出せるオブジェならありうるべ。
593デフォルトの名無しさん:04/09/15 20:43:25
delete this;するべき状況は思い付かないな
594デフォルトの名無しさん:04/09/15 20:49:44
windoze
595デフォルトの名無しさん:04/09/15 20:56:01
WindowsのMFCやWTLなら使うこたぁある。
596デフォルトの名無しさん:04/09/15 22:16:11
>>593
侵入型参照カウント
597デフォルトの名無しさん:04/09/16 00:18:21
delete this;する関数名もほぼお決まりだな
void desroy();
598デフォルトの名無しさん:04/09/16 00:21:57
デスローイ!
599デフォルトの名無しさん:04/09/16 00:25:11
pimplとかcloneとかselfとか、最初から決まってる方が
分かりやすくて名前考えなくて済むから楽でいいよね
600デフォルトの名無しさん:04/09/16 00:41:31
News 2004-09-15: C++ Standard Core Language Issues List (Revision 31) is available
ttp://www.open-std.org/jtc1/sc22/wg21/
601デフォルトの名無しさん:04/09/16 00:42:07
>>572
それじゃ Hoge に const 付かないだろ。
602デフォルトの名無しさん:04/09/16 01:31:43
お前ら、デストロイをすぐに入力できるかね?
漏れはなぜか、「destory」。何度やってもこうなってしまう。
destroyと入力できない。同じクセがあるヤシいる?
603デフォルトの名無しさん:04/09/16 01:37:51
デストーリ?w
604デフォルトの名無しさん:04/09/16 01:44:57
destroy
605デフォルトの名無しさん:04/09/16 01:50:33
>>602
おれもなるよ
606デフォルトの名無しさん:04/09/16 01:56:24
clientがclinetになってしまうのに似てる。
ただ、clientはしょっちゅう使うスペルなので慣れてしまうけど、
destroyはあまり使わないのでいつまでたっても変なまま。
607デフォルトの名無しさん:04/09/16 01:57:09
   ∧_∧  デストローイ!!  
 |\ΦДΦ)   /|
 ○ <  ζ) <  ○                  人人
 | >  旦  > |              <   ∧∧  キュワアアアアア!!!
 | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|             ヽ(゚Д゚ )ノ
  | ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ |               (  へ)
  |              |                く
608デフォルトの名無しさん:04/09/16 02:24:08
おまえら何くだらねーこと言ってんだ。

俺もよくやる。
609デフォルトの名無しさん:04/09/16 02:28:05
constがcosntってなる・・・
610デフォルトの名無しさん:04/09/16 02:31:43
itn。。。
611デフォルトの名無しさん:04/09/16 02:34:31
receiveとrecieve
612デフォルトの名無しさん:04/09/16 06:55:02
コンストラクタへのポインタって使えますか?
数種類のクラスからランダムで1つを選ぶってので、ポインタをテーブルにいれといてそこから呼び出したいんですが
613デフォルトの名無しさん:04/09/16 10:15:48
そういうときこそdestroyの逆でよく使われる、
createですよ。
詳しくはabstract factoryデザインパターンをごらんあれ。
614デフォルトの名無しさん:04/09/16 10:18:45
>>612
オブジェクトを生成するstatic関数を定義すればOK。
で、生成用のstatic関数でオブジェクトの生成方法を選択する。
複数のクラスを生成するならば、基底クラスで生成メソッドを定義し、
そいつをキャストして返してやる。

あとは、そのポインタをdynamic_castなりしてやれば問題なし。
GoFで言えば、Builderになるのかな?
615614:04/09/16 10:20:26
>>612,613
かぶった…
abstract factoryか勘違いスマソ
616デフォルトの名無しさん:04/09/16 10:25:27
>>613>>614
なるほど、それ忘れてました
617デフォルトの名無しさん:04/09/16 13:07:23
>>602
自分も昔「destory」ってよくやってしまてたよ。

同様に
true→ture
label→lable
もよく間違ってったよ…
618デフォルトの名無しさん:04/09/16 16:15:33
retrunを忘れるな。
619デフォルトの名無しさん:04/09/16 16:16:54
>>613-615
factory methodだろ
620デフォルトの名無しさん:04/09/16 16:48:19
pritnf
621デフォルトの名無しさん:04/09/16 20:05:02
Drwa
622デフォルトの名無しさん:04/09/16 20:14:48
>>612
コンストラクタのアドレスは取得できない
623デフォルトの名無しさん:04/09/16 20:58:09
>>622
コンストラクタも静的にすれば……。
624デフォルトの名無しさん:04/09/16 21:10:42
>>623
俺がつっこむ必要なさそうだなw
625デフォルトの名無しさん:04/09/17 00:50:28
falseを「フェイルス」って発音する上司がいるんですけど、
どうしたら良いでしょう?
それ聞くと噴出しそうになるので。
626デフォルトの名無しさん:04/09/17 00:53:48
>>625
fail と混同してるんだろうなぁ・・・。

とりあず、2択だな。
1. ちゃんと正してあげる
2. 慣れる・自分も使う
627デフォルトの名無しさん:04/09/17 01:16:54
fail→連続する母音は前の母音が二重母音化
false→eで終わる単語はその前の母音が二重母音化<alはallの如き発音に
case→eで終わる単語はその前の母音が二重母音化

なまじ単語の知識がある人こそ填まりかねない罠。
628デフォルトの名無しさん:04/09/17 01:17:38
>>625
warningを「ワーニング」って発音するやつが身の回りに20%くらいいるけどもう慣れたよ。
人前で話す機会には訂正してあげてる。
629デフォルトの名無しさん:04/09/17 01:24:18
ウォーニン
630デフォルトの名無しさん:04/09/17 01:43:36
英語なんて日本人がどんなに正確であろうと思われる発音しても
nativeから見ればップって感じだからどうでもよくね?
631デフォルトの名無しさん:04/09/17 01:49:33
マックスストア
632デフォルトの名無しさん:04/09/17 02:58:13
Make your dream come false;
633デフォルトの名無しさん:04/09/17 03:02:01
>>628
ワーニングであってるよ。厳密には、(ゥ)ワニング。
ウォーニングと発音するのは厨房。
Doom3でしょっちゅう聞いたよ、ワーニング。
634デフォルトの名無しさん:04/09/17 03:15:14
ほれ。goo辞書の発音。
http://dictionary.goo.ne.jp/voice/w/00090699.wav
635デフォルトの名無しさん:04/09/17 03:31:32
活きた英語じゃなくて受験英語を目指すあたりが厨。
英語試験担当者(生粋の日本人)が喜んでとりあげそうなネタだ。
でも実態は違うというオチ。アメリカなら、ワーニングでいいよ。
お利巧さんは、イギリスにでも逝ってろってこった。
636デフォルトの名無しさん:04/09/17 03:58:30
ウォーニングだろうが、ワーニングだろうがどっちにしろ
日本語発音なんだからどうでもいい。
637デフォルトの名無しさん:04/09/17 04:00:59
>>628が元凶
638デフォルトの名無しさん:04/09/17 04:29:41
>>632
ワラタ
639デフォルトの名無しさん:04/09/17 13:05:48
hong kong
king kong
640デフォルトの名無しさん:04/09/17 13:08:27
>>632の笑い所がわからん
641デフォルトの名無しさん:04/09/17 13:38:35
>>640
中学英語からやり直してこい
642デフォルトの名無しさん:04/09/17 15:23:56
あなたの夢を喜劇にしなさい。
643デフォルトの名無しさん:04/09/17 16:44:11
falseの発音は「フォルス」でいいの?
644デフォルトの名無しさん:04/09/17 16:58:35
「厳密には」とか言いながらカタカナ表記で、
しかも最後が「グ」なんて書く
頭の悪い人が後を勃たない。
645デフォルトの名無しさん:04/09/17 17:08:57
厳密には、
頭の悪い人ではなく、バカが悪い人と書く。
646デフォルトの名無しさん:04/09/17 17:11:50
true = トルエ
false = ファルセ
647デフォルトの名無しさん:04/09/17 17:19:17
ファールス
648デフォルトの名無しさん:04/09/17 17:24:27
int=あいえぬてぃー
double=だぶる
char=きゃら
float=ふろーと
long=ろんぐ
unsigned=あんさいんど
true=とぅるー
false=ふぁーるす
class=くらす
struct=すとらくと
template=てんぷれーと
stdio=えすてぃーでぃーあいおー
stdlib=えすてぃーでぃーりぶ
iostream=あいおーすとりーむ
fstream=えふすとりーむ
vector=べくたー
deque=できゅー
649デフォルトの名無しさん:04/09/17 17:25:43
cout=しーあうと
cin=しーいん
cerr=しーえらー
650デフォルトの名無しさん:04/09/17 17:29:18
string=すとりんぐ
wstring=だぶるすとりんぐ
boost=ぶーすと
stlport=えすてぃーえるぽーと
651デフォルトの名無しさん:04/09/17 17:31:29
reinterpret_cast=れいんたーぷりときゃすと
652デフォルトの名無しさん:04/09/17 17:35:27
operator=おぺれーた
653デフォルトの名無しさん:04/09/17 17:40:20
cinco=チンコ
654デフォルトの名無しさん:04/09/17 17:41:29
queue=きゅー
find=ふぁいんど
find_if=ふぁいんどいふ
lower_bound=ろうあーばうんど
upper_bound=あっぱーばうんど
equal_range=いこーるれんじ
remove=りむーぶ
for_each=ふぉーいーち
partition=ぱーてぃしょん
nth_element=えぬてぃーえいちえれめんと
iterator=いてれーた
const=こんすと
655デフォルトの名無しさん:04/09/17 17:45:06
int=いんと
double=どうぶる
char=ちゃー
float=ふろーぁと
long=ろんぐ
unsigned=あんさいねど
operator=おぺらーとぁ
while=わいる
656デフォルトの名無しさん:04/09/17 17:45:35
while=ほわいる
657デフォルトの名無しさん:04/09/17 17:46:58
regex=れじぇっくす
C++=しーぷらすぷらす
658デフォルトの名無しさん:04/09/17 17:47:30
operator=おぺらとーる
659デフォルトの名無しさん:04/09/17 17:48:11
>>648
int イントでは?
660デフォルトの名無しさん:04/09/17 17:51:30
.cppファイルと.hファイルの違いって何なんでしょう。
cppファイルが複数あった場合、コンパイル時どういう順で展開されるんでしょうか
661デフォルトの名無しさん:04/09/17 17:51:51
別にあいえぬてぃーでも問題無いんじゃない?
doubleをでぃーおーゆーびーえるいーとか読まれたら引くけど
662デフォルトの名無しさん:04/09/17 17:52:17
>>660
こんぱいらにおくったじゅん
663デフォルトの名無しさん:04/09/17 17:53:23
4ヶ月ぶりぐらいにC++をやったら、プログラムを実行できなくなりました。
原因は全くわかりません。初心者丸出しの質問ですが、どなたか何が
原因と思われるかわかりませんか?
664デフォルトの名無しさん:04/09/17 17:55:32
>>663
あなたが4ヶ月ぶりくらいにC++をやったこと
665デフォルトの名無しさん:04/09/17 17:57:34
>>660
hファイルはコンパイル前にcppファイルに取り込まれる。
cppファイルは取り込んだhファイルごとコンパイラにかけられてオブジェクトファイルになる。
666デフォルトの名無しさん:04/09/17 17:57:58
>>663
どんなプログラムでどんなエラーが吐き出されたとか
詳細を書かなければ誰も答えてくれませんよ

とマジレスしましたがネタですかね(?)
667デフォルトの名無しさん:04/09/17 17:58:16
int = いんてじゃー
668デフォルトの名無しさん:04/09/17 17:58:18
>>664
原因が何だか本当にわかりません。
ビルドの結果はエラーなしなのですが、実行すると、「プログラムを実行できません」と出ます。
マジで困ってます・・・OTL
669デフォルトの名無しさん:04/09/17 17:58:22
1000 2000=せんにせん
2000 4000=にせんよんせん
5200=ごんに
3900=ざんく
1000=せんてん
7700=なななな
670デフォルトの名無しさん:04/09/17 17:59:18
家のパソコンが夜な夜な勝手に動きまわるんです。
たすけてください
671663:04/09/17 17:59:47
>>668は僕です。
>>666 
ネタじゃないです・・・。エラーは出てないんですが、実行ができません。
672デフォルトの名無しさん:04/09/17 18:00:57
>>667
そこiいんてじゃーねとかいうとintegerって書かれるぞ
673デフォルトの名無しさん:04/09/17 18:01:53
>>671
板違い
674663:04/09/17 18:03:22
>>673
板違いなんですか・・・?確かにプログラム以前の問題だとは思いますが・・誰もわかりませんかね?
675デフォルトの名無しさん:04/09/17 18:06:30
>>674
開発環境に沿ったスレで質問した方がきちんと答えてくれる人が
いると思われ。
そこでもう少し詳細を述べましょ
676663:04/09/17 18:08:00
>>675
そうですか・・わかりました。ありがとうございます。
677デフォルトの名無しさん:04/09/17 18:12:37
>>648
stdio=スタンダードアイオー
stdlib=スタンダードリブ
って言わないの?
俺だけ?
678デフォルトの名無しさん:04/09/17 18:18:04
GUI=じーゆーあい
CUI=しーゆーあい
stdio=すとでぃお
679デフォルトの名無しさん:04/09/17 18:18:49
GNU=ぐにゅ かっこつけるとき ぬー
680デフォルトの名無しさん:04/09/17 18:24:08
GUI=ぐい
CUI=くい
GNU=じーえぬゆー
681デフォルトの名無しさん:04/09/17 18:35:56
>>665
cppファイル1つに付き、オブジェクトファイル1つ作られるのでしょうか。それから、リンクってこと。??
682デフォルトの名無しさん:04/09/17 18:36:55
GNUはグニューと決まっている。て言うかC++の話題マダ〜?
683デフォルトの名無しさん:04/09/17 18:45:21
>>654なんて完全にC++の話題ジャン
684デフォルトの名無しさん:04/09/17 18:51:50
GUI=ぎゅい
CUI=きゅい
GNU=ぐぬぅ
685デフォルトの名無しさん:04/09/17 19:05:39
ここはとても低レベルなインターネッツですね。
686デフォルトの名無しさん:04/09/17 19:20:40
万個スレが削除された途端
こっちがネタスレになっちゃったな。
687デフォルトの名無しさん:04/09/17 19:23:41
endl=えんどえる
std=えすてぃーでぃー

それはそうと
cout << "Hello World" << endl;

<<
の読み方がわからん。
逆の>>も。
688デフォルトの名無しさん:04/09/17 19:30:52
左!左!
689デフォルトの名無しさん:04/09/17 19:32:39
NILはなんて読んだらいいの?
690デフォルトの名無しさん:04/09/17 19:40:05
NULL=ぬる
(void*)0=ぬるぽ
691デフォルトの名無しさん:04/09/17 20:01:14
>>690
#define NULL (void*)0ならどうなるよ?
692デフォルトの名無しさん:04/09/17 20:03:14
#define NULL (void*)0=しゃーぷでふぁいん ぬる ぬるぽ
693デフォルトの名無しさん:04/09/17 20:07:19
こんにちは。わたくし、ぬるぬるぽと申します。
694デフォルトの名無しさん:04/09/17 20:51:00
やけにスレが伸びてると思ったら。
695デフォルトの名無しさん:04/09/17 20:56:58
>>693
のび太みたいだな。
696デフォルトの名無しさん:04/09/17 21:50:18
大切な重複スレがゴミ箱に捨てられてしまった。
697デフォルトの名無しさん:04/09/17 21:50:55
ゴミ箱って書けないんだっけ
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
どっちでも好きなほうでいいんでない?
700デフォルトの名無しさん:04/09/18 01:00:19
>>698
委譲で出来る事は全部委譲でやる。
委譲で出来なくてprivate継承で出来る事は全部private継承でやる。
それでもできなければprotected継承で。
それで無理なら考え直せ。
701698:04/09/18 01:11:20
委譲って言葉をはじめて知りました。
メンバにもってその機能を使い、もう少し便利な形にして外に見せる、見たいな事でしょうか。
とりあえずメンバに持つやり方にします。
ありがとうございました。
702デフォルトの名無しさん:04/09/18 01:39:36
>>698
iostreamの設計を見つめてください
703デフォルトの名無しさん:04/09/18 01:49:26
自分の事は自分でやる...か。意味深な
704デフォルトの名無しさん:04/09/18 01:49:46
すごい複雑でつね。こんな設計見習うべきか躊躇しまふ。
705デフォルトの名無しさん:04/09/18 02:07:10
質問させて下さいな。
3桁毎に区切りが入った 2,234,713 のような10進文字列の取得は
皆さんどうやって実現してるんでしょうか?
706デフォルトの名無しさん:04/09/18 02:08:31
,を全部無視するだけじゃないの?
707デフォルトの名無しさん:04/09/18 02:10:17
sscanf(buff, "%d %d %d", &a,&b,&c); これは無理か?
708デフォルトの名無しさん:04/09/18 02:14:50
>>706
std::string s = "70,145,123";
s.erase(std::remove(s.begin(), s.end(), ','), s.end());
int result = atoi(s.c_str());
709デフォルトの名無しさん:04/09/18 02:14:52
無理だ。
int a,b,c;
char buff[]="10 20 30";
sscanf(buff, "%d,%d,%d",&a,&b,&c);
これでできたよ。。うちは
710デフォルトの名無しさん:04/09/18 02:15:31
C++だた...
711705:04/09/18 02:15:34
質問の仕方が悪かったみたいです。
やりたい事は、int → char*です。
snprintf()とか_itoa()とかでは実現できないみたいなので質問しました。
一時は自力でやるべきかと思いましたが、ロケール毎で区切り文字などが違うらしいので、
なにか良い方法はないものかと思いまして・・・。
712デフォルトの名無しさん:04/09/18 02:18:56
>>711
>>708をちょっと変えて
!isdigitでremove_ifすればいいじゃない?
区切りが数字なんて無いでしょ?
713デフォルトの名無しさん:04/09/18 02:19:35
>>712は勘違いしますた
714デフォルトの名無しさん:04/09/18 02:27:13
>>713はそれを指摘しますた
715デフォルトの名無しさん:04/09/18 02:29:28
1,000,000  これが100万てことか。
例えば"1,000,000"ていう文字列を10進数に
直すって意味ではないのか。質問の意味が分からない。
716705:04/09/18 02:34:34
>>715
ちょうど逆です。
1000000を"1,000,000"に変換したいのです。
なにか汎用的な方法とかあるんでしょうか?
717デフォルトの名無しさん:04/09/18 02:41:36
あります
718705:04/09/18 02:46:42
>>717
是非ご教示下さい。
719デフォルトの名無しさん:04/09/18 02:59:10
自作
AddComma( moneyStr, ',', 10000 )
void AddComma(char *str, char chr, int money);
力不足でごめん。
720デフォルトの名無しさん:04/09/18 03:06:26
>>719はただのバカですが、ちゃんとできます。
721デフォルトの名無しさん:04/09/18 03:07:13
#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デフォルトの名無しさん:04/09/18 03:10:05
>>721も分かってないみたいですが出来ます
723デフォルトの名無しさん:04/09/18 03:12:31
メモリのプール化について説明してるサイトないですか?
724721:04/09/18 03:20:12
>722
はあ?分かってないって何だよ。面白くねーなクソが。

あんた>717か?汎用的な方法ってやつの事か?
マニピュレータでも定義するんなら、とっととコード書くなりヒント与えるなりしたらどうだ。
# 確か標準マニピュレータの中にはコンマを付加するやつは無かったと思うけどさ。
# あるんなら早くポインタ示してやれよ。
725デフォルトの名無しさん:04/09/18 03:22:59
printf("%03d,%03d,%03d",(x%1000000000)/1000000,(x%1000000)/1000,(x%1000));
726705:04/09/18 03:24:20
>>721
ご教示有難うございました。自作版ですね。


例えばWindowsでは、コントロールパネルの「地域と言語のオプション」から
各国毎の数値の表記方法が確認できるのですが、
アイスランド語やアゼルバイジャン語(50音順に並ぶ最初の2つの言語)は、
日本語の数値表記と違うみたいです。むしろ、日本と違う国がたくさんあるようです。
こういうのって、boostにあってもよさそうに思うのですが。
727デフォルトの名無しさん:04/09/18 03:33:04
boostなんか使わなくてもちゃんとロケールが定義されてる環境なら標準C++でできます。
>>724
gccみたいなお馬鹿なコンパイラでは無理ですよ
728デフォルトの名無しさん:04/09/18 03:33:57
ちなみにVC++7.1みたいな標準準拠度の高いコンパイラならOKです。
729デフォルトの名無しさん:04/09/18 03:35:47
文法の質問?なのですが、

Class TestClass{
  
  struct TestClass{
    int a,b,c;
    char c,d,e;
};
};

これって使えますか?
つまり、クラスのメンバの構造体の名前が、クラス名と同じという書き方はできるんでしょうか?
730デフォルトの名無しさん:04/09/18 03:38:06
他に誰も知らないみたいなのでそろそろ答えを出します。

#include <locale>
#include <iostream>

int main()
{
using namespace std;

int i = 1500000;
cout.imbue(locale(""));
cout << i << endl;
}

文字列に格納したければcoutの代わりにstringstreamを使えばOKです。
locale("")で使用環境のネイティブロケールを指定した事になります。
731デフォルトの名無しさん:04/09/18 03:40:04
ちなみにさっき書き間違えましたが、
お馬鹿なのはlibstdc++でgccではないかもしれません。
732デフォルトの名無しさん:04/09/18 03:40:55
>>724
無知をさらけ出さない方がイイですよ
733705:04/09/18 03:49:40
>>730
早速、試してみました。有難うございました。
locale("")というのは、関数じゃなくてクラスのインスタンスなんですね。

標準C++は奥が深いなぁ。ちょっと目からウロコ。
734721:04/09/18 04:05:29
>732
そうやって俺をイラつかせて、何をしたいんだ。
俺に恨みでもあるのか。それとも人をからかうのが好きなのか。
どちらにしても、お前は悪意をもって人を傷つけようとした。
こういう事はこれで最後にしろ。
735デフォルトの名無しさん:04/09/18 04:07:38
>ロケール毎で区切り文字などが違うらしい
だってこの質問文も読まないでカンマに固定してんだもん。
736デフォルトの名無しさん:04/09/18 04:21:55
>735
は?>705では3桁区切りとしか書いてねーじゃん。
だから俺も3桁で区切るコード書いたんだよ。

で、何だ。俺が>711を読んだ上で>721のコードを書いてしまったとして
お前はそれを「無知」つって笑うのか。これ、「無知」つーのか。
「不注意」じゃなくて。
737デフォルトの名無しさん:04/09/18 04:25:45
そろそろウザい。2人とも消えろ。な?

↓何事もなかったかのように質問ドゾー
738デフォルトの名無しさん:04/09/18 04:26:30
>>736
localeも知ってたんなら無知じゃなくて不注意でもいいけど、
locale自体知らなかったなら無知だろ。つーかどうでもいいよ。しつこいし。
739デフォルトの名無しさん:04/09/18 04:32:39
>>737
もう質問有るから何事もなかったように
>>723とか>>729とかに答えてやれよ
740デフォルトの名無しさん:04/09/18 11:01:35
>>723 boost::pool
>>729 やってみれ
741デフォルトの名無しさん:04/09/18 11:30:16
News 2004-09-18: The C++ Standard Library Issues List (Revision 32) is available
ttp://www.open-std.org/jtc1/sc22/wg21/
742デフォルトの名無しさん:04/09/18 12:27:19
自分の弁護に必死になるのは見苦しい。
相手が自分より良い方法を示してきたら素直に受け容れろ。
743デフォルトの名無しさん:04/09/18 12:47:32
一言多い人って子供っぽい
744デフォルトの名無しさん:04/09/18 13:23:18
はぁ
745デフォルトの名無しさん:04/09/18 13:35:14
>>743 いい例ですね
746デフォルトの名無しさん:04/09/18 13:46:34
そもそも>>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関数の引数をどのようにすればよいでしょうか?
748デフォルトの名無しさん:04/09/18 14:27:15
いちいち相手して721の神経逆なでする事も無いじゃん
749デフォルトの名無しさん:04/09/18 14:45:29
>>747
普通にこうしたらだめ?
void print_pointer2D(double c) {
printf("%f \n", c);
}
750デフォルトの名無しさん:04/09/18 14:49:39
747は何か根本的にパーだから放置しる
751デフォルトの名無しさん:04/09/18 15:08:02
>>730
>>721
クスクス・・・
752デフォルトの名無しさん:04/09/18 15:18:06
レスのやり取りをみてると、721は何も悪くない。
730の方がスゲー感じ悪いよ。
753デフォルトの名無しさん:04/09/18 15:55:41
>>749
いや、それでもいいのですが、それだと今までに作ったプログラムを結構書き換えなければ
ならないんですね。うーむ、うまい方法はないものでしょうか。
754デフォルトの名無しさん:04/09/18 16:21:56
>>753
ならdouble**版とdouble版をオーバーロードしたらどうだ。
ただし周りを混乱させる諸刃の剣。

そういやvoid print_pointer2D(double c);なんて関数名と引数が合っていないな。
ますます混乱させる度合いが上がるぞ。
755デフォルトの名無しさん:04/09/18 16:24:38
やっぱそれしかないですか。。
根性で今までのプログラム書き換えます。
どうもありがとうございました。
756デフォルトの名無しさん:04/09/18 16:26:07
こういうのってリファクタリングツール使えば簡単に直せるんじゃないの?
C++用ノリファクタリングツールがあるかどうかはしらんが。
757デフォルトの名無しさん:04/09/18 19:52:40
>>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さんはどんな環境なのですか?
758デフォルトの名無しさん:04/09/18 19:54:38
別方向から食いついてるな
759デフォルトの名無しさん:04/09/18 21:41:20
>>757
とりあえずcygwinだと動かないよ。
でもcygwinはnewlibだったかな?
newlibはmingwか。
760デフォルトの名無しさん:04/09/18 21:42:27
ここは標準スレですコンパイラ比較スレではありませんコンパイラの比較は
【初心者歓迎】C/C++室 Ver.9【環境依存OK】
http://pc5.2ch.net/test/read.cgi/tech/1094494997/
でどうぞ
761デフォルトの名無しさん:04/09/18 22:32:58
Rubydeすべてかいけつ。」
留byさいきょうげんご
るびーーーーーーーーーーーー
762デフォルトの名無しさん:04/09/18 23:20:55
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_35/code.txt


配列とポインタがらみの質問なのですが
int hairetu[10]; int* point = hairetu; とするとpointにはhairetu[0]のアドレスが入るんですよね?
さらに*(point+9)とするとhairetu[9](最後尾)の内容を表すと思うのですが、
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/lounge/file/1074774948_35/code.txt 
↑このコードのtmpint.array+10というのはarray[0]から10個先のarray[11]を指しているように見えるのですが・・・
763デフォルトの名無しさん:04/09/18 23:23:55
間違えました、array[10]を指しているように見えるのですが、arrayは[10]で定義されているので最後尾が[9]までだと思うんです。
これって配列の最後尾より大きいところを指しているように見えるのですが。。
764デフォルトの名無しさん:04/09/18 23:28:06
>>763
[ first, last )
765763:04/09/18 23:50:50
書き忘れました、何度もすみません。
このコードを実際に動かしてみるとしっかりとarray[9]を指していることが分かるのですが
最初に書いた例で行くと、point+1はhairetu[1]のアドレスを意味するのになぜこの場合はtmpint.array+10でarray[9]を意味するのでしょうか?
766デフォルトの名無しさん:04/09/19 00:05:18
>>765 意味しないよ
767デフォルトの名無しさん:04/09/19 00:05:32
>>765
>この場合はtmpint.array+10でarray[9]を意味する
ここの理解が違います。tmpint.array+10はarray[10]のアドレスを指してます。
STLアルゴリズムの範囲の指定の仕方を調べて下さい。(答えは764。)
768デフォルトの名無しさん:04/09/19 00:06:13
終了条件
769デフォルトの名無しさん:04/09/19 00:07:44
質問の直後に出てる答えをスルーする質問者って多いな。
770デフォルトの名無しさん:04/09/19 00:09:03
[ first, last )
これは高校数学を習ってないと分からないからな
771デフォルトの名無しさん:04/09/19 00:51:20
>>770
高校数学じゃないって。大学の教養課程だ。
772デフォルトの名無しさん:04/09/19 00:56:49
>>771
極限は数V
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
774デフォルトの名無しさん:04/09/19 01:11:05
fscanfで正規表現のようなものが使えます
ぐぐってみて
775デフォルトの名無しさん:04/09/19 01:13:11
boost::tokenizer
776デフォルトの名無しさん:04/09/19 01:16:12
BCB使ってるんでboostは使えません
777デフォルトの名無しさん:04/09/19 01:16:39
777
778デフォルトの名無しさん:04/09/19 01:19:54
>>776
boost::tokenizerは別に使えるようだが。
779763:04/09/19 01:20:58
レス遅れてすみません。
教えていただいた内容で調べてみることにします。
ありがとうございました。
780763:04/09/19 01:27:05
すみません、最後にどうしても気になったのでひとつ。
>>tmpint.array+10はarray[10]のアドレスを指してます
配列の最大を超える見たいですが、これに問題はないのでしょうか?
もし問題がなければ配列の大きさなんて関係なしに[1]とか適当にやっておいて後から[2]とか適当に足していくことができるんですか?
781デフォルトの名無しさん:04/09/19 01:30:10
>>780
> 配列の最大を超える見たいですが、これに問題はないのでしょうか?
int a[10]; と定義したら、読み書きして良いのは a[0] から a[9] まで。

ただし例外として &a[10]; (有効なアドレスの次のアドレス) は取得して OK。
もちろん a[10] を読み書きしたらアウト。
782デフォルトの名無しさん:04/09/19 01:34:29
別にアドレスの取得自体は何を取得しても問題ないべ
783763:04/09/19 01:34:40
>>781
なるほど、そんな例外があったんですね。。
入門書をいろいろ読んできたのですが一度もそんな内容を見ていなかったのでわかりませんでした・・
となると、sortなどは1番目の引数に配列の先頭のアドレス、2番目に配列の最大より一つ大きいところのアドレスを指定する必要があるんですね。
784デフォルトの名無しさん:04/09/19 02:01:50
boost の勉強にオススメな本って何かありますか?
785デフォルトの名無しさん:04/09/19 02:08:23
>>782
規格上は &a[11] とかは未定義だよ。

ま、ふつーは問題ないけど 32bit アーキテクチャで &a[2ギガ] とかやると、
ポインタがオーバーフローして別の有効な変数のアドレスに一致したり
NULL と一致したりして泣くかも知れず。
786デフォルトの名無しさん:04/09/19 02:10:29
>>772
は?

高校数学では、括弧に意味付けする記述は使わんだろ。
787デフォルトの名無しさん:04/09/19 02:12:37
そうなの?私立だったから習ったのかな?
788デフォルトの名無しさん:04/09/19 02:14:13
教科書には
[, ] (, ) の説明はちゃんとしてある
789デフォルトの名無しさん:04/09/19 02:21:48
>>788
何時ごろの教科書?
最近?
790デフォルトの名無しさん:04/09/19 02:29:13
>>789
超最近
791デフォルトの名無しさん:04/09/19 03:17:57
高校では、「界」を抽象的には扱わんだろ。
わざわざ括弧での記述を教える意味がない。
扱うものが1次元の数値だけなので不等号で十分でしょが。

高校の教科書にホントに出てるの?
あやしい。
792デフォルトの名無しさん:04/09/19 03:21:48
>>791
あなたもしつこい人ですね
出てるったら出てるんです
793デフォルトの名無しさん:04/09/19 03:27:15
数学の話は数学板でどうぞ
794デフォルトの名無しさん:04/09/19 03:27:56
>>792
(・∀・)ニヤニヤ

嘘くさ・・・(w
795デフォルトの名無しさん:04/09/19 03:56:55
>>773
getlineではデリミタが指定できるんだが。
796デフォルトの名無しさん:04/09/19 03:59:30
[]と()は開区間と閉区間の説明で、高校の教科書に出てくる。
ただ、説明だけが出てきてまったく使わないだけのこと。
少なくとも4年前には出てた。
797773:04/09/19 04:08:27
お答えありがとうございました。
getlineでデリミタ指定できるのは知りませんでした。
boostのtokenizerも知りませんでした。
798デフォルトの名無しさん:04/09/19 04:43:10
>>794は中卒だから知らないんだよw
799デフォルトの名無しさん:04/09/19 09:48:05
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 を動的読み込みしています。
801デフォルトの名無しさん:04/09/19 10:47:36
>>800
ABI,vtbl,RTTI,SEHの形式や使い方が違うコンパイラだったら
当然まずいんじゃないの?
802デフォルトの名無しさん:04/09/19 10:52:47
803デフォルトの名無しさん:04/09/19 13:12:28
>>799
「Cの」ではなく、CでもありC++でもある領域の問題だろが
CとC++の共通項はどちらでもいいし、C特有の問題はCスレ、C++特有の問題はC++スレで何の問題があるんだ?
804デフォルトの名無しさん:04/09/19 13:16:41
>>803
俺も同意見
805デフォルトの名無しさん:04/09/19 13:44:50
C特有の問題でもC++的なアプローチを示せる可能性だってあるしねぇ
806デフォルトの名無しさん:04/09/19 13:49:05
どっちでもいいじゃん
807デフォルトの名無しさん:04/09/19 15:05:29
>>805
漏れもそう思う。
標準のC++クラスやboostを使うことにこだわるのとは意味がちがう。
C++的解決方法は他にもたくさんある。
808デフォルトの名無しさん:04/09/19 16:59:53
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
車輪をつくるな!!!
810デフォルトの名無しさん:04/09/19 17:16:09
車輪がなきゃ走れないよ
811デフォルトの名無しさん:04/09/19 17:17:11
走る必要なんてないよ
812デフォルトの名無しさん:04/09/19 17:25:17
他人がどうこう言うこっちゃねぇ
813デフォルトの名無しさん:04/09/19 17:37:44
きっとT* operator[](int)を定義するんだ
814デフォルトの名無しさん:04/09/19 17:41:24
車輪の再発明は、プラモデル感覚が楽しいのは確かだ。
ただ、プラモデルを実務に導入するのはまずい。
実際に作って構造を理解するのには役立つが、それ以上のものであってはならない。
815デフォルトの名無しさん:04/09/19 17:43:47
>>800
(例) MetrowerksCodeWarriorPro8.3forWinReleaseNotesより抜粋
* データメンバーを使う多重継承のクラスレイアウトはMSVCと完全互換ではありま
 せん。異なるコンパイラでコンパイルされたモジュール間ではこの機能に使用し
 てデータを共用することはしないでください。
こういうことがあるから、dll間でクラスのやり取りは基本的に無理だと考えておいた
ほうがよい。
816デフォルトの名無しさん:04/09/19 20:02:42
>>808
メンバ関数にこれを追加
operator T**() {return data;}
817デフォルトの名無しさん:04/09/19 20:16:13
Ruby >>>>>>>>>>>>> C++
818デフォルトの名無しさん:04/09/19 20:20:08
ルビ厨が4年前からタイムスリップしてきたかのようだ。
懐かしいな。
819デフォルトの名無しさん:04/09/19 20:29:28
boostっていつ標準C++に入るの?
もう何個かは決まってるんでしょ?
さっさとして欲しい
820デフォルトの名無しさん:04/09/19 20:44:00
2009年くらい
821デフォルトの名無しさん:04/09/19 20:46:31
>>820
あれは実は16進だから2015年までだったりして
822デフォルトの名無しさん:04/09/19 20:53:45
16進だと何故2015年なんだろう…
823デフォルトの名無しさん:04/09/19 20:57:29
0x

0x○
って事じゃないの?
824デフォルトの名無しさん:04/09/19 20:59:47
ルビ厨が暴れてたころを知らんのだがどこみればいい?
825デフォルトの名無しさん:04/09/19 21:03:32
0x9 == 9 のような気が
826デフォルトの名無しさん:04/09/19 21:06:34
>>825
0xF == 15
827デフォルトの名無しさん:04/09/19 21:07:55
>>821
そもそも
0x1000
とかも出来るから何年にでも出来るんじゃないの?
828デフォルトの名無しさん:04/09/19 21:08:14
2009ってlonghornよりも後じゃん…
829デフォルトの名無しさん:04/09/19 21:11:13
日本語のページのみ検索するようにして次世代C++の呼び名でぐぐると
良く分かんないハングルのページばっかり引っかかるのはgoogleの嫌がらせか?
830800:04/09/19 21:55:35
>>801
>>815
お答えいただきありがとうございました。
イベントクラスの、フレームワーク・外部モジュール間の受け渡しを考えていたんですが、
なかなか難しいようで…もうちょっと頭をひねってみます。

>>802
参考にさせていただきます。
831デフォルトの名無しさん:04/09/19 22:44:22
>>824

http://web.archive.org/web/20000302001334/http://www.ruby-lang.org/ja/compar.html
--------------------------------------------------------------------------

C++
いろいろと有名なオブジェクト指向言語であるC++とRubyを比較すると:


C++なぞ問題外.^^;;;

--------------------------------------------------------------------------
ちなみに、英語版には記載がない(ぷ
832デフォルトの名無しさん:04/09/19 23:10:54
>>831
thx. こりゃキッツー。勘違いルビ厨が暴れるのも分かるワ
833デフォルトの名無しさん:04/09/19 23:34:13
Ruby>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
ばーか。C++ユーザ死ねよ
Ruby以外の言語は糞なんだよ。そんなことも分からないの?

834デフォルトの名無しさん:04/09/19 23:35:56
SE「これからはRubyなんだ!Rubyの案件持ってきてくれよYO!」
営業「・・・」
課長「・・・」
部長「るびーって何だね?」



営業「おい、Rubyの案件なんてなかったぞ!」
SE「ちゃんと探してんのか?ゴルァ!!」
営業「それよりこっちのC++の見積り早く出してよ」
SE「・・・」
課長「プッ」
部長「るびーって何だね?」
835デフォルトの名無しさん:04/09/19 23:36:40
簡単なsmtpクライアントを作ろうと思ったのですが日本語エンコードの問題に
ぶち当たってしまいました。エンコード変換にはいろいろ方法があるようですが
なんとか見慣れたstream系の書式のままエンコード変換→送信する方法はないでしょうか?
コンパイラはminGW、socketのラッパーとしてgimite/socketというのを使ってます。
836デフォルトの名無しさん:04/09/19 23:38:29
Rubydesubetekaiketu!
837835:04/09/19 23:41:50
RubyではHTTPクライアントを作った事がありますが、
確かにC++に比べて全然簡単ですね(涙
838デフォルトの名無しさん:04/09/20 00:03:35
>>835
そういうストリームクラス作ればいいじゃん。
839デフォルトの名無しさん:04/09/20 00:27:13
いcおんv
840835:04/09/20 00:54:55
iconvってcharベースじゃないですかw
コレ使って内容書き換えるstreamクラス作るしかないのかなぁ
なんかやろうとしてる事に対して大げさすぎる気が(汗
理想的にはiomanipみたいな感覚で
stream << encode("Shift_JIS");ってできたらいいのになぁ。
誰か作ってないのかなぁ・・・。
841808:04/09/20 01:14:50
レスありがとうございました。
よければ標準ライブラリで動的確保を行うクラス列挙してもらえませんか。みなさんがよく使われるモノ知りたいです
842デフォルトの名無しさん:04/09/20 01:22:28
>>840
バッファに直接アクセスしにくいiostream系は応用面でオhル。
あまり当てにしないほうがいい。
843デフォルトの名無しさん:04/09/20 01:40:13
いbm いcう
844808:04/09/20 01:44:09
vectorクラスっての使ってみます。調べずに聞いてごめんなさい。
845デフォルトの名無しさん:04/09/20 02:38:23
846835:04/09/20 02:47:17
>>845
ぬお!まさに求めていたモノに近い(嬉
不安定そうな名前といやに多いマクロが心配ですが使ってみまつ。
ありがとう。
847デフォルトの名無しさん:04/09/20 02:50:36
そいや昔BoostのMLで「コード変換ライブラリ欲しい」「iconvがあるじゃねぇか」「iconvはライセンス的にクソ」みたいなやりとりがあった気がするな。その後どうなったのか知らんが。
848デフォルトの名無しさん:04/09/20 03:08:44
>>846
gimite/socketの作者も利用してるみたいだから
頼めば、gimite/socket に組み込んだモノを用意してくれかもしれんよ。
849デフォルトの名無しさん:04/09/20 06:16:00
ライセンスが面倒なのでそこらへんは自作してるなぁ。>iconv
850デフォルトの名無しさん:04/09/20 12:57:43
純粋仮想constメンバ関数は
virtual void ConstFunction() const = 0;
でいいのですか?
851デフォルトの名無しさん:04/09/20 12:58:54
>>850 まずコンパイラに聞け。
852デフォルトの名無しさん:04/09/20 13:08:33
しらないならすなおにしりませんっていえよ
友達いねーだろw
853デフォルトの名無しさん:04/09/20 13:11:57
Rubysaikyou!!!!!!!
854デフォルトの名無しさん:04/09/20 13:17:57
ですねw
855デフォルトの名無しさん:04/09/20 13:36:28
C++は最強──・ε・)・π・)・ι・)σ)・τ・)・η・)・μ・)・η・)──!!!
856デフォルトの名無しさん:04/09/20 13:38:17
ですねw
857デフォルトの名無しさん:04/09/20 15:28:18
>>855
えぴすてーめーハケーン
858デフォルトの名無しさん:04/09/20 17:15:35
>>850
const修飾の有無はどうでもいいことなのです

> virtual void ConstFunction() const = 0;

よろしい
859デフォルトの名無しさん:04/09/20 21:58:16
ふと気になったのだけど、
draw_lineとdrawLine、アンダースコアでセパレートするのと小文字で始め大文字区切りにするのと、
C++ではどちらを好きな人が多いのかな?
860デフォルトの名無しさん:04/09/20 22:00:24
Ruby <>>><<<<<<<<<<<<<<<<<<JMMMMMMMMMMMPOC+++++++++
861デフォルトの名無しさん:04/09/20 22:04:39
関数や制御構造ローカル>draw_line
それより大きいスコープ>DrawLine
3文字以下の名前>ABC
どの名前も適さない一時変数>FILE* file/POINT point/int i/float f
862デフォルトの名無しさん:04/09/20 22:09:54
なんだか知らないけどここにウィルス置いときますね
ttp://pukapuka.s1.x-beat.com/img-box/img20040920215205.lzh
863デフォルトの名無しさん:04/09/20 22:10:34
俺はDrawLine派
864デフォルトの名無しさん:04/09/20 22:22:08
>>859
Win32 系のプログラムだと API に合わせて DrawLine
でも STL や Boost だと draw_line

ま、何でも良いよ。
865デフォルトの名無しさん:04/09/20 22:23:38
Win32系でboost使う場合は?
ちなみに漏れは draw_line
この方がなんか目に優しい感じがするから
866デフォルトの名無しさん:04/09/20 22:28:13
質問なんですが、

void main()
{

}

で、コンパイルエラーを出すのと出さないのでは何が違うのですか?

エラーを出すコンパイラ
gcc など gnu系(MinGWなど)

エラーを出さず正常にコンパイルできるコンパイラ
VisualStudio.Net 2003
Borland C++ compiler 5.5.1
867デフォルトの名無しさん:04/09/20 22:31:13
ホントはdraw-lineと書きたい。
868デフォルトの名無しさん:04/09/20 22:32:11
工エエェェ(´д`)ェェエエ工
869デフォルトの名無しさん:04/09/20 22:41:03
draw_lineのほうがお肌に優しいと聞いた。
870デフォルトの名無しさん:04/09/20 22:46:13
アンダースコアなーじっくりみないとスペースに見えてしまうんだよ。
アンダースコートならそれでいいんだけどなー。
871デフォルトの名無しさん:04/09/20 22:48:42
>>866
mainエントリポイントの返り値にvoidが不正・・・だったはず
872デフォルトの名無しさん:04/09/20 22:53:42
873デフォルトの名無しさん:04/09/20 23:13:26
>>870
使ってるフォントが悪いな。
874835:04/09/21 01:10:39
835です。
皆様のおかげでC++のstream書式で無事にsmtpクライアントを書くことができました。
babelはShift_JIS->iso-2022-jpへの直接変換ができないみたなので焦りましたがw。
また有名(?)なbare LF問題で小1時間悩んだり・・・ヘボくてすみません。

最後に質問させてください。
今ファイル添付の機能をつけようと思ってbase64変換ライブラリを探しているのですが、
gmite/socketやbabelと同様にstring or streamを操作するタイプのものを求めています。
cやPerlのものは結構見つかるのですが・・・良いのがあったら教えてください。お願いします。
875デフォルトの名無しさん:04/09/21 02:28:52
>>874
それぐらいならその c や perl のヤツを元に自分で書き起こしてもいいんじゃない?
876デフォルトの名無しさん:04/09/21 02:59:07
sf.net
877デフォルトの名無しさん:04/09/21 04:51:54
boost::spirit が半端なく重いのですがどうしたらよいでしょうか
878デフォルトの名無しさん:04/09/21 06:02:26
使わない
879デフォルトの名無しさん:04/09/21 06:44:51
なんだか知らないけどここにもウィルス置いときますね
ttp://pukapuka.s1.x-beat.com/img-box/img20040920215205.lzh
880デフォルトの名無しさん:04/09/21 08:27:00
・CPUを速いのに変える
・CPUを増やす
・flex/bisonでがんばる
881デフォルトの名無しさん:04/09/21 10:52:21
>>877
詳しくよろ
882デフォルトの名無しさん:04/09/21 10:53:57
よろも何もboost::spiritが糞重いのは常識だと思うんだが。
サンプルコンパイルしてみりゃ分かる。
実用的な物を作りたいならflexとbison使うべき。
883デフォルトの名無しさん:04/09/21 11:05:08
spiritとflex/bisonの組み合わせを比較したって意味ですよね?
どれくらい差があったの?
若しくはどのサンプルが遅かったのか教えてください。
884デフォルトの名無しさん:04/09/21 11:11:34
>>883
http://spirit.sourceforge.net/repository/applications/show_contents.php
とりあえずCでも動かしてみて下さいな。
grammer checkしかしてないのに何でこんなに遅いんだと思うよ。
885デフォルトの名無しさん:04/09/21 11:13:43
生成される実行ファイルも異様にでかいよね。spiritは。
886デフォルトの名無しさん:04/09/21 11:20:37
まあspiritはc++の中で無理矢理完結させてるんだから、
外部ツールとして中で最適化でも完全ハッシュ生成でも
何でもやりほうだいのbisonやらyaccと比べるのはどうかと思うよ。
887デフォルトの名無しさん:04/09/21 11:24:43
flexはC++に一応対応したけどbisonはC++未対応で、
bison++が全然更新されてないからなあ…
888デフォルトの名無しさん:04/09/21 11:28:43
とりあえずnamespaceで包んでやればいいんでないの?
889883:04/09/21 12:24:36
とりあえずやってみました。
test_files/Moments.cで100回平均して22ms
(P3:800 VC7.1 Release)
flex/bisonだと1msで収まるって感じなのかなぁ。
890デフォルトの名無しさん:04/09/21 12:29:35
そもそもあれはflex/bisonがやる事の一部しかやってない
891デフォルトの名無しさん:04/09/21 12:30:16
あれは->あのサンプルは
892デフォルトの名無しさん:04/09/21 12:32:06
あれは.operator->(あのサンプルは)
893デフォルトの名無しさん:04/09/21 23:19:22
>>887
yayacc どうよ?
894デフォルトの名無しさん:04/09/21 23:20:48
ややCC?
結構C++って事か?
895デフォルトの名無しさん:04/09/21 23:24:27
どちらかというとCC
だろ
896デフォルトの名無しさん:04/09/21 23:28:18
>>894
ちゃうちゃう。Yet Another Yacc という、C++ 使える yacc の改良版みたいなやつ。

ttp://www.gradsoft.com.ua/eng/Products/YaYacc/yayacc.html
897デフォルトの名無しさん:04/09/21 23:33:07
>>896
何故にマジレス・・・
898デフォルトの名無しさん:04/09/21 23:35:33
YayaCoshiya
899デフォルトの名無しさん:04/09/21 23:49:17
cygwinのbisonをふつーにC++で使いまくってるんだが。
プレコンパイルヘッダが使えないのが微妙につらいが
それ以外でなんか困ることある?
900デフォルトの名無しさん:04/09/22 05:15:16
>889
これ(c_grammar.cpp)subrule使ってないですからね〜.
subrule使ったときの改善度合いが知りたいですけれど・・・時間が無い.

ていうか真剣にtypeof欲しいっ!ヽ(`Д´)ノ ウワァァン!!
901デフォルトの名無しさん:04/09/22 08:47:36
class Final
{
private:
Final();
//全てのコンストラクタをプライベートにする
};

と宣言すると、Finalを継承したクラスを作ることは
できなくなる、ということでいいんでしょうか?
902900:04/09/22 08:52:16
書き忘れ。Final自体はfactory methodでコンストラクトできるという設定です。
903デフォルトの名無しさん:04/09/22 08:53:16
902は900じゃなく901です。
904デフォルトの名無しさん:04/09/22 11:32:12
なんでそうfinal使いたがるかな

仮想デストラクタを使わないだけじゃだめ?
905デフォルトの名無しさん:04/09/22 11:56:28
違反しても文句言われない規則など意味ねーんだよ
906デフォルトの名無しさん:04/09/22 13:45:41
それにしても継承禁止を明示する必要性ってのがわからん。
907デフォルトの名無しさん:04/09/22 14:06:27
cppllに複雑な継承禁止パターンがあったと思う
908デフォルトの名無しさん:04/09/22 14:21:36
>>906
 この型は継承してはいけません、って書いておいても平気で継承して、
(例えばデストラクタが動作しないとかの)トラブルを引き起こす奴とかが
いるからじゃないか?
909デフォルトの名無しさん:04/09/22 15:09:49
C(notC++)ライブラリの関数を可能な限りinline指定つきで再実装したいんだが
許されることなんだろうか?それとも無駄?
910デフォルトの名無しさん:04/09/22 15:26:11
>>907
つかboostにあるだろ
911デフォルトの名無しさん:04/09/22 15:32:04
処理速度を上げたいんだったら、より上位のアルゴリズム最適化しる。
そんなことは既にやっていてプロセッサ固有命令を使いたいとかだったら
止めはしないけど、ただ単にコードをinline化するだけの小手先最適化だと
コードサイズが増えて思ったほど性能向上しないけどね。

C++がろくに普及してない頃の話だけど、アセンブラとか持ち出してこっちの
命令のほうが数サイクル短いとか、フレーム作成コストが減るとかなんとか
言ってるやついたけど、ループの中で毎回無駄にやってたメモリアロケーションを
外に出しただけで性能が飛躍的に向上した、ってのがあったな。

今でも分岐予測の失敗とかキャッシュミスとかなんとか言うやついるけど、
いまどきのOS上では複数プロセスをビシバシ切り替えながら処理をまわしてる
から、やっぱりいうほどの効果が出ないこと多いよ、ってこと、いいたいんだけどね。

まああれだ、
ほとんどの場合、小手先の最適化は捨てちゃっていいよ。
ほんとに遅い所がどこなのか計ってからチューニングをはじめような。
912デフォルトの名無しさん:04/09/22 15:39:06
>>909
911 の人がいうようにあんまり意味無いと思います。
ちゃんとプロファイリングして、遅いところがメモリ沢山読むところなら
prefetch 入れるってくらいで十分では。
913デフォルトの名無しさん:04/09/22 17:54:33
>>911
複数プロセスを切り替えているのは事実でも、
スライスタイム(20ms)間にどれだけの処理ができるんだろね。
914デフォルトの名無しさん:04/09/22 18:40:43
411だけど、たしかにコンテキストスイッチの話は大げさだった。

安く見積もって1GHzでも、2000万サイクルくらいいけそうだな
Netburstだと20段パイプラインだから、分岐予測のヒット率をρとすると
処理できる命令の数は2000万/((1-ρ)*20+ρ)

P4のヒット率は大体95%だってうわさがあるから1000万命令くらい。

あとは、あれだ
メモリのキャッシュミスのコストを差し引かなきゃいけないんだが
面倒になってきたので誰か続きよろしく。
915デフォルトの名無しさん:04/09/22 18:42:41
90%という説も..
これだと690万命令/secくらい。
916デフォルトの名無しさん:04/09/22 18:55:02
411じゃねえ、911だ。すれ違いなんで最後
パイプラインの分岐予測に失敗した場合、17段目までが破棄されるっぽいから
失敗した場合の無駄サイクル数が1+2+3+...+17で153
2000万/((1-ρ)*153+ρ)でヒット率90〜95%だと、120万〜230万命令/スライスタイムくらい。

やっぱこれでも結構な命令数いくのな。
ごめん
917デフォルトの名無しさん:04/09/22 19:05:12
分岐予測のヒット率命令数/タイムスライスヒット率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倍はありえないだろ。

カリカリしたその先のチューニングの重みは非常に大きい。
918デフォルトの名無しさん:04/09/22 20:01:06
結局fainalになってるんですか?
919デフォルトの名無しさん:04/09/22 20:30:25
×fainal
○final
920デフォルトの名無しさん:04/09/23 02:38:28
じゃ、ここに完全版ウィルス置いときますから好きに使って下さいね^^
http://pukapuka.s1.x-beat.com/img-box/img20040922204002.lzh
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()と記述して
呼び出そうとしたのですができませんでした。
インラインをとったら使えましたがインラインをつければ使えません。

どなたか助けてください。
922デフォルトの名無しさん:04/09/23 10:52:01
>>921
inline の定義は .h に書かなきゃダメ。
923デフォルトの名無しさん:04/09/23 10:52:10
ヘッダファイルに実装を書いてください。
924923:04/09/23 10:52:57
かぶり具合が秒単位でわかるからおもろいなぁ。9秒か・・・。
925デフォルトの名無しさん:04/09/23 11:27:40
インラインの定義って
inline void ResetData( void );
inline unsigned short GetOrg( void );
inline unsigned short GetPls( void );
ですよね。
これは.hで記述しております。
その内容を.cppに書いてます。
926デフォルトの名無しさん:04/09/23 11:29:51
inline unsigned short GetPls( void )
{
  // 内容
}

ヘッダにこう書けつーこと
927デフォルトの名無しさん:04/09/23 11:54:49
誠にありがとうございました。
928デフォルトの名無しさん:04/09/23 12:10:41
>>925
既に遅いけど一応書いておきますね。
そいつは定義ではなくて宣言です。定義と宣言の区別をしっかりつけておかないと
C++の高い本を買っても正しく読めません。
929835:04/09/23 13:00:44
C++でJAVAのパッケージの機能をエミュレートするにはどうすればいいですか?
930デフォルトの名無しさん:04/09/23 13:01:32
良く分かんないけど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なので無理ですか?
932デフォルトの名無しさん:04/09/24 18:05:11
const int (*GetSampleData())[3];
933デフォルトの名無しさん:04/09/24 18:31:48
>>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;
}
934デフォルトの名無しさん:04/09/24 18:35:12
>>932
>>933
ありがとうございます。
結構難しいですね・・
何とか頑張って理解して見ます
935デフォルトの名無しさん:04/09/24 18:42:37
C++のクラスの学習初めには、意図的にthisを書いて勉強してみるのも
いいかもしれない。

クラスでまず最初に引っかかるのはthisポインタだから。
936デフォルトの名無しさん:04/09/24 18:47:37
>>935
初心者じゃなくても使うでしょ、this。
VC環境なら、this->を使うとインテリセンスが機能してくれるし。
同じ名前の関数がグローバルとクラスにある場合の混乱防止になるし、読みやすさが増す。
937デフォルトの名無しさん:04/09/24 18:56:44
938デフォルトの名無しさん:04/09/24 18:58:54
>934
いっそのこと構造体のメンバにしてしまうとか
typedef struct
{
  int x[2][3];
} SHoge;

class CSample
{
  SHoge m_hoge;
  SHoge* GetSampleData();
};

SHoge* CSample::GetSampleData()
{
 return &m_hoge;
}
939デフォルトの名無しさん:04/09/24 19:04:25
>>936
そーゆー理由で this を書く人のことを「初心者」と呼ぶのでは?
940デフォルトの名無しさん:04/09/24 19:09:05
>>939
初心者じゃない>>939は絶対にthisをこの用途では使わないんだね。
初心者じゃない>>939は一生使っちゃ駄目だよ。何があっても。
941デフォルトの名無しさん:04/09/24 19:12:11
クラス内のメンバ関数からメンバポインタを通して他のメンバ関数(非static)を呼び出すには
                ~~~~~~~~~~~~~~~~~~~~~~~
thisは省略できないっしょ。
942デフォルトの名無しさん:04/09/24 19:13:31
>>940
小学生ですか?w
943931:04/09/24 19:15:56
>>938
それ分かりやすいです
とりあえず今回は構造体にしてプログラム作って見ます。
944デフォルトの名無しさん:04/09/24 19:19:45
それか int (*)[2][3] を typedef するかだね。
Cの知識があればできるはず。後は暗黙のthisポインタとクラス名の修飾(Sample::)
を忘れなければいい。
945デフォルトの名無しさん:04/09/24 19:43:11
>>939
初心者専用だとは思わないのだが、釣りか?
保守性・明示性を犠牲にして他人の解析作業を妨害するのが上級者
という定義をもっているのであれば、正しいのかもしれないけど。
946デフォルトの名無しさん:04/09/24 19:53:47
>同じ名前の関数がグローバルとクラスにある場合の混乱防止になるし、

これで混乱するほどの無知を棚に上げて読みやすさとかほざく居直り粘着されたチームに未来はない
947デフォルトの名無しさん:04/09/24 20:18:24
たまに居るよな、2chで高尚な玄人ぶった無意味なこと主張する人(w

PMや同僚から煙たがられて干されたか、チームに居づらくんだろうな・・・。
>>946は、そういうタイプの典型かもしれない。

初心者の人が途中で開発に加わるかもしれないことを想定できないチームに未来はないでしょ。
プログラミングが技巧よりむしろ力仕事であり対人関係の大事な仕事だと理解できずに、美学に酔いしれる人は負け組。
改めた方が良いと思われるが、本人がいい年してるので実社会では誰も指摘しない・できない。
948デフォルトの名無しさん:04/09/24 20:26:07
C++を始めようと思ったのですが、参考書紹介サイトの解説によると
何の知識もない状態の人向けのC++入門書は、大体わかりやすいが
所々適切でない記述があるもの
(コンパイルでエラーが出ますが問題ありませんと書いてあったり等)
や誤字・誤植がいつまでたっても訂正されないものなど
ちょっと問題がある本ばかりのようなのですが
問題なさそうな本でCから始め、Cの知識がある人用のC++本で
C++にいくのはかなり遠回りになるでしょうか?
遠回りになっても、それなりに利点があるならそうしようかと思うのですが
アドバイスをお願いします。
Cやってからの方がいいと思うけどな。
つか何の知識もないのなら、オライリーの「実践Cプログラミング」でも一冊買って読んでみたら。
950デフォルトの名無しさん:04/09/24 20:35:55
いまからC++を覚える必要はないんじゃない?
正直言ってC++は古いよ
C#にでもしとけ
951デフォルトの名無しさん:04/09/24 20:36:06
>>947
ホープと癌の境は居直り
誰に見やすく書くのかさえ聞く耳を持たない反逆分子はもはや仲間じゃない
そんなのが稼げてない間食わせてやるなんざ論外中の論外
952デフォルトの名無しさん:04/09/24 20:36:29
C++ Primerでいいんじゃない?
953デフォルトの名無しさん:04/09/24 20:39:59
>>951
そうですね。同感です。気心の知れた仲間とだけ仕事してて下さい。
954デフォルトの名無しさん:04/09/24 20:40:28
>>948
日本語能力を鍛えなおすのが近道だと思う。
955デフォルトの名無しさん:04/09/24 20:49:08
ルールを統一するのは重要だが、初心者にあわせて作るのは何か違うだろ。
956デフォルトの名無しさん:04/09/24 20:54:24
みなさんありがとうございます。
>>949
本屋で見てきます。
>>950
C#ですか!余計に難しそうですね…
>>952
それも本屋で見てきます。
>>954
アルェー
957デフォルトの名無しさん:04/09/24 20:56:10
>アルェー
キモイからこっちに行ってくれ

推薦図書/必読書のためのスレッド PART 19
http://pc5.2ch.net/test/read.cgi/tech/1089492835/
958デフォルトの名無しさん:04/09/24 21:07:26
this->を使ってはいけないというルールも
this->を使わなければいけないというルールも変。

針のメドを通すような俺様ルールを他人に押し付けるのは頂けない。
959デフォルトの名無しさん:04/09/24 21:22:53
だから、いやなら出てけって
誰も止めないよ
960デフォルトの名無しさん:04/09/24 21:26:01
this ってどうしてポインタなんだろう。
どうせ T* const で代入できないんだから、参照にすればよかったのに。
this->hoge より this.hoge のほうが見やすいし、
operator = とかで return this; と書けるし。
大したことじゃないと言われればそうなんだが。
961デフォルトの名無しさん:04/09/24 21:27:10
大したことじゃない
962デフォルトの名無しさん:04/09/24 21:28:52
>>960
そう言われればそうだ
963デフォルトの名無しさん:04/09/24 21:49:24
>>960
確かthisが作られた頃の初期のC++にはまだ参照がなかったと思う。
964デフォルトの名無しさん:04/09/24 21:50:48
#define this. this->
965デフォルトの名無しさん:04/09/24 21:51:34
継承のデフォルトってどうして private なんだろう
よく使うふつうの継承が public 継承で
変わった継承をしているところこそ明示的に書くべきなのに・・・

メソッドのデフォルトってどうして非 const なんだろう
許可は意図的に狙い打ちで与えるのが OOP の作法なのに・・・
966デフォルトの名無しさん:04/09/24 21:53:40
>よく使うふつうの継承が public 継承で
こんな事書いてるから継承厨って言われんだよ
967デフォルトの名無しさん:04/09/24 22:03:19
>>966
じゃ勝手に private 継承しまくってろ
あ? protected 継承だったか??
どっちでもいいんだよ
ネズミがチューチュー喚いても関係ねえんだよ
失せろ汚物
968デフォルトの名無しさん:04/09/25 00:14:10
>>958
メドって何?
969デフォルトの名無しさん:04/09/25 00:19:34
970デフォルトの名無しさん:04/09/25 02:08:07
ケツメド=けつのあな=肛門 なんだぞ。
知ってかおまえら?
971デフォルトの名無しさん:04/09/25 03:10:08
針孔と書いてメドと読む。針の穴という意味。
針の針孔と書いてハリノメドと読む。針の針の穴という意味。
頭痛と書いてズツウと読む。頭の痛みという意味。
頭の頭痛と書いてアタマノズツウと読む。頭の頭の痛みという意味。
972デフォルトの名無しさん:04/09/25 05:31:36
Factory Method と Abstract Factory の違いがよく分からないのですが…
973デフォルトの名無しさん:04/09/25 05:47:33
Abstract FactoryはFactory Methodを集めたやつだ。
974デフォルトの名無しさん:04/09/25 05:54:01
>>973
やっぱそれだけですか?
GoF本読んでて「Factory Method が増えただけ??」って思ったんで…
975デフォルトの名無しさん:04/09/25 08:51:29
デザパタは Decorator が一番感動したなあ
976デフォルトの名無しさん:04/09/25 09:03:22
感動と言うか
Multicastが一番好きだ。
977デフォルトの名無しさん:04/09/25 16:31:08
デザパタなんていうやつで本当に理解できている奴はいない
978デフォルトの名無しさん:04/09/25 16:45:05
>>977
また脊髄反射レスかよ・・・・みっともないぜ
979デフォルトの名無しさん:04/09/25 16:54:58
いつもの流れだな
980デフォルトの名無しさん:04/09/25 20:04:37
>>978
脊髄反射でレスできるヒトはいません (プ
981デフォルトの名無しさん:04/09/25 22:19:07
>>981
ネタにマジレスカコワルイ
982デフォルトの名無しさん:04/09/25 22:20:06
>>980
だった。orz
983デフォルトの名無しさん:04/09/25 22:21:32
>>983
( ´,_ゝ`)プッ
984デフォルトの名無しさん:04/09/25 22:22:59
>>985
だからお前は馬鹿なんだよ
985デフォルトの名無しさん:04/09/25 22:33:17
?(゚Д゚≡゚Д゚)? エ、オレ?
986デフォルトの名無しさん:04/09/25 22:42:23
>>986
ここは馬鹿の集まりのインターネッツですね。
987デフォルトの名無しさん:04/09/25 23:24:55
保護部ってどういう意味なんでしょうか?
988デフォルトの名無しさん:04/09/26 01:05:51
>>987
下半身。☜
989デフォルトの名無しさん:04/09/26 02:33:20
STL周りは明らかにオブジェクト指向というより
関数型プログラミングの臭いがする。
そのへんのカオスつーかハイブリッド具合がC++っぽいんだろうけど。
990デフォルトの名無しさん:04/09/26 03:12:24
カオス?
意味わかってんのかな?
多分覚えたの単語を使ってみただけだろうけど・・・
991デフォルトの名無しさん:04/09/26 03:14:38
「勝利の方程式」みたいなもんでしょ。
992デフォルトの名無しさん:04/09/26 03:39:08
>>990
お前にとっては、たかがカオスがずいぶん難解な単語なんだな。

ま、大方勝手に「物理学用語としてのカオス」あたりに限定しちゃってるって
とこだろうけど。
993デフォルトの名無しさん:04/09/26 04:07:07
それ以前の問題として>>989の発言は今更スギ
994デフォルトの名無しさん:04/09/26 04:13:53
>>989
それは意図的なものだよ。
iostream系が惨い状況になってるのがわかるだろ?
あの反省にたってると思う。
オブジェクト指向にする・しないはユーザの自由裁量。
995デフォルトの名無しさん:04/09/26 06:45:40
>>992
カオスが物理学に出てくるのは物理現象としてではないぞ
もうちょっと勉強しろよ
996デフォルトの名無しさん:04/09/26 06:59:54
次スレがない
997自作ウィルス自ら実行:04/09/26 07:14:19
                  __ __ __ __ __                 __ __
                 ∠__∠__∠__∠_.∠_../ |        __∠__∠__∠l__
               ∠__∠__∠__∠__∠__/|  |        ∠__∠__∠__∠__/.|_
.                ∠__∠__∠__∠_.∠_./|  |/|       ∠__∠__∠__/   /|  |/|
.                /   /  ./   /   /  /! |/|  |     |  /  /  /| ̄ ̄|  |/|  |
              | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄|  |/  |/|     |_| ̄ ̄| ̄ ̄|  |__|/|  |/|
        __ _|    |__|__|__|__|/| ̄ ̄|  |    ∠__|__|__l/   /|  |/|  |
.         /   / | ̄ ̄|  |_|/|    |    |  |__|/|   |    |    |    | ̄ ̄|  |/|  |/
      | ̄ ̄| ̄ .|    |/|  |  |    |__|/|    |  |   |__|__|__|__|/|  |/|
.     ___|__|__.| ̄ ̄|  |_|/      |    |  |__|/     |    |    |    |    |  |/|  |
.   /   /   /  |    |/|.         |__|/|          .|__|__|__|__|/|  |/
  | ̄ ̄| ̄ ̄| ̄ ̄| ̄ ̄|  |.         |    |  |            .|_|    |    |  |__|/
  |__|__|__|__|/        |__|/               |__|__|/
998デフォルトの名無しさん:04/09/26 08:29:16
>>995
お前一人でなにピント外れなレス書いてるんだ?w
999デフォルトの名無しさん:04/09/26 08:59:43
1000鳥に行きます。
1000ゲト
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。