- 1 名前:デフォルトの名無しさん mailto:sage [2007/08/19(日) 20:07:56 ]
- スレを勃てるまでもない低俗なC/C++の質問はここでお願いします。
過去ログ スレを勃てるまでもないC/C++の質問はここで pc11.2ch.net/test/read.cgi/tech/1167476845/ スレを勃てるまでもないC/C++の質問はここで 2 pc11.2ch.net/test/read.cgi/tech/1178503366/
- 445 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:31:33 ]
- 128文字以上を入力するとマズい
getsを使うなってのは、読み込む最大文字数を指定できないからで、入力ファイルに予想より長い文字列が現れたら致命的 代わりにfgetsを使えってのは、fgetsは最大文字数を指定できるので、どんな入力が来ても死ぬことはない >>444 の関数はそれと同じ問題を孕んでいる ユーザに127文字までしか入力してはいけないといくら言い聞かせてみたところで、禁止されるとやりたくなるのが人というものだし、 そうでなくてもついうっかり文字数制限を忘れてしまうこともあるだろうし、プログラムはどんな入力が来ても安全なように作っておくべき
- 446 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:56:45 ]
- >>444
ReadDataにsの要素を渡して文字数のチェックをちゃんとすればおk てかex変数が無駄に見える……
- 447 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 12:57:32 ]
- 間違えた、sの要素数を、ね
- 448 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 13:52:11 ]
- ofstreamはdeleteした際には自動的にcloseされるますか?
- 449 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 16:56:00 ]
- yes yes yes
- 450 名前:444 mailto:sage [2007/10/17(水) 21:22:36 ]
- レスありがとうございます。
>>445 >128文字以上を入力するとマズい 実装時には、バッファ長を1kB位取ってごまかしちゃうつもりでしたが、 言われてみればその通りですね。変数ipをチェックすればいいので、 バッファがあふれたらエラーを返すコードを追加しようと思います。 >>446 >ex変数が無駄に見える…… やっぱり? ループの脱出条件をコーディングしながら決められるので、ついつい やっちゃいます。こんな場合は、 while ( (c=fgetc(p) != EOF ) { とか書くもんなんでしょうか?
- 451 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:24:27 ]
- >>450
exが無駄って言ったのは、 ループ中途脱出(break)を判別するためだけに使ってるように見えたから。 あれならwhileループ後のif文をそのままwhile内にぶちこめば、 ex使わないでいけそうだったし。 まあ、分かりやすく書けば良いと思うので、聞き流して結構です do { if( (c=fgetc(p)) == EOF ) { s[0] = '\0'; return 0; } } while (IsDelimiter(c)); ループ終了条件を>>450みたくデリミタでなくEOFにすると、 この場合はreturnするために別にまたif文書かないといけないから、無駄そう
- 452 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 22:50:46 ]
- C言語なんだから、関数ばしばし作ろうよ。
・デリミタもしくはEOFまで読み飛ばし、最後に読み飛ばした文字を返す ・デミリタまで文字列を格納する という2つの関数を作ればスッキリするよ。
- 453 名前:444 mailto:sage [2007/10/17(水) 22:59:06 ]
- >>451
>whileループ後のif文をそのままwhile内に む。なるほど。 こちらの方がシンプルですね。 プログラムをできるだけ愚直に書こうと努力しているつもりですが、 スマートな解を示されると感動しちゃいます。勉強になりました。 >>452 >関数ばしばし 実装フェーズでは、そうなっちゃうかもしれません。 ただ、データ読み出しの関数なので、恐らく何万回も呼ばれる ことになると思います。 実のところ、こんな冗長な関数を作るべきか、まだ悩んで いるんです・・・
- 454 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:09:09 ]
- 何万回程度の関数呼び出しコストなんて屁でもないぞ
- 455 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:15:46 ]
- というかこれでいいと思う
int ReadData(FILE *p, char *s){ int c, ip=0; while( (c=fgetc(c)) != EOF) if (IsDelimiter(c)) s[ip++] = (char) c; s[ip] = '\0'; return !!ip; }
- 456 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:21:41 ]
- いいのか、ほんとに。
- 457 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:29:45 ]
- なんでいいのか判らん・・・
- 458 名前:455 mailto:sage [2007/10/17(水) 23:32:29 ]
- あ、すまん、所々ミスってる上にそもそも動作が違うなw
これでどうだ int ReadData(FILE *p, char *s){ int c , ip=0 , flag=0; while( (c=fgetc(p)) != EOF ){ if (flag){ if (!IsDelimiter(c)) s[ip++] = (char) c; else break; } else if (IsDelimiter(c)) flag=1; } s[ip] = '\0'; return !!ip; } うーん、あんまりスマートじゃない……
- 459 名前:455 mailto:sage [2007/10/17(水) 23:34:58 ]
- >>456-457
いや、IsDelimiterの戻り値を勘違いしてた上に、 そもそも動作を全く勘違いしてたw これならわざわざ書き直す必要なかったですね…… 偉そうにでしゃばってすみませんorz
- 460 名前:444 mailto:sage [2007/10/17(水) 23:44:46 ]
- 各位殿
色々ご指導ありがとうございました。 とりあえず仮決めですが、下記のようにすることにしました。 色々いじったら、仕様が変わっちゃった・・・ >>454 ちょっと安心しました。 >>455 読み込み長を返すアイデア頂きました。 ありがとうございました。
- 461 名前:444 mailto:sage [2007/10/17(水) 23:45:24 ]
- int ReadData(FILE *p, char *s)
{ int c, ip; /* 非デリミタ文字が現れるまで読み飛ばす */ do { if ( (c = fgetc(p)) == EOF ) { s[0] = '\0'; return 0; } } while (IsDelimiter(c) == 1); s[0] = (char) c; /* デリミタが現れるまで,文字列を積み上げる */ ip = 1; while (1) { if ( (c = fgetc(p)) == EOF ) break; if ( IsDelimiter(c) == 1 ) break; s[ip] = (char) c; ip++; if (ip >= MAXBUFSIZE) { ip--; s[ip] = '\0'; return -ip; } } s[ip] = '\0'; return ip; }
- 462 名前:デフォルトの名無しさん mailto:sage [2007/10/17(水) 23:58:02 ]
- 自分なら、↓こんな感じかなぁ。
int ReadData(FILE* pFileIn, char* strOut) { *s = '\0' ; int countDelimiter = 0 ; int countOutput = 0 ; while(1) { int c ; c = fgetc(pFileIn) ; if (c == EOF) break ; if (IsIsDelimiter(c)) { ++countDelimiter ; if (countDelimiter ==2) break ; } else if (countDelimiter == 1) { *strOut = (char)c ; ++strOut ; } } return countOutput ; }
- 463 名前:462 mailto:sage [2007/10/17(水) 23:58:45 ]
- おっと、間違った。
int ReadData(FILE* pFileIn, char* strOut) { int countDelimiter = 0 ; int countOutput = 0 ; while(1) { int c ; c = fgetc(pFileIn) ; if (c == EOF) break ; if (IsIsDelimiter(c)) { ++countDelimiter ; if (countDelimiter ==2) break ; } else if (countDelimiter == 1) { *strOut = (char)c ; ++strOut ; } } *strOut = '\0' ; return countOutput ; }
- 464 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:14:00 ]
- countDelimiterで制御するのですね。
ちょっとトリッキーかな・・・
- 465 名前:462 mailto:sage [2007/10/18(木) 00:22:08 ]
- やりたい処理を素直に書いただけなんだけどなぁ・・・。
- 466 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 00:35:46 ]
- 文化が違うのがオモロイなぁ・・・
- 467 名前:デフォルトの名無しさん mailto:sage [2007/10/18(木) 01:16:12 ]
- int ReadData(FILE *fp , char *out , int n){
int c , i=0; while(i<n-1){ c = getchar(fp); if (c == EOF || (IsDelimiter(c) && i != 0)) break; if (!IsDelimiter(c)) out[i++] = c; } out[i] = '\0'; return i; }
- 468 名前:デフォルトの名無しさん [2007/10/20(土) 22:47:48 ]
- エラーメッセージを出力するところなんですが、
#define ABC "ABCの時のエラーメッセージ" などと定義しておいて、エラーメッセージの出力関数には、 エラーコードの「ABC」のみを引数で渡すようになっています。 ただの文字列に変換する場合はこれでよかったんですが、 エラーの時に出た数字もエラーメッセージに含める場合も追加されました。 その数字は、書式指定(%dとか%lfとか)なので、同じようにマクロで 文字列を生成しようとして、つまづいてしまいました。 こんな感じで書いてみたんですが、当たり前だけどstrをどこで定義すれば よいのかがわかりません。 #define ABC(gStr) sprintf( str, "ABCの時のメッセージ( %g ).", gStr ) 引数なしの時と同じように、文字列(str)をそのまま生成するには どう書いたらいいですか?
- 469 名前:デフォルトの名無しさん mailto:sage [2007/10/20(土) 23:28:42 ]
- >>468
> エラーコードの「ABC」のみを引数で渡す あなたは自分がやっていることを理解してない。 ABCはエラーコードなんてものではなく、文字列リテラルへのポインタ。 なお、複数の同じ内容の文字列リテラルが1つにまとめられることは保証されていない。 そして、マクロが何者なのか、理解していない。 いまのコンパイラはプリプロセッサが統合されているので、わかりにくいが、 ソースコードは、プリプロセッサによってマクロが展開された後に、コンパイルされる。 マクロは「定義」するものだが、その定義とは、日本語の定義とは意味が異なる。 > strをどこで定義すればよいのかがわかりません。 エラーはネストするの? シングルスレッドとマルチスレッド、どっち?
- 470 名前:469 mailto:sage [2007/10/20(土) 23:35:01 ]
- ああぁ
呼び出し側の関数にエラーコードとして返したりせず、 エラーメッセージを出力する関数にしか渡さないのなら、 適当に自動変数で持てばいいと思うよ。 CとC++どっち?
- 471 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:00:21 ]
- >>468
#define ABC(gStr) "ABCの時のメッセージ("#gStr")" ってgStrが変数なのか 知らね
- 472 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:21:50 ]
- 基本的なことが理解できてない人に、
場当たり的に教えるのは、 効率が悪すぎる。
- 473 名前:デフォルトの名無しさん [2007/10/21(日) 00:42:22 ]
- 468です。いくつかのご回答、ありがとうございました。
>>469 自分のしていることを、自分で理解していないのかもしれません。 > エラーコードの「ABC」のみを引数で渡す は間違いで、エラー出力関数への引数には、文字列になります。 エラーはネストしません。また、シングルスレッドです。 >>470 C++です。 「適当に自動変数」というのは、文字列自動変数をエラーコード 毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか? >>472 効率よく教わるためには、どの基本的なことを勉強すればよいでしょうか。
- 474 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 00:56:30 ]
- >>473
ネストせず、シングルスレッドなら、str をグローバル変数にしてしまうのも可能。 簡単だけど、あんまり良いやり方ではないが、とりあえず最小の変更で済むかな。 strなんて短くてどこにでもありそうな名前は、変えるべきだよ。 > 「適当に自動変数」というのは、文字列自動変数をエラーコード > 毎にその場でベタにつくって、エラー出力関数に渡す、という感じでしょうか? そう。
- 475 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/21(日) 11:00:52 ]
- >>468
>>473 C++なら普通polymorphismを使いますが兎も角動かすには #define ABC(i_code) { char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); } ブロックについては www.geocities.jp/ky_webid/c/022.html
- 476 名前:デフォルトの名無しさん [2007/10/21(日) 11:47:16 ]
- >>475
ありがとうございます。 実環境で確認してみます。
- 477 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:45:38 ]
- おま・・・。
せめてdo-while #define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0) で、ソレは俺も質問見たとき考えたけど、マクロの意味というか役割というかが変わってるから、 「なんでエラーメッセージをマクロにしたいのか」が分からないと使えるかどうか分からなかった。 個人的には、ストリングテーブル的に↓とかで十分かな、と思う。 #define ABC "ABCの時のメッセージ( %s )." (共通な文字列リテラルの切り出し。日本語版やら英語版やらを作るときに使う)
- 478 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 16:56:29 ]
- >>477
do whileハックを使わないといけないのは、古いコンパイラ。
- 479 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:33:37 ]
- >>478
それはすまない。俺の勉強不足のようだ。 ついては↓のコードがエラー無くコンパイル通るような 「新しいCコンパイラ」は何かを教えてくれないか? #include <stdio.h> #define macro(x) {puts(x);} int main() { if(1) macro("str1"); else macro("str2"); return 0; }
- 480 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 17:56:42 ]
- >>479
そういう{}のないif文は、コーディング規約で禁止。
- 481 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:00:58 ]
- マクロには;をつけないっていう選択肢はなし?
- 482 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:32:53 ]
- どう考えてもバグの原因になるだろ。
- 483 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 18:58:42 ]
- 小細工禁止!
マクロによる関数もどきはダメ。 インライン関数やテンプレート関数を使うべし。
- 484 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:06:06 ]
- コンパイルに5分かかるプログラムを作ったら一人前ですか
- 485 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:07:23 ]
- そうだねえ。
再帰テンプレートとか作ると簡単に5分超えるね。 練習にはいいんじゃない?
- 486 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:10:36 ]
- で、規約やら小細工やら良いんだけど
>do whileハックを使わないといけないのは、古いコンパイラ。 誰かコレを解説して貰えんか? コンパイラの新旧が、マクロを括るブロックにdo-whileを使うことと どう関係してんだ?
- 487 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:11:40 ]
- 勘弁してやれw 勘違いだろw
- 488 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 19:42:09 ]
- 制御文なしに中括弧だけを書くとエラーになるような古いコンパイラがあったんじゃないか。
- 489 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:31:08 ]
- >>475
それだとABC(data);って書いたら駄目だわなw #define ABC(i_code) do{ char str[256]; sprintf(str, "ABCの時のメッセージ( %d ).", i_code); printf("%s\n",str); }while(0) こうだな まあ受け売りだが てか一回sprintf経由する必要はあるの? #define ABC(i_code) printf("ABCの時のメッセージ( %d ).\n", i_code) これじゃ駄目なんかいな
- 490 名前:489 mailto:sage [2007/10/21(日) 20:33:43 ]
- やべ、俺リロードしなさすぎw
吊ってくるww
- 491 名前:デフォルトの名無しさん mailto:sage [2007/10/21(日) 20:34:54 ]
- エラーメッセージを生成するのと、表示するのは、分離したほうがいいと思う。
- 492 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 10:50:35 ]
- つーか、元質はデバッグ出力関数に渡す引き数を生成したいんじゃないかな?
だとしたら、>475以下はダメだろう。
- 493 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:39:51 ]
- C言語に関して質問です。
構造体の各要素に添え字を使ってアクセスすることはできないのでしょうか? 例えば struct OBJ{ int x; int y; char c; char str[10]; }; main() { struct OBJ tmp; tmp.[0] ← xのこと tmp.[1] ← yのこと tmp.[2] ← cのこと tmp.[3] ← str[]のこと } といった感じのことがしたいのです。実現可能な方法があれば是非お願いします。
- 494 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:43:42 ]
- unionを使えば出来ないことはないけど、正直お勧めしない。
- 495 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:02 ]
- C++なら・・・無理か。
型もバラバラだしな。 添え字に変数を使って tmp.[i] ってしたとき、何型で扱うつもりなんだ
- 496 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 19:44:13 ]
- >>493
限定的にはunionを使えばできる。 ややこしくはなるがポインタをキャストしてもできる。 どちらにしろ、サイズの違う型を統一的には扱えない。
- 497 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:19:14 ]
- >>493
なんで、そんな変なことをしたいの?
- 498 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:22:08 ]
- テンプレートクラスでtemplate <Type T>のTにクラスを入れることが可能なのですか?
int型などを入れるメリットは分かるのですが具体的にどんなクラスを入れれば役に立つのか教えていただけないでしょうか?
- 499 名前:493 mailto:sage [2007/10/22(月) 20:29:47 ]
- 回答して下さった方々有難う御座います。
for文のインデックスを利用出来たらと思いました。 しかし型などが違うのでその都度場合わけをしないといけないので出来たとしても結局のところ手間は増えますね。
- 500 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 20:33:51 ]
- >>498
可能です。 STLのvector<T> はTの配列と置き換えられる動的な再配置も可能なクラスですが 当然組み込み型以外でもvectorを使うことが出来ます。
- 501 名前:デフォルトの名無しさん [2007/10/22(月) 21:15:25 ]
- float a;
a=1; print("%d",a); を実行すると 1072693248っていう数がでてくる。 これってどういうこと?
- 502 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 21:24:52 ]
- >>501
言語およびコンパイラは何? "%f" を使うべきである事は知っていて、なぜそうなるのかが知りたいということ?
- 503 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:53:01 ]
- >>501
printfの引数の2つ目以降の型って決まってないよね。 だから、printfにとっては、どんな型の値を引数に渡されたのか、わからない。 そのため、書式文字列に%dとあれば、intだと思って処理するわけ。
- 504 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:54:09 ]
- >>498
可能。 int型を入れるのと同じメリットが、stringクラスを入れるのにもあると思うのだが。 stringの配列なんて使う機会ないか? ないなら、まぁ仕方ない。
- 505 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 22:58:36 ]
- list<vector<string> >
とかな。
- 506 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:28:17 ]
- >>505
そんなこと、したことないぞ。 まず、stringのように重いものを、ポインタや参照ではなく値として持つvectorに格納するのが、乱暴だ。 次に、vector<string>を直にlistに格納するのも、乱暴だ。 vector<string>に何か意味があるのであれば、それなりのクラスにすべきだ。
- 507 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:35:45 ]
- 乱暴ってのが何を意味してるかわからんが、
別にstringは重くないしvector<string>も十分に速いぞ
- 508 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:36:17 ]
- あほすぎる・・・
- 509 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:46:20 ]
- >>506が何を言いたいのかワカンネ
乱暴ってどういう意味? vector<string>を使うなって言ってるの?
- 510 名前:デフォルトの名無しさん mailto:sage [2007/10/22(月) 23:57:05 ]
- vector<string>を内包したオブジェクトつくって
インターフェースをきちんとしたオブジェクト指向な作り方しろってことか…。 C++だからって必ずオブジェクト指向で作らんでもいいだろ…
- 511 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:00:22 ]
- >>506は「そんなこと、したことないぞ」と言っている通り、思い込みで書き込んでいるんだよ。
- 512 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:02:01 ]
- vector<string> に何か意味をもたせるとして、所詮 vector 程度なら変数名で十分示せると思う。
vector<string> はオブジェクト指向だよ。
- 513 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 00:27:02 ]
- >>507
それは実装依存だな。 どーでもいい場所なら乱暴なコーディングをしても構わないし、すべきだろうが、 重くないとか十分に速いとか言ってるようじゃ、C++使う意味がないんじゃないか。 >>509 文字どおりさ。 動けば何でもいい、そういうやりかた。 >>510 何らかの意味があるのだからtypedefすべきだし、 大抵の場合は何か付随したデータがあるわけで、 それと本体のvector<string>を別管理するのは、 不適切だと思う。 >>512 オブジェクト志向と言いながら、 BASICやスクリプト言語のように、型にルーズでどうしようもない代物を作る人を、見てきたわけだが。 彼らは万能ナイフを作ることに喜びを感じているようだが。
- 514 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 08:58:30 ]
- ふ〜ん。君はそういう事に喜びを感じているんだね。
- 515 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 09:02:19 ]
- そこでboost::ptr_vector, ptr_list
内部ではvoid*として保持されているためコードサイズ膨張対策にもなる 重いオブジェクトのコンテナならこれで決まり☆
- 516 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:21:21 ]
- >>513 のやり方を推し進めたら、プログラム中に出てくる概念全部を
typedefなりクラス化なりすることになるな アホとしか思えん いちいち型を定義してたら型がむやみに大量発生するし、 そのせいでtypedefされた型の元の型がわからなくなって どういう操作ができるのかいちいち調べる羽目になる 名前の一覧は vector<string> names; で十分 過度の抽象化は毒であると知れ
- 517 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:44:09 ]
- >>516の書き込みをみて
VC++が頭をよぎった。 ふとよぎった。
- 518 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:50:52 ]
- >>513は早すぎる最適化をやっちゃうタイプだな
- 519 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 10:51:54 ]
- >>516
> 名前の一覧は vector<string> names; で十分 名前だけで単独なんだ・・・どういう場合?
- 520 名前:デフォルトの名無しさん [2007/10/23(火) 15:36:35 ]
- スイッチを押すと外部割り込みでInterrupt関数が呼び出されて、スイッチを押した回数を数えて変数countに保存し、
タイマ割り込みで一定時間ごとにTimer関数を呼んで押した回数ごとに行動を変えるプログラムを作りたいです。 グローバル変数を使う以外に二つの関数の間でcount変数の値を渡す方法はありますか?
- 521 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:04:40 ]
- つまり、二つの割り込み関数からそれぞれ設定と参照を行いたいわけだな。
グローバル変数の代わりに、それらの関数をメンバとして持つクラスを作ってそのメンバとしてcountを持てばいい。 勿論、そのクラスの生存期間に注意が必要。
- 522 名前:520 [2007/10/23(火) 16:23:07 ]
- せっかく回答してくれたのにすみません。
C++ではなくCで行う方法を教えてください。
- 523 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 16:37:47 ]
- >>520
設定も参照もどちらも割り込みルーチンから行なうのなら、 グローバル変数にしておくのが無難だがなぁ。 グローバル変数にしたくない理由は?
- 524 名前:デフォルトの名無しさん [2007/10/23(火) 16:44:44 ]
- メインで変数作ってポインタ渡せば?
グローバルと同じような物だけど
- 525 名前:520 [2007/10/23(火) 17:49:50 ]
- >>523
やはりグローバル変数がいいですか・・・。 プログラム作ってる途中でよくわからなくなることが多くて個人的にあまり好きじゃないだけです。
- 526 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 18:12:44 ]
- >>520
gccなら関数内関数で外側のローカル変数を参照出来るはず。 グローバル変数以上に問題のあるコードかもしれんが。
- 527 名前:デフォルトの名無しさん mailto:sage [2007/10/23(火) 19:13:25 ]
- >>524
割り込み処理だと渡しようがないと思うんだ。
- 528 名前:wolf ◆8VH3XAqjlU mailto:sage [2007/10/23(火) 21:52:40 ]
- >>520
>>525 1.割り込みマスク外した後ならsignal関数では? 2.共通の割り込みハンドラで割り込みを1箇所で受けられるかな?
- 529 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:25:37 ]
- ここで聞いてよいのかわからないのですが・・・
CPadてVistaでも使えるものなんでしょうか? とりあえず実行すると〜.exeが見つかりません〜てなエラーが出てきます。 これはOSとCPadとの相性が悪いのか、自分が何かミスを犯しているのか、どちらなのでしょう?
- 530 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:29:32 ]
- 調べてみたら自己解決できそうなので、自分で調べてみます。
- 531 名前:デフォルトの名無しさん mailto:sage [2007/10/24(水) 07:32:45 ]
- 解決、スレ消費申し訳ありませんでした。
- 532 名前:デフォルトの名無しさん [2007/10/25(木) 16:20:24 ]
- VCでコントロール(仮にオリジナルのペイントソフト)を作成して
それをVB.NETから呼び出して、VBで作成したインターフェース内に埋め込みたいのですが VCで作ったものをDLLにまとめることくらいしか現在わかっていません。 何に対応(例えば継承させるクラス)させればよいのかなどおおまかに教えていただけないでしょうか?
- 533 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 16:23:09 ]
- VBのスレで聞いたら?
- 534 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 18:26:14 ]
- >>532
> 何に対応させればよいのか ↓ > コントロール 自分で書いていて気がつかないとは。
- 535 名前:デフォルトの名無しさん [2007/10/25(木) 19:31:24 ]
- ABのどっちが好き?
#include <iostream.h> void f(unsigned int u){ printf("%u", u); } main(int argc, char **argv){ unsigned int u = 0; if(argc > 1){ A u = static_cast<unsigned int>(atoi(argv[1])); B sscanf(static_cast<const char *>(argv[1]), "%u", &u); } f(u); }
- 536 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:32:55 ]
- lexical_cast<>
- 537 名前:デフォルトの名無しさん mailto:sage [2007/10/25(木) 19:55:07 ]
- qa3457974
- 538 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 01:33:48 ]
- >>535
エラー処理してない点は同じなのでどちらも却下。 だ が 敢 え て 言 わ せ て も ら う if(1 < argc){ だと!
- 539 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 06:44:04 ]
- >>538
if(argc > 1) より if(1 < argc) の方がいい理由も添えて書いてくれ。
- 540 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 11:33:39 ]
- いまどきiostream.hって・・・
- 541 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 13:57:17 ]
- .h
- 542 名前:デフォルトの名無しさん [2007/10/26(金) 14:13:27 ]
- bf
- 543 名前:538 mailto:sage [2007/10/26(金) 17:15:12 ]
- >>539
半分冗談だったんだけどね(^^; 適当に流して欲しかったんだけど。 単に俺のスタイルなだけ。 例えば、『aが1よりおおきくて、かつ10より小さい』という命題について if(1 < a && a < 10) と書くと、常に右が大きくなるでしょ。 完全に主観だけど、あとでソースを見返すとき分かりやすいんですよ。 (数学の)実数線も右が大きいし、なんとなくそういうクセをつけました。 それだけ。
- 544 名前:デフォルトの名無しさん mailto:sage [2007/10/26(金) 17:36:45 ]
- >>543
俺もそう書く 理由も同じ
- 545 名前:デフォルトの名無しさん [2007/10/26(金) 21:27:52 ]
- vectorは「動的配列」という事なのですが、
これは、 void init_vct() { vector< vector<int> > v; v.resize(3); for(int i=0; i<v.size(); ++i) v[i].resize(5); int array[] = { 0, 1, 2, 3, 4}; } int main() { init_vct(); return 0; } としたときに、init_vct()関数を抜けても、 int型配列 arrayと違って、vector< vector<int> >型配列 vは、 メモリ上から消されないということですか? //初歩的な質問で申し訳ありません。
|

|