【初心者歓迎】C/C++室 Ver.47【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.47【環境依存OK】 - 暇つぶし2ch960:デフォルトの名無しさん
08/02/04 11:44:37
>>955
コピーコンストラクタ書いてる?

961:デフォルトの名無しさん
08/02/04 11:45:08
a > b であるunsigned int同士の引き算 b - aの動作は仕様によると
どうなるのでしょうか?

それと、ビットシフト演算子が算術シフトか論理シフトになるかどうかは
環境依存であってますか?

962:デフォルトの名無しさん
08/02/04 11:55:12
すみません。windowsXPで、eclipse+CDT+cygwinで勉強しています。
scanfなどで変数値を入力するプログラムを書いたとき、
事前に表示する「数字を入れてください」などの文章が出ず、
scanfに値を入力する待機状態になってしまいます。
どうしたらよいのでしょうか。
すみません。お教えください。

963:デフォルトの名無しさん
08/02/04 11:56:55
>>961
1) b - a + (UINT_MAX+1)
2) 左右シフトともに負の値のシフトに関して未定義。
  いきなりエラーで落ちても文句は言えない。

C規格の専用スレもあるので活用してください。

964:962
08/02/04 12:11:12
すみません。自己解決しました。
putsなりprintfなりを書いた後、fflush(stdout)をしました。
失礼しました。

965:デフォルトの名無しさん
08/02/04 12:17:35
>>963
すばやい回答ありがとうございます。もうひとつ質問がありました。
たびたびすいません。

両方ともunsigned intであるa * bが表現可能な数値の範囲を超える場合、
仕様による動作は未定義であってますでしょうか?

その動作に依存するコードを発見したので、書き直そうかどうか迷ってます。
ただ、画像処理(アルファブレンディング)に関するコードなので、書き直す
と命令数が増大して遅くなってしまうので、躊躇してます。

>C規格の専用スレもあるので活用してください。
初心者お断りと書いてあるのですが、このような質問でも大丈夫
なのでしょうか?

966:デフォルトの名無しさん
08/02/04 12:20:57
>>965
a * b % (UINT_MAX+1)
符号なし整数型の算術演算の結果があらわせる範囲を超えた場合はループする

頭の悪いやつがつけたスレタイを気にする必要はない。

967:デフォルトの名無しさん
08/02/04 12:25:26
>>966
ループするのですね、ありがとうございます。
コード書き直す必要が無いとわかって助かりました。

今度からこのような質問は規格スレに持っていく事にします。

968:デフォルトの名無しさん
08/02/04 12:26:25
>>959
<numeric>ですね。これほとんど使ってなかったんだよな。
恥ずかしいが、自分的にはaccumulateとか知ったからよかったよ。
ありがとう。


969:デフォルトの名無しさん
08/02/04 14:04:32
>>965
そもそもαブレンディングでオーバフローするような数字を扱うわけじゃないだろ。
そこを吟味せずにオーバフロー対策なんて意味ないぞ。

例えば、rgb各8ビットの画像から画素の値を取り出す場合は通常0-255の値域を取る。
そこで、unsigned intのr, g, b, ra, ga, baがあるとしたらr * raは何があってもオーバフローしないわけだ。

970:デフォルトの名無しさん
08/02/04 14:34:43
なんかずれてる気がするんだけどなあ。

971:デフォルトの名無しさん
08/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 になる。
②コンパイラが警告を出す。('mon'に代入した値は使われていない)
どうしたらいいのか教えてください。

972:デフォルトの名無しさん
08/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:デフォルトの名無しさん
08/02/04 17:52:22
>>972
安心した、ありがとうございます。

974:デフォルトの名無しさん
08/02/04 18:03:21
>>969
コードは載せられませんが、アルファブレンディングは

alpha*src + (1 - alpha)*dst

になりますが、そのコードでは一時変数を嫌って、

alpha * ( src - dst ) + dst

になってました。

975:デフォルトの名無しさん
08/02/04 22:20:29
演算子オーバーロードのような感覚で、
クラスのインスタンス名を書いたときに、特定の処理結果を返すようにする方法はありませんか?
具体的には

class ClassA{
int val;
}

ClassA ca;

があったとして

cout<<ca.val;

と書くところを

cout<<ca;

で出来るようにするという事です。
宜しくお願いします。

976:デフォルトの名無しさん
08/02/04 22:22:42
>>975
<<演算子をオーバーロードしろよ

977:975
08/02/04 22:31:18
すみません、<<は確かにそうでした。
条件式に単独で入れたときにvalの値でboolに変換されるようには出来ませんか?

978:デフォルトの名無しさん
08/02/04 22:34:31
bool ClassA::isPlus(){ return val > 0; }
とかじゃだめなん?

979:デフォルトの名無しさん
08/02/04 22:34:45
bool operator !()constと operator void *()constあたりを定義するのが常套手段だが。

980:デフォルトの名無しさん
08/02/04 22:39:46
operator bool をオーバーロードするだけじゃダメなのか?

981:デフォルトの名無しさん
08/02/04 22:40:27
intへの暗黙のキャストが許せるなら、それでもいい。

982:デフォルトの名無しさん
08/02/04 22:54:31
>>980
訳わかんねえことがいっぱい起こるから、やめといた方がいい。

983:デフォルトの名無しさん
08/02/04 23:00:47
0xではこの辺の暗黙的型変換を禁止できるようになるんだよな、たしか。

984:975
08/02/04 23:19:06
変換関数を定義しておけば良いんですね。
そういうものがあるというのは読んだんですが用途まで考えていませんでした…。
>>980の方法で良さそうです。

>>979のoperator void*でも上手くいきましたが
条件式の中身はboolにキャストされると思っていたんですが、
void*でも動くのはどういう意味なのか教えてもらえないでしょうか。

985:975
08/02/04 23:23:45
すみません、>>981以降リロードしてませんでした…。

986:デフォルトの名無しさん
08/02/04 23:26:16
if( x )はif( x!=0 )と等価、というか。
void *m = malloc(len);
if( m ) { return m; } else { abort(); }
みたいな処理ってやったことないの?

987:デフォルトの名無しさん
08/02/04 23:27:42
>>984
982でも書いたが、operator boolのオーバーロードはやめとけ。

ClassA a, b;
int c = a + b;
int d = abs(a);

みたいのがコンパイル通っちまう。
>>979 が常道。

988:975
08/02/05 00:02:09
わかってきました。
条件式に入るクラスは数値かポインタへの変換を持っていれば良くて、
operator void*を定義しておけばそちらに変換されると。
でintからboolよりもintからポインタの方が予期せぬ動作が少ないのでvoid*を使うべきと。
知識が足りてなくてレス読みつつググったりして勉強になりました。
どうもありがとうございました。

989:デフォルトの名無しさん
08/02/05 00:03:21
>>984
ポインタはboolへの暗黙の変換がある。
cinもそれを利用してif(cin)を可能にしている。
その方法が>>979の方式だ。
boolへの暗黙の変換はおすすめできない。

990:デフォルトの名無しさん
08/02/05 00:03:40
>>987
bool 値として使用したいのならそんなもんじゃね?
そうでないならそもそも演算子オーバーロードで解決すべきじゃないと思う。

991:デフォルトの名無しさん
08/02/05 00:23:35
boostは徹底してて、関数ポインタとか返してくるし(w

992:デフォルトの名無しさん
08/02/05 00:31:24
int a = 123;
bool b = !!a;

993:デフォルトの名無しさん
08/02/05 00:33:44
>>991
すごー。でもそのくらいの方が有り難い。
まえに operator bool()を定義してて、コンパイラがブッ壊れたかと思った。

994:デフォルトの名無しさん
08/02/05 00:44:42
>>991
つまり、関数呼べちゃうってことか?
メンバポインタとかの方が良くね?

995:デフォルトの名無しさん
08/02/05 00:48:01
・ ・ ・ ・ ・ ・ ・ ・ 
メンバ関数ポインタだぜ?

そうそう呼べはしないとおもうが。

996:デフォルトの名無しさん
08/02/05 00:49:29
なんだ。メンバ関数ポインタか。
ならいいが。

997:デフォルトの名無しさん
08/02/05 01:19:14
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
スレリンク(tech板)

998:デフォルトの名無しさん
08/02/05 01:20:11
【初心者歓迎】C/C++室 Ver.48【環境依存OK】
スレリンク(tech板)

999:デフォルトの名無しさん
08/02/05 01:22:10
さーて来週のスレは?

1000:デフォルトの名無しさん
08/02/05 01:24:41
お疲れ様でした。次週も環境依存コードをお楽しみください。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch