1 名前:デフォルトの名無しさん mailto:sage [2008/01/16(水) 15:14:51 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.46【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1198755167/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
552 名前:デフォルトの名無しさん mailto:sage [2008/01/28(月) 23:09:57 ] >>551 うわぁお!! すげー、通りました、感動しています。 しかし6.0から2005にするといろいろ戸惑いますね。作業効率が半分くらいになった感じです。
553 名前:デフォルトの名無しさん [2008/01/28(月) 23:37:08 ] >>545 そうですね、こちらでも考えましたが、このような木の構造にするしかなさそうですね。 >>547 アドバイス有り難うございます。 処理系を作るときに、こういう形で構文木を作るとネストされたリストも簡単に表現できるということで、 勉強したことがありました。確かに自分もよく使います。 お二方、どうも有り難うございました。
554 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:09:40 ] >>552 6.0から2005だと色々変えないといけないところが出てくるだろうな。 new 失敗した時デフォで NULL 返すような古いコンパイラだからなあ。 まあ、変更が終われば大した違いはなくなると思うぜ。
555 名前:デフォルトの名無しさん [2008/01/29(火) 00:46:03 ] LONG a=適当; LONG b=適当; LONG c=適当; if(a*a + b*b > c*c) { } とした時に、 a*a等がLONGに収まる範囲を超えてしまったら、 どうなるのでしょうか?
556 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 00:56:45 ] >>555 LONGがlongのtypedefなら未定義
557 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:22:40 ] STLでウィンドウへ作ったり絵を描くクラスはどこにありますか?
558 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:23:49 ] ありません gilを使ってください
559 名前:555 mailto:sage [2008/01/29(火) 01:32:29 ] >>556 Win32APIを使ったプログラムで、 LONGは<windows.h>に定義されているモノです。たぶん。 未定義というのは、どうなるか分からないということですか。
560 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:33:46 ] 世界ランク14位おめw 2chcity.myminicity.com/ ランク 国名 街 人口 (前日比) 前日 --- 1 US1 LUELand 326354 (+211) 326143 --- 2 US2 GoonTown 179482 (+711) .178771 --- 3 Germany1 .isnichwahr.de 119091 (-654) 119745 --- 4 US3 CreateMyCity Forum .87380 (+1982) 85398 --- 5 Poland1 #debian.pl 79594 (+1043) .78551 --- 6 Germany2 upOTia 52443 (+399) 52044 --- 7 France1 Reze'Les Nantes .41960 (+246) 41714 --- 8 Canada1 J-C Satanas & CO .40995 (+721) 40274 --- 9 US4 retromundi .40604 (+788) 39816 --- 10 France2 FanaZ .39902 .(+1268) 38634 2↑ 11 Germany3 deluxebits 38770 .(+3199) 35571 1↓ 12 US5 .isnichwahr.at .38234 (+78) 38143 1↓ 13 France3 gravure-news .37204 .(+765) 36439 2↑ 14 Japan1 2ch_city 35637 .(+1970) 33667 1↓ 15 Spain1 Media-Vida .35205 .(+686) 34519 1↓ 16 France4 Sguy .35083 .(+1456) 33626 2↓ 17 Ireland1 .prapikilty .35067 .(+871) 34196 --- 18 Spain2 benidaver .34505 .(+914) 33591 --- 19 Germany4 directupload ..32490 .(+82) .32408 -↑ 20 Slovakia1 Legionar City 32056
561 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 01:36:39 ] >>559 そういうことです。
562 名前:デフォルトの名無しさん [2008/01/29(火) 05:15:49 ] doubleとintの丸め誤差について質問しているものです。 SSE2命令で計算するとどうして3.55*100が355になるのか、どうしてもわかりません。 IEEEの仕様どおりの浮動小数点の計算方法だと、レジスタのサイズが52でも80でも128でも doubleの3.55は実際には2.54999999...となってしまうと思うのですが、、、 gccでSSE2命令を有効にして作成したバイナリの逆アセンブルの結果をみると、 <元ソース> int main(void) { double d = 3.55; int n = d * 100; printf("%d", n); } <続く>
563 名前:デフォルトの名無しさん [2008/01/29(火) 05:17:36 ] <続き> <main関数の逆アセンブル結果> 80483c4: 8d 4c 24 04 lea 0x4(%esp),%ecx 80483c8: 83 e4 f0 and $0xfffffff0,%esp 80483cb: ff 71 fc pushl -0x4(%ecx) 80483ce: 55 push %ebp 80483cf: 89 e5 mov %esp,%ebp 80483d1: 51 push %ecx 80483d2: 83 ec 24 sub $0x24,%esp 80483d5: dd 05 d8 84 04 08 fldl 0x80484d8 80483db: dd 5d e8 fstpl -0x18(%ebp) 80483de: dd 45 e8 fldl -0x18(%ebp) 80483e1: dd 05 e0 84 04 08 fldl 0x80484e0 80483e7: de c9 fmulp %st,%st(1) 80483e9: dd 5d e0 fstpl -0x20(%ebp) 80483ec: f2 0f 2c 45 e0 cvttsd2si -0x20(%ebp),%eax <以下はprintfを呼んでいるだけと思うので略> をみてもなんでこうなるのか全然わかりません。 cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに コピーします。」という内容らしいので、この動作がキモと思うのですが、これは 中でどういう動作をしてるのだろう。誰かご存知ありせんか? 長々とすいませんどうかよろしくお願いします。
564 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 05:26:47 ] When a conversion is inexact, a truncated (round toward zero) result is returned. と書いてあるから3.54になるはずなのに変だねえ。
565 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 08:06:51 ] >>563 逆アスじゃなく、gccのアセンブリ出力を載せてくれ。0x080484d8なんてアドレス書かれてもなんだか判らん。
566 名前:デフォルトの名無しさん [2008/01/29(火) 09:06:52 ] >>565 すいません。Cのコードは先のものと同じです。 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx subl $36, %esp fldl .LC0 fstpl -24(%ebp) fldl -24(%ebp) fldl .LC1 fmulp %st, %st(1) fstpl -32(%ebp) cvttsd2si -32(%ebp), %eax movl %eax, -12(%ebp) movl -12(%ebp), %eax movl %eax, 4(%esp) movl $.LC2, (%esp) call printf <以下略>
567 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 09:35:25 ] だから、どうして.LC0とか.LC1の定義も省略するのかなぁ……
568 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 10:46:51 ] >>563 > cvttsd2siの命令が、「64ビット倍精度実数を整数値に変換して汎用レジスタに > コピーします。」という内容らしいので、この動作がキモと思うのですが、これは > 中でどういう動作をしてるのだろう。誰かご存知ありせんか? ここまでくるとCPUアーキテクチャマニュアル見ないとわからん。 Intelのサイトにあると思うが、日本語であるかどうかわからん。
569 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 11:03:35 ] CVTTSD2SI--Convert with Truncation Scalar Double-Precision Floating-Point Value to Signed Doubleword Integer F2 0F 2C /r xmm/m64 切り捨てを使用して、xmm/m64の 1 つの倍精度浮動小数点値を r32 の 1 つの符号付きダブルワード整数に変換する。 説明 ソース・オペランド(第 2 オペランド)の 1 つの倍精度浮動小数点値を、デスティネーション・ オペランド(第 1 オペランド)の 1 つの符号付きダブルワード整数に変換する。ソース・オペ ランドは、XMM レジスタまたは 64ビットのメモリ・ロケーションである。デスティネーショ ン・オペランドは汎用レジスタである。ソース・オペランドが XMM レジスタの場合は、倍精 度浮動小数点値はレジスタの下位クワッドワードに置かれる。 変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。変換の結果が 符号付きダブルワード整数の最大値より大きくなる場合は、整数不定値(80000000H)が返さ れる。
570 名前:デフォルトの名無しさん [2008/01/29(火) 12:08:40 ] 本当にありがとうございます。 自分もマニュアル見てみました。 結局動作としては、 1)3.55を80bitのレジスタ上で表現する。レジスタ上では3.55よりもわずかに小さい数として存在 2)fmulp命令を使って、1)の結果と100の積を計算する。 3)上の2)の結果をcvttsd2si命令を使ってint型に変換 になると。 >変換が不正確な場合は、切り捨てられた(ゼロに丸められる)結果が返される。 354.99999..からintへの変換はどう考えても「変換が不正確な場合は、」に該当すると思うのですが、 切り捨てると、354になると思うんですが、、、
571 名前:デフォルトの名無しさん [2008/01/29(火) 12:54:22 ] 何度もすいません。 -msse2付きでコンパイルしても、不正確になってしまうケースがありました。 int main(void) { double d = 32.55; int n = d * 100; printf("%d\n", n); return 0; } あとは、512.55, 513.55とか、8192.55, 8193.55とか。(これ以外にもかなり多い) SSE2を使ったところで完全ではないようだし、なんだか不毛な感じもしてきた。 3.55については、たまたまSSE2で上手く計算できたケース、ということかな、と。
572 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:05:19 ] >>571 >567 手元の多桁演算処理に喰わせてみようと思うのだが……
573 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:12:09 ] 私の所でOptimization(最適化)レベルを切り替えて実験してみた所 -O0で354、-O1で355になりました。 コンパイラはg++3.4.5です。 ソースコードをのぞいてみると、-O0は律儀に計算していましたが、 -O1の方はいきなり定数355をロードして終了していました。
574 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 13:12:41 ] .file "IEEE1.c" .def ___main; .scl 2; .type 32; .endef .section .rdata,"dr" LC2: .ascii "%d\12\0" LC3: .ascii "pause\0" .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $16, %eax call __alloca call ___main movl $355, 4(%esp) ←これ movl $LC2, (%esp) call _printf movl $LC3, (%esp) call _system movl $0, %eax leave ret .def _system; .scl 2; .type 32; .endef .def _printf; .scl 2; .type 32; .endef
575 名前:デフォルトの名無しさん [2008/01/29(火) 20:52:37 ] std::vectorを使った場合で指定した添え字番号のオブジェクトを消す方法ってありますか?
576 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 20:58:18 ] vec.erase(vec.begin() + i);
577 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:19:04 ] C言語って1から覚えるとなると難しいでしょうか? プログラム関係の職(未経験可)どうしてもやってみたくて 就こうと思ってるんだけど理系学校出てないから無謀かな… スレ違いだったら凄くすいません…
578 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:21:27 ] まぁアレだ。プログラマ板で聞けばいいんじゃね
579 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:22:16 ] >>577 どんな人も1から覚えるわけだが。
580 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:26:36 ] パソコンとインターネット環境持ってるなら、ただでプログラミングの 勉強できるから、やってみればいいんじゃないか。 難しいかどうかは、人によるからなんとも言えない。 また、理系かどうかは思ったより関係ない。 ただし、数字アレルギーとか英語まったく読む気ないですぅとか言うなら、 やめた方がいいと思う。
581 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:00:31 ] でも、ひでーアルゴリズムのコードを見ると、 理系ってのも大事だなあと思う。
582 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:06:11 ] >>578 プログラマ板か…、予備知識無くここにカキコんじゃったからな… 次からそっちで聞いてみます >>579 まぁそうなんですよね…<どんな人も1から それを承知で聞いてみたんで >>580 色々サイト巡りして知識付けようとはしてます 数字アレルギーは全く無いけど、英語が学校成績で常に2付近だったから それが不安材料でヤバイってのは承知済み…orz 今度からプログラマ板でも行ってカキコしてみます レスどうもでしたm(__)m
583 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:12:35 ] プログラミング関係の英語ドキュメントなんて複雑な文法とか表現使ってないから学校の成績はほとんど関係ない
584 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:14:29 ] 俺も数学と英語は毎回赤点だったが今では必要なだけは出来るようになったぞ。 まあ相性と経験次第。
585 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:44:01 ] >>581 理系でもひでー奴はいくらでもいる。 >>582 > 英語が学校成績で常に2付近だったから >>580 をよく読んでくれ、英語ができないんじゃなくて、 「英語をまったく読む気がない」ならって書いてあるだろ。 君が必要に迫られたら何とかするタイプなら、心配はない。 >>583-584 が言うように、そんなに高レベルの英語が出て くるわけじゃないし、しかもラッキーなことにここ数年で 機械翻訳がそれなりに進化して、技術文書ならなんとなく 意味が理解できるぐらいなってきたから、あまり心配しな くても大丈夫だよ。
586 名前:デフォルトの名無しさん [2008/01/29(火) 23:44:45 ] 質問させてください。以下のソースをコンパイルしたところ、エラーが吐かれたのですが、その理由が良く分かりません。 #include <fstream> #include <TCHAR.h> #include <string> #include <sstream> using namespace std; class zantei{ private: // 行動データ構造体 class Action { public: int No; // 行動番号 (無しなら0) LPTSTR Type; // 行動種類 (無しなら0) LPTSTR Detail; // 行動詳細 (無しなら0) int Damage; // ダメージ(無しなら100) LPTSTR Color; // 色 (無しなら0) int X; // マルチプレイ用の遠距離行動(無しなら0) }; Action action[32]; public: BOOL LoadAction(); };
587 名前:デフォルトの名無しさん [2008/01/29(火) 23:45:15 ] エラー: ・error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 ・以下、変数Typeが認識されないためと思われるエラー他たくさん(24個) 全角スペースや、Typeが実は予約語だったんじゃないかとも疑いましたが、 空白はすべて半角スペースとタブ入力でしたし、TypeをiやNumに変えても同じエラーが出ました。 …ということは、完全に知らないことか、思い至っていないことによるエラーだと思われる、ということまでは考えることはできました。 どなたかご教授いただけないでしょうか。
588 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:45:50 ] ほほう 何というコンパイラで、何というメッセージが吐かれたのだい?
589 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:50:01 ] コンパイラは、Visual Studio 2005 Academic Editionです。 エラーは、>>587 以外もかくとすると…、ちょっと多いので、少々お待ちください。
590 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:51:06 ] >>586 そのコピペは全角だらけやな
591 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:51:32 ] このエラーだと、通常は Type の直前にある物がおかしいんだが、 tchar.h はインクルードしてあるしな・・・。 TCHAR が大文字でも何か起きると思えないし。
592 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:24 ] もしかすると、 #include <windows.h> が無かったりだったりとか?
593 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:26 ] >>587 全角が入ってる。間違いない。絶対だ。
594 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:54:56 ] エラー 2 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 エラー 3 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラー 4 error C4430: 型指定子がありません - int と仮定しました。 エラー 5 error C2146: 構文エラー : ';' が、識別子 'Detail' の前に必要です。 エラー 6 error C4430: 型指定子がありません - int と仮定しました。 エラー 7 error C4430: 型指定子がありません - int と仮定しました。 エラー 8 error C2146: 構文エラー : ';' が、識別子 'Color' の前に必要です。 エラー 9 error C4430: 型指定子がありません - int と仮定しました。 エラー 10 error C4430: 型指定子がありません - int と仮定しました。 エラー 11 error C2146: 構文エラー : ';' が、識別子 'LoadAction' の前に必要です。 エラー 12 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません エラー 13 error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません 警告 14 warning C4183: 'LoadAction': 戻り値の型がありません。'int' を返すメンバ関数とみなします。 これよりしたのエラーは、LoadAction()の実装部分で吐かれているエラーです。
595 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:55:00 ] >>592 そうか。撤回する。
596 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:55:42 ] >>594 全角入りのソースでそれと同じエラーを見たぞ。
597 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:56:36 ] 全角はチェックしてるって書いてあるだろw
598 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:21 ] まず、LPTSTR を char* にしてコンパイルは通るか? それをチェックしてみようぜ。
599 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:31 ] うーん、それじゃ、ちょっとソースをあっぷしてみますね 全角半角スペースを表示させても全角はは行っているようにみえないですが… 見落としかもしれないですし
600 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:57:43 ] あ、いや、wchar_t* か。
601 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:58:03 ] >>598 あ、はい、分かりました
602 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:01:02 ] マルチバイト文字セットに変えてchar*型、一応w_char*型にしてみても、 同じエラーが吐かれました(確認したのは大体のエラーの見た目と数だけですが) ソースをアップする作業に入りますね
603 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:01:27 ] w_char じゃなくて wchar_t だぜ
604 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:17:01 ] お待たせしました。 www.youlost.mine.nu/html999/upload.php の、2968.zipです。 うp用に、配置しなおしたら、エラーが増えて涙目になってました(汗 他のアプリケーション用に書いてたものを、エラーはかれていたソースファイルを別プロジェクトでテストしながらなおそうとしたため、 プロジェクト別フォルダから読み込む方式になっています。 ヘッダがプロジェクトに入っていないのは、…えー、ごめんなさい、忘れました、試行錯誤の過程です。 いずれヘッダも戻すつもりではいました。 …ごめんなさい。
605 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:28:00 ] zantei の最後にセミコロンがない。
606 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:29:01 ] game.h の方のやつね。
607 名前:デフォルトの名無しさん [2008/01/30(水) 00:31:11 ] 「最大50文字で自然数を2つ入力し、その大小を求めるプログラムを作成せよ」 って問題なんですが、プログラム作ってみたけどわかりません 文字数が同じときの結果がめちゃくちゃになりました 誰かこのおしえてください(><) cout << "文字数a:" << a_count << endl ; cout << "文字数b:" << b_count << endl ; if(a_count > b_count){ cout << "a>b" << endl ; }else if(a_count < b_count){ cout << "a<b" << endl ; }else if(a_count == b_count){ cout << "文字数が一緒なので一桁ずつ判断します" << endl ; for(int i=0 ; i < a_count ; i++){ if(a[a_count-i] == b[a_count-i]){ cout << a[a_count-i] << "=" << b[a_count-i] << endl ; }else if(a[Max_Length-i] != b[Max_Length-i]){ break ; } } if(a[a_count-i] > b[a_count-i]){ cout << "a>b" << endl ; }else if(a[a_count-i] < b[a_count-i]){ cout << "a<b" << endl ; } } }
608 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:32:38 ] a[a_count-i-1]
609 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:33:17 ] (><)
610 名前:607 [2008/01/30(水) 00:34:08 ] #include <iostream.h> #include <iomanip.h> const int Max_Length = 50 ; // 入力できる文字数の最大値 main() { char a[Max_Length] ; // 最初に入力する文字列 char b[Max_Length] ; // あとに入力する文字列 cout << "2つの自然数(最大50桁)を入力し、" << endl ; cout << "その2数の大小を判定するプログラムです" << endl ; cout << "数値を入力してください(最大50桁)" << endl ; cout << "a>>" ; cin.getline( a , Max_Length ) ; cout << "b>>" ; cin.getline( b , Max_Length ) ; int a_count , b_count ; // 文字カウンタ int i , j ; a_count = 0 ; b_count = 0 ; i = 0 ; j = 0 ; // 文字数をカウントする while(a[i] != '\n' && a[i] != '\0'){ a_count++ ; i++ ; } while(b[j] != '\n' && b[j] != '\0'){ b_count++ ; j++ ; }
611 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:34:14 ] iostreamマジ見にくい
612 名前:607 [2008/01/30(水) 00:35:02 ] 610が先で、607が続きです(><)
613 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:35:21 ] 入力できる文字数の最大値が 50 なら、バッファは 51 以上必要だね。
614 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:40:17 ] std::lexical_compare使え
615 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:44:48 ] すみません、元からこんなに早くリアクションがくれると思っていなかったので、 質問してすぐ風呂に入る予定だったため、 アップロードしてしばらく返事がなかったので、急いでお風呂に入っていたため、反応が遅れました。 申し訳ありません。 >>605-606 ありがとうございます! セミコロンを直し、game.hをプロジェクトを追加し、gamemain.cppにgame.hをインクルードし、 gamemain.cppのクラス宣言部分をコメントアウトしてコンパイルしましたが、 結局 error C2146: 構文エラー : ';' が、識別子 'Type' の前に必要です。 がヘッダで吐かれてしまっています… ここの部分を改善する、考えられるミスはありませんでしょうか…
616 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:50:24 ] >>607 ヘッダファイルは <iostream.h> や <iomanip.h> ではなく <iostream> や <iomanip> を使用する事が推奨されている。 cout とかが std::cout とかになっちゃうのが嫌なら、 この程度のプログラムなら using namespace std; と書いておけば std:: を略せる。 古いコンパイラなら知らんがね。 最大 50 文字なら、a のサイズは Max_Length + 1 にする。 cout の後 cin をする際には、cout を flush した方がいい。 cout << "a>>" << flush; でないと、表示されない事もある。 getline は改行文字を格納しない。改行との比較は無駄。 50 文字以上入力したら次の cin.getline が失敗するのは無視してもいいのかな。宿題程度なら。 cin.clear(); して、改行まで読み飛ばすか構わず cin.getline するか・・・。 文字数カウントは strlen で可能だが、まだ習ってないのかな。 i と j という変数を作らなくても、直接 a_count と b_count 使えばいい。 while 文より for 文使った方がすっきりする。 i が 0 〜 a_count - 1 のループでは、 a_count - i は a_count 〜 1 になる。 これは意図する所ではないはず。 そして、a[Max_Length-i] != b[Max_Length-i] で何をやろうとしているのか分からないし、 このあたり全体的にちとおかしいと思う。 もうちょっとよく考えよう。
617 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:51:00 ] >>615 TCHAR.h → tchar.h
618 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:51:46 ] 全角だろ。間違いない。全角なんだ。
619 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:53:17 ] >>615 風呂の予定なんかどうでもいい。 しかも二回も風呂って書きやがって。 風呂はゆっくり入れ。
620 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:54:03 ] インクルードガードがないのもすげー気になるが、 これだけのヘッダファイルだと BOOL は定義されてなくね?
621 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:54:56 ] #include <cstddef> #include <tchar.h>
622 名前:デフォルトの名無しさん [2008/01/30(水) 00:55:17 ] >>616 たくさんありがとうございます! 考え直してもういっかい来ます
623 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:58:12 ] >>615 とりあえず windows.h をインクルードしとけ。
624 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:58:29 ] #include <iostream> int main(void) { const int max_str = 50 + 1; char str1[max_str], str2[max_str]; std::cout << "数値a入力>"; std::cin >> str1; std::cout << "数値b入力>"; std::cin >> str2; int len1, len2; for( len1 = 0; len1 < max_str; ++len1 ){ if( str1[len1] == '\0' ) break; } for( len2 = 0; len2 < max_str; ++len2 ){ if( str2[len2] == '\0' ) break; }
625 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:59:29 ] std::cout << "数値a 文字数:" << len1 << std::endl; std::cout << "数値b 文字数:" << len2 << std::endl; if( len1 == len2 ){ std::cout << "文字数が一緒なので一桁ずつ判断します" << std::endl; for( int i = 0; i < max_str; ++i ){ if( str1[i] == str2[i] ) continue; else if( str1[i] > str2[i] ) std::cout << "a > b" << std::endl; else std::cout << "a < b" << std::endl; break; } }else if( len1 > len2 ) std::cout << "a > b" << std::endl; else std::cout << "a < b" << std::endl; } >>612 総書き直しすれば簡単
626 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 00:59:38 ] >>617 提案ありがとうございます。すみません、でもとおりませんでした >>618 エディタでトリプルチェックしましたが、やはり全角はありませんでした… >>619 う…(苦笑)。すみません、お気遣いありがとうです。 >>620 windows.hをインクルードすれば定義されるでしょうか? >>621 これは、BOOLのヘッダでしょうか。すみません、レスを先にして、試してきます。
627 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:00:18 ] >>624 std::cin >> str1; バッファオーバーフロー一直線!!!
628 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:02:38 ] >>625 無茶苦茶やな・・・。
629 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:04:36 ] >>621 試してみたら、エラーが13に減りました! でも、 >>623 windos.hをインクルードしたら、もっと減りました(10)! あとは、game.hに、using namespace std;をかけば、通りそうな雰囲気です。 ありがとうございました。 一応、最後に通るか確認してきますね。
630 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:05:22 ] >>629 ヘッダファイルで決して using しないと俺と約束してくれ。
631 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:08:29 ] >>630 ごめんなさい。 gamemain.cppの方でした。 そして、通りました!皆さん本当にありがとうございました。そして、お騒がせしました! ちなみに、ヘッダファイルでusingすると、どんな弊害がおきるのでしょう? ちょっと考えれば分かるかもしれない気はするので、失礼な質問でしたらすみません。 あと、<TCHAR.h>より、<tchar.h>をお勧めになった理由もお教えいただけないでしょうか?
632 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:10:41 ] 本来 tchar.h という名前のファイルだから気になっただけ。 ヘッダで using して、色々インクルードしまくってると、 どこで using されているかさっぱり分からない状態になる。 using されては困る状況が現れた時、どの using が原因で困ってるか分からない。
633 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:12:45 ] 触っちゃダメよと言われてるヘッダファイルで using されてると泣くしかない。
634 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:16:32 ] usingされているヘッダファイルをインクルードすると、 その名前空間がインクルードしたファイルにもusingされてしまう、ということでしょうか? それとも、usingされてると、呼び出すときに、どの名前空間に所属しているのが分かりにくくなり、 数が膨大になったときに、エラーからたどりにくくなる、ということでしょうか? …後者ですよね?
635 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:17:47 ] 両方。
636 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:21:19 ] おあ、両方ですか。 前者も、ということになると、確かに本当にヘッダファイルでusingしてしまう(されてしまう)と、困ってしまいますね。 絶対にヘッダファイルでusingしないと、>>630 さんと指きりしてお約束します。 ありがとうございました!
637 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:24:53 ] namespace isolate { // isolate using directives and declarations #include "hoge.h" // has using directives or declarations } using isolate::Hoge; // declared in hoge.h, and want to use in this source と無理矢理隔離してみたり。
638 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:28:40 ] なるほど
639 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:46:32 ] STLとATLではどちらを覚えたほうがいいですか?
640 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:50:28 ] STL: どの環境でも使える ATL: Windows でしか使えない
641 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:54:30 ] STL: 誰も使ってない ATL: 90%くらいの環境で使える
642 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 01:57:43 ] 両方覚えろよ
643 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:04:22 ] Windowsでプログラミングするなら両方。 そうじゃないならSTL。
644 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 03:39:23 ] >>642 に一票
645 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 05:46:40 ] てゆーか二者択一するようなもんじゃないだろwwwww
646 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:02:37 ] 関数内でnewでchar型の動的確保をしたいんだけど、他の全ての関数でもその宣言した char型のを使えるようにするにはどうすればいい?
647 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:06:10 ] ごめん文章が変だったので追記 要するに関数内でnewで宣言したcharをグローバル変数みたいな感じで使いたい
648 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:07:01 ] 外部変数にchar*型のポインタ用意してそこに代入すれば?
649 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:16:06 ] >>648 ああそうか。それでいけたw staticみたいなので全範囲で使えるようになるのないかなって探してたよ ありがとう
650 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 07:31:28 ] C++で開発をする際、他言語以上にいつもクラス設計で悩まされます 何かそこらへんを専門的に取り扱ったおすすめの本はないでしょうか?
651 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:11:37 ] ATLにSTLのコンテナ使う仕掛けが合ったよな。
652 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:12:25 ] 有った