[表示 : 全て 最新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/


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

150 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 05:04:57 ]
だから標準入力はフラッシュしちゃダメだってば。



151 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 05:20:19 ]
>>148
なるほど!良く解ってスッキリしました。
ありがとうございます。


152 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 06:10:46 ]
>>150
そうか、じゃあこういうの用意して
void flush(FILE* in) {
if (in->_cnt == 0)
return;
in->_ptr = in->_base;
*(in->_base) = '\0';
in->_cnt = 0;
}
入力ストリームを使う関数の前でflush(stdin);ってのはどう?
これでも環境依存でやばいかな?

153 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 06:54:35 ]
>>147
思い通りの動きにならない場合は、
デバッガ上でステップ実行して、
何が起きているのか確認するのがいい。

VCのIDEに統合されたデバッガなら、
inputの中身を確認するのも簡単だしさ。


ただし、覚えておいてほしいことがある。
問題の原因を理解せずに、思い通りの動きになるまで、コードを弄り倒す
というのは、やってはいけない。
コード的には間違っているのに、偶然で思い通りの動きになってしまっている
というので良しとしてはいけないから。

たとえば、今回の場合、
あえて酷い例を挙げると、
do
{
char dummy ;
printf( "input A\n" );
scanf( "%c", &input );
scanf( "%c", &dummy );
}while( input != 'A' );
としても、一見、思い通りに動いているように見える。
でも、これは間違っている。

154 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:06:54 ]
>>148
> 解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い

かならずユーザの入力があるまでブロックしたいのなら、それもいいかもしれないが、
先行入力を許したい場合や、ファイルからのリダイレクトを許したい場合に困るよ。

人間がAを押下した後にエンターを押させる
というのが意図した仕様であれば、
人間の入力の単位は1文字ではなく行である
ということなわけだよね。
ということは、それを受け取るプログラム側でも、
1文字ずつ読み取るのではなく、1行ずつ読み取る
ようにするのが自然だと思う。

自分なら、
char input_buf[10] ; /* この長さが適切なのか・・・ */
do {
printf( "input A\n" );
} while((fgets(input_buf, sizeof(input_buf), stdin) != NULL)&&(input_buf[0] != 'A')) ;
という感じにする。

エラーの場合も直進するのが、ちょっとアレだが。

155 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 08:40:15 ]
>>143
たとえば142で割ったとして、各桁の余りは0~141だろ?(24か2.4か0.00024かの違いはあるが。)
ということは最長でも141桁目にはループが現れているはずだ。
よくわからなかったら筆算してみることをお勧めする。

156 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 09:07:49 ]
>>154
ちゅーことは、結局こういう面倒くさい事しないと駄目なのかYp
char* buf = (char*)malloc(sizeof(char) * stdin->_bufsiz);
if (buf == NULL) {
fputs("メモリが確保できなかった", stderr);
exit(1);
}
do {
printf("'A'を入力 : ");
if (fgets(buf, stdin->_bufsiz, stdin) == NULL) {
fputs("終端か、エラー", stderr);
exit(1);
}
} while (buf[0] != 'A');
free(buf);

たかが文字を1文字読むだけなのに…

157 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 09:26:37 ]
関数にしとけばおk

158 名前:121 mailto:sage [2007/06/06(水) 09:29:24 ]
>>122

>>132の方法でSERVICE_CONTROL_SHUTDOWNイベント確認できました。
それとSTOPイベントはシャットダウン時には発生しないのですね。

HandlerでのSetServiceStatusの件は勉強になりました。

このスレを見渡したところ今回の件は確かにスレ違いでした。
NTサービススレで探して無かったのでNTサービススレを立てようかと
思ったのですが、スレ立てるまでもないかと思いここに来ました。
ご容赦してください。

ありがとうございました。


159 名前:122 mailto:sage [2007/06/06(水) 09:46:57 ]
>>158
たぶんWin32APIスレあたりが、良かったと思う。


160 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 09:53:24 ]
>>156
本来やりたい処理だけを書いているうちは明瞭でも、
エラー処理を入れると、途端に、ぐちゃぐちゃになるのは、
しかたないよ。




161 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 21:23:09 ]
FILE *fpとfpb = NULL;
chars,[256]とn[26]
int aとbとc
for(a=0;a<26;a++);{
n[a] = 0 ;
}
if( (fp = fopen("CRed.txt","r")) == NULL );{
exit;}
fp = fopen("Count.txt","w");
while(fgets(s, 256, fp) != NULL);{
fgets(s,256,fp);
for( a=0 ; a<256 ; a++ ){
while( s[a] != '\0' ) {
for(b=0;b<26;b++) {
if( s[a] == b+65 )
{
n[b]++;
break;
}
}
}
}
}
fclose(fp);
fprintf(fpb,"+---+------+");
for(c=0;c<26;c++);
{
fprintf(fpb,"| %c | %4d |","c+65","n[c]");
fprintf(fpb,"+---+------+");
}
テキストの中の文字をカウントするものを組もうと思ったのですがうまくいきません。
素人のソースなのですが、どうかどこが悪いのかお教えください。

162 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 21:26:50 ]
下から三行目の
fprintf(fpb,"| %c | %4d |","c+65","n[c]");

fprintf(fpb,"| %c | %4d |",c+65,n[c]);
でした。

Count内部では、for構文をつかっているのに枠が一つ分しかでなかったし、
しかも、n[c]内部の値が明らかに用意しておいたテキストの中身から考えておかしい数になっていました。
どうやら、表示させるほうもカウントさせるほうも問題があるように考えられますが、
for構文なんかの使い方に問題があるような気もしますが原因がはっきりとはわかりません・・・


163 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:04:33 ]
>>161
まず、本物のソースコードを、そのままコピペすべし。

次に、デバッガでステップ実行すべし。

164 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:08:43 ]
おい、>>123はどうした。

>>126で理解できたか?
返答くらいしる!

165 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:34:14 ]
>>147です。
ポインタの受け渡し等実はまだ良く理解していないのですが、
入力やデバッガやエラー処理の事等色々と勉強になりました。
ありがとうございます。

166 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:46:33 ]
>>163
forまでは変数の宣言なんで、本物ですけど・・・
もしかして、変なこといってますか?

167 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:47:35 ]
>>166
for以降はです。

168 名前:デフォルトの名無しさん [2007/06/06(水) 22:53:37 ]
現在、我流でC言語の勉強してます
教材は 「プログラミング言語C 第二版 ANSI規格 B.W.カーハンニ D.M.リッチー著」 なんですが
なんだか難しくて理解するのに大変です
初心者にお勧めの教材の本ってありませんでしょうか?



169 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 22:57:36 ]
>>166
もう一度確認。
ソースファイルからコピペしたのか?

もし手作業で書き写したのであれば、>>161を読む意味がないんだよ。
なぜかというと・・・それは後で説明してあげるから。

170 名前:デフォルトの名無しさん [2007/06/06(水) 23:00:43 ]
>>168
VC++ Express Editionとかあるんだから、
マイクロソフトプレスで、とっつき易そうなの探してみたら?



171 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:15:51 ]
>>168
その本は俗に"K&R"と呼ばれる尊敬すべき歴史的な本で、今となっては古典です。

C++へのステップとしてCを勉強しようというのであれば、それは無駄が多いです。
Cを習得していない人向けのC++入門書を選ぶことをオススメします。
そういう本を見かけた覚えがあります。

言語の文法を理解しただけでは、プログラムはうまく書けないです。
いちばん実戦的な教材は、上手な人が書いたプログラムです。
プログラムを読んで、何をやっているのか把握したり、
デバッガ上で実際に動かして、ステップ実行で動きを追ったりすると、いいです。
1人のものだけでは駄目で、多くの人のプログラムを読むのが肝心です。

172 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:34:00 ]
もう寝るから、>>161がコピペしたものだとして、間違いを指摘するぞ。

■間違い1  余計なところにセミコロンがある。(2箇所)
{ } は、複数の文をひとまとめにするものであって、
if文、for文、while文の構文の一部ではない。

たとえば、
for(a=0;a<26;a++);{
n[a] = 0 ;
}
というのは、
for(a=0; a<26; a++) {
/* 何もしない */
}
{
n[a] = 0 ;
}
という意味になる。

■間違い2  変数名が間違っている。
fp = fopen("Count.txt","w");
↑これはfpではなくfpbだろう。

■間違い3  whileの条件は実際に実行される
while(fgets(s, 256, fp) != NULL);{
fgets(s,256,fp);

条件文のfgetsはループの先頭で実行されるので、
このように書くと、fgetsを2回呼ぶことになってしまう。


173 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:42:16 ]
■ループではないのにwhile文を使うな(if文を使うべき場所でwhile文を使うな)
while( s[a] != '\0' ) {
このwhileは無限ループするぞ。

■マジックナンバーを使うな

■ファイルに出力する文字列は改行を入れたほうがいいんじゃない?





それから、
学校の宿題なら、宿題スレに行ったほうがいいと思うぞっと。

174 名前:デフォルトの名無しさん mailto:sage [2007/06/06(水) 23:48:12 ]
忘れてた。

ソースファイルからコピペしろ! と言ったのは、
タイプミスが、プログラムが思い通りに動かない原因になりうるから。
1文字違うだけで、プログラムは違う内容になってしまうから。
タイプミスには重々気をつけて、よく見直すこと。


プログラムの実行結果が、
意図したものにならなかった場合は、
プログラムが思い通りに動いてない。

そういう場合は、まず、
デバッガでステップ実行して、
自分が思っていた通りに動いているのか、確認すること。

かなりの問題点は、デバッガでステップ実行することで、発見できる。

175 名前:デフォルトの名無しさん [2007/06/07(木) 01:21:19 ]
catch(...)しているのに例外をcatchできないんですが、
原因は何が考えられるのでしょうか?
スタック破壊でcatchできなくなることあったりするのでしょうか?



176 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 01:34:32 ]
コンパイラおよびコンパイル時のオプション指定にもよる。

177 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 02:29:05 ]
案外、try{}の外で例外が発生していたりして。

再現性があり、デバッガ上で再現できて、
デバッガに、
例外が発生したらcatchされていても構わずブレークする
という機能があれば、それで例外の発生箇所をチェックしてみたらどうでしょう。

案外、別のスレッドだったりして。

178 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 10:56:54 ]
C、及びC++の拡張子はそれぞれ何が標準ですか?
cだとcでc++だとcppでよいのでしょうか?
cxxとかもたまに見かけるのですが。
あとhppってどのようなときに使うのでしょうか?

179 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 13:51:59 ]
>>178
> cだとcでc++だとcppでよいのでしょうか?

ok。

> あとhppってどのようなときに使うのでしょうか?

C++でしか使えないことを暗に示すとか、
.cに対する.cppと対称のほうがカッコイイとか。


180 名前:デフォルトの名無しさん [2007/06/07(木) 14:36:36 ]
ifの中にifは使えますか?



181 名前:デフォルトの名無しさん mailto:sage [2007/06/07(木) 14:42:13 ]
>>180
{ } の中には使えますが
( ) の中には使えません。

182 名前:デフォルトの名無しさん [2007/06/07(木) 17:42:52 ]
とある理由でオンライン対戦カードゲーム(オリジナル)を作る事に決めました。
それで質問なんですが、C++はホスト型の対戦ゲームを作るのには使えるのでしょうか?
ホストの人ににもう一人がIP接続してプレイする感じです。
対応していなければいけねい様なので・・・。






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

前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