- 1 名前:デフォルトの名無しさん [2007/06/03(日) 22:33:55 ]
- エスケープシーケンスやWin32APIなどの環境依存な物でもOK。
ただしその場合、質問者は必ず、環境を書きましょう。 ※sage禁止です。 【前スレ】 【初心者歓迎】C/C++室 Ver.37【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1178432985/l50 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 411 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:38:21 ]
- C++ってなんでfinallyがないの?
あったら、auto_ptr使わなくてもこんな感じで書けたりしませんか? char *str = new char[256]; try { ... if (...) return; ... } finally { delete [] str; } と、C/C++初めて1年の俺が適当に言ってみる。
- 412 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:41:27 ]
- >>411
逆にスコープに厳しいコンストラクタ/デストラクタ(auto_ptr)があるから、 finalliyはいらないという判断だったような気がする
- 413 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:42:02 ]
- >>411
そんな書き方をいったい何箇所にコピペするつもりだ? RAII のほうが処理を局所化できていい。 finally しかない Java では実際にそういうコードのコピペが多くなる。
- 414 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:45:13 ]
- >>411
↓こっちのが楽だと思わんか? std::string str(256); ... if (...) return; ...
- 415 名前:デフォルトの名無しさん [2007/06/13(水) 09:53:43 ]
- そうそう、確か、deleteを使わずにローカル変数オブジェクトがC++流儀だった希ガス。
- 416 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 09:54:43 ]
- >C++言語的割り込み処理
割り込み処理って、中断するだけで割り込みが終わったら元の処理に戻るんじゃなかったっけ? なら意味違うかも。。。
- 417 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:48:04 ]
- 割り込みはダメだろう・・・常識的に考えて。
例外処理は例外処理。 例外的な動作が起こった場合に行う処理。
- 418 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:52:15 ]
- 食い込みはおk?
- 419 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 10:56:58 ]
- >例外的な動作が起こった場合に行う処理。
C言語の戻り値見て対処するのも”例外処理”って呼ばれるし、 これじゃ、区別付かないじゃん。
- 420 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:02:07 ]
- でも「C++例外処理」じゃ不満なんだろ。
センセーショナルでクールな・・・ | \ __ / _ (m) _ピコーン |ミ| / `´ \ ('A`) ノヽノヽ くく 「禿式例外処理」なんてどうだ? 組み込みのおっさん相手にはかなりセンセーショナルだろ。
- 421 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:03:25 ]
- >でも「C++例外処理」じゃ不満なんだろ。
当たり前だろ、C++の例外処理は、C++例外処理です。っていえないお。 >「禿式例外処理」なんてどうだ? オヤジギャグ?
- 422 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:06:32 ]
- 別に俺用語を生み出すのは構わないけど
他人とコミュニケーションを取るときには使わないでね
- 423 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:08:45 ]
- 洋本でも普通にC++EHだしな
- 424 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:09:05 ]
- 禿が作ったんだから禿式ってことね。
www.research.att.com/~bs/ エラーコードによる例外処理に対して区別するって意味なら、 例外オブジェクトによる例外処理って感じかなぁ。
- 425 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:15:26 ]
- 儂の例外処理は108式まで……
- 426 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:27:04 ]
- 構造化例外ってのは別物だっけ課?
- 427 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:38:04 ]
- 例外を使わずに自前のChain of Responsibilityパターンを使ったエラーハンドラ機構を使うようにしましょう
- 428 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 12:42:32 ]
- >>419
それは言語的に特殊な構文が用意されてるわけじゃない。 あと、何でもかんでも名前で説明しようと思うからいけない。 そういう違いは名前以外の解説文で説明しなはれ。
- 429 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:04:41 ]
- 配列の要素を全部同じ値に埋めるって関数があったと思うんですが、
forで回すのとその関数を使うのとではどちらが早いんですか? もしくは、計測するのでその関数名教えてください。age
- 430 名前:デフォルトの名無しさん mailto:age [2007/06/13(水) 13:14:35 ]
- memsetのこと?
- 431 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 14:27:31 ]
- fill() だろ。
- 432 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:00:43 ]
- ostream::write って引数 const char* だけど、
何で const void* じゃないの? クラスまで暗黙にキャスト、あるいは static_cast できてしまうから?
- 433 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:05:48 ]
- >>432
writeは何をする関数かな?
- 434 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 15:12:29 ]
- あなたに愛を届ける関数です。
- 435 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:19:29 ]
- int main()
{ FILE *fp; int c; fp=fopen("sample.txt","r"); while((c=fgetc(fp))!=EOF) putchar(c); fclose(fp); return 0; } このプログラムの動作でsample.txtが日本語でも大丈夫なようにしたいのですが、 fgetcをどう変えたら良いでしょうか?
- 436 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:26:24 ]
- >>435
それで大丈夫なように見えるけど、どうダメだったの?
- 437 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:33:31 ]
- >>436
すいません、putcharの下に一つ入れ忘れましたorz int main() { FILE *fp; int c; fp=fopen("sample.txt","r"); while((c=fgetc(fp))!=EOF) { putchar(c); putchar('\n'); } fclose(fp); return 0; } 正しくはこうでした。
- 438 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:34:43 ]
- cが漢字の1バイト目だったら改行しない、でいいだろ
1バイト目かどうかの判断は文字コードによる
- 439 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:36:49 ]
- 文字コードじゃなくて漢字コード、ね。
で、1バイト目を出力したことは覚えておいて 2バイト目は無条件に出力 3バイトの文字コードなら以下同様
- 440 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:48:56 ]
- >>439
ありがとうございます。 エラー内容と言われたことをよく考えたら c=fgetc(fp); putchar(c); c=fgetc(fp); putchar(c); これで日本語一字を出力するんですね。 putcharってこれでやったら日本語を1バイトずつ区切って ゴミ(?)の文字2つを出力するかと思ってました。
- 441 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:32:27 ]
- >>406-
構造化例外処理という言葉はあるにはあるのだが、 Windowsの例外処理の名称として有名なので使えない
- 442 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 17:58:33 ]
- >Windowsの例外処理
これってなんだけ?
- 443 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:16:48 ]
- >>433
そんなこと全く関係ないっしょ。 fwrite の引数の型が const void* だし。
- 444 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:19:30 ]
- 関係ある。ちゃんと読め。
fwrite は、サイズと数を指定するだろ。 ストリームはストリームを指定するんだ
- 445 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:21:58 ]
- >>442
「構造化例外」つってんのにググりもしないとは。 >>443 それこそまったく関係がない。 「文字列を出力する」 ostream と 「何でも出力する」 fwrite() を比較するとは 頭大丈夫?
- 446 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:22:12 ]
- >>442
__try __except __finally
- 447 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:23:58 ]
- >>445
ostream は別に文字列だけ出力すればいいわけじゃないってのは、 ofstream と ios::binary の存在を考えれば分かると思うが。
- 448 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:24:54 ]
- >>444
要するに、あくまでバイトストリームを出力する、というスタンスを示すために、 write では引数を const char* としてるという理解でいいのか?
- 449 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:26:38 ]
- 文字列をbyte列と言い換えればいいのでは、streamは
- 450 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:34:58 ]
- クラステンプレートbasic_ostreamのこともたまには思い出してあげてください
writeの引数はただのcharではなくテンプレート引数よ
- 451 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:36:15 ]
- ああ、そうか。
そういうことか・・・。 了解。分かった。
- 452 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:42:34 ]
- 俺が思うに、basic_ostream::writeに対応するCの関数は、
fwriteではなくfputs/fputwsなのだろう するとfwriteに対応するのはなんだろうという気になるが
- 453 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:52:56 ]
- いや、ヌル文字を無視するから、fputs とは対応しないと思う。
wostream::write がある以上、 fwrite と basic_ostream::write も対応しないんだろうな。 用途的には fwrite と ostream::write が対応するんだろうけど。
- 454 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 18:56:35 ]
- ところで、例えば int 値をバイナリでファイルに書き込みたいときは、
ofstream f("hoge", ios::binary); int x = 0x12345678; f.write(reinterpret_cast<const char*>(&x), sizeof x); という風に使うんだよね?(エラー処理は略)
- 455 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:29:12 ]
- new されたサイズをプログラマが知る方法はないですか?
- 456 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:37:32 ]
- >>455
標準にはない
- 457 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:03:36 ]
- >>454
たしかに、そうなんだけどね。ただ、 basic_ofstream<wchat_t> f; のときは f.write(reinterpret_cast<const wchar_t*>(&x), sizeof(x) / sizeof(wchat_t)); になる。 const void* を引数にするとわけ分からなくならないか?
- 458 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:05:26 ]
- "wchat_t"?
- 459 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:11:26 ]
- >>457
それって意図したとおりに動かないんじゃないの 最終的に書き込む際にはバイト列に落とし込まなければならないんだから char以外のストリームだと確実にエンコード変換がかかるだろ 単なる狭化変換かもしれんがバイナリ値とかは確実に壊れる write()で書いたものが変換をバイパスできるわけではないし
- 460 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:34:48 ]
- >>457
それは x のサイズが wchar_t のサイズで割り切れなければヤバいかと。 まあ、今回は x が int だから多分ほとんどの環境で大丈夫なんだろうけど。 const void* でわけわからなくなる点に関しては、 既にその点で了解してる。 バイナリで wchar_t 以外の値を書き込む場合は、 ostream::stream を使うしかないとういことやね。 char = 1バイトと決まってるし。
- 461 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:14:07 ]
- >>455 >>456
replacement newを書くというのはだめなのかな。
- 462 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:16:49 ]
- >>459
エンコード変換なんてかかるの? basic_ofstreamはwchar_tだけ特殊化なんてことはしないと思うから、 charでかからないならwchar_tでもかからないと思うよ。 それとも、エンディアン変換の話か? >>459 うん。割り切れない処理系がないとは言い切れないよね。正確には知らんけど^^ そもそも、stream系のクラスはバイト列を扱うこと自体が 向いていないってことを言いたかっただけだよ。
- 463 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:21:27 ]
- >>462
まぁ落ち着いてVCとかの標準C++ライブラリのソース見てみ。
- 464 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:38:59 ]
- C言語でプログラムを作ってコンパイルまでできているのに
いざコマンドプロンプトで実行して整数値を入力だとかするんだけど、 数回入力するとエラーがでるんだけどなんでなんだい?
- 465 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:40:41 ]
- コンパイルが通るからってバグが無いわけじゃないだろ
その情報だけじゃ何が原因かはわからんけど
- 466 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:42:18 ]
- 文てきには間違ってないんだけど、
長い文を書いて作ると絶対なるんだよね。 行数の限界とかってないよね?
- 467 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:47:43 ]
- >>457
char 以外のストリームでバイナリ出入力っていうのがそもそも無理。
- 468 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:12:04 ]
- >>463
一応、STLportのソースをざっとみたけどそんな箇所は見あたらなかった。 少なくともSTLportでは、 ofstream::write → streambuf::sputn → streambuf::xsputn → char_traits<_Char>::assign の順で文字などが出力されているのだけど、 このどこでエンコーディング変換を行うのかだけでもよかったら教えて欲しい。 多分、探し方が足りないだけだと思うので。 >>467 basic_ostream<char>でしか正しくバイナリストリームを扱えないにもかかわらず、 UTF8やUTF16、UCS4などに対しても適切なstreamクラスを提供せねばならんので、 charだけ特別ってわけにはいかなかったんだろうね。
- 469 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:37 ]
- 学校で作ったライブラリがあって、ヘッダーファイルに
#define GameMain \ int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPreInst,LPSTR lpszCmdLine,int nCmdShow)\ {\ MSG lpMsg;\ HWND hWnd;\ WNDCLASS myProg;\ (以下略) } って書いてるんだけど、家に帰っていざ作って入力すると全行にエラーが出て動かないんだ・・・ とりあえず、\消してやってみたりしても{に対応する関数がないとかエラーが出て動かない。 学校だと.net2003で、家だとVC2005なんだけど・・・何がどう間違っているんだかさっぱりだ。orz
- 470 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:14:47 ]
- >>468
足りんな。 そこまででは、I/Oバッファに書き込んでいるだけだ。 実際にI/Oバッファからファイルにフラッシュする時点で同時に 変換を行っているはずなので、そこを探せ。
- 471 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:18:50 ]
- >>469
どういうエラーだよ \は次の文字と組み合わさるので この場合は、\直後の改行が無効になるだけ スペースとかまぎれこんでるとエラーになるぞ
- 472 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:19:40 ]
- >>469
}が全角だとか言う落ちはないよな?
- 473 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:24:58 ]
- キタ━━━━(゚∀゚)━━━━!!!!
- 474 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:35:19 ]
- >>471 >>472
半角だった。 今、見比べていて、唯一違った部分のコメント部分消したら動くようになった。 \とかとコメントって絡ませたらまずいってことを知ったよ。お騒がせして申し訳ない。orz
- 475 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:50:00 ]
- 問題が発生したため、ta.exe を終了します。 ご不便をおかけして申し訳ありません。
コマンドプロンプトで実行したら絶対途中でエラーがでる。 なぜだよおい。
- 476 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:51:56 ]
- 環境もコードも示さずにその質問に答えられるのはエスパーだけだな
まぁexeとかコマンドプロンプトとか言ってるし Windowsなんだろうなってことぐらいはわかるが
- 477 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:53:56 ]
- まあ、どうせいまだにMBCSなんだろう>糞学校のソースコード
で、VS2003のIDEのデフォルト設定がMBCSで、 VS2005のデフォルトが、ようやく、ほんとうにようやくUnicodeに変わったので、 こけてるんじゃないか。
- 478 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:54:51 ]
- 素人なもんですみません。windowsです。
でなにを示せばいいんだい。 ちなみに短い文ならエラーでないのに複雑な文になると途中で強制終了される。
- 479 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:00:51 ]
- >>459
Cのstdioだとバイナリモードなら変換がかからなかったはず もしかしたら単に俺の使っているVisual C++固有の挙動なのかもしれないけど >>468 locale関係で文字の変換の機能が提供されていて、 標準では(locale毎の)charとwchar_tの変換が用意されていることになっている たしかcodecvtとかいうファセットがそれだったと思う
- 480 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:02:34 ]
- >>478
素人が手を出すもんじゃない。 大人しく一から言語の勉強をしなさい。
- 481 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:04:08 ]
- >>480
おそらくコマンドプロンプトがバグってると思われるんだけどな
- 482 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:10:04 ]
- ソース出せばいいと思うよ
- 483 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:11:04 ]
- >>481
わらた、おもしろすぎ。
- 484 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:13:38 ]
- >>481
windows入れなおせばいいと思うよ
- 485 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:26:52 ]
- >>470
最終的にファイルに書き出すときに、sjisやeucに変換する必要があるってことね。 たしかに変換してた。 勉強になった。ありがとう。
- 486 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:39:48 ]
- >>474
/* */ 型のコメントなら大丈夫だよ
- 487 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:46:04 ]
- >>857
へぇ、今まで自分もエラーは一括して-1返してた。 ていうかそもそもmainの正常終了異常終了って何かが拾って処理してるんですか?
- 488 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:47:30 ]
- 何誤爆しとんねんw
- 489 名前:487 mailto:sage [2007/06/13(水) 23:51:37 ]
- 誤爆しました><
焦ってすぐ書き込もうと連打したら規制リストに引っかかりました><
- 490 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:52:31 ]
- NULLは大抵 0 とか (void *)0 だと思うんですが、環境によっては ゼロ じゃない時もある、とききました。すなわち、
「NULLは 0」ということを前提としたプログラムは書くべきではないですか? 例えば… void hoge(Foo *bar) { // bar が NULL じゃなかったら if (bar != NULL) // こっちはいいけど if (bar) // こう書く奴は死ぬべきでしょうか bar->...; }
- 491 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:54:41 ]
- >>355
それらしい記述見つからないから、flushした方がいいのかなぁ。 ようわからん。
- 492 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 00:56:23 ]
- >>490 www.kouno.jp/home/c_faq/c5.html
- 493 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 01:24:47 ]
- >>491
d。 俺も最新のドラフト見てるけど、 それにすらそれらしい記述が見つからないんだよな。 どっか違うところに隠れてるのか、それとも flush しないとヤバいのか・・・。 まあ、flush しといた方が無難そうだな。
- 494 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:27:21 ]
- pc11.2ch.net/test/read.cgi/tech/1181087371/l2
↑のスレで>>982のコードを書いたのですが、 このプログラムで非数字(たとえばaとか)が入力されると プログラムが異常な動作となってしまいます。 これって普通どうやって対処するものなのでしょうか?
- 495 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 19:35:50 ]
- scanf の戻り値を確認して
0 なら 1 文字捨てて読み直す
- 496 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:18:35 ]
- >>495さんのレスを参考に変えてみたのですが、
for(i=0;i<3;i++){ printf("%d行目の\n",i+1); for(j=0;j<3;j++){ printf("%d列目=",j+1); if(scanf("%d",&array[i][j])==0) printf("%d",array[i][j]); j--; } こういうことかと思ったらやはり間違ってて、 「一文字捨てる」という概念がいまいち分からないです。 どう直したらarray[i][j]のエラー入力は無かったことにされて 再入力するようにできるんでしょうか?orz
- 497 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:35:41 ]
- int ret;
while(ret = scanf("%d", &array[i][j]), ret == 0) { scanf("%*c"); } if(ret == EOF) { /* 途中で終わっちゃったのでエラー処理して終了 */ }
- 498 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:43:41 ]
- >>497
%*cって何やってるんだろうとググったらscanfに見たことも無い仕様が いっぱいで今更ながらにビックリしてしまったです…。 for(j=0;j<3;j++){ printf("%d列目=",j+1); if(scanf("%d",&array[i][j])==0){ scanf("%*c"); j--; } レスを参考にこんな感じで直したらいけそうな感じになりました! scanfの入力エラーって結構よくあるわりに長いこと対処法が分からなかったのでとても助かりました。 教えて頂き本当にありがとうございます><
- 499 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 20:53:50 ]
- つか、getchar でいいような
- 500 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:12:28 ]
- >>499
getcharって文字入力用じゃないですか? これで使う方法ってあります?
- 501 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:26:25 ]
- scanf("%*c"); の代わりに使ってみればいいじゃないの。
- 502 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 21:34:57 ]
- >>501
あぁあなるほど、そっちの方に使うのか! getchar=入力用って思ってたからscanfの代わりにって言ってるのかと思った。 それじゃ「111」が三桁の数値にならないよなぁ?みたいなよく分からない混乱に陥っていたorz ちょっとそちらでも試してきてみます><
- 503 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:46:34 ]
- 結局のところ、scanf()の代わりにfgets()+sscanf()で充分ってことだね。
- 504 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 22:48:53 ]
- 余計複雑になるだけだと思うが。
- 505 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 03:24:22 ]
- fgets+strtolにすれば10進数以外も使えて便利
文字が来ても対処簡単だし
- 506 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 04:02:27 ]
- 1行につき数値1つ?
- 507 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:00:46 ]
- >>506
オイオイ、strtolは変換できなかった場所のポインタ返ってくるし 変換できなかった場合はerrnoにエラーコード入るから改行までループで回せば何個でも変換できるぞ
- 508 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 13:48:27 ]
- すまんす
- 509 名前:デフォルトの名無しさん [2007/06/15(金) 15:35:13 ]
- C++の質問です。
学習用の簡単なクラス(名前をsampとします)があって、内部でintの値を保持してます。 そこに、friend関数でoperator+()を追加したいです。 最初、 samp operator+(samp & obj, int i) samp operator+(int i, samp & obj) としたところ、 obj = 10 + obj; はOKだったのですが、 obj = 10 + obj1 + 10; はコンパイルがエラーになりました。 そこで、 samp operator+(samp obj, int i) samp operator+(int i, samp obj) としたところ、コンパイルが通り、結果も意図した通りになりました。 これはなぜなのでしょうか? ちなみに、operator+()の内部は以下のように書きました。 samp operator+(int i, samp obj) { samp temp; temp.x = obj.x + i; temp.y = obj.y + i; temp.z = obj.z + i; return temp; } 引数の順序が反対の関数も内部は同じです。 今まで参照と実物とはまったく同じ扱いでいいと思っていたのですが、
- 510 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 15:43:21 ]
- samp operator+(samp & obj, int const & i) ;
samp operator+(int const & i, samp & obj) ;
- 511 名前:デフォルトの名無しさん [2007/06/15(金) 15:56:02 ]
- >>510
そのように書き直してみましたが、コンパイル通りませんでした。 以下はコンパイルエラーのメッセージです。 > g++ samp.cpp samp.cpp: In function 'int main()': samp.cpp:50: error: no match for 'operator+' in 'operator+(((const int&)((const int*)(&10))), ((samp&)(& obj3))) + obj3' samp.cpp:37: note: candidates are: samp operator+(const int&, samp&) samp.cpp:28: note: samp operator+(samp&, const int&)
|

|