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

C++相談室 part9

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
現在最高のプログラム言語と言われるC++についてのご相談承ります。
(´∀`).。o(関連URLは>>2-5の辺り)
0369デフォルトの名無しさんNGNG
>>368
> #end

さらしあげ
0370364NGNG
ようわからんが、
複数行に渡るコメント/**/
は""の中にあるかも判断すると
コンパイラ作るのが面倒になるから
単純に最初の*/で判定してるってことで納得しました。
0371デフォルトの名無しさんNGNG
//a.h
#ifndef __A__
#define __A__
int getvalue();
#endif

//a.c
#include "a.h"
int getvalue() { return 0; }

//main.c
#include "a.h"
int main() {
return getvalue();
}

//makefile
main : main.obj a.obj
bcc32 main.obj a.obj
main.obj : main.c a.h
bcc32 -c main.c
a.obj : a.c a.h
bcc32 -c b.c

というふうなプログラムをコンパイルしているのですが、
main.c をコンパイルすると getvalue の宣言がないと警告がでます。
一応実行は出来るようですが、どうすれば出なくなるでしょうか?
0372デフォルトの名無しさんNGNG
>>370
ちげーよ
/*が来るとその後に*/が来るまでは何がこようとすべてコメントとみなして"があっても文字列としてみないだけ。もちろんint i;とあってもそれは単なるコメントと見なす。
0373デフォルトの名無しさんNGNG
>>369 あんたはんはいけずや かなんわ

>>371 extern お使いやす
0374デフォルトの名無しさんNGNG
>>371
とりあえずint getvalue();はint getvalue(void);にしろ
037511NGNG
>>366
なんだそりゃ!!!!
つまり"〜*/〜"は"〜*""/〜"と書けということか
0376デフォルトの名無しさんNGNG
コメントの中身を評価(?)されてしまったら困ると思うのだが・・・
0377デフォルトの名無しさんNGNG
>>371
間違いはなさそうだが、とりあえずプリプロセッサにかけたものをみてみろ。
037811NGNG
>>372
なるほど、よく考えたら当然だ
0379371NGNG
>>373-374
getvalue(void) に直したら extern を付けなくても警告が出なくなりました。
原因はよくわかりませんが。

どうもありがとうございました。
0380364NGNG
>>372
ああ、なるほど!!
/* " */ "
先に/*があるから後の"が無視されて*/が文字列になってないのか。
0381デフォルトの名無しさんNGNG
>>379
まじ!?
結構細かいんだね。BCCって。
プロトタイプの場合、voidをつけないと関数呼び出し時に引数リストをどんなものにしてもコンパイラがエラーを出さないからつけたほうがいいよ。
0382デフォルトの名無しさんNGNG
後の
~~~~?
0383デフォルトの名無しさんNGNG
>>371
C++ なら void 書いても書かなくても同じだと思うけど。
a.c/main.c か。
あと、__A__ とか、インクルードガードに _ 使う人多いんだけど、
いちおうダメだよね。
038411NGNG
>>381
それはCの場合でC++では空の引数リストはvoidと同じ
0385デフォルトの名無しさんNGNG
>>383
何がだめなの?
0386デフォルトの名無しさんNGNG
>>384
.cだからCだとオモタ
038711NGNG
とおもったら>>371はCじゃん!!!1
0388デフォルトの名無しさんNGNG
>>384
いいかげんに名無しに戻ったほうがいいと思うよ。
0389364NGNG
>>382
>後ろの"
/*の後ろの"
0390デフォルトの名無しさんNGNG
__で始まるのは処理系依存の識別子だっけ?
0391383NGNG
>>385
予約されてる識別子。
0392デフォルトの名無しさんNGNG
>>391
__FILE__とかか?
0393デフォルトの名無しさんNGNG
float型の変数の値を標準出力に出力したいのです。
wsprintf でまず変換しようとしましたが、これは整数のみできないようなのです。
方法がありましたらお願いします。
0394デフォルトの名無しさんNGNG
>>393
printf("%f\n",f);
これじゃだめなのか!?
0395デフォルトの名無しさんNGNG
>>393
std::cout << f << std::endl;
じゃないの?
0396デフォルトの名無しさんNGNG
>>394
あ!できました。すごい!!
ありがとうございました。
0397デフォルトの名無しさんNGNG
>>396
あんたがすごいよ
039811NGNG
>>393
>>396
何がなんだか分からん!
0399C厨NGNG
そういえばここってC++スレだったのね(^_^;)
ごめん。スレ立てるまでもない・・・スレかと思っていた。
0400デフォルトの名無しさんNGNG
C厨はこのスレに来ないで。。(;;)
お願い
0401デフォルトの名無しさんNGNG
>>400
ごめん。本当にごめん。
0402400NGNG
いや間違えただけならいいんだ。言い過ぎた。
0403デフォルトの名無しさんNGNG
C++でprintf使ったら駄目ってこと?
0404デフォルトの名無しさんNGNG
>>403
だめじゃない。でもC++らしくない。
0405デフォルトの名無しさんNGNG
>>404
でも
cout << "(" << number << ")" << endl;
っていうようなのはなんとなくダセエ
0406デフォルトの名無しさんNGNG
>>405
そゆときどうしてる?
0407デフォルトの名無しさんNGNG
>>406
fprintfを使っていマス
0408デフォルトの名無しさんNGNG
>>407
わしも。
0409デフォルトの名無しさんNGNG
あるnamespace内にオーバーロードされた複数の同名の関数があって、
そのうちの片方だけをusingすることは可能ですか?
0410デフォルトの名無しさんNGNG
>>405 boost使います。
0411デフォルトの名無しさんNGNG
>>409
usingする方法は分からないのだけれども
インラインのラッパを用意してやれば片方だけ使えるようになるよ
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
できますが、何か? もしかしてパーミッションの問題か?
■ このスレッドは過去ログ倉庫に格納されています