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
㌧。でも、よりによって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
エスパーするとスッドレを使うべし
257:デフォルトの名無しさん
07/06/12 23:45:06
x68k環境用(ぶっちゃけいうとTI-89)でC++使うと
コンパイラがどんなに頑張ってもstd::cout << "Hello, World!" << std::endl;
だけで5kbytesになるって本当ですか?
ちなみにC(TIGCC)のprintf("Hello, World!\n")だと700bytes程でした
258:254
07/06/12 23:46:09
>>255
アドバイスありがとうございます。
ちなみに、プロジェクトの種類はCLR
テンプレートはWindowsフォームアプリケーション
を使っています。
スレを汚してしまい、すみませんでした。
>>256
ありがとうございます。
少し、スッドレの勉強をしてみます。
259:デフォルトの名無しさん
07/06/13 10:55:25
>>257
x68kて…w
誰も知らないだろ。
サイズがでかくなるのは最適化が弱いだけじゃね?
260:デフォルトの名無しさん
07/06/13 11:12:26
>>257
それは、全てスタティックリンクされているのか?
printf()の実装だけで、軽く数十キロバイトにはなるはずだぞ。
261:デフォルトの名無しさん
07/06/13 13:14:50
リアルタイムで動くゲーム作ってます
マルチスレッドについて教えてください
それ使うと全体の実行速度は速くなりますか?
もし速くなるならたくさん使えば使うほど速くなりますか?
262:デフォルトの名無しさん
07/06/13 14:36:54
>>261
すでにCPU100%使ってるなら、さほど変わらないだろう
別にマルチスレッドにしたからって、CPUの限界を超えられる訳じゃない
URLリンク(ja.wikipedia.org)
263:デフォルトの名無しさん
07/06/13 15:31:58
>>237
> scanfの文字数の部分に#defineで定義した記号定数名を入れ
具体的に、ソースコードの該当箇所をコピペして見せて。
(コピペだよ。打ち直したりしちゃダメだよ。)
> 文字列は157文字以下が入力されるものとし
それなら、
char str1[157] ;
というのは間違い。
char str1[157+1] ;
とすること。
文字列には、文字列の終わりを示すための特殊な文字'\0'が必要だから。
もしかしたら、一見正しく動いているように見えても、トンデモナイ大間違い。
264:デフォルトの名無しさん
07/06/13 15:33:26
>>243
エラーや警告のメッセージが出たら、ちゃんと読もうよ。
読まない人がほんとうに多い。
メッセージを読まないのは、パソコンのドシロウトだけにしてくれ。
265:デフォルトの名無しさん
07/06/13 15:36:39
え?
「メッセージを読まないのは、パソコンのドシロウトだけ」、だろ
266:126
07/06/13 15:55:26
>>246
どうやら察しの悪い人のようなので、諦めて、答えを書くよ。
単体のコンパイラやなどのCUIの実行ファイルを、
エクスプローラ上でダブルクリック(設定によってはクリックか)して実行すると、
プログラムが終了し次第、ウィンドウが閉じられてしまうのは、
Windowsの(エクスプローラの)仕様です。
コマンドプロンプトを開いて、
そこからコンパイラや、作ったプログラムを実行させればいい。
それでも、あっという間にスクロールして見えなくなるので、
コマンドプロンプトのウィンドウの左上のアイコンを右クリックして出てくるメニューから、
プロパティを開いて、タブのレイアウトで、画面バッファのサイズの高さを、数百くらいにするといい。
> 最後の「7」はバグなんですか?
コンピュータで小数がどのように扱われるのか勉強しよう。
267:デフォルトの名無しさん
07/06/13 16:03:41
>>249
C言語のポインタくらいで、つまずくようでは、先が思いやられる。
世の中には、C言語のポインタで つまずく人が大勢いるが、
決して、C言語のポインタが難解なのではない。
その本が前提としている知識を持ち合わせていないため、本に書かれていることが理解不能
とか、
その本の説明が悪くて、著者本人か、すでに理解している人にしか、理解不能
いずれにしても、本のチョイスの問題です。
前提知識がないのであれば、それを学ぶために別の本を予め読むのも含めてね。
それから、本に書いてあることを読んだだけでは、はっきりとは理解できないこともあるので、
実際にプログラムを書いて、デバッガ上でステップ実行して確かめるのも大切なことです。
268:デフォルトの名無しさん
07/06/13 16:05:39
>>254
スレ違い。
ちなみに、
ボタンの押下に対するハンドラは、速やかに制御を返すべき。
時間のかかる処理を、そのコンテキストでやってはいけない。
269:デフォルトの名無しさん
07/06/13 16:09:24
>>257
本当かどうか、自分で試してみればいいじゃないか。
まぁたぶん本当だろうね。
C++のストリームのライブラリがスタティックリンクされれば、
mainにたった1行でも、かなりのサイズになる。
>>261
スレッドの話はスレ違い。
C/C++は基本的にスレッドの面倒を見ません。
マルチスレッド対応といっても、複数のスレッドからライブラリ関数を呼ぶことができるようになっているだけです。
だから、OSのスレッドの機能の勉強をしてください。
270:デフォルトの名無しさん
07/06/13 16:31:45
>>262,>>269
申し訳ない
出直してくる
271:デフォルトの名無しさん
07/06/13 21:03:47
みんなガンバレ!
言葉はキツいが諸先輩方は応援してるぞ。
272:デフォルトの名無しさん
07/06/14 00:19:17
getchar();で入力された英字の他に改行コードも一緒にラインバッファに保存され
次の入力で改行コードが返されてしまう問題で、ラインバッファに保存されてる改行コードをクリアする方法
はありませんか?
for(i=0;i<10;i++){
ch = getchar();
printf("%c\n",ch);
ch = 改行コードをクリア
}
こんな感じで
とりあえず今は下のような感じで対処してるのですが、他に方法があったらお願いします
ちなみに入力関数はgetchar();のみしか使用できません
for(i=0;i<10;i++){
ch = getchar();
printf("%c\n",ch);
ch2 = getchar();
}
273:デフォルトの名無しさん
07/06/14 01:18:02
無理
274:デフォルトの名無しさん
07/06/14 01:37:04
>>272
いまどき、CUIでインタラクティブなプログラムを作るのに慣れたところで、大して役に立たないと思うが・・・
自分なら、とりあえず、こうする。
for(i=0;i<10;i++){
do {
ch = getchar();
} while ((ch == '\r')||(ch == '\n')) ;
printf("%c\n",ch);
}
275:デフォルトの名無しさん
07/06/14 11:01:35
>>272 >>274
言わないと気づかないだろうたからあえて言うが、無駄な改行はやめてくれ。
見づらい。
276:デフォルトの名無しさん
07/06/14 11:42:36
>>275
改行にも意味があるのだが。
277:デフォルトの名無しさん
07/06/14 11:44:38
レスの改行? \n のこと?
278:デフォルトの名無しさん
07/06/14 14:48:21
レスの空行に決まってるだろ。
279:デフォルトの名無しさん
07/06/14 14:51:50
だったら意味無い気が。ソースの空行だべ
280:デフォルトの名無しさん
07/06/14 14:56:09
>>276 のいう「意味」とやらを訊こうか。
いや引っ張る程の話じゃないから、やっぱりいいや。
281:274
07/06/14 16:35:11
え、改行が多すぎる?
1行毎に改行を入れているつもりではないけど、結果的に、そうなっちゃってるねぇ。
282:デフォルトの名無しさん
07/06/14 16:39:45
多すぎるよ。意味の区切れでもないのに空行なんか要らない。
283:デフォルトの名無しさん
07/06/14 17:35:12
こまけーw
284:デフォルトの名無しさん
07/06/14 22:29:39
>>274
個人的にはインデントが無い前提なら、このぐらいの空行のが見やすい。
まぁ人それぞれじゃね?
285:デフォルトの名無しさん
07/06/14 23:15:35
TSearchRec Sr;
int Attributes = faAnyFile;//検索対象とするファイルの属性
if (FindFirst(CDirectoryOutline1->Directory+"\\*.mp3", Attributes, Sr) == 0) {
do {
if ((Sr.Attr & Attributes) == Sr.Attr) {
ListBox1->Items->Add(Sr.Name);
//Sr.Sizeでファイルのサイズを取得できる
i=i+1;
max=i;
}
}while (FindNext(Sr) == 0);
FindClose(Sr);
}
環境
Windows XPsp2
C++Buileder6.0
CDirectoryOutlineで選択したフォルダ内にあるmp3ファイルのファイル名をListboxに表示させたいと思っているのですが、
ファイルを選択→右クリック→プロパティ→全般タブ→詳細設定
の、
「内容を圧縮してディスク領域を節約する」
にチェックの入っているファイルが表示されません。
分かる方いましたら解決方など教えてくださいm(__)m
286:デフォルトの名無しさん
07/06/14 23:17:23
VC++.NET2003を使っています。
CPointをint型に入れたいのですがどのようにすればよいのでしょうか。
どうか、教えてください。
287:デフォルトの名無しさん
07/06/14 23:21:06
CPoint pt(10, 20);
int n = pt.x << 16 | (0xFFFF)pt.y;
288:デフォルトの名無しさん
07/06/14 23:21:25
無理言うな
289:デフォルトの名無しさん
07/06/14 23:22:03
ちがった、こうやりたかった。
int n = pt.x << 16 | (0xFFFF & pt.y);
290:デフォルトの名無しさん
07/06/14 23:23:27
CPoint pt;
int x = pt.x;
int y = pt.y;
291:デフォルトの名無しさん
07/06/14 23:27:13
>>287
>>288
>>289
>>290
ご返答、ありがとうございます。
あの、int x=みたいな初期値を設定するようなやり方じゃなければ
入れることが出来ないのでしょうか?
292:デフォルトの名無しさん
07/06/14 23:34:31
そんなことは無い。
単に変数宣言せずに書くのが嫌で、
2行に分けるのが面倒だっただけだと思うが。
293:デフォルトの名無しさん
07/06/15 00:33:24
>>292
そうでしたか。
ここまでのお付き合い、本当にありがとうございました。
294:デフォルトの名無しさん
07/06/15 01:01:20
最近C++の勉強をはじめたのですが、どうもCのような設計になりがちで困ってます。
クラス内で作成する関数なんですけど、良く使うキー情報は関数にパラメータを増やして
渡すやり方はC++ではあまりしないんですかね?
クラスのメンバ変数にすると便利そうなんですが、知らないうちにメンバ変数が
どんどん増えていって、収拾がつかなくなることが多くついついパラメータ渡しに
なってしまいます。いまのやり方はまずいですかね?
295:デフォルトの名無しさん
07/06/15 02:06:08
・まずはどういう処理について述べているか、具体的に(例でもいいから)挙げてください
・クラス内で作成するって何を作成する関数なんですか?
・キー情報って何ですか?
296:デフォルトの名無しさん
07/06/15 03:17:47
>>285
まずは、デバッガ上でステップ実行しろ!
このスレで何度も言っているが、
書いたプログラムが思い通りの結果を出さない場合、
たいていは注意深くステップ実行する(変数の内容もチェックする)ことで間違いに気がつく。
ということで、原因はわかるが、あえて、教えない。
他の人も教えるなよ!
297:デフォルトの名無しさん
07/06/15 03:25:29
>>294
> 良く使うキー情報は関数にパラメータを増やして渡すやり方
そういうのはCでも、やらないなぁ。
構造体のポインタを渡すよ。
もし、複数の関数で、同じ引数群を渡すのなら、
どうせスタックに同じものを積むのだから、構造体で値渡しするよ。
構造体を使うにしても、1つの構造体にフラットにメンバを並べるのではなく、
データどうしの関係に合わせて、構造体をネストする。
そういうのはCとC++で違いはないよ。
298:デフォルトの名無しさん
07/06/15 06:11:00
入力された数値がマイナス数値だった場合それを自然数に変えるにはどうやるんですか?
299:デフォルトの名無しさん
07/06/15 06:32:40
入力した数値を2に変える。3でも良いけど。
300:デフォルトの名無しさん
07/06/15 09:41:16
オレだったら4かな、、、って
abs()の事を聞いてるのか?
301:デフォルトの名無しさん
07/06/15 11:13:42
>>298
何をしたいのが不明瞭。
このスレで質問する人は、C/C++が云々という以前に、日本語が不自由すぎる。
302:デフォルトの名無しさん
07/06/15 15:10:46
わかるように書いて質問すれば、
より早く適切な答えを貰えるのにね。
303:デフォルトの名無しさん
07/06/15 15:13:26
自分でも何をしたいのか分かってないんだろ。
この程度のレベルなら、人に説明できれば自ずから解決できる。
304:デフォルトの名無しさん
07/06/15 15:28:30
プログラミング云々という以前に、
問題を切り分ける気がないんだろう。
たとえば>>285みたいなのは、
問題を切り分けていけば、
おのずと原因がわかるのだが。
305:デフォルトの名無しさん
07/06/15 15:29:18
int a;
scanf("%d",&a);
if(a < 0)
a = 2;
もしくは
int a;
scanf("%d",&a);
while(a < 0)
a++;
ってこどだろ?
306:298
07/06/15 15:54:33
5が入力されたら5
マイナス5を入力されても5として扱う方法を聞こうと思ったんですが、、
自分にレスしてくれたんじゃないかもしれないけど305をヒントにできました。
307:デフォルトの名無しさん
07/06/15 16:01:25
そういうのを絶対値と呼ぶんだってことは中学生でも知ってそうなもんだがな
308:298
07/06/15 16:03:48
小学生ですが何か?
来年から中学ですけど
309:デフォルトの名無しさん
07/06/15 16:05:41
入力した負の数に-1かけりゃいい話だがや
310:298
07/06/15 16:10:17
だから、もうわかったって言ってるだろ
しつこい馬鹿
311:デフォルトの名無しさん
07/06/15 16:11:54
しつこい馬鹿
312:デフォルトの名無しさん
07/06/15 16:24:31
変数を宣言して初期化する場合、普通は
int a,b,c;
a=1;
b=2;
c=3;
ってやるけどさ
↓こうした方がコンパイラも高速なコード生成できるし入力数も少なく見やすくてよくね?
int a=1,
b=2,
c=3;
313:デフォルトの名無しさん
07/06/15 16:27:36
>>312
天才
314:デフォルトの名無しさん
07/06/15 16:42:21
>>305
intが32ビットや64ビットで、
負の最大値のような巨大な数字が入力されたら、
大変だぞ。
>>306
とりあえずC標準ランタイムライブラリのabs()を使ってみようよ。
>>308
高校生くらいまでは、
プログラミングよりも学校の勉強とかに時間を使ったほうがいいぞ。
プログラミングなんて大人になってからやっても遅くはないが、
子供のころに勉強することは、大人になってからでは遅いんだよ。
自分も小学生の頃からプログラム書いてたけど、
もっと数学や物理をよく勉強すれば良かったと後悔してるよ。
>>309
今は乗算のコストが加算と同じだけどさ、
普通は減算を使って
if (a < 0) a = 0 - a ;
とやるよね。
>>310
うわぁ。
プログラミングの勉強よりも、対人コミュニケーションの勉強しようよ。
315:デフォルトの名無しさん
07/06/15 16:49:25
>>312
コンパイラの最適化を有効にしていれば、
どっちでも同じコードが出力されると思うぞ。
ちなみに、
int a, b, c ;
というように複数をまとめて宣言するのは、
int* p, q, r ;
のようなトラブルを起す可能性があるので、良くない。
面倒でも、
int a = 1 ;
int b = 2 ;
int c = 3 ;
としたほうがいい。
316:デフォルトの名無しさん
07/06/15 19:17:02
>>126>>266
ありがとうございます。書くの遅くなりましたが解決できました。本の後ろの方に書いてありました。
回答ありがとうございました。
「7」についてなんですが、本には「0」って書いてあるんです。
でも実行ファイルにすると「7」と表示されるんでバグなのかな?って思って聞いてみました。
317:デフォルトの名無しさん
07/06/15 19:59:47
>>316
ライブラリの実装の違いかもしれない。
いずれにしても、
floatやdoubleは内部では二進数なので、
10進数との相互変換は100%完璧にはできない。
318:デフォルトの名無しさん
07/06/16 01:08:58
>if (a < 0) a = 0 - a ;
if (a < 0) a = -a;
319:デフォルトの名無しさん
07/06/16 01:19:18
マイナスを前に付ければ符号反転なんだけどさ、
算数的には、0から引いたほうが、わかりやすいっしょ。
いまどきのコンパイラは、両者で出力するコードが変りはしないし。
320:デフォルトの名無しさん
07/06/16 01:27:49
>算数的には、0から引いたほうが、わかりやすいっしょ。
??????
321:デフォルトの名無しさん
07/06/16 01:28:13
どっちでもいい
322:デフォルトの名無しさん
07/06/16 01:29:38
算数的ではなく314的だろ
323:デフォルトの名無しさん
07/06/16 06:36:33
314のマスターベーションだろ?
324:デフォルトの名無しさん
07/06/16 17:13:26
じゃ結論はこうってことで、 a * -1
325:285
07/06/16 17:18:08
do while 内のifを外したところ解決しました。
お騒がせしましたm(__)m
326:デフォルトの名無しさん
07/06/16 17:20:55
>>325
>>296の言うとおり、デバッガ使った?
327:デフォルトの名無しさん
07/06/16 17:23:13
>>325
一応聞いておくけど、なんでifを外せばいいのかは理解してるんだよね?
というか、ifを外して良いのか?
バグを修正すべきなんじゃないのか?w
>if ((Sr.Attr & Attributes) == Sr.Attr) {
この式、変じゃない?
Attributesと&取ってて、その結果が Sr.Attrであるためには、
Sr.Attr == Attributesでなくてはならないのでは?
328:デフォルトの名無しさん
07/06/16 17:27:51
while(gets(str);strcmp(str,"quit"); )
って書き方はありですか?
329:デフォルトの名無しさん
07/06/16 17:29:36
間違えました
for(gets(str);strcmp(str,"quit"); )
でした
for文しか使えなかった場合の話で
330:デフォルトの名無しさん
07/06/16 17:29:41
なしです。
こうしてください。
while(fgets(str, sizeof(str),stdin) && strcmp(str,"quit") )
331:デフォルトの名無しさん
07/06/16 17:31:29
for(fgets(str, sizeof(str), stdin); str&&strcmp(str,"quit");fgets(str, sizeof(str), stdin) )
332:デフォルトの名無しさん
07/06/16 17:32:55
ちがった、こうかな。
for(fgets(str, sizeof(str), stdin);EOF!=*str&&strcmp(str,"quit");fgets(str, sizeof(str), stdin) )
333:デフォルトの名無しさん
07/06/16 17:34:49
>>330
出来るだろうけど、fgetsは改行コードまで取るから、
"quit"に改行コード入れるか、strncmp使うか、
何かしないと狙い通りに動かんと思うよ
334:296
07/06/16 18:45:16
>>325
解決してよかったね。
ちなみに今回の質問の件とは違うが、まだバグが残ってる。
ディレクトリ名の末尾が.mp3の場合もファイルとして扱ってしまう。
int Attributes = faAnyFile ;
↓
int Attributes = faAnyFile ^ faDirectory ;
にして、ディレクトリ名は取得しないようにしたほうがいい。
>>327
条件文自体は間違ってないよ。
(Sr.Attr & Attributes) == Sr.Attr
というのは
(Sr.Attr & ~Attributes) == 0
と同じことだからね。
適当にテストプログラムを書いてステップ実行して、
TSearchRec::Attrに渡される値をみてみなよ。
Borland氏ね!と叫びたくなること請け合いだよ。
335:デフォルトの名無しさん
07/06/16 19:00:59
>(Sr.Attr & Attributes) == Sr.Attr
>というのは
>(Sr.Attr & ~Attributes) == 0
>と同じことだからね。
本当に?
(Sr.Attr & Attributes) == Attributes
ではなくて?
336:296
07/06/16 19:20:10
>>335
ごめん、間違ってた。その通りです。
だがしかし、
(Sr.Attr & Attributes) == Attributes
や
(Sr.Attr & Attributes)
に直しても、問題は解決しないのよ。
VCLの定数faAnyFileは0x3Fで、
TSearchRec::Attrに返される値は
圧縮ファイルの場合には0x800がORされているから。
faAnyFileを-1に変更するか、
0x3Fを指定された場合にはVCLのリファレンスヘルプに書いてない隠しビットフラグ0x800を立てるのをやめるか、
どっちかにしてほしいぞ > Borland
FindFirstがフィルタしてるんだから、自前でもう一度フィルタしようとするのが変といえば変なのだが。
337:デフォルトの名無しさん
07/06/16 19:38:56
いやあのね、それ、DOSの頃からのファイル属性の仕様だから(無属性が通常ファイルは)。
VCL上だけ変えたら、よけい混乱する人が続出するだけ。
338:296
07/06/16 22:06:28
>>337さんの書き込みを見て気がついた。
> ごめん、間違ってた。その通りです。
↑は前言撤回。
やっぱり間違っていなかった。
>>327と>>335が間違ってる。
339:デフォルトの名無しさん
07/06/16 22:23:05
>>337
(Sr.Attr & Attributes) == Sr.Attr
(Sr.Attr & ~Attributes) == 0
これらは、無属性の通常ファイルの場合も、真になるよ。
フィルターとしては、
指定した属性以外がついているファイルを除外する
ということになる。
340:298,306
07/06/17 04:47:51
>>314
やっぱりあったんですか・・。絶対値って言葉が出てきませんでした。
教えていただきありがとうございます。
自分は308ほど若くは無いですが、高校生くらいまでは学校の勉強に集中するのは同意します。
ていうか小学中学の時点でプログラム組めるとそれで数学やっちゃいそうで計算力が多分付きませんね。
プログラムは半年くらいしかまだやってないですけど、
プログラム以外の事も覚えなきゃなぁ~とは思っています。。
341:デフォルトの名無しさん
07/06/17 11:10:21
Windows Vista にて
普通のサーバープログラムを sexe でサービスに入れたのですが
通知領域(タスクトレイ)にアイコンが表示されません。
サーバー機能は問題なく動作しているようです。
もちろん「ディスクトップとの対話をサービスに許可」していますし
Shell_NotifyIcon のタイムアウト処理も行い
msgTaskBarRestart によるタスクトレイ再登録も行っています。
直接の原因は Shell_NotifyIcon が全て ERROR_TIMEOUT に
なってしまっていることのようです。(1秒スリープで20回トライ)
対応策はあるのでしょうか?
やはり サービスプロジェクトで書き換えるしかない?
342:デフォルトの名無しさん
07/06/17 11:40:57
↑の書き込みで”全て ERROR_TIMEOUT ”と書きましたが、
”全て ERROR_TIMEOUT 以外”の間違いでした。
これから調べます。すみません。
343:デフォルトの名無しさん
07/06/17 11:51:40
調べたら ERROR_FILE_NOT_FOUND だった。
Shell_NotifyIcon で ERROR_FILE_NOT_FOUND って
何のファイルが無いんだ??? さっぱりわからん。
ちなみにサービス起動でない場合はちゃんとアイコンは表示されます。
344:デフォルトの名無しさん
07/06/17 14:24:46
>>341
それは、C/C++の質問というよりは、Win32APIの質問だ。
Win32APIのスレで質問しなおしたほうがいい。
質問し直しても、
設計が悪い、Windowsのアーキテクチャを理解しろ、
なんて言われるのがオチだが。
345:デフォルトの名無しさん
07/06/17 16:41:34
>>344
了解。
346:デフォルトの名無しさん
07/06/19 00:40:49
char *p[3] は char p[][3] と同じ意味でしょうか?
347:デフォルトの名無しさん
07/06/19 01:11:34
違います。
348:デフォルトの名無しさん
07/06/19 01:23:23
そうですか...
char **p[3] は char p[][3] と同じ意味でしょうか?
349:デフォルトの名無しさん
07/06/19 01:28:22
*はヒープ領域、[]はスタック領域を扱う。
だから、
char* p[3];
p[0] = new char[10];
ということはできても、
char p[][3];
p[0] = new char[10];
ということはできない。
350:デフォルトの名無しさん
07/06/19 01:32:59
>>349
むずかしす、難しいすぎて理解できません、orz
351:デフォルトの名無しさん
07/06/19 01:39:00
char *p[3] は、要素数3の配列で、要素はchar 型のポインタ
char p[][3]; は…こんな型はない。これは配列初期化時の特殊な構文。
char p[][3] = {{1,1,1},{2,2,2}}; とすれば、char p[2][3] = {{1,1,1},{2,2,2}}; だし、
char p[][3] = {{1,1,1},{2,2,2},{3,3,3}}; なら、char p[3][3] = {{1,1,1},{2,2,2},{3,3,3}}; だし、
上の二つは、左辺だけを見れば、一見同じ型のように見えるが、実際に宣言されているのは異なる型。
繰り返すが、char p[][3] という型はない。
Cの配列は、サイズ固定。
352:デフォルトの名無しさん
07/06/19 01:41:12
×char p[][3]; は…こんな型はない。これは配列初期化時の特殊な構文。
○char p[][3]; は…こんな型はない。これは配列宣言時の特殊な構文。
353:デフォルトの名無しさん
07/06/19 01:50:07
>>351-352 型がキーワードみたいですが、型って何ですか?
354:デフォルトの名無しさん
07/06/19 01:59:31
ここでいう型とは、「データ型」のこと。
ビット列で表されるデータを、どう解釈するか、ということの取り決め。
二進表記で、01100101 は、数値型の取り決めでは 十進数の101をあらわし
同じデータを、文字型ではアスキーコードと解釈して 'A' になる。
あくまでも取り決めであって、それ自体が自ら意味を持っているわけではない。
それぞれの型が、何を意味しているかは、一つ一つそのルールを覚えなければ
理解することはできない。
355:デフォルトの名無しさん
07/06/19 10:10:08
>>349
>*はヒープ領域、[]はスタック領域を扱う。
はい?
おまいはPascal出身か?
356:デフォルトの名無しさん
07/06/19 17:43:03
>>346
関数の仮引数という状況においてだけは、同じ意味になる
357:デフォルトの名無しさん
07/06/19 23:06:30
PSDKのサンプルにあったんだが
CAllocator::CAllocator(HRESULT& hr, HWND wnd, IDirect3D9* d3d, IDirect3DDevice9* d3dd)
: m_refCount(1)
, m_D3D(d3d)
, m_D3DDev(d3dd)
, m_window( wnd )
{
....
}
っていう関数の定義があったんだが、引数リストの後、コロン以降はどんな意味がある?
検索したが、検索しにくくて見つけることが出来なかった
358:デフォルトの名無しさん
07/06/19 23:12:00
適当に数字を入力してもらってその数だけ配列を用意したいのですが、どうすれば
できるのでしょうか?
イメージではこんな感じで宣言したい。でもこれだとエラーでる(´・ω・`)
cin>>num;
int i[num];
359:デフォルトの名無しさん
07/06/19 23:14:32
>>357
つ[初期化指定子]
>>358
つ[c99]
つ[std::vector]
360:デフォルトの名無しさん
07/06/19 23:15:04
int*i;
i=new int[num];
361:デフォルトの名無しさん
07/06/19 23:26:58
>>359-360
ありがとうございます。できました(゚∀゚)
これでi[255]なんてぶさいくな宣言せずにすみます
362:デフォルトの名無しさん
07/06/20 05:39:27
delete するの忘れないようにな
使い捨てのコードなら別にいいけど
363:357
07/06/20 09:30:27
>>359
検索できた!ありがとう!
ぱっとみ難解だが頑張るよ!
364:デフォルトの名無しさん
07/06/20 14:23:53
>>349
ヒープかスタックかは、型で決まるのではないぞ。
365:デフォルトの名無しさん
07/06/20 21:49:43
>>364
>349は型に言及しているわけではないぞ。
#勿論、演算子に決まるわけではないが。
366:デフォルトの名無しさん
07/06/20 22:01:34
レジスタ割り当てってのもあるぜ。
367:デフォルトの名無しさん
07/06/20 22:10:19
レジスタの前に静的領域を思い出そうぜ。
368:デフォルトの名無しさん
07/06/20 23:40:50
C++でPCAのライブラリ的なものってどっかにあったりしませんか
369:デフォルトの名無しさん
07/06/24 16:39:47
自動配線ツールをCで書こうと思ってるんですけど。
アルゴリズムはmazeをベースで。
書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか?
アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。
サンプルなどがあればと思って質問させていただきました。
誘導していただければ幸いです。
370:デフォルトの名無しさん
07/06/24 17:40:31
マルチするな
371:デフォルトの名無しさん
07/06/25 05:36:17
>>369
「自動配線ツール」だけで通じると思うな。
372:デフォルトの名無しさん
07/06/25 17:12:26
例えば2乗や3乗の時はpowよりもa*aやa*a*aとした方が速いですが、
何条ぐらいまでかけ算に展開した方が速いのですか?
コンパイラは最適化時に自動的に展開してくれるのでしょうか?
373:デフォルトの名無しさん
07/06/25 17:34:19
やってみりゃいいじゃん
374:デフォルトの名無しさん
07/06/25 17:48:47
>>372
学校の宿題っぽいな。
375:デフォルトの名無しさん
07/06/25 20:59:31
っ 実測
376:デフォルトの名無しさん
07/06/25 21:05:17
powのソース嫁
実装をみれば、ああなるほど、と思うぞ。
377:デフォルトの名無しさん
07/06/25 22:17:07
自己参照構造体で、リストの最後尾にデータを追加しようとしています。
エラーが出て困っています。何かわかりましたら教えてください。
構造体が以下のとおりで、
struct list {
double x; double y; double z;
struct list *next;
};
以下のように呼び出してるのですが、
=========================================
struct list *listp; //宣言
~~中略~~
listp = add_list(x,y,z,listp);
=========================================
struct list *add_list(double x, double y, double z, struct list *listp){
struct list *p;
if ((p = (struct list *) malloc(sizeof(struct list))) == NULL) {
printf("malloc error\n");
exit(1);
}
p->x = x; p->y = y; p->z = z;
p->next = NULL;
listp->next = p; //←←実行時にここでエラーが出ます。
return p;
}
378:デフォルトの名無しさん
07/06/25 22:29:54
>>377
このスレで何度も言っていることだが・・・
プログラムは省略せず全部コピペしろ!
どんなエラーメッセージが出たのか書け!
デバッガでステップ実行しろ! (変数の値のチェックもな!)
がんばれ。
379:デフォルトの名無しさん
07/06/25 22:58:22
>378のいうとおりなのだが、書いてある範囲で怪しいのは
listp = add_list(x,y,z,listp);
のlistpには何が入っている?
中略がどうなっているかわからんが初めはあさっての方向を
指しているぞ。
380:372
07/06/26 02:38:22
やってみたら5乗あたりで抜かれるね
381:デフォルトの名無しさん
07/06/26 07:57:55
そして8乗はx *= x; x *= x; x *= x;に抜き返される悪寒。
後は、精度の問題が出るような数値のときにどうするかだな。
382:デフォルトの名無しさん
07/06/26 10:08:30
ある vector< vector<string> > A と vector< vector<string> > B があって、
Aの1列目とBの1列目が同じIDの集合をもっています。
そこで、Aのsort(たとえばAの2列目を昇順)を実行したときに、BもAと同じ順番に
連動してsortしたいのですが、どのようにすればよろしいでしょうか?
383:デフォルトの名無しさん
07/06/26 10:11:40
その中略の中にlistpの初期化や代入が無かったら
add_listのlistp->next = p でこけるのはあたりまえ。
384:デフォルトの名無しさん
07/06/26 11:19:32
>>383
アンカーくらいつけようよ。
>>382
先ず、Aの2列目をキーにBをソート、然る後にAをソート。
385:デフォルトの名無しさん
07/06/26 13:18:08
>>384
なるほど。ありがとうございました。
386:デフォルトの名無しさん
07/06/26 13:37:17
>>381
powの実装も、
乗数が整数の場合には、
だいたいはそれなんだけど、
ループ回数が可変だから、
どうしてもオーバーヘッドが。
387:デフォルトの名無しさん
07/06/26 13:54:31
>>382
そもそもAとBを分ける必要はあるの?
そして、1列目がID、2列目が何か、というように役割が決まっているなら、どうして構造体にしないの?
typedef struct {
string ID ;
string 何か ;
vector<string> A ;
vector<string> B ;
} HOGE ;
vector<HOGE> AB ;
こういうのじゃ駄目なの?
388:387
07/06/26 14:03:09
ちなみに、頻繁にソートかけるなら、
vector<HOGE> AB ;
とは別にソート用に、
vector <HOGE*> AB_PTR ;
を用意して、AB_PTRのほうをソートする。
そしたら今度は、
ABとAB_PTRを同期させる必要が出てくるので、
ABとAB_PTRを裸で見せるのはやめて、クラスでラップする。
389:デフォルトの名無しさん
07/06/27 02:27:37
A ? TRUEの処理 : FALSEの処理;
っていう書きかたを最近知ったのですが
Aが変数ならこの書きかた出来るんですがAが関数の場合はエラーになってしまうんですが
どうやっても無理ですか?
390:デフォルトの名無しさん
07/06/27 02:37:27
>>389
関数の返り値で分岐させたいってこと?
普通に出来るんだが…
コードかエラーメッセージでも挙げてみてくれ
391:デフォルトの名無しさん
07/06/27 03:00:20
すいません今関数作ってやってみたら成功しました
エラー出てたのは関数じゃなくて#defineだったからなのかもしれませんorz
Windowsプログラムになってしまうんですが、こういう事出来ないかなと。
//ウィンドウ生成
hWnd = CreateWindow(
~略~
) ? 処理TRUE : 処理FALSE;
error C2440: '=' : 'BOOL' から 'HWND' に変換できません。
整数型からポインタ型への変換には reinterpret_cast、C スタイル キャスト
または関数スタイル キャストが必要です。
とりあえず今は上のようには書かずに次の行にこう書いて妥協してます
hWnd ? 処理TRUE : 処理FALSE;
392:デフォルトの名無しさん
07/06/27 03:24:13
Cond ? 処理TRUE : 処理FALSE;
条件演算子を使う場合、処理TRUEと処理FALSEの値の型は同じか、
または処理FALSEの型から処理TRUEの型への暗黙の変換が可能でなければならない。
つまり型(クラス)HogeとFooとの変換が定義されていない場合、
Cond ? Hoge() : Foo();
のようなことは出来ない。
あと、式の値を再利用する必要がないなら素直に
if(hWnd = CreateWindow(...)) {
処理TRUE;
} else {
処理FALSE;
}
とすべき。
393:デフォルトの名無しさん
07/06/27 03:29:59
>>391
変数 = 関数() ? 値1 : 値2;
と書いたら当然、値1か値2が変数に代入されるわけだが。
やりたいことがよく判らんが、処理を分岐させたいのなら三項演算子は使うべきじゃない。
関数の呼び出し結果を変数に代入しつつ別の変数に評価を入れたいのなら、
変数1 = (変数2 = 関数()) ? 値1 : 値2;
とでもすればできなくはないが、やはりこの場合も無理に一行に書くことはないだろう。
394:デフォルトの名無しさん
07/06/27 03:34:05
>>392
分かりました。ありがとうございます。
ここは素直にIFで書いておきます・・・
395:デフォルトの名無しさん
07/06/27 03:38:08
>>393
何となくコードを削りたくなってしまって、、
396:デフォルトの名無しさん
07/06/27 04:10:33
hWnd = 関数() ? val1:val2;
というのは、
hWnd = (関数() ? val1:val2);
だというのは判ってる?
きみのやりたいのはたぶん
(hWnd = 関数()) ? val1:val2;
397:デフォルトの名無しさん
07/06/27 04:11:59
あ、「出来る」というだけで、決して「やれ」という意味じゃないから
398:デフォルトの名無しさん
07/06/27 05:29:05
>>396-397
ありがとうございます。
自分でも後からいろいろ試してて、、
何か、ちょっと勘違いしてたみたいです
396のでやりたい事が出来ました。
どうせ趣味で書いてるんで自分さえ読めれば良いんでやってきますwwww
399:デフォルトの名無しさん
07/06/27 06:53:09
しばらく経つと、自分でも読めなくなるに一票。
400:デフォルトの名無しさん
07/06/27 10:24:16
そうみたいです・・読みずらいってレベルじゃないですね。
一回全部のIFを書き直してみたんですがいくつか残して戻しましたよorz
ちなみに分岐はこんな風に書きました
A ? 処理:
B ? 処理:
C ? 処理: 0;
何もしないっていう処理は適当に当てはめたんですが
0; で良いんでしょうか?
なんかこの書き方面白すぎてはまりそうですw
(もう既にはまってるか)
401:デフォルトの名無しさん
07/06/27 10:28:36
>>400
なるほど、処理の分岐に三項演算子を使いたかったのか。
意味的にそんな阿呆なことをする子には教えてあげません。
402:デフォルトの名無しさん
07/06/27 11:38:53
覚えたての言葉を使いたがる子供みたい
403:デフォルトの名無しさん
07/06/27 12:04:58
自分でも、埋め合わせに 0; を思いついた時にこんな馬鹿な話が・・・って思いましたw
でもそんないじわるされるとは予想外でしたwwっうぇw
と・・・こんな風にかく人少ないと思うので
誰かに指摘されるまでは0;やNULL;って書きます
いろいろありがとうございました
404:デフォルトの名無しさん
07/06/27 14:49:10
だから、阿呆だって指摘されているだろう。これ以上何を指摘されたいんだ?
405:デフォルトの名無しさん
07/06/27 15:59:22
ほうっておこうや
時に暖かく見守る事もしつよう(←なぜかry)な事なんだ
406:デフォルトの名無しさん
07/06/27 19:45:15
389みたいなやつを見ると、コーディング規約で3項演算子の使用を禁止したくなる気持ちが、よく分かる。
407:デフォルトの名無しさん
07/06/27 20:17:06
ふっふっふぅ、漏れの策定したコーディングガイドでは三項演算子の「代入用途以外の使用」を禁止している。
408:デフォルトの名無しさん
07/06/27 20:22:17
それよりも条件演算子の重ねがけを禁止すべき
こんなコードを書かれたらたまらん
x = p1 ? p2a ? at : af : p2b ? bt : bf;
409:デフォルトの名無しさん
07/06/27 21:20:16
きちんとインデントで整理できてれば見やすくないか?
x = p1
? p2a
? at
: af
: p2b
? bt
: bf;
410:デフォルトの名無しさん
07/06/27 21:46:34
でも条件とそれに対応する処理を列挙していくような書き方って
関数型プログラミング言語っぽくて面白い気がする
411:デフォルトの名無しさん
07/06/27 22:22:31
>A ? TRUEの処理 : FALSEの処理;
こう書いている時点で勘違いしているとおもう。
式1 ? 式2 : 式3
式1を評価して0以外なら式2の評価した値が、0なら式3を評価した値が
全体の評価結果になる。
>何もしないっていう処理は適当に当てはめたんですが
> 0; で良いんでしょうか?
こういう発想が出る時点で三項演算子を使うべきではない。
412:デフォルトの名無しさん
07/06/27 22:52:05
>>410
if文でいいじゃないか。
413:デフォルトの名無しさん
07/06/27 23:27:28
>>409
そこまでするくらいならif文でいい希ガス。
414:デフォルトの名無しさん
07/06/28 09:59:27
常にif文でいいじゃないかと言われる運命だなw
マクロで使用して、何をするかがマクロ名で明確にわかるときに使うかなあ。
415:デフォルトの名無しさん
07/06/28 19:56:25
クラスがなかなか覚えられません(´・ω・`)
「はじめてのC++」でもかなりのページしめてるけど、やっぱりそれぐらい大切ってこと?
416:デフォルトの名無しさん
07/06/28 20:22:14
クラス使わないなら C でも使っとけ、って言われるくらい。
417:デフォルトの名無しさん
07/06/28 21:09:18
>>415
「覚える」という言葉を使う時点で、間違っているのですよ。
「覚える」というのは、
セックスで例えるなら、ハウツー本を読み漁るだけの童貞君。
プログラミング言語は使いこなしてナンボ。
セックスで例えるなら、百人切りで鍛え上げたテクニック。
418:デフォルトの名無しさん
07/06/28 21:26:31
百人と浅い付き合いをするくらいなら、一人と深く付き合った方がより使いこなせると思うのだが。
419:デフォルトの名無しさん
07/06/28 21:40:31
C++でSTLを使うのは非常に上手だが、STLを使うことしかできない
そういう人みたいな感じになるぞ。
420:デフォルトの名無しさん
07/06/28 22:14:33
一人と深く付き合った事がある加藤鷹が理想
他の女に乗り換える時に楽
421:デフォルトの名無しさん
07/06/28 22:18:34
ちんこが持たねぇっす
422:デフォルトの名無しさん
07/06/28 22:43:11
C++でSTLとboostを非常に上手く使える人間だったら十分問題ないと思うけど
423:デフォルトの名無しさん
07/06/28 22:47:03
STLを使う/使える案件しかやらないのなら、いいんだよ。
424:デフォルトの名無しさん
07/06/29 00:24:37
ありがとう。やっぱりクラスは大切なのか
これからは積極的に使って身につけていくことにします(`・ω・´)
425:デフォルトの名無しさん
07/06/29 11:58:49
つーかいまどきC++は生産性が悪すぎ。
426:デフォルトの名無しさん
07/06/29 12:07:56
言語間での生産性の差ってそんなに大きくないだろう
427:デフォルトの名無しさん
07/06/29 12:23:40
全ての状況下に於いて、生産性だけが重要とは限らない
428:デフォルトの名無しさん
07/06/29 12:42:54
C++でtemplate meta programmingやマクロを駆使して書いたプログラムが強いところって何でしょう?
「皆が読めなくなるからやめろ、STLやtemplateも出来れば使うな、boostなんて以ての外」
って言うところも多いと聞きますが…
429:デフォルトの名無しさん
07/06/29 13:13:27
STL程度で「皆が読めなくなる」なんて、三流以下のソフトハウスでもなければ言われないと思いますが。
430:デフォルトの名無しさん
07/06/29 13:31:26
三流以下のソフトハウスが多いことの証左なんだろうさ。
ところで、>>428 の
>~が強いところって何でしょう?
が何を訊いてるんだかよく判らない。
「~に強い会社ないし集団はどこでしょう?」
の意だろうか。
431:デフォルトの名無しさん
07/06/29 15:12:02
STLの実装にバグがあってトラぶった時、STLなんて使うからだと言う人がいた。
たしかに、使ったSTLの実装は古く、メンテナンスされていないものだった。
だがしかし、その人が書いたSTL相当の独自のクラスにもバグがあった。
ちなみに一流の現場では、STLは使わず、もっと良いテンプレートライブラリを使うと思う。
STLはC++標準に入ってはいるものの、最善策ではないから。
432:デフォルトの名無しさん
07/06/29 16:37:08
C言語で、配列の個数を外部から入力することはできますか?
例えばa[n]という配列に対しnをscanfでキーボードから読みけませて、要素がn個の配列を作るといった感じです。
433:デフォルトの名無しさん
07/06/29 16:49:32
C99じゃなけりゃ、m(c)allocやalloca使うしかないかな
434:デフォルトの名無しさん
07/06/29 18:07:51
>>428
利点を挙げるとしたら、高度の抽象化に役立つということ。
問題は、それを必要とされない、あるいは必要性が理解されないということ。
435:デフォルトの名無しさん
07/06/29 21:28:52
>>432
おれがこの前教えてもらった方法
int *a,n;
scanf("%d",&n);
a=new int [n];//a[0]~[n]まで確保
Cだと無理なのかな
436:デフォルトの名無しさん
07/06/29 21:44:34
STLやtemplateもboostもstd::もしらないけどc++動かせるよ
どんな利点があるのか教えろ
437:デフォルトの名無しさん
07/06/29 21:46:11
つか、進化した言語の方が優れているなら、アセンブラもC言語も絶滅しているはずだろう
しかししてない
だから使える機能を使えばいい
438:デフォルトの名無しさん
07/06/30 00:59:45
>>436
delete[]のような後処理が要らないしrealloc相当のことができる
std::vectorが取っ掛かりには便利。
Boostは正規表現が実用的だろう。
439:デフォルトの名無しさん
07/06/30 05:31:00
>>438
そんなのはSTLの専売特許ではないしぃ。
440:デフォルトの名無しさん
07/06/30 15:41:07
標準もしくは準標準ってところが大事なのかと
441:デフォルトの名無しさん
07/06/30 19:26:00
STLがどんなにクソッタレでも、C++標準に入っている以上、しかたない。
あの万能ナイフっぷりには呆れるぜ。
442:デフォルトの名無しさん
07/06/30 20:33:49
こんな風にC++の標準関数まとめてくれてるサイトない?
URLリンク(cham.ne.jp)
443:デフォルトの名無しさん
07/06/30 22:26:36
ある
444:デフォルトの名無しさん
07/06/30 22:30:38
本スレテンプレのコレとか
URLリンク(www.cppreference.com)
445:デフォルトの名無しさん
07/06/30 22:48:49
>>439
436が使ったことないって言うから、
早速使えそうなものを薦めてみた。
うんちく語っても仕方がないと思ったし。
446:デフォルトの名無しさん
07/06/30 23:05:10
じゃあSTLはまぁそこそこ使える、かつ稲葉氏のページにあるものは一通り知っている
っていう人に対してお勧めのboost library(sandbox含む)を教えてください
447:デフォルトの名無しさん
07/07/01 09:48:04
STLは機能が多すぎて、つまり、注意事項が多すぎて、怖い。
オブジェクトを手っ取り早く永続化したくて、
一定のアドレスにオブジェクトを配置する、
カスタムなヒープを使う、カスタムなアロケータを
使うように指示して、それがちゃんと使われるのか、とか。
448:デフォルトの名無しさん
07/07/01 10:07:28
>>447
そんだけなら単にSTLコンテナ宣言してる場所をgrepすりゃいいだけじゃね
つか、STLに限った話じゃ全然ねー
STL使わんでも普通にmalloc()だのnewだの使われたくないんだろ?
アホじゃないの?
449:デフォルトの名無しさん
07/07/01 11:23:31
>>447
アロケータは使い方を知らないとハマるわな。
450:デフォルトの名無しさん
07/07/01 11:30:39
実装によってはアロケータをガン無視しちゃってるのがなかったっけ
451:デフォルトの名無しさん
07/07/01 13:23:33
setやmapをそのままシリアライズしたいって思うことあるよなぁ。
iteratorで舐めてファイルに書きだしたものを、
ファイルから読んで1つずつinsertするのは、
なーんか無駄っぽいんだ。
452:デフォルトの名無しさん
07/07/01 16:23:59
ライブラリにしとけばええやん。
453:デフォルトの名無しさん
07/07/01 20:32:59
>>452
そういうことではなくて、B木の構築コストがもったいない。
454:デフォルトの名無しさん
07/07/05 11:19:09
ほんと初歩的な事なんですが・・・
C言語には行とかいうのは関係なくて全部一行で書けるって聞いたんですが
#include<stdio.h> main()~
っていうのはどうやっても出来ないんでしょうか?
455:デフォルトの名無しさん
07/07/05 11:40:20
#include はC言語じゃなくてプリプロセッサ用
456:デフォルトの名無しさん
07/07/05 13:57:29
>>455
プリプロセッサっていうのは、コンパイルの時の処理ですよね
一行ずつ読み込む・・・から、
やっぱ、無理って事でしょうか?
457:デフォルトの名無しさん
07/07/05 14:08:36
ヘッダファイルの中から使う分だけ直接持ってくりゃいいべ
458:デフォルトの名無しさん
07/07/05 17:44:03
>>457
その手が、、、あった。。。ありがとうございました
459:デフォルトの名無しさん
07/07/05 22:25:40
標準ライブラリのヘッダの中身って結構処理系独自拡張のオンパレードだから、
あまりおすすめできないけどな。
460:デフォルトの名無しさん
07/07/05 22:26:50
7行プログラムとかlisp500とか書きたいんだろうか
461:デフォルトの名無しさん
07/07/06 00:07:56
プロトタイプと構造体とtypedefくらいだべ
462:デフォルトの名無しさん
07/07/08 06:21:10
大きな配列を確保する際、newやmallocだと確保できるのに、
プログラム中に最初から
double a[100000]
のように書くと実行時に確保できない旨のエラーがデルのは何故ですか?
463:デフォルトの名無しさん
07/07/08 06:41:41
スタック領域
464:デフォルトの名無しさん
07/07/08 06:51:11
>>462
staticでもつければ?
465:デフォルトの名無しさん
07/07/08 13:20:28
>>462
スタック領域が足りなくなるから。
環境によってはスタック領域を大きくできるぞ。
466:デフォルトの名無しさん
07/07/09 11:12:57
スタックとヒープの違いを把握しましょう
467:デフォルトの名無しさん
07/07/09 13:51:14
ご教授お願いします。
コード
URLリンク(kansai2channeler.hp.infoseek.co.jp)
不正なbreakですとなってしまいます。なぜでしょうか?
468:デフォルトの名無しさん
07/07/09 13:53:55
>>467
なんちゅうスタック破壊
469:467 ◆4usmhdjocU
07/07/09 14:01:12
すみません詳しく教えていただけると助かるのですが・・・
470:デフォルトの名無しさん
07/07/09 14:01:25
誤>printf("New string --->%s\n,tbl");
正>printf("New string --->%s\n",tbl);
471:デフォルトの名無しさん
07/07/09 14:01:59
>>467
このスレで何回も言ってることだが・・・。
・エラーメッセージの類いは、一字一句そのままコピペすること。
往々にして勝手に要約して端折った部分に大切な情報がある。
それが大切だと分かってないから、問題の原因が理解できない。
・デバッガでステップ実行すること。
がんばれ。
472:デフォルトの名無しさん
07/07/09 14:03:23
>>470
あーあ、答え書いちゃった。
プロセスを教えずにリザルトだけ教えていたら、
いつまでたっても467はヒヨコのままだぞ。
473:デフォルトの名無しさん
07/07/09 14:04:41
>>467
・forの書き方に問題があるから、不正なbreakになる。
・>468も指摘しているが、printf()の使い方にも間違いがある。
474:デフォルトの名無しさん
07/07/09 14:04:41
>>469
getsは危険です絶対に使ってはなりません。
475:467 ◆4usmhdjocU
07/07/09 14:07:17
C:\Documents and Settings\cp1\デスクトップ\testplog\test.cpp(39) : error C2043: 不正な 'break' です。
cl.exe の実行エラー: error C2043: 不正な 'break' です。
>>470
ありがとうございます
>>471,472
わざわざ自分のことを考えていただきありがとうございます。
しかし、エラーがでてなおりません。
次はヒントでいいので教えていただけませんか?
476:デフォルトの名無しさん
07/07/09 14:07:40
標準関数でtolower()ってのがあるから、使う時はtolower()使ってね☆
477:467 ◆4usmhdjocU
07/07/09 14:08:19
とてつもない初歩的なミスでした・・・
聞いていたじぶんがはずかしくなりました><
お手数かけました
478:デフォルトの名無しさん
07/07/09 14:08:45
>>475
セミコロン
getsとかtolowerとか、練習で問題文写してるんだろうから
あんまり言うとわからなくなるぞ
479:467 ◆4usmhdjocU
07/07/09 14:08:52
>>476
勉強します^^
480:デフォルトの名無しさん
07/07/09 14:09:27
for(i = 0;i < max;i++);
481:467 ◆4usmhdjocU
07/07/09 14:10:14
>>478,480
ありがとうございました
482:デフォルトの名無しさん
07/07/09 14:26:19
そしてthruされる>473、>474……
483:デフォルトの名無しさん
07/07/09 14:52:12
LINK : fatal error LNK1104: ファイル "win32.lib" を開けません。
link.exe の実行エラー
これってどうやれば直りますか
484:デフォルトの名無しさん
07/07/09 14:52:58
そもそも、
固定の文字列を出力するのにprintfを使う
getsを使う
などという、
見習ってはいけない「お手本」を載せている、
クソッタレ参考書がいけないと思うんだよね。
いったい何十年前の本なんだよ、って感じ。
485:デフォルトの名無しさん
07/07/09 14:54:44
>>483
1. ライブラリ名が正しいか確認する
2. リンカのマニュアルを確認する
486:デフォルトの名無しさん
07/07/09 15:18:44
>>484
固定の文字列を出力するのにprintf()を使う以外の見習うべきお手本は何?
487:デフォルトの名無しさん
07/07/09 15:27:00
puts()
488:デフォルトの名無しさん
07/07/09 15:37:30
>>487
puts()に替えたら改行しちゃいました。どうしたらいいでしょう。
489:デフォルトの名無しさん
07/07/09 15:42:43
fputs()
490:デフォルトの名無しさん
07/07/09 15:49:06
どうせコンパイラが最適化でputs()に置き換えたりするんだからprintf()でいいじゃん。
491:デフォルトの名無しさん
07/07/09 15:56:06
そんなコンパイラはgccぐらいしか知らんが
492:デフォルトの名無しさん
07/07/09 16:10:55
打つ量の削減とかそういう理由で使い分けてる
493:デフォルトの名無しさん
07/07/09 16:19:48
わかっていない人のために説明すると・・・
printfの第一引数は、あくまでも書式を指定するための文字列である。
だから、
printf("100%元気") ;
なんてのは大間違いなわけ。
あえてprintfで任意の文字列を出力したいのであれば、
printf("%s", "100%元気") ;
とすべき。
そんな間抜けな間違いはしないよ、というかもしれないが、うっかりミスは恐ろしいし、
void PrintMessage(char* szMessage) {
printf(szMessage) ;
}
なんてことをやったりしたら、収拾がつかなくなる。
494:デフォルトの名無しさん
07/07/09 17:06:51
まあ
printf("%s\n", s);
なら
puts(s);
一択だわな。タイプ量が少なく効率も良い。
printf("%s", s);
を
fputs(s, stdout);
にするかどうかは気分次第だな。
改行を打ち出す時は
puts("");
が短いが、俺は
putchar('\n');
を使うことがおおいな。
495:デフォルトの名無しさん
07/07/09 17:11:41
inline void NEW_LINE() {
putchar('\n');
}
::NEW_LINEみたいにしたり(w
496:デフォルトの名無しさん
07/07/09 17:13:03
>>495
賢いのう、ワレ!
497:デフォルトの名無しさん
07/07/09 18:44:07
>>484
> いったい何十年前の本なんだよ、って感じ。
昔のBASICなどのPRINTと同じ感覚の老人が書いた本だろ。
498:デフォルトの名無しさん
07/07/09 18:46:41
printf(name) ;
printf("\n") ;
printf("ほげほげを入力してください。\n") ;
printf("入力できる数値の範囲は、fooからbarです。\n") ;
こんなの見たら卒倒するよ。
499:デフォルトの名無しさん
07/07/09 19:20:09
JavaやってからC++に戻ってくると>>498みたいに書きたくなる。
500:デフォルトの名無しさん
07/07/09 19:30:03
getsはともかく、printfは別にいいだろ
char配列そのままprintfに渡すのはまずいけど、
文字列リテラルなんかコンパイラによってはputsに置き換えたりする事もある
501:デフォルトの名無しさん
07/07/09 20:20:28
ループ成立w
502:デフォルトの名無しさん
07/07/09 20:32:46
別にprintfでもputs/fputsでも、そんなん好みの問題やん。
503:デフォルトの名無しさん
07/07/09 23:25:28
UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)
SOCK_DGRAMで作成した場合は、固定長最大メッセージをサポート、
ってなってるから、約64KBまで送信できると思うのですが、イーサネットの
フレーム長が1500byteまでとか言う風に書いてあって、よく分からないのです。
オフィス用の一般的なPC(WinXP SP2、10BASE-T)の環境でテストプログラムを
作ったところ、一応60KBちょいまで送受信できたので64KBまでOKなのかな?
あと、さらに質問で、64KBまで送受信できるけどXXbyteを超えると信頼性が
著しく下がるとかありますか?
また、上のほうでも書きましたが、イーサネットで1500byteってのはアプリケーションでは
意識してないけれど、ネットワーク層(?)とかデータリンク層(?)とかのレイヤが
勝手にセグメント化してくれてるのでしょうか?
長々として申し訳ないのですが、どなたかお助けを。
504:デフォルトの名無しさん
07/07/10 00:05:05
TCP/IPではパケットサイズを期待してはいけない。それは下位層によって1バイトずつに分断されているかもしれない。
UDPではパケット到来順序を期待してはいけない。それは経路によって順不同に並べ替えられているかもしれない。
だっけ?
505:デフォルトの名無しさん
07/07/10 08:40:13
>>503
> UDPの通信メッセージの最大長っていくつですか?(socket、bind、sendtoを使います)
環境による。
通信バッファが小さくて長いUDPパケットを受け取れない人もいるし、
なかには、受け取れないどころか即死するヘボ実装の人もいる。
両側とも自分で書いたプログラムなら、通信の最初に、
送受信できる最大サイズを調べるためのメッセージ交換を入れたらどうかな。
最初は128バイトあたりで、送受信を確認できたら、サイズを2倍にしていくの。
> イーサネットのフレーム長が1500byteまでとか言う風に書いてあって
UDPパケットが長い場合、複数のイーサネットフレームに分割して送受信される。
> 64KBまで送受信できるけどXXbyteを超えると信頼性が著しく下がるとかありますか?
パケットサイズが可変なのに対して、パケットのCRCチェックサムのビット数が固定なので、
長さに比例してエラー検出能力が下がっていくけど、あんまり気にしない。
信頼性を気にするなら、更に自前で別のチェックサムを付けてUDPに載せるといい。
506:デフォルトの名無しさん
07/07/10 19:17:26
>>503と>>505は釣りかい?
マジなら>>505はもう一度勉強な。
それから、UDPの送信フレーム数そのものに制限は無い。
どこで知ったかしらないが、64kbyteなんて制限はない。
恐らくAPIレベルの話だろう。64kbyte以上送りたければ、何度もAPIを呼べばいい。
受信側が受け取れなければ、単に破棄するだけだ。
それは、受け取り側が糞なんじゃなくて、そういう仕様。
UDPの通信フレームの最大長は、1500オクテット(=バイト)だが、
IP情報分を除くと1480バイトになる。経路が全てイーサネットで
組まれているのなら、APIレベルで1480バイト以下を送れば分割(フラグメント)は起こらない。
インターネットに流すのならもっと小さくする必要がある。
IPヘッダ専用のチェックサムはあるが、それはデータとは無関係。データ自身には何のチェックバイトもない。
イーサネットフレームのCRCはあるが、それは送信時のもので、異なるプロトコルにぶちあたるとコロリととれてしまう。
イーサネットフレームに戻るときにはCRCも戻るが、それは再構築されたものなので、送信時のものとは全く関係ない。
そもそも、UDPは、次の特徴をもっている。
・>>504が言うとおりIPフレームの到来順序を期待してはいけない。
・戻されたIPフレームがどの順番に届くかは保証されない。
・IPフレームの一部が失われた場合、再送の手順は行わない。
・IPフレームは分割(フラグメント)されるかもしれないが、分割された順序を記憶するフィールドがあり、再構築されるようになっている。
UDPとは、
・本来、内部LANのように信頼性の高い部分で使用することを前提に策定された
・今は、動画や音声のように、一部が失われても十分機能する場合によく用いる
のですよ。ちなみにコレはIPv4の仕様。IPv6はこうとは限らない。