トップページ⇒tech
1001コメント300KB

C++相談室 part9

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
0412デフォルトの名無しさんNGNG
>>411
ありがとう。
0413デフォルトの名無しさんNGNG
>>383
> あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
> いちおうダメだよね。
処理系が予約してるから、ね。俺は一度だけ、標準ヘッダのインクルードガードと
衝突して泣いた経験がある。

ただ VC++ みたく「処理系が勝手に _ 付きのインクルードガードをつける」場合に
は問題ないんじゃない? あれは重複しない文字列 (GUID) 使ってるし。
0414デフォルトの名無しさんNGNG
float,doubleを最高の精度で
文字列にするにはどうすればいいのでしょうか?
0415デフォルトの名無しさんNGNG
ポータビリティ無視なら、BASE64とか使えばいいじゃん。
0416デフォルトの名無しさんNGNG
>>414
もとのデータはそんなに正確なのかい?
0417414NGNG
精度指定はあとから考えようと思うのですが、
まず初めは
float -> string -> float
みたいな処理をしても
一致させたいのです。
0418デフォルトの名無しさんNGNG
>>417
なんでそんなことを?
0419デフォルトの名無しさんNGNG
>>417 それは原理的に>>415のいうようなバイナリのまま保存しなければ無理だと思うよ
0420414NGNG
>>415〜419
ありがとう。がんばってみます。
0421デフォルトの名無しさんNGNG
>>417
float の全ビットパターンについて
sprintf(buf, "%.15g", f1);
sscanf(buf, "%g", &f2);
assert(f1 == f2);
を試してみたことがあるが、NaN,Infを除いて一致したよ。
0422デフォルトの名無しさんNGNG
>float の全ビットパターンについて
スゲー、floatが32bitってことは43億通りになるんかいな?
0423デフォルトの名無しさんNGNG
なにがスゲーんだ???
たいして時間かからないでそ。
0424デフォルトの名無しさんNGNG
>>421
ビットパターンのセットってintとかからキャストしてぶっこむの?
0425421NGNG
>>424
キャストで予期しない変換がおこると嫌なので、memcpy しました。
テストコードはこんな具合っす。

float f1, f2;
for (unsigned long u = 0; u != 0xFFFFFFFF; ++u) {
  int e = (u >> 23) & 0xff;
  if (e == 0 || e == 0xff) continue; // NaN or Inf
  memcpy(&f1, &u, sizeof(f1)); // f1 = *(float*) &u;
  sprintf(.... 以下 >>421 と同じなので略

PenIII 700MHz で2〜3日で終わったよ。
0426デフォルトの名無しさんNGNG
>>425
そんなにかかるのかー。一瞬自分もやってみようとしたけど
それを聞いておいて良かったw
0427デフォルトの名無しさんNGNG
c++に標準で用意されているらしい
複素数ライブラリってどうやって使うんですか?
0428デフォルトの名無しさんNGNG
complexをincludeするんじゃないの?
0429421NGNG
>>426
実際に試したのは sscanf ではなく istringstream 経由の
istream >> float なので、sscanf なら3日もかからず早く終わるかも。
試してみるなら、途中経過を入れておくと良いっす。
if (u % 0x10000 == 0) printf("%08lx,%g", u, f1);

0430421NGNG
ちなみに >>425 のコメントは少々間違っていた。
e == 0 は 0 or Denormal です。
e == 0xff が NaN or Inf です。
0431デフォルトの名無しさんNGNG
423 :デフォルトの名無しさん :02/07/31 17:13
なにがスゲーんだ???
たいして時間かからないでそ。


SETI@home、UDはカレにおまかせ♥
0432デフォルトの名無しさんNGNG
なんで電気代を払ってまで奴らの金儲けに強力せにゃならんのだ
献血と同じで無意味だ
0433デフォルトの名無しさんNGNG
献血は無意味じゃねぇよ
0434デフォルトの名無しさんNGNG
>>433
献血も無意味だよ。
死ぬ奴は死なしておけば良いんだ。
0435デフォルトの名無しさんNGNG
>>434 それはそれなりの主張だと思うけど、
 その主張の先は、
 「じゃキミ生きてなくてもいいよ。キミが生きてる事は俺には無意味だ」
 とか「俺には迷惑だよ」となる
0436デフォルトの名無しさんNGNG

 こ こ は C + + に つ い て

 相 談 す る ス レ で す 。
0437デフォルトの名無しさんNGNG
なぜ下の条件がないと
f1≠f2
になってしまうのでしょうか?

int e = (u >> 23) & 0xff;
if (e == 0 || e == 0xff) continue; // 0 or Denormal or  NaN or Inf
0438デフォルトの名無しさんNGNG
348も355もC++じゃなくってc99じゃねえか。
どっかにC++の規格書落ちてねえのかよ。
0439デフォルトの名無しさんNGNG
>>438
>>5
0440デフォルトの名無しさんNGNG
>>439
それはまずかないですか?
0441デフォルトの名無しさんNGNG
>>427
http://blackphase.hoops.ne.jp/BPProgram/complex.htm
0442デフォルトの名無しさんNGNG
>>440
何故?
0443デフォルトの名無しさんNGNG
>>442
売り物じゃないの?
0444デフォルトの名無しさんNGNG
>>437
NaNもしくはInfの場合は、
f1==f2がfalseになるからではなくて?

ってかNaNかInfの時ってf1==f2はtrue?false?
どっち?
0445デフォルトの名無しさんNGNG
例外がでますた
0446デフォルトの名無しさんNGNG
数じゃないものを比較しちゃいけねえよ
0447デフォルトの名無しさんNGNG
NaNはデータベースでいうところのnullみたいなもんだな
0448デフォルトの名無しさんNGNG
C++の規格書にははっきりとはポインタがアドレスだって書いてないな…
しかし、allocation functionはアドレスを返し、返されたポインタがどうたら
と書いてあるところはある…。
アドレスとポインタを同一視してると思えるような文は所々にあるな。
0449デフォルトの名無しさんNGNG
>>448
なにがいいたいの?
0450デフォルトの名無しさんNGNG
>>449
ポインタはC++ではアドレスなのか。そうでないのか。
規格書の記述ではわかりづらいが前者のようだということ。
0451デフォルトの名無しさんNGNG
>>450
それが重要なの?
0452デフォルトの名無しさんNGNG
>>451
一応ね。人にポインタを説明する時に頻出事項だし。
ぜひ確認しておきたいことではあるね。

ただし、一般にアセンブラなどで使ってる「アドレス」とは
異なる意味でのアドレスだということは確かだな。
ポインタの値はimplementation-definedだとはっきり書いてあるし。
0453デフォルトの名無しさんNGNG
>>450と>>452が矛盾してやしない?
0454デフォルトの名無しさんNGNG
>>453
いや、そう思いやすいかもしれないけど、そうではないと思う。
implementation-definedでかつアドレスなんだと思う。
勝手に処理系がつけた値を「アドレス」と呼んでしまえば、矛盾しない。
言葉の定義の問題だけど。
0455デフォルトの名無しさんNGNG
>>454
implementation-defined は、ようはどう定義しても間違いではないって
意味でしょ?例えば「aが整数だ」というルールがあったときに、
あんたはa=0だと主張しているに過ぎないんじゃない?
0456デフォルトの名無しさんNGNG
>>455
だから、もしも0という言葉が整数全体を表す言葉にも使える
ものだったとしたら(実際は違うけど)OKだよな?

あと、いくらimplementation-defined だと言っても
全く自由というわけではないぞ。当然他の規則と矛盾しない
ようにしなくてはならない。
0457デフォルトの名無しさんNGNG
仮定法過去だね。
0458デフォルトの名無しさんNGNG
>>457
そうだが。
いろいろな記述を見るに、アドレスはポインタだと考えないとつじつまが合わない。
決定的なのはさっきのallocation functionの記述。
それから、constやvolatileに関してはアドレスがポインタだと明記してある。
例えば、allocation functionの説明でもアドレスはポインタだとして
解説してるようだが、それ以外にもconstやvolatileに関してはアドレスが
ポインタだとはっきり明記してある。
この場合は確実にimplementation-definedで、かつアドレスなんだよ。
0459デフォルトの名無しさんNGNG
ん?なんか二度同じことを説明してしまった。スマソ。
0460デフォルトの名無しさんNGNG
>>448
本当に規格書読んだ?
ISO/IEC 14882:1998(E)
5.3.1
2
The result of unary & operator is a pointer to its operand.
0461デフォルトの名無しさんNGNG
>>460
ん?その部分は勿論読んだぞ。
「&はポインタを返す」だろ。
でも、ポインタがアドレスとはその部分だけでは断定できまい。
「&がアドレスを返す」と書いてない以上。
まあ、&は「address-of operator」って名前らしいが…

しかし、それ以外のいろんな記述を見るに、アドレスがポインタらしいと
いうのが俺の意見。
0462460NGNG
アドレスとポインタを混同してたわ。
046311NGNG
>constやvolatile(のT型)に関してはアドレスがポインタ
なだけでその他はそうであるとは限らない。ということだと思いまっせ。
0464デフォルトの名無しさんNGNG
>>463
文脈から見るに、その部分は「〜へのポインタ」という言い方をconstなど
に適用するとどうなるかを説明した文であって、そこだけアドレスがポインタ
だということを説明した文じゃないと思うわけよ。
それに、何度も言ってるように、他でアドレスとポインタを混同したような文がいくつもある。
比較的証拠っぽいのは14.3.2のプログラムのコメントとか、thisポインタが
アドレスだとかな。
046511NGNG
>>464
おおその通りだ。へたうった。例外はメンバポインタの場合だけだ
3.9.3.5 In this International Standard,
the notation {\it cv} (or {\it cv1}, {\it cv2}, etc.),
used in the description of Types,
represents an arbitrary set of cv-qualifiers,
0466デフォルトの名無しさんNGNG
なんとなく、ニュアンス的には、&aがアドレスなのは当たり前の前提事項だから、
適当にアドレスと書いたり書かなかったりしてしまってるように見える。
まあ断定は出来ないけど。
0467デフォルトの名無しさんNGNG
コピペできるpdfがほしい
0468デフォルトの名無しさんNGNG
>>467
% cp foo.pdf bar.pdf
できますが、何か? もしかしてパーミッションの問題か?
0469デフォルトの名無しさんNGNG
pdfコピペできるっしょ?
0470 NGNG
>>468
コピーしているようにしか見えないが、どこでペーストしてる?
0471デフォルトの名無しさんNGNG
>>470
foo.pdf で取り込み(コピー)、bar.pdf で貼り付け(ペースト)では?

# cp コマンドで名前変えて連続コピーってできたっけか?
# シェルスクリプト書く方が早そうだけど
0472デフォルトの名無しさんNGNG
int *i;
と
int* i;
の違いって何ですか?
0473デフォルトの名無しさんNGNG
*の位置
0474472NGNG
・・・・・。
0475 NGNG
>>472
違いはない。書き手のセンスの問題。
0476デフォルトの名無しさんNGNG
int * i;
0477デフォルトの名無しさんNGNG
int/*
Accept: */*
i
;
0478デフォルトの名無しさんNGNG
if (hoge) {

};

とかみたいにブロックの後に ; を付ける人が偶にいますが、
これってどうですか?
0479デフォルトの名無しさんNGNG
意図が見えない。
0480488NGNG
漏れのアクロバットリーダーでは
テキスト選択のボタンが使えなくなってる。なんでだろ。
0481デフォルトの名無しさんNGNG
ちゃんと ISO+IEC+14882-1998.pdf を購入した人なら、>>2 にある
html版の Final draft を使わせてもらってよいんじゃないかな。
つーか、html 化された正式版仕様書ってないの?
ちなみに >>5 にある ansi_iso_iec_14882_1998.pdf は海賊版ぽい。
ダウンロードした人の話では正式版とはファイルサイズが異なるらしい。
0482デフォルトの名無しさんNGNG
(ΦωΦ)フフフ・・・・for_eachサイコー
0483デフォルトの名無しさんNGNG
>>481 プ
ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
それから、なぜ正規購入者でなければwebのFDを利用できないんだ?
頭に虫沸いてない?
0484デフォルトの名無しさんNGNG
>>483
> ISO/IEC 14882は 2.8M 2.1M の2つのタイプが存在するのを知らないのか?
うん、知らない。2.8M のやつってどこが配布してるの? 2.1M のやつとは
何か違いがある?

> なぜ正規購入者でなければwebのFDを利用できないんだ
FD って一般に公開されてなかったと思ったから。実際のところ、FDの
ライセンスはどうなってるの?

上記2点、よければ教えてよ。
0485デフォルトの名無しさんNGNG
俺のは2.72Mだが何か?
0486デフォルトの名無しさんNGNG
structの使い方についての質問です。例えば、
struct A { int i; float f; };のようなstructを定義して、
これをmain()の中で、A *a=new a[10];(あるいは、A a[10];)
として、他の関数の中で使うには、その関数はどう定義
すればよいのでしょうか?void func(A* a[]){}ではダメでした。
ここでいうfunc()の中で、a[5]->iを使いたいのです。
よろしくお願いします。
0487デフォルトの名無しさんNGNG
>>478
struct{
...
};
でセミコロンをつけ忘れないように普段から慣れさせておくため。
0488デフォルトの名無しさんNGNG
>>486
void func(A a[]) ;
とか
void func(A *a) ;
0489486NGNG
自分で解決できました。この場合
void func(A a[10])でいいのですね。
0490489NGNG
>>488さん、ありがとうございます。
そちらのほうが良さそうですね。
a[10]としてしまうのとどう違うんでしょうか。
0491デフォルトの名無しさんNGNG
何故あなたはC++を使うのですか?
0492デフォルトの名無しさんNGNG
>>490
結果に違いはないです。 ないからわざわざ10と書くこたな(略
0493初心者NGNG
ないなら別に10と書いても(略
0494デフォルトの名無しさんNGNG
2文字余計にタイプするだけで指が疲れる。。
0495デフォルトの名無しさんNGNG
>>494
そんなこと言ったら、2chに書き込む方がよっぽど指が疲れるYO!
0496デフォルトの名無しさんNGNG
つか、10個の配列だよ、と断りを入れておけば、9個しか用意しないで呼び出したやつに文句(略
0497デフォルトの名無しさんNGNG
っていうか、C++なんだからvector使えYO!
0498デフォルトの名無しさんNGNG
>>493
C, C++ だと仮引数の配列はポインタに縮退するから、わざわざ a[10] と
書くのは

 誤解を助長してる

としか思えんなぁ。だいたい要素数 10 個の配列にしか適用できない関数って
時点で、何か間違ってるような気がする。

俺なら

1. 構造体にして、そのポインタを引き渡す
2. 要素数も同時に引数として渡す or vector 使う
3. 番兵を使う

どれかにするけどな。
0499デフォルトの名無しさんNGNG
C++初心者です.RECT構造体についての質問です.
RECT myrect;
---------------------------------------------------
myrect.top = 0;
myrect.left = 0;      問題はこの部分です
myrect.bottom = 100;
myrect.right = 100;
---------------------------------------------------
CreateHatchBrush(HS_CROSS,GetSysColor(COLOR_WINDOW));
FillRect(hwnd,&myrect,hbrush);
のようにして,ウィンドウの任意の領域を白紙に戻したいのですが,
RECT構造体(myrect)の(座標の)初期化がうまくいきません.
GetClientRect(hwnd,&myrect);
として座標を取得するしかないのでしょうか?
また,任意の領域を白紙に戻す方法でもっと良い方法があるんでしょうか?
よろしくお願いします.
0500かかしNGNG
あの相談したいことがあるのですか、
ここの掲示板に書くことではないと思うのですがどこに書けばいいか
分からないのでアドバイスをお願いします。

「DevelopperStudio」とは、何のことでしょうか?
探してもさっぱり  (+_+)
皆さん!!この件に関して知っていることがあれば
メールかRe>でお願いします。

@かかし
0501デフォルトの名無しさんNGNG
Developper Studioは探しても見つかりません。
Developer Studioを探して下さい。
0502499NGNG
解決しました.

RECT *root;

void Draw(void)
{
RECT *p = new RECT;
p->top = 0;
p->left = 0;
p->bottom =100;
p->right =100;
root = p;
}
とする事で代入できました.
ポインタを使ってしかメンバには代入できないのですね.
Cでは
RECT myrect;
のように構造体myrectを宣言すれば myrect.メンバ名
もしくは、myrectを指すポインタ->メンバ名
でアクセスできたのと思うのですが.
newもしくはmallocを使ってポインタの指す構造体を直接作らないと
いけないんですねえ.
間違いがあれば指摘お願いします.
0503デフォルトの名無しさんNGNG
&a で渡して、A(*)[10] 型で受け取るようにしたらどうだろう。
要素数を間違えて渡したらコンパイル時に型不一致で引っかかって
くれる。
0504デフォルトの名無しさんNGNG
>>499>>502
いってることがよくわからないんだけど…。
RECTみたいな単純な構造体メンバへのアクセスって別にCもC++もかわらないよ?
0505デフォルトの名無しさんNGNG
メンバ関数のポインタを使ってメンバ関数を呼び出そうとしているのですが、
class Base {
 void Function();
void Main();
 void (Base::*funcPtr)();
};
void Base::Main() {
 funcPtr = &Base::Function;
 (*funcPtr)(); // ここでエラー
}
としても
error C2171: '*' : 'void (__thiscall Base::* )(void)' のオペランドが無効です。
error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。
とエラーが出てしまいます。
メンバ関数を呼び出す際は何か特別な構文などが必要なのでしょうか?
0506デフォルトの名無しさんNGNG
>505
(Base::funcPtr)();
とか
0507デフォルトの名無しさんNGNG
>>505
インスタンスを与えればよい。

class Base {
void Function();
void Main();
void (Base::*funcPtr)();
};
void Base::Main() {
Base b;
funcPtr = &Base::Function;
(b.*funcPtr)();
}
0508デフォルトの名無しさんNGNG
>>506
コンパイル通らないっすよ。
0509デフォルトの名無しさんNGNG
(this->Base::*funcPtr)()
0510506NGNG
>508
コンパイルは通った。リンクで引っかかるんだろ
つか、厨でした。逝ってきます
0511デフォルトの名無しさんNGNG
>>510
うーんコンパイラによるような。
BCC5.6だとコンパイルエラー。「メンバポインタの不正な使用」だとさ。
>>509
なるほど。その手があったか。
■ このスレッドは過去ログ倉庫に格納されています