1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ] スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。 スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/
21 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 22:49:44 ] C言語で 1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた 2 0から1までの間のdouble型の乱数の発生のさせかた を教えてください。rand()関数を使うなどの簡単なプログラムの方がありがたいです。 ググって見たら、整数の乱数の発生させかたは幾つか見つかったのですが 小数の乱数の発生させかたを見つけることができませんでした。 よろしくおねがいします。
22 名前:21 mailto:sage [2007/05/15(火) 22:58:43 ] 書き忘れてました。 毎回同じ乱数で大丈夫です よろしくお願いします。
23 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:46:25 ] >整数の乱数の発生させかたは幾つか見つかった これが分かって、何で >1 -0.5から0.5までの間のdouble型の乱数の発生のさせかた >2 0から1までの間のdouble型の乱数の発生のさせかた これがわかんないんだ? ちょっと考えれば分かりそうなもんだが…
24 名前:デフォルトの名無しさん mailto:sage [2007/05/15(火) 23:54:53 ] 応用力のないゆとり
25 名前:デフォルトの名無しさん [2007/05/16(水) 00:39:24 ] >>21 ゆとり教育の弊害か? こういう調べ方もわからない香具師はなにかに躓くたびに 同レベルの質問するんだろうなw
26 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 00:53:20 ] まあきっとリア消なんだろうと思って免じよう (double)rand() / ((double)RAND_MAX + 1) これで0以上1未満の乱数になる。1を加えなければ、範囲が0以上1以下になる。 あとは0.5を引けばいいだけ。
27 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 01:00:42 ] >きっとリア消 そうかな? 文章の書き方はもう少し上の年齢を感じさせるが。 だからこそ応用できないのが残念というか不思議というか…
28 名前:18 [2007/05/16(水) 01:55:47 ] たぶん、基本的な型変換の知識が欠如してるかと思われます
29 名前:21 mailto:sage [2007/05/16(水) 06:31:24 ] みなさんすいません。つい最近C言語を始めたばかりで何もかもがチンプンカンプンな30歳です。 整数しかなくても乱数の中の最大値で割れば小数に変換できるってことですね(RAND_MAXっていうのは乱数の 中の期待される最大値ってことですよね・・?)。 こんな風にできるのか。勉強になりました。ありがとうございます
30 名前:デフォルトの名無しさん [2007/05/16(水) 06:43:52 ] 1、機能設計 2、関数(クラス)設計 3、実装 4、レビュー 5、1にもどる これを繰り返しやってるんだが効率が悪い気がする なんかいいプログラム方法ってないの
31 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 06:49:36 ] >>30 1. なんとなく実装 2. バグ取り これなら効率よく見えるかい?w
32 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:22:27 ] 作業の合間の2chをなくせば効率は少なくとも5割アップする。 間違いない。
33 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:29:14 ] 今は、2chの合間の作業だからなあ
34 名前:デフォルトの名無しさん [2007/05/16(水) 10:50:43 ] C初心者です。 ググッていたら int PASCAL WinMain なんていうmain関数見つけたのですが、なんでCなのにパスカルなんですか?
35 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 10:54:07 ] >>34 CDECL、PASCAL、STDCALLあたりで調べてみな
36 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 22:48:12 ] #include <stdio.h> int main(void) { int data[ ] = { 7,4,12,71,3,85,69,47,11 }; int i, j=0; printf("prime ="); while(j<10){ for(i=3;i<data[j];i++){ if(data[j]/i!=0) i++; else(data[j]/i==0) printf("%d\n",data[j]); } j++;} return 0 ; } 数字の中から素数を出力するプログラムを作りたいのですけど ステートメントにセミコロンがないとエラーが出てしまいます。 セミコロンは忘れずにつけているはずなのですが・・・ どなたか教えてください。よろしくお願いします。
37 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 22:51:41 ] else(data[j]/i==0)
38 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 22:54:41 ] >>37 理解できました。 /じゃなくて%使わないとだめだったのですね ありがとうございます。
39 名前:デフォルトの名無しさん mailto:sage [2007/05/16(水) 22:58:09 ] それでいいんなら構わないんだけど・・・
40 名前:デフォルトの名無しさん mailto:sage [2007/05/17(木) 10:29:49 ] >>36 一応マジレスしておくと、慣れない内はif, for, whileなどには必ず{}をつけるようにした方がいいぞ。 それと、{}の位置は対応が見つかりやすい位置に揃えておくこともね。
41 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 04:38:09 ] 以前、Visual Studioの6.0を使っていたのですが CDが無くなって見つからなかったせいもあり、 せっかくだから新しいのを買おうとVisual Studio 2005を買ってきたんです。 ところが、簡単なプログラムを組んで知人に渡すと 「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。」 と出て、実行できないとのことなのです。 調べてみると、VCの新しいランタイムを入れなければいけないとのこと。 VC++6の頃は、こんなのが出た記憶がなかったのですが、 それは、VC6が古かったのでランタイムが既に入っていただけなのでしょうか? 大半の人がランタイムを入れないと動かないというのは、好ましくないのですが 2005を使う利点というのは、どの程度あるのでしょうか? 単にフリーソフトを作って配布するだけならば、VC++6でも十分なのでしょうか? また、持ってないのでなんともいえないのですが、VS2003についてはどうなのでしょうか? 場合によっては、2005を誰かにでも売って、2003を買ってくるなり VC6をもう一度探してみるなどの手段を講じようと思っております。 どなたかよろしくお願いいたします。
42 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 05:28:33 ] >単にフリーソフトを作って配布するだけならば、VC++6でも十分なのでしょうか? Yes つーか俺は VS2003proとか持ってるけど、 未だにC++は VS6.0でやってる メインの開発マシンが pen3 1GHzのノートだってのも理由だけど
43 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 10:08:05 ] 2005はランタイムにDLLを使うのが初期設定になっただけで、 プロジェクトオプションをいじれば、 従来どおりラんタイム (CRT)を静的リンクしてEXE内に含めることも可能。 .NET 2003のデフォルトは静的リンクだが、 動的リンクした場合は、やはり2005同様ランタイムを別途入れないといけない。 6では静的リンクがデフォルトだったと思うが、 動的リンクしても、ランタイムのmsvcrt.dllが殆どのWindowsで初めから入っているため問題になりにくい。 いずれにしても、ランタイムのDLLをEXEと同梱して同じフォルダにおいても使える。 2005はマニフェスト書かないといけないから若干面倒だけど。
44 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 13:53:17 ] 静的リンクで、サイズがあまり大きくならなければ EXE内に含んでしまうのも手ですね… VC6のときは、そういった問題が起こらないのもそういう理由だったのですね。 それにしても…全然VC6でも未だにいけるんですな。 何のために2005買ってきたんだろう… 2005だとこれがいい!とか、これがあるから2005にしとけ! っていうのはあります?
45 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 14:10:32 ] すばらしいC++/CLIが使用できます!
46 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 15:57:41 ] テンプレートやそれを使うライブラリ(Boostなど)がまともに使えるようになる。 (たしか2002と2003の間に越えられない壁) あとは最適化の能力も着実に上がっている。
47 名前:デフォルトの名無しさん mailto:sage [2007/05/19(土) 17:45:35 ] 古いMFCって色々バグなかったっけ
48 名前:デフォルトの名無しさん mailto:sage [2007/05/20(日) 19:33:33 ] >>44 VS6の場合、WinXPから実装されたような新しいAPIはヘッダにない 有名だけど、VS6のSTLはバグあり
49 名前:44 mailto:sage [2007/05/20(日) 22:14:08 ] >>45-47 単語を元に色々見てみました。 バグや最適化のことも考えて2005のライブラリ同梱でいこうと思います。 せっかく買ったことですしね。 C++/CLIについては、今やってるものが終わったら 一旦勉強してみたいと思います。 どうも昔ながらのBASICやらCが染み付いてしまってるので なじめるか心配ですが・・・・ ありがとうございました!
50 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 01:03:52 ] UTF-16LEでかかれたファイルを1行ずつ読み込んで処理したんです。 std::wstringをつかってどうにかできませんか
51 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 01:17:46 ] >>50 ×処理したんです ○処理したいんです。 orz
52 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:26:16 ] >>50 お前の使うCPUがリトルエンディアンで、 お前の使う処理系でのwchar_tがUTF-16なら、 std::wifstreamでバイナリモードにすれば大抵上手くいくと思う。
53 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 18:54:20 ] こんにちは。 大量の浮動小数データをCSV形式でファイルに出力する必要があるのですが、 文字列の生成に時間がかかってしまい困っています。 出力する必要のある浮動小数データ数は5憶個くらいです。 sprintfとstrlenで時間がかかるのはわかるのですが、 何か良い方法はないものでしょうか? --- char buf[4096]; DWORD temp; for (int i = 0; i < 100; i ++) { // 行番号の出力 sprintf(buf, "%.3f,", 値); // 各列の値出力 for (int j = 0; j < 100; j ++) { sprintf(buf+strlen(buf), ",%.14f", 値); } // 改行コード strcat(buf, "\n"); // ファイル出力 WriteFile(m_hFile, (LPVOID)buf, strlen(buf), &temp, NULL); } --- #bufサイズの件については考えていません。
54 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 19:02:02 ] ループ中のstrlenを止めるだけで結構変わる悪寒
55 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 19:16:10 ] >>53 出力サイズ(=buf内の文字列長)を常に保持するようにすればstrlen()は全く要らなくなる。 #それでどれだけ速くなるかは知らんが。 寧ろ、もそっとこまめにWriteFile()した方が速くないかい?
56 名前:55 mailto:sage [2007/05/25(金) 19:16:51 ] あー、最後の一行無視しておいて。
57 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 19:33:20 ] >>53 strlenやめたコードで16MBくらいのデータを出力してみたが、 ぶっちゃけHDDの速度に依存してる感じだ。w あんまりかわらんね。
58 名前:デフォルトの名無しさん mailto:sage [2007/05/25(金) 19:44:13 ] >>53 散々言われているがファイルの書き込みを考えたほうがいい メモリマップドIOにするなり別スレッドで書き込むようにするなり
59 名前:53 mailto:sage [2007/05/28(月) 12:02:35 ] 皆様有難う御座います。 文字列の長さを変数に保持して、新たに追加された文字列分だけ strlenするようにしても対して効果はありませんでした。 #皆さんの答えで一つわからなかったのですが、 #sprintfで何文字で出力されるかわからないので完全にstrlenを #除去出来ないですよね? プロファイルを取って調べた処、7割の時間をsprintfで 消費している事がわかりました。 数値を文字列に高速に変換する方法などあれば解決しそうですけど なかなか考えつきませんね。。
60 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 12:17:03 ] >>59 少しは調べる努力もしよう。 -- from MSDN >戻り値 >書き込まれた文字数を返します。 -- from www.linux.or.jp >返り値 >成功時には、上記の関数は書き込まれた文字数を返す (文字列の最後を示すために使用する `\0' は数に含まれない)。
61 名前:デフォルトの名無しさん mailto:sage [2007/05/28(月) 12:28:24 ] >>53 今ちょっと実測してみたんだけど、数値の範囲にも拠るけど 桁数が増えるとパフォーマンスにかなり影響する。 %.14fを例えば%.13fや或いは%.14gに変えられないの?
62 名前:デフォルトの名無しさん mailto:sage [2007/05/29(火) 10:08:31 ] まあsprintfの戻り値使えばstrlenはいらないけど、たいした節約にはならんような。 自前でftoa()でも作ってしまうとか。 10^n掛けていって整数部分を取るような。
63 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 02:14:35 ] Cの場合は void 関数名(void); じゃないと警告出ますよね C++の場合 void 関数名(); で、警告出ないんですけどvoidは入れた方が良いんですか?
64 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 02:20:12 ] >>63 C++の場合はvoidを書かなくても書いた場合と同じとなってますが、 Cとの互換性を考えるなら書いた方がいいかもしれません。
65 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 07:46:02 ] >>64 分かりました。ありがとうございます。
66 名前:53 mailto:sage [2007/05/30(水) 13:56:24 ] sprintfの戻り値が出力数とは目から鱗でした。 最終的にstrlenの除去と、出力を%.7fにする事で 文字変換のコストを10%程度削減出来ました。 ファイルへの出力も逐次出力するのをやめた所 全体で30%程度処理時間を短縮する事が出来ました。 皆さんありがとう御座いましたm(__)m
67 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 21:54:37 ] 誰か教えてくれ。 次のようなコードをたまに見るんだけど、なんか意味はあるのだろうか。 for (int i = 0; i < 3; i++) { swtich (i) { case 0: printf("%d\n", 2); break; case 1: printf("%d\n", 3); break; case 2: printf("%d\n", 5); break; } } 単純に逐次処理で printf("%d\n", 2); printf("%d\n", 3); printf("%d\n", 5); としたほうが分かりやすいと思うんだけど。
68 名前:デフォルトの名無しさん mailto:sage [2007/05/30(水) 23:11:35 ] 書いた本人は、処理の数が膨大な数になり且つ、もしcase以降の処理の順番を入れ替える事態が発生した時の 保守のし易さにでも重点を置いたんだろう。 あんたの見たその時の状況を知らないからなんとも言えないが、もし枝分かれが指折り数えるくらいなら意味ないね。
69 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 03:48:55 ] 上の質問と被ってしまうような気もするけど・・・気にしない。。 switch(CHECK) { case 1: break; case 2: break; } これを switch(CHECK) { case MENU: break; case END: break; } こういう風にしたいのですけどCHECKの型を何にしたら良いのでしょうか
70 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 06:41:09 ] int
71 名前:デフォルトの名無しさん [2007/05/31(木) 07:27:36 ] すごいくだらない質問なんですが、 CをどこまでやったらC++に移っても問題ないのでしょうか? 入門書を一通り終えたらC++に行っちゃって大丈夫なんですか?
72 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 07:40:47 ] >>66 ていうかさ、なんでstdioを使わないでAPIを直接使ってるの? 初心者にありがちな間違いだけど 「FILE*を使うと直呼び出しに比べてオーバーヘッドがある」という点より 「FILE*を使うと内部でバッファリングしてくれるので呼び出し回数が減り、結果的に速くなる」 というのが正しいから。 ファイルマッピング使っても、本質は同じ。 もちろん、ディスクアクセスがunmap時のみに出来る(量)なら充分だけど そうでなければ、結果的にシステムコールを減らせるほうが速いから。 setvbufを使ってもいいし。 sprintfの戻り値の件もそうだけど、知らないで思い込む(=調べない)と損だよ。
73 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 09:48:11 ] >>69 enum の出番だ まあ>>70 の通りだ
74 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:49:13 ] ちょっと疑問なのですが、 char *str = "ABCDE"; のような宣言のとき、 "ABCDE"という文字列がstrに入った☆ なーんて説明されたんだが、既に納得がいかない。 ・str自体は、先頭の'A'のポインタが入ってるはず。 ・char型を5個連続で確保できる保障なんてあるのか? ・無かった場合、どっかのデータ壊すんじゃないのか? ・何か俺勘違いしてるのかな・・・? 教えてくださいエラい人・・・。
75 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 10:53:25 ] >>74 まず、リテラルの"ABCDE"を格納している領域があって、そのアドレスがstrに入るだけ。 char str[] = "ABCDE";だと6個の領域がローカルに確保されてリテラルの"ABCDE"から 内容がコピーされる。
76 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 15:36:13 ] ローカルのは処理系依存だな 単にcharの配列の初期化になるだけとか
77 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 17:15:53 ] >>76 >ローカルのは処理系依存だな 意味不明。
78 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 21:48:06 ] >>75 >>76 ありがとうございました。
79 名前:デフォルトの名無しさん mailto:sage [2007/05/31(木) 23:19:56 ] 質問です。 "<列番>,<行番>,<顧客名>" という形式で入力されるデータを 行列ソートされた状態で変数に格納しようとしています。 map型でキーを2つ使う事は出来るのでしょうか? より簡潔に書ける方法があれば、そちらもご教授願いたいです。
80 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 00:42:12 ] 処理系くらい書けや www.tt.rim.or.jp/~rudyard/torii009.html
81 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 00:54:29 ] >>79 うーむ、mapが一番楽ではないかな。
82 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 12:03:48 ] >>79 std::map<列, std::map<行, 顧客名> > ではあかんの?
83 名前:sage [2007/06/01(金) 15:50:28 ] Windowsのサービスプログラムを作成しています。 Shell_NotifyIconでログインしたときにシステムトレイに アイコンの表示とポップアップメニューでコントロール できるようにしたいのですが、サービスではアイコンが 表示できないようでホトホト困っております。 そもそもサービスからシステムトレイへアイコンを表示する場合は 別のプロセスで行わなければならないものなのでしょうか? ご存知の方、どうぞ教えていただけないでしょうか。
84 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 15:56:11 ] >>83 普通そういう構造にはしないけど、だからってできないことはないと思うが。 もしもログイン時に動かないんであれば、実行時にはまだシェルが起動してなくて Shell_NotifyIcon自体が失敗してんじゃないの?
85 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 16:00:16 ] >>83 >>79 これってどーやったらみんなみたいに青くなるんですか??
86 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 16:05:42 ] >>85 sageはメール欄な
87 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 16:06:23 ] って入ってるじゃねーかw
88 名前:83 mailto:sage [2007/06/01(金) 16:25:42 ] >>84 ATLで雛形を作成していますので、 手動とサービス起動の両方で実行が可能になっています。 それで両方で試してみましたが、手動のほうは問題なく アイコンが表示されましたが、サービスのほうはコンパネより手動で サービスを起動してもアイコンは表示されませんでした。 そこで考えたのがサービス起動のときだけShell_NotifyIconが 失敗しているのではと思ってやってみたら、 サービスのときは「重複した I/O 処理を実行しています。」 というエラーになりました。 エラーの意味が何のことかよくわからないですが やはり、サービスでアイコンを表示するのは無理だったみたいです。
89 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 16:34:50 ] >>88 へんだな。 当然、 デスクトップとの対話をサービスに許可 にはチェック入れてるんだよな?
90 名前:83 mailto:sage [2007/06/01(金) 16:59:40 ] >>89 対話を許可というものがあること自体解からなかったのですが。 チェックを入れたら表示されました。 ありがとうございました。 危うくプロセスを分けてCOMで状態を受け渡す行動に出るところでした。
91 名前:デフォルトの名無しさん mailto:sage [2007/06/01(金) 17:50:58 ] 私と同じことにつまずいた方に サービス登録時にデフォルトでチェックを入れて かつ自動起動にするやり方をあげておきます。 inline BOOL CServiceModule::Install() { ・ ・ ・ SC_HANDLE hService = ::CreateService( hSCM, m_szServiceName, m_szServiceName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS | SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL, szFilePath, NULL, NULL, _T("RPCSS\0"), NULL, NULL); ・ ・ } VSが作成したCreateServiceの引数を変更するだけですが・・・ よかったら参考にしてください。
92 名前:771 mailto:sage [2007/06/02(土) 18:30:00 ] CからC++に移行したと思っています。 CとC++の関数が載っているオススメの書籍を教えて下さい。
93 名前:79 mailto:sage [2007/06/02(土) 22:30:32 ] >>82 上手くいきました。 良い案をありがとうございます。
94 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 19:01:38 ] class A : private B { // 省略 } ; というのは、どういう場合に使うのでしょうか。 AのメンバからしかBはアクセスできないので、 class A { private: B b ; } ; としてしまったほうが、スッキリするような気がするのですが。
95 名前:デフォルトの名無しさん [2007/06/03(日) 20:09:03 ] cin, cout は何の略ですか.
96 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 20:51:04 ] >>94 A has BかA is Bかの違いでしょ。
97 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 20:54:12 ] >>94 とりあえず実際的な理由としては virtual関数をオーバーライドしたいときとか。
98 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 21:34:02 ] >>95 cはconsoleの略 inとoutはそのまま
99 名前:94 mailto:sage [2007/06/03(日) 22:53:19 ] >>96 privateで継承した場合は、 A a ; B& b=a ; ということができないので、 A is B ではなく、A has B になると思うのですが・・・。 Aを外側から見るのではなく、Aの中からAの中を見れば、A is B なのかもしれないけど・・・。 >>97 なるほど、 Aが、Bからのコールバックを受け取りたい場合、 privateで継承してしまえば、 Bにコールバック先のポインタを教えてあげる手間が省けますね。
100 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:06:03 ] Bが純粋仮想関数を持っていれば、継承せざるを得ないわけで。 で、AがBの実装を云々したくなければprivate継承で充分だと。
101 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:12:51 ] でも実際問題private/protected継承なんて使っているところを見たことがない そういうこともできるんだと頭の片隅に留めておけば十分だと思う
102 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:52:32 ] おまえらEffectiveC++くらい読めよ。
103 名前:デフォルトの名無しさん [2007/06/04(月) 00:12:38 ] ググっても質問しか出てこなく、解答が見つからなかったのでここで質問させてもらいます。 1 名前: 名無し 投稿日: 2001/04/15(日) 21:22 下のプログラムは複素数演算のcomplex.hを使用しています。 コンパイルすると、『特化パラメータを指定しないと テンプレート 'complex<T>' を使えない』エラーになります。 特化パラメータって何でしょうか?どうしたらコンパイル通る ようになるのでしょうか。ソースはインタフェース(2001.5)誌の ソースをBCC5.5でコンパイル使用よしたものです。 bcc32 sample.cpp ** sample.cpp ** #include <stdio.h> #include <complex.h> extern int Dka( double *c, complex *result, int n, double eps); main() { } Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland 3aa.cpp: エラー E2102 3aa.cpp 5: 特化パラメータを指定しないとテンプレート 'complex<T>' を使えない エラー E2293 3aa.cpp 5: ) が必要 *** 2 errors in Compile ***
104 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:15:17 ] >>103 当たり前だろデフォルトパラメータがないんだから。 complex<double>とか特化しろって事だよ。
105 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:34:12 ] >>104 #define Complex complex<double> と書いてみたのですが、同じようなエラーが出ました。 ”特化する”ということがよく分からないのですが、 もうすこし詳しく教えていただけないでしょうか……
106 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:41:42 ] それよりはtypedef Complex complex<double>;のほうがいい。 それはともかく、こうしてComplexを用意したものの、 Dkaの宣言がcomplexのままになっているのでは?
107 名前:103 mailto:sage [2007/06/04(月) 00:44:03 ] >Dkaの宣言がcomplexのままになっているのでは? 自分のソースを見たらその通りでした……。 まさか大文字小文字を間違える単純なミスだったなんてorz 何とか解決しました。ありがとうございました。
108 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 01:02:16 ] テンプレートの特化の意味がわからないなら、テンプレートの勉強を すべきだと思う。特にSTLが出すエラーメッセージは常人では解読する 事が不可能な内容である事が多いため、ソースからコンパイルエラーの 原因を追わなければならない。
109 名前:103 mailto:sage [2007/06/04(月) 01:22:28 ] >>108 そうですね。今までもエラーメッセージを解読できなかったことが多かったので、 これを機にテンプレートの勉強をしてみようと思います。
110 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 10:03:37 ] >>100 Aが継承せざるを得ないわけではない。 選択肢は1つではない。 Bを継承したCをメンバに持っても構わない。 >>101 多重継承がgdgdしてくると、privateで継承する必要が出てくる。 そうなった場合、そもそものクラス設計が妥当なのか、 小一時間考えたほうがいいことは言うまでもないが。
111 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 10:07:18 ] >>107 人間はミスをする生き物なので、 1文字違いの識別子を使うのは、 やめたほうがいい。 文字数が多くなっても、 complex_double などのようにしたほうが。
112 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 18:34:15 ] だったらcomplex<double>でいいよという結論
113 名前:デフォルトの名無しさん [2007/06/05(火) 01:59:35 ] C言語でswitch文使うときに、 case 〜〜の〜〜の部分を範囲指定(例えば0 < a && a < 9みたいな)する方法ってありますか? 初めて1ヶ月も経ってなくてスキルはカスですがやらしく教えてください
114 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:13:39 ] ありません。
115 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 02:37:25 ] ありがとうございます。 なんか学校の課題でそういうのやったらポイント高いぜーとか教授が言い出してたんです。 ifとelse if使った関数勝手に作って強引に処理して解決?しました それならswitch使う意味がどこにあるんだって話になるんでしょうけれど・・・
116 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:41:42 ] >>113 switch (a) { case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: 処理; break; } または、 switch (0 < a && a < 9) { case 0: 範囲外の処理; break; default: 範囲内の処理; break; }
117 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 11:34:35 ] >>73 できました!ありがとうございます
118 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 15:47:31 ] >>112 typedefしたほうがいいと思うけどなぁ。 >>116 後者だったら、if文を使ったほうがいいと思うなぁ。
119 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 15:51:24 ] >>118 確かに。 >typedefしたほうがいいと思うけどなぁ。 complex<float>してもエラーメッセージが判りにくいからね。 それが嫌ならtypedefした方がいい。 >後者だったら、if文を使ったほうがいいと思うなぁ。 敢えてswitchを使う理由がなければそう思うよ。
120 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 17:23:07 ] switch文を使うとしたら、 何らかの分類関数を呼ぶことになるかと。 switch(_mbsbtype(pointerToSomeString, idx)) { case _MBC_SINGLE : // 何か break ; case _MBC_LEAD : // 何か break ; case _MBC_TRAIL : // 何か break ; case _MBC_ILLEGAL : default : // ひでぶ break ; } if〜else ifを直に書いてしまうのと、 分類関数を作って一段噛ませるのがいいのかは、 どうなんだろう。 そもそも、教授の発言の背景は何だろう。 switchのcaseに定数しか書けないのは不便だなぁ、条件文が書ける言語もあるのに という愚痴で、何かいい解決法を見つけ出す人がいないかな? と儚い期待をしたのか、 >>116 の前者が可能なことに気がつく人はいるかな? ニヤニヤ ということだったのか。
121 名前:デフォルトの名無しさん [2007/06/05(火) 17:55:58 ] VC++6でATLのスケルトンを作ってNTサービスアプリを開発しています。 とりあえず雛形に手を加えずビルドしただけのもので勉強している 段階なのですが、サービス停止時の動作で コンパネのサービスから停止させた場合は CServiceModule::Handler(DWORD dwOpcode)に SERVICE_CONTROL_STOPイベントが発生するのですが 期待したOSシャットダウン時に発生しないのです。 さらに m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_SHUTDOWN としてみてもSERVICE_CONTROL_SHUTDOWNも発生しません。 イベントの発生の有無はCServiceModule::LogEvent()で吐き出した イベントログで確認しています。 シャットダウン時にSERVICE_ACCEPT_STOPイベントが発生しない原因 について推測でもいいのでご存知ないでしょうか?