[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/29 13:41 / Filesize : 252 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者歓迎】C/C++室 Ver.47【環境依存OK】



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

952 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:32:25 ]
初期化されます

953 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:36:09 ]
>>952
ありがとうございます。
かなり時間かけてクラス作ったのにコンストラクタ実行されなかったら泣くところだった

954 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 07:36:14 ]
>>949
本当にそれした方がいいかどうかは分からんね。
どちらにしろ強制的に terminate される状況もあるわけだし、
よほど呼んでもらわないと困る処理は
set_terminate 側で対処した方がいい気もする。

955 名前:951 mailto:sage [2008/02/04(月) 10:45:38 ]
vector使った方が上手く処理できそうなのでvectorを使ってみたんですが、デバッグ
で追いかけてみたところコンストラクタが実行されてません。
もしかしてvectorで確保した場合はコンストラクタ実行されないんでしょうか?

956 名前:デフォルトの名無しさん [2008/02/04(月) 10:49:29 ]
STLのvectorでintとかdoubleなどの値を保持しているとき、それらの和は
どうやって計算するのが一番よいですか?
自分は、boost::lambdaをつかってるんですが、なんかもっと他の書き方が
ありそうな気がして。(自分的にはboostがインストールされてないとダメなのが
嫌なんだけど、和、積、など他の演算にも対応がしやすくていいと思ってる)
int tmp = 0;
for_each(v.begin(), v.end(), tmp += boost::lambda::_1);
ここのスレの他の人のやり方を見せてください。


957 名前:デフォルトの名無しさん [2008/02/04(月) 10:54:39 ]
ふつうは0からv.size()-1まで足すだろ

958 名前:デフォルトの名無しさん [2008/02/04(月) 11:24:24 ]
>>957
そうか、、、。
そういわれると、そういう気もする。
なんだか956が恥ずかしいな。わすれてください。


959 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:29:25 ]
しかもSTLにあるしなw
tmp = accumulate(v.begin(), v.end(), 0);

960 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 11:44:37 ]
>>955
コピーコンストラクタ書いてる?



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<252KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef