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
925 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:46:48 ] >>923 次の二行を削除(もしくはコメントアウト)してみな fprintf(fp,"%s",shohin[i].name); fprintf(fp,"%d\n",shohin[i].tanka);
926 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:48:33 ] >>924 同じでした・・・
927 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:49:37 ] ,の認識どうなってんだろうね
928 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:50:22 ] >>925 文字化けが消えました! どうもありがとうございました!!!
929 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:52:00 ] >>914 将来の拡張のために ID の範囲は余裕を持っておく ぐらいのことは普通にあるだろ。
930 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:53:40 ] >>928 そうじゃなくて %s でひと続きの文字列として shohin[i].no 以下に格納されてるだけってのを見て欲しい
931 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:04:56 ] 突然ですが、実際のプログラム(main)って、 tryの中にほとんどの記述を入れるのでしょうか。 とある本で例外処理の部分を読んでいる初心者ですが、 この章だけは、mainのほとんど(catch以外)を tryの中に入れてます。だけど、この後の章では ざっと見た限りほとんど入れてないように思います。 例外をことごとく捕まえたいときには、実際の 現実的なプログラムだとどうなるのでしょうか。 先走っているのかもしれませんが気になるので教えてください。
932 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:10:06 ] 例外がキャッチされなかった場合、 自動変数のデストラクタが走る保証はない。 もしそれで致命的なリソースリークが起こるなら、 例外をキャッチするべきなんだろうな。
933 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:10:57 ] 〜皿 只只 只只只只 只只 只只只 | 凸
934 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:13:57 ] エラー処理と復帰処理のできるところで捕まえればいい。 mainの処理全体をtryで囲むのは、例外即終了でおkな場合でしょ。
935 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:15:43 ] >>931 mainでキャッチしても、エラーメッセージ出すくらいしか使い道無くないかな 例外でアプリを落としてもいい場合は、キャッチしなくてもいいかな 落としたくない場合は、落としたくない箇所でキャッチすれば良い。たとえばメッセージループとかかな 質問だけど、DLL書いたとき、エントリのところで例外全部キャッチしたほうがいいかな
936 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:18:34 ] >>934 基本は全部囲っておかないと、 catch 漏れが無いか気をつけないといけなくなる。
937 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 23:41:16 ] >935 まあ、COM入門で出てくる話だが、「例外はDLL境界 超えられないものとして扱うべき」だな。
938 名前:931 mailto:sage [2008/02/03(日) 23:43:24 ] >>932- どうもでした。 mainの中で全部っていうのは、 この本の(この章の)説明の都合なんですね。 こういうことでよろしいのでしょうか。 ・mainの中でcatchしてもエラーメッセージを出すくらいの 処理しかできないので、基本は処理できるところで捕まえる。 ・ただし、catchもれの心配もあるのでmainも全部囲う。 (もしかしてここはプロの方でも人によるとか、、?)
939 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:12:56 ] 例外なんかキャッチしない仕事の人もいるぜ
940 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:17:20 ] >>932 確認させてください。スタックの巻き戻しってのは 例外だろうが何だろうが、スコープを抜けたら 構築済みのローカルオブジェクトは正しくデストラクタ が呼ばれて解放されるんではないんだっけ? これがRAIIを使ったリソース管理のメリットだと 思ってたんだけど。throwされた例外は確実にcatch されないとリークするの? { boost::shared_ptr<Widget>(new Widget); throw Reigai(); } この場合、例外でスコープを抜けても どこかでcatchされないとデストラクタ が呼ばれずに、そのままterminateしてしまう?
941 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:24:00 ] terminate da Human.
942 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:15:31 ] 試したけど本当に呼ばれないな。 そういう規格なんだろうか。 ハーブサッターの本の例外の話は嘘か?
943 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:17:15 ] 例外を捕まえるハンドラがなければ、 throwした時点でterminate呼んでも良いみたいな話?
944 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:25:56 ] 本当だ。 規格に書いてあった。
945 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:29:13 ] >>943 Exceptional C++の例外安全の話 項目13 P53とか ”例外が投げられてスコープから出たときにデストラクタが 呼び出され。。。” って書いてあるから勘違いしてたかも。
946 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:49:51 ] 最終的にどっかでcatchされるという前提なんだろうな。
947 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:05:31 ] しかしわかりにくい。。。 それじゃ、”例外が投げられてスコープから出たときに デストラクタが 呼び出され。。。” じゃなくて、 「その例外がcatchされたとき、。。。」って書けよなあ。
948 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:10:42 ] 本当そう思う。 でもわかって良かった。
949 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:35:22 ] 要するにmainで全ての例外をcacheすればいいってことか。
950 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 02:40:10 ] そういうことになるね。こんな記事見つけた。 Stack Unwinding in the Event of an Uncaught Exception When an exception is thrown and no matching handler can be found for it, C++ invokes the function terminate(). By default, terminates invokes the function abort(). (ここまでは規格の話だろうね) Some compilers guarantee that at this point, the stack has been unwound, i.e., all local automatic objects have been fully destructed, streams have been flushed, and open files have been closed. Other compilers don't unwind the stack in this case. In other words, whether the stack is unwound in the case of an uncaught exception is platform-defined. Therefore, you should check your compiler's documentation to know how it behaves in the event of an uncaught exception.
951 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 04:16:27 ] testというクラスがあって、 test::test(){各変数の初期化}というコンストラクタがあった場合 test *p; p=new test [n]; とした場合も*p[0〜(n-1)]の全てがコンストラクタが実行されて初期化されますか?
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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。