スレを勃てるまでもな ..
116:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/05 11:34:35
>>73
できました!ありがとうございます
118:デフォルトの名無しさん
07/06/05 15:47:31
>>112
typedefしたほうがいいと思うけどなぁ。
>>116
後者だったら、if文を使ったほうがいいと思うなぁ。
119:デフォルトの名無しさん
07/06/05 15:51:24
>>118
確かに。
>typedefしたほうがいいと思うけどなぁ。
complex<float>してもエラーメッセージが判りにくいからね。
それが嫌ならtypedefした方がいい。
>後者だったら、if文を使ったほうがいいと思うなぁ。
敢えてswitchを使う理由がなければそう思うよ。
120:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/05 20:06:13
"丸め誤差"でググれ
125:デフォルトの名無しさん
07/06/05 20:08:28
switch構文じゃなくて
strategyパターンを使った方が良い場合ってどういうときがありますか?
126:デフォルトの名無しさん
07/06/05 20:10:19
>>123
> borland社のコンパイラを使っているのですが、閉じるのが早くてエラーの文など読めません。
原因も対処方法も見当がついているけど、
自己解決するスキルを身につけて欲しいので、
あえて、詳しい話を聞かせてね。
「何が」閉じるのが早いの?
どうやって実行しているの?
127:デフォルトの名無しさん
07/06/05 20:10:41
丼じゃなくて、
酢飯を使った方が良い場合ってどういうときがありますか?
128:デフォルトの名無しさん
07/06/05 20:11:17
携帯ですみません
ifの条件文の中に&&や||は使えますか?
学校じゃないから確かめられない
129:デフォルトの名無しさん
07/06/05 20:18:22
家にPCはないのか?
130:デフォルトの名無しさん
07/06/05 20:22:12
ないです
131:デフォルトの名無しさん
07/06/05 20:24:29
だったらノートPCでもなんでもいいから買えよ
それともかく使えないようにする理由がないから使える
132:122
07/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
07/06/05 20:41:24
ちなみに・・・
Win32サービスの作り方を勉強するなら、
そのままの状態で適切に動作するか怪しいVC6のウィザードが生成した雛形よりも、
PlatformSDKとかのサンプルを見たほうが、いいと思う。
さらに、ちなみに・・・
自分も長々と書き込んでおいて言うのもなんだけど、
Win32APIの話は、C/C++の言語自体の話とは違うから、スレ違いだと思う。
134:デフォルトの名無しさん
07/06/05 20:47:20
>>128
> 学校じゃないから確かめられない
学校に通っていて、
いまは学校以外の場所にいるので確かめることができない
ということだと解釈する。
解決案1
次に学校に行ったときに確かめる
解決案2
学校の友人に電話して聞く
解決案3
自宅でも確かめられるようにする
だいたいさぁ、
> 学校じゃないから確かめられない
こんな下らない理由で、見ず知らずの他人を頼るなよ。
何が
> 携帯ですみません
だよ。
んな余計な文を打ち込む暇があったら、携帯で調べろよ。
135:デフォルトの名無しさん
07/06/05 20:50:22
スレを立てるまでもないレベルの低い質問のスレではあるが、
ちょっと書いてコンパイルしてみるだけで、
自分でわかるようなことは
レベルが低い質問ですらないから。
ネットの第三者の善意に頼って質問していいのは、
できるだけ努力はしたけど自分にはサッパリわからない
というような場合だ。
136:デフォルトの名無しさん
07/06/05 21:23:32
あんまり萎縮するようなことを書くのは、どうかと。
もっと気軽に行こうよ。
小言を言って雰囲気を悪くしたりせず、
だまってスルーすればいいんだよ。
137:デフォルトの名無しさん
07/06/05 22:13:42
ある数の逆数を求めるプログラムで循環小数部を除いて表示させたいのですが
どのような方法があるでしょうか?
138:デフォルトの名無しさん
07/06/05 22:39:47
C/C++言語の質問ではないような。
Cには分数を扱う組込み型がないので、
ちまちまと筆算をシミュレートするとして、
割り算の余りに既出のものが出たら、
その既出のものが最初に出たところが、
循環部のはじまり。
ということでどう?
139:デフォルトの名無しさん
07/06/05 22:49:01
配列などは使わないでできますか?
140:デフォルトの名無しさん
07/06/05 23:06:30
ランダムアクセスする必要ないから、リストでできるよ。
配列のほうが簡単だと思うけどなぁ。
141:デフォルトの名無しさん
07/06/05 23:13:53
わかりました
ありがとうございました
142:デフォルトの名無しさん
07/06/05 23:17:05
何桁で循環するかは計算で出せるはずだが。
143:デフォルトの名無しさん
07/06/05 23:47:49
10のN乗を分母で割った余りが1になる場合のNの最小値だったかな。
ちょっとググれば答えが見つかりそうじゃないか?
144:デフォルトの名無しさん
07/06/05 23:55:28
10のn乗とかオーバーフローが怖いな
MPFRとか使えってか
145:デフォルトの名無しさん
07/06/06 00:05:27
数学屋さんは、
1÷3×3が1になる
という前提で話をするからねぇ。
logとか使われちゃうと、
お手軽なdouble型では、
丸め誤差がアレだし。
だからさ、
ちまちまと筆算をシミュレート
したほうが手っ取り早いと。
146:デフォルトの名無しさん
07/06/06 00:38:39
>>142
どんな計算法ですか?
147:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/06 03:47:37
例えばaを入力してエンターを押すと
バッファに’a'と改行コードが入力される
でscanfはinputに'a'を入力する、このときまだ標準入力バッファに改行コードは残っている
そして次のループではscanfはこのLFを拾ってinputに代入してしまうわけ
解決策としてはscanfの前でflush(stdin);でも使ってバッファをクリアするのが手っ取り早い
149:デフォルトの名無しさん
07/06/06 03:50:11
誤:flush
正:fflush
150:デフォルトの名無しさん
07/06/06 05:04:57
だから標準入力はフラッシュしちゃダメだってば。
151:デフォルトの名無しさん
07/06/06 05:20:19
>>148
なるほど!良く解ってスッキリしました。
ありがとうございます。
152:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/06 08:40:15
>>143
たとえば142で割ったとして、各桁の余りは0~141だろ?(24か2.4か0.00024かの違いはあるが。)
ということは最長でも141桁目にはループが現れているはずだ。
よくわからなかったら筆算してみることをお勧めする。
156:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/06 09:26:37
関数にしとけばおk
158:121
07/06/06 09:29:24
>>122
>>132の方法でSERVICE_CONTROL_SHUTDOWNイベント確認できました。
それとSTOPイベントはシャットダウン時には発生しないのですね。
HandlerでのSetServiceStatusの件は勉強になりました。
このスレを見渡したところ今回の件は確かにスレ違いでした。
NTサービススレで探して無かったのでNTサービススレを立てようかと
思ったのですが、スレ立てるまでもないかと思いここに来ました。
ご容赦してください。
ありがとうございました。
159:122
07/06/06 09:46:57
>>158
たぶんWin32APIスレあたりが、良かったと思う。
160:デフォルトの名無しさん
07/06/06 09:53:24
>>156
本来やりたい処理だけを書いているうちは明瞭でも、
エラー処理を入れると、途端に、ぐちゃぐちゃになるのは、
しかたないよ。
161:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/06 22:04:33
>>161
まず、本物のソースコードを、そのままコピペすべし。
次に、デバッガでステップ実行すべし。
164:デフォルトの名無しさん
07/06/06 22:08:43
おい、>>123はどうした。
>>126で理解できたか?
返答くらいしる!
165:デフォルトの名無しさん
07/06/06 22:34:14
>>147です。
ポインタの受け渡し等実はまだ良く理解していないのですが、
入力やデバッガやエラー処理の事等色々と勉強になりました。
ありがとうございます。
166:デフォルトの名無しさん
07/06/06 22:46:33
>>163
forまでは変数の宣言なんで、本物ですけど・・・
もしかして、変なこといってますか?
167:デフォルトの名無しさん
07/06/06 22:47:35
>>166
for以降はです。
168:デフォルトの名無しさん
07/06/06 22:53:37
現在、我流でC言語の勉強してます
教材は 「プログラミング言語C 第二版 ANSI規格 B.W.カーハンニ D.M.リッチー著」 なんですが
なんだか難しくて理解するのに大変です
初心者にお勧めの教材の本ってありませんでしょうか?
169:デフォルトの名無しさん
07/06/06 22:57:36
>>166
もう一度確認。
ソースファイルからコピペしたのか?
もし手作業で書き写したのであれば、>>161を読む意味がないんだよ。
なぜかというと・・・それは後で説明してあげるから。
170:デフォルトの名無しさん
07/06/06 23:00:43
>>168
VC++ Express Editionとかあるんだから、
マイクロソフトプレスで、とっつき易そうなの探してみたら?
171:デフォルトの名無しさん
07/06/06 23:15:51
>>168
その本は俗に"K&R"と呼ばれる尊敬すべき歴史的な本で、今となっては古典です。
C++へのステップとしてCを勉強しようというのであれば、それは無駄が多いです。
Cを習得していない人向けのC++入門書を選ぶことをオススメします。
そういう本を見かけた覚えがあります。
言語の文法を理解しただけでは、プログラムはうまく書けないです。
いちばん実戦的な教材は、上手な人が書いたプログラムです。
プログラムを読んで、何をやっているのか把握したり、
デバッガ上で実際に動かして、ステップ実行で動きを追ったりすると、いいです。
1人のものだけでは駄目で、多くの人のプログラムを読むのが肝心です。
172:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/06/06 23:42:16
■ループではないのにwhile文を使うな(if文を使うべき場所でwhile文を使うな)
while( s[a] != '\0' ) {
このwhileは無限ループするぞ。
■マジックナンバーを使うな
■ファイルに出力する文字列は改行を入れたほうがいいんじゃない?
それから、
学校の宿題なら、宿題スレに行ったほうがいいと思うぞっと。
174:デフォルトの名無しさん
07/06/06 23:48:12
忘れてた。
ソースファイルからコピペしろ! と言ったのは、
タイプミスが、プログラムが思い通りに動かない原因になりうるから。
1文字違うだけで、プログラムは違う内容になってしまうから。
タイプミスには重々気をつけて、よく見直すこと。
プログラムの実行結果が、
意図したものにならなかった場合は、
プログラムが思い通りに動いてない。
そういう場合は、まず、
デバッガでステップ実行して、
自分が思っていた通りに動いているのか、確認すること。
かなりの問題点は、デバッガでステップ実行することで、発見できる。
175:デフォルトの名無しさん
07/06/07 01:21:19
catch(...)しているのに例外をcatchできないんですが、
原因は何が考えられるのでしょうか?
スタック破壊でcatchできなくなることあったりするのでしょうか?
176:デフォルトの名無しさん
07/06/07 01:34:32
コンパイラおよびコンパイル時のオプション指定にもよる。
177:デフォルトの名無しさん
07/06/07 02:29:05
案外、try{}の外で例外が発生していたりして。
再現性があり、デバッガ上で再現できて、
デバッガに、
例外が発生したらcatchされていても構わずブレークする
という機能があれば、それで例外の発生箇所をチェックしてみたらどうでしょう。
案外、別のスレッドだったりして。
178:デフォルトの名無しさん
07/06/07 10:56:54
C、及びC++の拡張子はそれぞれ何が標準ですか?
cだとcでc++だとcppでよいのでしょうか?
cxxとかもたまに見かけるのですが。
あとhppってどのようなときに使うのでしょうか?
179:デフォルトの名無しさん
07/06/07 13:51:59
>>178
> cだとcでc++だとcppでよいのでしょうか?
ok。
> あとhppってどのようなときに使うのでしょうか?
C++でしか使えないことを暗に示すとか、
.cに対する.cppと対称のほうがカッコイイとか。
180:デフォルトの名無しさん
07/06/07 14:36:36
ifの中にifは使えますか?
181:デフォルトの名無しさん
07/06/07 14:42:13
>>180
{ } の中には使えますが
( ) の中には使えません。
182:デフォルトの名無しさん
07/06/07 17:42:52
とある理由でオンライン対戦カードゲーム(オリジナル)を作る事に決めました。
それで質問なんですが、C++はホスト型の対戦ゲームを作るのには使えるのでしょうか?
ホストの人ににもう一人がIP接続してプレイする感じです。
対応していなければいけねい様なので・・・。
183:デフォルトの名無しさん
07/06/07 17:43:52
そういう質問をする時点で前途多難だな・・・
まあキミが希望することは可能
184:デフォルトの名無しさん
07/06/07 18:52:00
.NET remotingのTCPChannel使ってTCP接続でできる
ホスト側にスレッドを持たせてここの接続をそいつらで管理するようにすれば
マルチプレイも可能
185:デフォルトの名無しさん
07/06/07 20:30:48
>>182
#include <stdio.h>
int main(void)
{
printf("%c %c %c %c %c %c\n",110,117,114,117,112,111);
return 0;
}
186:デフォルトの名無しさん
07/06/07 20:52:12
>>185
unsigned long m = 0x00afdeb6 ;
puts(&m) ;
187:デフォルトの名無しさん
07/06/07 22:35:08
>>172-174
遅くなりましたが、ありがとうございます。
小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。
大学に行けば勉強できるのですけど、早くなれて自分で簡単なゲームぐらいは作れるようにしたいので簡単なプログラムでも書いてコーディングの練習をしてみようかなと思ってやってます。
一応、フローチャートは書いておいたのですが、どうもコーディングの技術がないようで未だにポインタとか変数の型とかifやforの()内の構文なんかがまだ理解できてないみたいです。
これからも精進していきますが、また質問などするばあいもあるとおもいますのでその時はよろしくおねがいします。
188:デフォルトの名無しさん
07/06/07 22:40:06
>>187で書いておいていきなりなのですが、さきほどマジックナンバーの意味がわからずwikiで調べてみましたがよく意味がわかりませんでした。
マジックナンバーとは、私の書いたコードでいえば26や255にあたるものと考えてもいいのでしょうか?
また、その場合マジックナンバーを使わないとはどういうことでしょうか?
たとえば、26に初期化した整数型の変数をとってそれを利用しろということでしょうか?
189:デフォルトの名無しさん
07/06/07 23:06:08
>>188
一番悪い例は、65だな。
190:デフォルトの名無しさん
07/06/07 23:09:19
当方vistaユーザーなのですが、
C言語を使ったプログラムのコンパイルができず困っております。
.c→.obj→.exe という手順なのはわかるのですが・・・。コンパイルをするためのソフトウェアがあるようですが・・・
なくてもできる という書き込みも目にしました。
フリーソフトをDLして挑戦してみたもののどこかでミスが発生し失敗してしまいます。
大変無知な質問で申し訳ないのですが、どなたかご教授いただけないでしょうか。
191:デフォルトの名無しさん
07/06/07 23:14:16
そのフリーソフトは何?
> なくてもできる
それはエスパー解釈すると.cファイルを書くためのエディタなどのことだと思われる
コンパイルするソフトウェア(コンパイラ)は必須
使わないとすれば、それは人間が頭でそれに相当する作業を行うとき
どこかってどこ?なんかメッセージとか表示されないの?
192:デフォルトの名無しさん
07/06/07 23:23:46
>>190
よく分らないがCPadでも使っとけ、10分ではじめるBCCを読めば初心者でも
何とかなると思う。
URLリンク(hp.vector.co.jp)
Borland C++Compiler 5.5.1をダウンロードする場所が変わったから注意
URLリンク(www.codegear.com)
193:デフォルトの名無しさん
07/06/07 23:51:09
>>188
マジックナンバーってのはコード中に直接数字を書くことだね。
マクロや const int を使って文字にした方がいい。
値の意味がわかるようにするのと数字の値は変えたくなることが
多いのでいっぺんに変えられるようにってことで。
194:190
07/06/08 00:01:38
みなさんレス感謝。
>>192
インストールも異常なく終わりました。
有難うございます。
195:デフォルトの名無しさん
07/06/08 00:20:53
現在VC6.0でsubst相当のことをやろうとしているのですがDefineDosDeviceを
使えばできそうだというとこまではわかったのですがドライブの解除時に
そのドライブを使用していたら(エクスプローラで開いている等)
エラーメッセージを出すということをしたいのですが
探し方が悪いのかよい方法が見つかりません。
申し訳ありませんがどなたか教えていただけないでしょうか?お願いします。
196:デフォルトの名無しさん
07/06/08 00:51:51
大域変数の配列A[k]の2次元版
例えばA[i,j] = 2 みたいに値を入れていく表みたいなものってCではどう書けばいいのですか?
197:デフォルトの名無しさん
07/06/08 00:59:23
A[i][j] = 2;
198:デフォルトの名無しさん
07/06/08 01:28:42
>>197
ありがとうございます!
199:デフォルトの名無しさん
07/06/08 07:40:15
>>187
> 小生まだ大学生でも高専生でもありませんので宿題ではないのですが、個人的な趣味にしようとおもってCを勉強しています。
ごめんな。学校の宿題をネットで片付けようとする輩が多いもんで、つい。
> 大学に行けば勉強できるのですけど
進学先は慎重に選ぼう。
2chのプログラマ板の悲惨な住人達のようにならないように。
プログラムも書く○○の専門の職業
というのはいいけれども、
プログラムを書くのが専門の職業
というのは、地獄です。
> どうもコーディングの技術がないようで未だにポインタとか変数の型とかifやforの()内の構文なんかがまだ理解できてないみたいです。
たとえば英語の勉強では、
文法を理解しさえすればネイティブの人達のような文章が書けるというわけではなくて、
文法を学びつつ、例文をたくさん読んで、使い方を覚えるよね。
プログラム言語も同じで、他人の書いたプログラムを読んで、使い方を覚えたほうがいいです。
今なら、オープンソースのソフトがネットでたくさん公開されているので、それらを見るのがいいです。
200:デフォルトの名無しさん
07/06/08 08:01:35
>>188
マジックナンバーを使わないというのは、
たとえば、
for(a=0; a<26; a++) {
ならば、
for(a=0; a< ('Z'-'A'+1); a++) {
と書いたほうがいい。
AからZまでの文字数は変ることはないので、
for(a=0; a<26; a++) { /* AからZまでは26文字*/
これでも十分だけどね。
意味としては AからZまで(Zを含む)走査するということなので、
for(a='A'-'A' ; a<='Z'-'A'; a++) {
と書いたほうが、意味がわかりやすいけど、ごちゃごちゃしてしまうね。
このプログラムの場合、26ならば簡単に見当がついて誤解もないだろうれど、
65は、すぐにはわからない。
if( s[a] == b+65 )
は、
if( s[a] == b+'A' )
と書いたほうがいい。
数字を直に書くと、他の人にわからないだけではなく、
時間がたつと、書いた本人でさえもわからなくなってしまうから。
(続く)
201:200
07/06/08 08:18:24
(続き)
配列の大きさは、後から変更することもあるため、直接数字を使うのは避ける。
というのも、複数箇所を漏れ無く変更するのは面倒だしミスしやすい。
たとえば、
#define TEXT_IN_BUFFER 256
としておき、
char s[TEXT_IN_BUFFER] ;
fgets(s,TEXT_IN_BUFFER,fp);
for( a=0 ; a<TEXT_IN_BUFFER ; a++ ){
のようにする・・・というのは昔から本に書かれているけれども、
最近のCコンパイラならば、もっと良い方法がある。
配列宣言にはスコープがあるけれども、
マクロにはスコープがないので、
const int TEXT_IN_BUFFER 256 ;
char s[TEXT_IN_BUFFER] ;
のようにする。
しかしそれではやはり煩雑だし、
TEXT_IN_BUFFERとsが生き別れになる事故もあるので、
#define SIZE_OF_ARRAY(x) (sizeof(x)/sizeof(x[0]))
としておき、
const int TEXT_IN_BUFFER 256 ;
char s[TEXT_IN_BUFFER] ;
fgets(s,SIZE_OF_ARRAY(s),fp);
for( a=0 ; a<SIZE_OF_ARRAY(s) ; a++ ){
のようにする。
この場合は、TEXT_IN_BUFFERを、ローカルスコープにするのであれば、
char s[256] ;
と直に書いても、悪くない。
202:デフォルトの名無しさん
07/06/08 08:20:03
>>195
それは、
C言語限定の話ではなく、
また、
Windows限定の話なので、
C言語のスレではなく、
Win32APIのスレで質問したほうがいいよ。
203:195
07/06/08 08:32:37
>>202
ありがとうございます。
Win32APIのスレで改めて質問してみます。
204:デフォルトの名無しさん
07/06/08 09:36:54
可変長引数をパラメタに持つ関数をラップしたいのですが、
可変長の引数を伝播することができません。
なにか簡単な方法ありますか?
va_listをパラメタに持つ関数だったらかんたんだったんですが…。
void FunctionA(int, ...);
void FunctionAwrap(int,...);
205:デフォルトの名無しさん
07/06/08 11:01:42
>>204
移植性なくていいなら、↓みたいな感じ。
void FunctionAwrap(int,...) {
struct {
int mem[可変数引数の予想されうる最大値] ;
} arg ;
va_start(v, n) ;
int* pFirst = &va_arg(v, int) ;
for (int i=1; i<n; i++) {
&va_arg(v, int) ;
}
int* pNextOfLast = &va_arg(v, int) ;
va_end(v) ;
memcpy(&arg, &n+1, pNextOfLast-pFirst) ;
return aa(n, arg) ;
}
スタックの進む方向
引数をスタックに積む順序
が違うと、ヤバい。
206:205
07/06/08 11:05:41
ごめん、バグってた。
void FunctionAwrap(int,...) {
struct {
char mem[可変数引数の予想されうる最大値] ;
} arg ;
va_start(v, n) ;
char * pFirst = (char*)&va_arg(v, int) ;
for (int i=1; i<n; i++) {
&va_arg(v, int) ;
}
char * pNextOfLast = (char*)&va_arg(v, int) ;
va_end(v) ;
memcpy(&arg, &n+1, pNextOfLast-pFirst) ;
return aa(n, arg) ;
}
207:デフォルトの名無しさん
07/06/08 12:48:17
C++の統合開発環境でフリーソフトで使いやすいのって、何かありますか?
eclipseは重いので軽いのを教えてくださいm(__)m
208:デフォルトの名無しさん
07/06/08 13:07:33
統合開発環境は、どうしても重い。
軽快さを求めるなら、スタンドアローンのエディタやデバッガを使えばいい。
209:デフォルトの名無しさん
07/06/08 13:11:33
>>207
GCC & Code::Blocks
GCC & Cygwin/MinGW
GCC & Dev C++
210:デフォルトの名無しさん
07/06/08 14:02:13
>>207
フリーソフトというけど、どういう意味の?
無料というだけの意味なら、
マイクロソフトのVisual Studio 2005 Express Edition
あたりはどうよ。
211:205
07/06/08 16:25:37
場合によっては、こういうのでもいいかも。
int printf_w(const char* format, ...) {
struct {
char mem[100] ;
} arg ;
memcpy(arg.mem, &format+1, sizeof(arg)) ;
return printf(format, arg) ;
}
これは、スタックの中身がsizeof(arg)未満だと、ヤバい。
手抜きな対策としては、
main()内の最初のほうで、
char mem[100] ;
と書いて、そこでスタックを100バイト消費させてしまう。
212:デフォルトの名無しさん
07/06/08 16:40:34
>>206
同じ「移植性が無くてよい」の条件なら
void myprintf(const char *fmt, ...) {
typedef struct {
char mem[可変数引数の予想されうる最大値] ;
} args ;
va_list ap;
va_start(ap, fmt);
printf(fmt, *va_arg(ap, args));
va_end(ap);
}
くらいで充分だろ。
213:デフォルトの名無しさん
07/06/08 18:23:34
>>208-210
レスありがとうございます。
フリーソフトというのは単に無料という程度のことです。
ノートパソコンを膝に抱えてプログラミングするのが好きなんですが
eclipseなんかだと簡単に固まるんですね。
紹介されたものも含めてもう少し考えてみます。
ありがとうございましたm(__)m
214:デフォルトの名無しさん
07/06/08 18:46:23
ノートPCなら尚のことテキスト環境で使ったほうが楽そうだが。
#マウスに頼らないで済む→膝の上でも安定。
215:デフォルトの名無しさん
07/06/08 18:56:33
VC使いだけど、あんまりマウス使わないよ。
キーボードだけでも、けっこう行けます。
216:デフォルトの名無しさん
07/06/08 19:24:53
>>212
無駄なコピーが1回減ってウマーだね。
×printf(fmt, *va_arg(ap, args));
○printf(fmt, va_arg(ap, args));
217:デフォルトの名無しさん
07/06/08 19:26:37
>>200-201
回答ありがとうございます。
>>200のほうはきっちり理解できました、間違ったコードを書かないように気をつけるより、どう間違えてもコードがおかしくならない様にするのと、
他人がもし自分のコードをみたときのためにマジックナンバーは使わないほうがいいということは理解できました。
ところでですが、>>201をみてわからなかった#difineやconstやsizeof()の構文を勉強してみましたが、「しかしそれでは煩雑だし」云々以降のコードは、
SIZE_OF_ARRAY(x)と書けば、配列xの最大の数から最低単位の数で割り配列の中にいくら要素が入っているかチェックしてその数を返す。
絶対に変更できないint型変数、TEXT_IN_BUFFERをつくり256を代入する。
要素をTEXT_IN_BUFFER個もつchar型配列sをつくる。
fpで指定されたポイントから一行分かsの要素の数だけ文字を読み取りs[0]から順番に代入していく。
aを0に初期化して、aがsの要素の数未満の間、aをインクリメントしながら{以下を繰り返す。
と読んでいいでしょうか?
なんだか、数学の問題集なんかで自分の思いもよらない解法で問題を解いているのを見るようで感動しました。
自分もこういうソースをかけるように精進します。
218:デフォルトの名無しさん
07/06/08 19:45:28
>>217
>>201のは、該当行だけ抜き出したものだと思う。
しかも間違ってる。
×const int TEXT_IN_BUFFER 256 ;
○const int TEXT_IN_BUFFER = 256 ;
プログラムには明確な正解はなく、人によって考え方も違う。
ある程度の失敗経験がないと理解しにくいこともあるので、
プロでなければ、あんまり気にしなくていいと思う。
219:デフォルトの名無しさん
07/06/09 00:02:08
#ifdef 0 〜 #endif
で囲まれたコードを消してくれる整形ツールの様な物はありますか?
220:デフォルトの名無しさん
07/06/09 00:12:31
配布されてるものでは知らないけど
それくらいのプログラムならすぐ作れるでそ
221:デフォルトの名無しさん
07/06/09 00:17:31
>>219,>>220
いま、俺、まさにそんな類のことができるツール書いてるとこなんだけど、マジメにやってたら結構面倒。
222:デフォルトの名無しさん
07/06/09 00:20:08
>>219
よかったな。
>>221が作ってくれてるってさ。
223:デフォルトの名無しさん
07/06/09 00:27:45
>>220
作るのはメンドイので既に有る物を使おうと思ってました。
ググったんですが中々見つからなくて・・
もうちょっと探してみます。
224:デフォルトの名無しさん
07/06/09 00:51:38
>>223
見つけたら是非、教えてくれ。そしたら俺も幸せになれるかもしれん。
225:デフォルトの名無しさん
07/06/09 00:58:00
そういえばプリプロセッサじゃだめなの?
226:デフォルトの名無しさん
07/06/09 01:06:28
>>225
インクルードされちゃうし、その他モロモロも全部展開されちゃう。
・・・って、Cプリプロセッサってモノによってはいろいろオプションが
あるし用途によってはそれで事足りるかもね。
俺が、いま作ってるのも実のところ拡張Cプリプロセッサだし。
227:219,223
07/06/09 03:38:15
>>224
幾つか見つけましたがコレでやりたいことはできました。
URLリンク(www.geocities.jp)
228:デフォルトの名無しさん
07/06/09 07:27:21
chraの四則演算はSSEを使えば16倍速くなるのですか?
229:デフォルトの名無しさん
07/06/09 08:08:26
>>227
d。でも、よりによってGUIかよ。俺の用途にはちとマッチしねぇ。
230:デフォルトの名無しさん
07/06/09 08:18:32
>>228
chraってなんですか?
231:デフォルトの名無しさん
07/06/09 09:41:08
>>229
GUIだからといって人間が毎回ちまちまと操作しなきゃいけないってことはない。
CUIでラップしてやりゃぁいいじゃないか。
いちいち画面にウィンドウが出るのが・・・とか言うのは、Windowsプログラマとしては無知すぎるぞ。
232:デフォルトの名無しさん
07/06/09 09:41:29
>>230
お前もしかしてチラ(chra)知らんのか?
233:デフォルトの名無しさん
07/06/09 12:09:30
ここでチラの話はやめようや…
また荒れそうだし
234:デフォルトの名無しさん
07/06/09 14:42:53
つ URLリンク(keyword.livedoor.com)
235:デフォルトの名無しさん
07/06/10 16:03:03
最近のチラシは両面印刷で書くとこないんだよな
236:デフォルトの名無しさん
07/06/10 18:42:34
basic_streamの拡張のうまい方法なんか説明したサイトか書籍しりませんか?
マルチスレッド対応とかにしたいんですけどいまいちあの3文字、4文字の
なんの意味か不明な記号列に苦しめられてます。
237:デフォルトの名無しさん
07/06/12 01:12:37
#define STR_SIZE 157
char str1[STR_SIZE];
scanf("%文字数s",str1);
printf("%d\n",(strlen(str1))
OS:XP C言語の質問なんですが
scanfの文字数の部分に#defineで定義した記号定数名を入れると入力した文字数が1と表示されてしまいます
しかし直接、数値を指定してやるとちゃんとした文字数が表示されます
ここには記号定数名は使えないってことでしょうか?
そうだとちょっと不便ですね
何か良い方法ありませんか?
238:デフォルトの名無しさん
07/06/12 01:22:31
>#define STR_SIZE 157
>
>char str1[STR_SIZE];
なんだよ、その超中途半端なサイズはw
239:デフォルトの名無しさん
07/06/12 01:27:36
>>238
問題文(含コード&リンク):
長さ157以下の英数字,空白の並びからなる文字列を二つ入力し,
それぞれをa1, a2とする. a1が"abc",a2が"ab"の場合のように,
a2の先頭部分がa1の先頭部分に含まれるときは1を,そうでないときは0を値として
返す関数 int match(char *a1, char *a2);を作成しなさい.
配列宣言を除きすべてポインタを用いて処理すること.
文字列は157文字以下が入力されるものとし,文字列の長さに関するエラー処理を
する必要はない.
計算の手順としては,文字列の先頭から一文字ずつ一致するかどうかを比較する.
a2にあたる文字列中の比較対象となった文字が'\0'であれば,a2はa1に包含された
ものとして扱う.これ以外で比較時に,一文字でも一致しない場合があれば
包含されていないとして扱う.
この関数をもちいて,2つの文字列を与えたとき,一つ目の文字列の中に二つ目の
文字列が含まれている場合(この場合先頭が必ずしも一致していなくてもよいものとする)
には "一致"をさもなければ"不一致"を出力するプログラムを作成しなさい.
240:デフォルトの名無しさん
07/06/12 02:54:09
今、sizeofについて勉強しているんですが、
参考書通りに入力してもエラーになってしまいます。
皆様、どうかご助力願えないでしょうか?
開発環境はBorland C++ Compiler 5.5です。
#include <stdio.h>
int main(void)
{
int a=1,b=0;
printf("short int型のサイズは%dバイトです。\n",
sizeof(short int));
printf("int型のサイズは%dバイトです。\n",sizeof(int));
printf("long int型のサイズは%dバイトです。\n",sizeof(long int));
printf("float型のサイズは%dバイトです。\n",sizeof(float));
printf("double型のサイズは%dバイトです。\n",sizeof(double));
printf("long double型のサイズは%dバイトです。\n",
sizeof(long double));
printf("変数aのサイズは%dバイトです。\n",sizeof(a));
printf("式a+bのサイズは%dバイトです。\n",sizeof(a+b));
return 0;
}
241:デフォルトの名無しさん
07/06/12 03:00:02
>>240
エラー内容も書けよ。
242:デフォルトの名無しさん
07/06/12 03:09:35
>>241
エラー内容も書いてくださいませ と言うように
243:デフォルトの名無しさん
07/06/12 03:29:58
申し訳ありません。
エラー内容は、
警告 W8004 sample5.c 21: 'b' に代入した値は使われていない(関数 main )
警告 W8004 sample5.c 21: 'a' に代入した値は使われていない(関数 main )
です。以後気をつけます。すみませんでした。
244:デフォルトの名無しさん
07/06/12 03:38:00
>>243
それは警告であってエラーではない。
int型のa,bに値を入れてるけど、その値を参照してないからコンパイラが
警告だしてるだけ。動作に問題は無い。
245:デフォルトの名無しさん
07/06/12 03:44:53
>>244さん、ありがとうございます。
確かに実行してみたら正常に動作しました!
こんな時間に助けていただきありがとうございました!
246:デフォルトの名無しさん
07/06/12 18:39:49
>>126>164
すみません、遅くなりました。ネットカフェでしかネットに繋げなかったので申し訳ありません。
回答ありがとうございます。
「何が」閉じるのが早いの?
どうやって実行しているの?
コンパイラです。ソースファイルをドラックして実行しているのですが、エラーなどの文がスラスラ流れるように出て
すぐ閉じてしまうので、エラーなどの文が読めません。
仕方なく「pauseキー」を押して止めたりしてるのですが、これが至難の技で・・。
コンパイラをクリックして起動させても、同じくすぐに閉じてしまいます。できあがった実行ファイルも・・。
解決策があるようなので、少し安心したりしています。よろしければ教えて下さい。
上にも質問させて頂いたの事なんですが
#include<stdio.h>
#include<float.h>
int main()
{
double what;
what=3.14159265358979;
printf("もう少し詳しい値は%20.18fです\n",what);
return 0;
}
の結果は3.141592653589790007になるんだけど、最後の「7」はバグなんですか?
なにぞとよろしくお願いします。(泣)
247:デフォルトの名無しさん
07/06/12 18:54:28
丸め誤差
248:デフォルトの名無しさん
07/06/12 18:58:46
>>123の質問の次のレスは読んでないのか。
249:デフォルトの名無しさん
07/06/12 19:39:34
自分はJavaをやろうとしたのですが、教本がちんぷんかんぷんだったので、
プログラミング言語の雰囲気だけ知っておこうと思い、Cの本を読み漁りました。
おかげでつまづいていた部分は何とか理解できたのですが、
ポインタの部分でつまづき、Cの理解を半ばにJavaに移行しようか、迷っています。
他言語に移る前提ならポインタ等C特有の概念の理解を飛ばしてもOKでしょうか?
後学のためになるなら喜んで労力を払いたいのですが、
なにぶんCを先達の方々のように使いこなせる自信がありません…
250:デフォルトの名無しさん
07/06/12 19:45:56
> ポインタ等C特有の概念
( ゚д゚)ポカーン
251:デフォルトの名無しさん
07/06/12 19:54:16
>>250
そうだな。ポインタなんて Pascal、PL/M、C++ にもあるもんな。
>>249
ここで訊くことじゃないと思うんだが。
まあ Java に戻ればいいんじゃね?
252:デフォルトの名無しさん
07/06/12 20:01:05
いきなり無知を晒してしまって恐縮ですorz
いっそう自信を無くしたのでCは諦めます(-_-;)
253:デフォルトの名無しさん
07/06/12 20:06:17
ポインタ演算を除けばJavaの参照みたいなもんだろ
254:デフォルトの名無しさん
07/06/12 23:06:31
Visual C++2005 を使い始めました。
フォームにピクチャーボックス1つとボタンを2つ配置しました。
1つ目のボタン(開始)をクリックすると、
ピクチャーボックスにグラフのようなものを書くようなプログラム
をつくりました。
ここまでは上手く動作しています。
次に、2つめのボタン(停止)で、
グラフの描写(For文で繰り返しているため時間がかかります)
を途中で一時停止させたいのですが、
グラフをすべて書き終えるまで、ボタンが押せる状態になりません。
どのような方法を使えばいいのか教えてください。
よろしくお願いします。
分かりにくくてすみません。
255:デフォルトの名無しさん
07/06/12 23:17:07
C/C++の問題じゃない。
Win32ApiだかMFCだか.NETだか分からないがソッチのスレのが良いかと。
とりあえずWin32APIかMFCなら、デフォルトのWindowProcじゃなくて、
自分で回してるfor文中でイベントの取得と処理をやることになると思われ。
256:デフォルトの名無しさん
07/06/12 23:37:32
エスパーするとスッドレを使うべし
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4306日前に更新/282 KB
担当:undef