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


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

スレを勃てるまでもないC/C++の質問はここで 2



1 名前:デフォルトの名無しさん mailto:sage [2007/05/07(月) 11:02:46 ]
スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。

スレを勃てるまでもないC/C++の質問はここで
pc11.2ch.net/test/read.cgi/tech/1167476845/


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イベントが発生しない原因
について推測でもいいのでご存知ないでしょうか?


122 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 19:15:39 ]
>>121
ATLもMFCも知らないので、適当ぶっこきます。

可能性1
イベントログのサービスが先に終了していて、イベントログに記録されていないだけで、
ちゃんとSERVICE_CONTROL_SHUTDOWNが送られてきている

可能性2
SERVICE_ACCEPT_SHUTDOWNをセットしたつもりが、
ラッパークラスのメンバ変数を書き換えただけで、
OSに対してWin32APIのSetServiceStatusを呼んでいない。

可能性3
シャットダウン時に他のプロセスやサービスが重くて、
サービスのプロセスにSERVICE_CONTROL_SHUTDOWNを送る
時間的な余裕がなく、問答無用で強制終了させられている

可能性4
何らかの原因でサービスのメッセージポンプが止まっていて、
送られてきたメッセージがキューに溜まったまま、消化されてない。

123 名前:デフォルトの名無しさん [2007/06/05(火) 19:57:31 ]
いくつか質問です

#include<stdio.h>
#include<float.h>

int main()

{
double what;
what=3.14159265358979;

printf("もう少し詳しい値は%20.18fです\n",what);

return 0;
}

/*結果は3.141592653589790007になるんだけど、最後の「7」は何か教えて下さい*/

後はborland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。
どうしたらよいのでしょうか?
後、初心者なのでDos形式でがんばってるのですが、これまた閉じるのが早くて自分で打った文字列などが読めません。
exeにしても一瞬で閉じてしまいます。制御するコード(HSPだとstop)みたいなのはないのでしょうか?
回答できる方よろしくお願いします。

124 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:06:13 ]
"丸め誤差"でググれ

125 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:08:28 ]
switch構文じゃなくて
strategyパターンを使った方が良い場合ってどういうときがありますか?

126 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:10:19 ]
>>123
> borland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。

原因も対処方法も見当がついているけど、
自己解決するスキルを身につけて欲しいので、
あえて、詳しい話を聞かせてね。

「何が」閉じるのが早いの?
どうやって実行しているの?


127 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:10:41 ]
丼じゃなくて、
酢飯を使った方が良い場合ってどういうときがありますか?



128 名前:デフォルトの名無しさん [2007/06/05(火) 20:11:17 ]
携帯ですみません
ifの条件文の中に&&や||は使えますか?
学校じゃないから確かめられない

129 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:18:22 ]
家にPCはないのか?

130 名前:デフォルトの名無しさん [2007/06/05(火) 20:22:12 ]
ないです

131 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:24:29 ]
だったらノートPCでもなんでもいいから買えよ
それともかく使えないようにする理由がないから使える

132 名前:122 mailto:sage [2007/06/05(火) 20:36:52 ]
>>121
ちょっと試してみた。

CServiceModule::Init()で、
m_status.dwControlsAccepted = SERVICE_ACCEPT_STOP|SERVICE_ACCEPT_SHUTDOWN;
に書き換えただけで、
CServiceModule::Handler()の、
case SERVICE_CONTROL_SHUTDOWN:
に来たよ。

ただ、イベントログに書き込むのは、最初から試さずに、
CloseHandle(CreateFile("適当なパス\\ServiceControlShutdownに到達したよ.txt", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) ;
とやって、ファイルが作られたかどうかチェックした。

だから、可能性1っぽいよ。


可能性2については、ゴメン。
VC6が生成したコードが、SetServiceStatusを呼んでた。

今回の件には影響ないと思うけど、Handlerが呼ばれた場合には、
ステータスが変化しなくても、必ずSetServiceStatusを呼ぶことになってる。
ところが、VC6が生成したコードは、
case SERVICE_CONTROL_STOP:
でしか呼んでいない。

ついでに、もう一つ。CServiceModule::ServiceMain()の
SetServiceStatus(SERVICE_STOPPED);
LogEvent(_T("Service stopped"));
これは、逆の順序のほうがいいと思う。
というのも、SERVICE_STOPPEDにセットした時点でスレッドが終了して、次の行が実行されないことがあるから。

133 名前:122 mailto:sage [2007/06/05(火) 20:41:24 ]
ちなみに・・・

Win32サービスの作り方を勉強するなら、
そのままの状態で適切に動作するか怪しいVC6のウィザードが生成した雛形よりも、
PlatformSDKとかのサンプルを見たほうが、いいと思う。

さらに、ちなみに・・・
自分も長々と書き込んでおいて言うのもなんだけど、
Win32APIの話は、C/C++の言語自体の話とは違うから、スレ違いだと思う。

134 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:47:20 ]
>>128
> 学校じゃないから確かめられない

学校に通っていて、
いまは学校以外の場所にいるので確かめることができない
ということだと解釈する。

解決案1
次に学校に行ったときに確かめる

解決案2
学校の友人に電話して聞く

解決案3
自宅でも確かめられるようにする



だいたいさぁ、
> 学校じゃないから確かめられない
こんな下らない理由で、見ず知らずの他人を頼るなよ。

何が
> 携帯ですみません
だよ。

んな余計な文を打ち込む暇があったら、携帯で調べろよ。

135 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 20:50:22 ]
スレを立てるまでもないレベルの低い質問のスレではあるが、

ちょっと書いてコンパイルしてみるだけで、
自分でわかるようなことは

レベルが低い質問ですらないから。


ネットの第三者の善意に頼って質問していいのは、
できるだけ努力はしたけど自分にはサッパリわからない
というような場合だ。


136 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 21:23:32 ]
あんまり萎縮するようなことを書くのは、どうかと。

もっと気軽に行こうよ。
小言を言って雰囲気を悪くしたりせず、
だまってスルーすればいいんだよ。

137 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:13:42 ]
ある数の逆数を求めるプログラムで循環小数部を除いて表示させたいのですが
どのような方法があるでしょうか?



138 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:39:47 ]
C/C++言語の質問ではないような。

Cには分数を扱う組込み型がないので、
ちまちまと筆算をシミュレートするとして、
割り算の余りに既出のものが出たら、
その既出のものが最初に出たところが、
循環部のはじまり。

ということでどう?

139 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 22:49:01 ]
配列などは使わないでできますか?

140 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:06:30 ]
ランダムアクセスする必要ないから、リストでできるよ。
配列のほうが簡単だと思うけどなぁ。

141 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:13:53 ]
わかりました
ありがとうございました

142 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:17:05 ]
何桁で循環するかは計算で出せるはずだが。

143 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:47:49 ]
10のN乗を分母で割った余りが1になる場合のNの最小値だったかな。

ちょっとググれば答えが見つかりそうじゃないか?

144 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 23:55:28 ]
10のn乗とかオーバーフローが怖いな
MPFRとか使えってか

145 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 00:05:27 ]
数学屋さんは、
1÷3×3が1になる
という前提で話をするからねぇ。

logとか使われちゃうと、
お手軽なdouble型では、
丸め誤差がアレだし。

だからさ、
ちまちまと筆算をシミュレート
したほうが手っ取り早いと。

146 名前:デフォルトの名無しさん [2007/06/06(水) 00:38:39 ]
>>142
どんな計算法ですか?

147 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 03:10:04 ]
VC++ 2005 Expressを使っているのですが、

#include <stdio.h>

int main(void)
{
char input;

do
{
printf( "input A\n" );
scanf( "%c", &input );
}while( input != 'A' );

return 0;
}

をビルドして実行すると、出力が

Aを入力して下さい
(A以外を入力)
Aを入力して下さい
Aを入力して下さい



と以下のループで”Aを入力して下さい”が二回表示されるのですが、
色々試してみても何故なのか良く解りません。
どうかご教授賜りたく…。



148 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 03:47:37 ]
例えばaを入力してエンターを押すと
バッファに’a'と改行コードが入力される
でscanfはinputに'a'を入力する、このときまだ標準入力バッファに改行コードは残っている
そして次のループではscanfはこのLFを拾ってinputに代入してしまうわけ

解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い

149 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 03:50:11 ]
誤:flush
正:fflush






[ 続きを読む ] / [ 携帯版 ]

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

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