- 1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 969 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:04:32 ]
- >>965
そもそもαブレンディングでオーバフローするような数字を扱うわけじゃないだろ。 そこを吟味せずにオーバフロー対策なんて意味ないぞ。 例えば、rgb各8ビットの画像から画素の値を取り出す場合は通常0-255の値域を取る。 そこで、unsigned intのr, g, b, ra, ga, baがあるとしたらr * raは何があってもオーバフローしないわけだ。
- 970 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:34:43 ]
- なんかずれてる気がするんだけどなあ。
- 971 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:34:53 ]
- 猫でもわかるC言語プログラミングという本で勉強し始めたのだが、
誤字脱字ありすぎで正直自分が悪いのか本が間違ってるのかコンパイラの問題なのかわからん。 Borland C++ Compiler 5.5 #include <stdio.h> #include <float.h> int main() { double pai = 3.14159265358979; int mon = 2; printf("%d\n", mon = 3); printf("%e\n", pai); printf("%05d\n", mon); printf("%20.18f\n", pai); return 0; } で 3 3.141593e+000 00003 3.141592653589790000 と表示されるらしいのだが、 @二行目が 3.141593e+00 、四行目が 3.141592653589790007 になる。 Aコンパイラが警告を出す。('mon'に代入した値は使われていない) どうしたらいいのか教えてください。
- 972 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:46:50 ]
- >>971
正常。浮動小数点演算は丸め込みとかでコンパイラによって結果が若干変わる場合がある gcc 3.2.2 [FreeBSD] 3 3.141593e+00 00003 3.141592653589790007 bcc32 5.6.4 3 3.141593e+00 00003 3.141592653589790007 cl(VC++) 13.00.9466 3 3.141593e+000 00003 3.141592653589790000 警告はint mon = 2;の後に値を読み出さずに3だを代入してるから出る。基本的に無害。
- 973 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:52:22 ]
- >>972
安心した、ありがとうございます。
- 974 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 18:03:21 ]
- >>969
コードは載せられませんが、アルファブレンディングは alpha*src + (1 - alpha)*dst になりますが、そのコードでは一時変数を嫌って、 alpha * ( src - dst ) + dst になってました。
- 975 名前:デフォルトの名無しさん mailto:age [2008/02/04(月) 22:20:29 ]
- 演算子オーバーロードのような感覚で、
クラスのインスタンス名を書いたときに、特定の処理結果を返すようにする方法はありませんか? 具体的には class ClassA{ int val; } ClassA ca; があったとして cout<<ca.val; と書くところを cout<<ca; で出来るようにするという事です。 宜しくお願いします。
- 976 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:22:42 ]
- >>975
<<演算子をオーバーロードしろよ
- 977 名前:975 mailto:sage [2008/02/04(月) 22:31:18 ]
- すみません、<<は確かにそうでした。
条件式に単独で入れたときにvalの値でboolに変換されるようには出来ませんか?
- 978 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:34:31 ]
- bool ClassA::isPlus(){ return val > 0; }
とかじゃだめなん?
- 979 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:34:45 ]
- bool operator !()constと operator void *()constあたりを定義するのが常套手段だが。
- 980 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:39:46 ]
- operator bool をオーバーロードするだけじゃダメなのか?
- 981 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:40:27 ]
- intへの暗黙のキャストが許せるなら、それでもいい。
- 982 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 22:54:31 ]
- >>980
訳わかんねえことがいっぱい起こるから、やめといた方がいい。
- 983 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:00:47 ]
- 0xではこの辺の暗黙的型変換を禁止できるようになるんだよな、たしか。
- 984 名前:975 mailto:sage [2008/02/04(月) 23:19:06 ]
- 変換関数を定義しておけば良いんですね。
そういうものがあるというのは読んだんですが用途まで考えていませんでした…。 >>980の方法で良さそうです。 >>979のoperator void*でも上手くいきましたが 条件式の中身はboolにキャストされると思っていたんですが、 void*でも動くのはどういう意味なのか教えてもらえないでしょうか。
- 985 名前:975 mailto:sage [2008/02/04(月) 23:23:45 ]
- すみません、>>981以降リロードしてませんでした…。
- 986 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:26:16 ]
- if( x )はif( x!=0 )と等価、というか。
void *m = malloc(len); if( m ) { return m; } else { abort(); } みたいな処理ってやったことないの?
- 987 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 23:27:42 ]
- >>984
982でも書いたが、operator boolのオーバーロードはやめとけ。 ClassA a, b; int c = a + b; int d = abs(a); みたいのがコンパイル通っちまう。 >>979 が常道。
- 988 名前:975 mailto:sage [2008/02/05(火) 00:02:09 ]
- わかってきました。
条件式に入るクラスは数値かポインタへの変換を持っていれば良くて、 operator void*を定義しておけばそちらに変換されると。 でintからboolよりもintからポインタの方が予期せぬ動作が少ないのでvoid*を使うべきと。 知識が足りてなくてレス読みつつググったりして勉強になりました。 どうもありがとうございました。
- 989 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:03:21 ]
- >>984
ポインタはboolへの暗黙の変換がある。 cinもそれを利用してif(cin)を可能にしている。 その方法が>>979の方式だ。 boolへの暗黙の変換はおすすめできない。
- 990 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:03:40 ]
- >>987
bool 値として使用したいのならそんなもんじゃね? そうでないならそもそも演算子オーバーロードで解決すべきじゃないと思う。
- 991 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:23:35 ]
- boostは徹底してて、関数ポインタとか返してくるし(w
- 992 名前:デフォルトの名無しさん [2008/02/05(火) 00:31:24 ]
- int a = 123;
bool b = !!a;
- 993 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:33:44 ]
- >>991
すごー。でもそのくらいの方が有り難い。 まえに operator bool()を定義してて、コンパイラがブッ壊れたかと思った。
- 994 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:44:42 ]
- >>991
つまり、関数呼べちゃうってことか? メンバポインタとかの方が良くね?
- 995 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:48:01 ]
- ・ ・ ・ ・ ・ ・ ・ ・
メンバ関数ポインタだぜ? そうそう呼べはしないとおもうが。
- 996 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:49:29 ]
- なんだ。メンバ関数ポインタか。
ならいいが。
- 997 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:19:14 ]
- 【初心者歓迎】C/C++室 Ver.48【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1202141921/
- 998 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:20:11 ]
- 【初心者歓迎】C/C++室 Ver.48【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1202141921/
- 999 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:22:10 ]
- さーて来週のスレは?
- 1000 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:24:41 ]
- お疲れ様でした。次週も環境依存コードをお楽しみください。
- 1001 名前:1001 [Over 1000 Thread]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
|

|