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
562 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:30:56 ] >>561 ではこのやり方はおかしくないんですね。 なんかこれならpublicにした方が手っ取り早いなあとか思ったんですが それはダメ!って色んなところで解説されてるので・・・ ありがとうございます。
563 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 14:41:34 ] どういう使い方をするのか知らないけど、publicにしたほうが手っ取り早いと感じるなら クラスじゃなくて構造体を使うとかしたら?
564 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:00:11 ] >>562 駄目な理由を考えてみる
565 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:17:27 ] クラスにしたのはコンストラクタとデストラクタが使いたかったからです。 このクラスの変数には別のクラスから頻繁にアクセスする必要があって、 こういう場合隠蔽する意味あるのかな〜?と。 かといって全部同じクラスにしちゃうと大きくなりすぎてこれもまた良くないよな・・・ とか思ってなかなか決められないんです。
566 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:20:29 ] あ、構造体でもコンストラクタとデストラクタは使えますね。 結局隠蔽すべきかそうでないのかの判断が良く分からないと言うか。
567 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:22:57 ] 好きにしろ
568 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:28:29 ] >このクラスの変数には別のクラスから頻繁にアクセスする必要があって まずこの設計が間違ってないかどうかを考えるべきだと思う
569 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 15:35:22 ] ですよね。 ちょっと検討しなおします。 ありがとうございました。
570 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 16:54:32 ] 横からなんですけど>>556 さんの質問に関連して、 現在独学でC/C++を勉強中でコンソールプログラムを色々作ってきた後、 GUIを作るのにWin32APIを勉強していて、 山本信雄さんの『はじめてのWindowsプログラミング』を読んだら、 Win32APIをそのまま扱うのは普通しなくてMFCで作る みたいなことが書いてあったから次はMFCと思っていたのですが、 MFCやる利点がないということはこれからどう勉強を進めたら良いですか?
571 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:00:38 ] >>570 とりあえず.NETかそうでないほうをやるかで決めては
572 名前:そう思えるかどうかが分岐点 mailto:sage [2007/06/16(土) 17:06:41 ] MFCやればいいじゃん。趣味なら何の問題もないよ。 もう後がないとか、2005EEでできないとか、どうでもいいじゃん。
573 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:11:21 ] さすがにMFCはもうやめといたほうがいいだろ。 どうせまだ入り口程度しかやってないんだろ。 だったら早いうちに.Netへ移行しておけ。
574 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:15:07 ] >>571 今のスタンダートとしては.NETなのですか? ていうかそうでないほうっていうのが何なのかも分からないですorz >>572 今は趣味ですが大学卒業後プログラマになりたくて勉強しているので 実際に現場で役に立つものを勉強したいのです。
575 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:17:10 ] >>573 やはり.NETが良いんですね>< 正直なところ.NETがどんなものか理解してないので今ちょっとググって調べてみます>< ついでにですが、プログラマになるにはそれが出来ていれば大丈夫でしょうか? それともJavaとかも身に付けておいた方が良いのですか?
576 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:08 ] >>575 プログラマを目指すなら、MFCも.Netも要らない。 現場で使っているものをその場で使えるようになればいい。 その為には、(当たり前の)コミュニケーション能力と(通常よりは高めの)理解力があればいい。 その上で、就職後に努力できるだけの気力を持てる会社に就職してくれ。
577 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:21:19 ] プログラマになるなら最低7つは言語を習得しないとダメです。
578 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:34:41 ] 下手な言語7つ覚えるよりC++をマスターするほうが遙かに難易度が高い件について
579 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:31 ] そもそも何を持ってマスターと言うのか? C++0xとかまだ定まっていないというのに
580 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:36:53 ] 難易度高くても、C++しかできないとな。 つぶしが利かない。
581 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:39:32 ] >>580 C++できたら他の言語なんて楽勝だろ。
582 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:41:42 ] 楽勝だったら、7つ覚えておけよw
583 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:45:08 ] 仕事で必要になるたびに覚えていけばいい
584 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:46:28 ] C++ が分かってれば、Java だの Ruby だの3日あれば使えるようになる。
585 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:47:52 ] いやぁ、C++からJavaはちょっと壁があるぞ。 C++言語を覚えただけじゃ、GUIもスレッドもないしな。
586 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:49:11 ] さらに言うと、現状javaの案件といえば、サーバーサイドだな。
587 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:50:03 ] >>585 でも逆の Java → C++ と違って挫折することはまずないだろ。
588 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:51:10 ] それで挫折する人間なら、C++覚える時点で挫折するよ。
589 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:59:05 ] GUI は言語の問題じゃなくてライブラリの問題だと思うが。
590 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:00:40 ] 言語だけのC言語ベースでイインジャネ? 設計まで絡んだら知らん。
591 名前:デフォルトの名無しさん [2007/06/16(土) 18:01:50 ] reinterpretって何て読むの? ネット辞典で調べてもでてこん。
592 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:03:55 ] リインタープリット
593 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:12:53 ] 文法だけではプログラマになれないよ。 そもそも質問主は、MFCか.Netかで迷ってるんだよ? それでもライブラリだから論点が外れてるといえるか?
594 名前:デフォルトの名無しさん [2007/06/16(土) 18:17:30 ] 俺から見ればC/C++もJavaも難しいよ、お前らって頭良いんじゃね いまだにfor(A;B;C){...}の判断,処理手順を間違えてるときあるしな。情けないよ for(A;B;C){...}の判断,処理手順で混乱する香具師、手を挙げろ! .ノ イテレータを作成してるときなんかあれ???、あれれれ?、なんで になるときあるニダ
595 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 19:20:14 ] >>594 慣れ。言語に対する慣れだけでなく、プログラミング作業に対する慣れも含んで。
596 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:22:02 ] 俺はC++からJavaScript+HTMLをやったんだが。 C#には簡単に移行出来たな。
597 名前:W [2007/06/16(土) 20:25:34 ] JavaScript+HTML
598 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:30:12 ] CやC++で a = b = c = d; としたら、段階的に処理を書くと、 a = b = (c = d); //まずcにdが代入される a = (b = c) = d; //次にbにcが代入される (a = b) = c = d; //最後にaにbが代入される と言うことでいいのでしょうか? 詳しく教えてほしいです
599 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:34:46 ] a = (b = (c = d)) c=dが行われ,その値がb=でbに代入され,その値がa=でaに代入される
600 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:40:25 ] なるほど! わかりやすい説明をありがとうございます!!
601 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:43:43 ] HTMLってプログラミング言語?
602 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:46:19 ] ・変数がない ・ループ、条件分岐が書けない ・関数も書けない 修飾言語ではあるが、プログラム言語ではないかな
603 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:53:07 ] HTMLはマークアップ言語です。
604 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:01:38 ] >>602-603 トンです。 上でプログラミング言語と並んで書かれてたから なんかHTMLって特異な言語だけど仲間なのかなぁ…と思ったら コンピュータ言語⊃プログラミング言語,マークアップ言語,・・・,なんですね。
605 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:03:45 ] プリコンパイル済みヘッダーを作ったですが デバッグモードではビルドできるのに、リリースにすると error LNK2005: *** は既に ***.obj で定義されています。 というエラーが全部のファイルで発生してしまいます。 これは何故なんでしょうか? 環境はVS2005です
606 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:28:39 ] >>605 エラーです
607 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:32:24 ] 特異な言語といえばSQLもそうだな。 一応Languageと名前についてるけど、 これをプログラミング言語と呼ぶのは ちょっと抵抗ある。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:49:46 ] ストアドとか書けば解るが、あれは十分にプログラム言語としての特徴を備えているような気が
609 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:51:48 ] SQLに制御構造をつけたのがストアドじゃないかね
610 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:58:45 ] HTMLだってLanguageと名前についてるだろ SQLはプログラミング言語じゃなくて、データベース言語だろ
611 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 21:59:39 ] Languageは「言語」であって「プログラミング言語」ではないからな。
612 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:07:19 ] >>594 for(A; B; C) { D } で、 A を処理して、B を判定して、D を実行して、C を実行して、また B を判定して・・・ とか考えるのは効率が悪い。 グルングルンと実行されるみたいな流れを もっとグラフィカルに頭に思い浮かべるのがコツ。 一旦処理の流れを線でつないで紙に書いて、 それを意識するもんだ。
613 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:08:18 ] HTML はプログラミング言語じゃなくてマークアップ言語。 TeX あたりだと単なるマークアップ言語と言い切るのは微妙だがな。
614 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 23:56:37 ] SQLがチューリング完全でないことは明白。
615 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 00:22:00 ] 何言ってるの?
616 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:02:03 ] わからないなら調べてから聞けよ
617 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 08:07:53 ] あ〜い、とぅいまてぇ〜ん♪
618 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 09:34:26 ] >>602 IEに限って言えば条件がIEのバージョンに限定されるけど条件分岐が使えるっぽ
619 名前:デフォルトの名無しさん [2007/06/17(日) 12:43:27 ] 親クラスのprotectedな変数が、public継承した子クラスでは publicにならずにprotectedなままなのは何故ですか? 親クラスのpublicな変数が、protected継承した子クラスでは protectedになるのに。 publicよりもprotectedの方が強いと理解しておけばよいのでしょうか
620 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:46:05 ] そう理解しておけばおk そしてプライベートが最強と
621 名前:デフォルトの名無しさん [2007/06/17(日) 12:55:24 ] >>620 ありがとうございました。 そう理解しときます。
622 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:57:34 ] =演算子をオーバーロードするときにthisポインタを戻り値にしてるんですが、 thisポインタを戻り値にしない書き方ってありますか?
623 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 14:58:53 ] ありますよ
624 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:01:58 ] それは例えばどういった書き方でしょうか?
625 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:03:17 ] >>624 void operator = (...
626 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:04:43 ] a = b + c + d;の処理の流れって、 a = (b + c) + d; //まずbにcを加算 a = ((b + c) + d); //次にb+cの値にdを加算 最後に aに代入という流れで理解してよいのでしょうか? 詳しく教えてください。
627 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:25 ] デバッグ
628 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:06:57 ] デバッグする環境がありません・・・すいません。
629 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:09:12 ] >>625 マジサンキュー 課題が終わった
630 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:10:36 ] >>626 その例はその理解で正しい。 演算の順序は、演算子の優先順位と結合規則によって決まってる。
631 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:13:46 ] いや待て、a = b + (c + d)という解釈をしているかも知らん。
632 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:28:39 ] c+dを先にやるなら+をオーバーロードしたときに参照を渡せないから b+cが先だろ
633 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:40:39 ] >>630 しかし、順序が変更されても結果に影響が出ない範囲でなら 最適化で順序が入れ替えられる可能性はあるな。 ま、結果に影響が出る場合(そういう風にオーバーロードした場合等)は そういうことは絶対にないが(コンパイラにバグでもない限り)。
634 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 16:56:56 ] >>633 コンパイラのバグを前提にして「可能性はある」なんて言うことに何の意味があるのかね?
635 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:08:24 ] ??? 誰もそんな事言ってないぞ?
636 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 17:14:59 ] 結果に影響が出ない範囲で入れ替えられても気にする必要は無いな。
637 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:18:51 ] a = b() + c() + d(); で、b, c, d の呼び出される順番は未定義だっけ? 結合順と、各項の評価順はまた別の話だよな。
638 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:37:07 ] fgetsの使い方で fgets(buf, sizeof(buf), stdin); のような常套句がありますが、これは sizeof(char) が1であることが 前提になっていますよね。もし sizeof(char) が2だったら、読み込む文字数が 想定した数の2倍になってしまうと思うのですが。 こういった書き方は問題ないのでしょうか。
639 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:40:16 ] >>638 sizeof(char)は常に1
640 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:41:57 ] >>638 sizeof(char)は絶対に1だから安心しる。 ただ関数によっては、バッファのバイト数を与えるのか文字列長を与えるのか 分かりにくい場合があるから、wchar_tを使ってるとちょっと困ることがある。
641 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:43:56 ] charが1バイトじゃなくて1バイトの定義がchar?
642 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:44:21 ] charは常に1バイト
643 名前:638 mailto:sage [2007/06/17(日) 18:47:09 ] レスありがとうございます。 charが常に1バイトというのは、規格で決まっているのですか?
644 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:48:49 ] >>643 決まってる。 ただ、「buf の型が char である」ということに依存しているから、 ここを変更したいと思った場合に変更を要するコードである事は確かだな。
645 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:50:14 ] 誤解があるといけないから念のために言うけど、 char が 1 バイトというのは決まってるが、 1 バイトが 8 ビットである保証はない。 1 バイトが 9 ビットの環境もある。
646 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:51:29 ] 1バイトのビット数を取得するマクロってありますか?
647 名前:638 mailto:sage [2007/06/17(日) 18:51:48 ] 皆さんありがとうございました。勉強になりました。
648 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 18:57:42 ] アルバイトのヒト数を取得するユニクロってありますか?
649 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 19:19:40 ] >>646 CHAR_BIT
650 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 20:31:59 ] >>637 未定義。iccだとご丁寧に「想定外の呼び出し順序になる可能性がある」と指摘してくれる。
651 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:06:51 ] たまにはlimits.hも眺めよう
652 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:08:10 ] float.h も眺めようぜ
653 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:10:15 ] 眺めすぎて惚れるなよ
654 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:21:25 ] やだ・・///
655 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:22:24 ] 構造体やクラスを関数内で定義すること、 つまり、以下のようなことがしたいのですが これは規格でできることが保証されていますか? void hoge() { struct hage { ... }; ... }
656 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:23:44 ] >>655 C89 の頃から余裕で使える。
657 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:26:15 ] ちなみに関数内で関数は定義できません
658 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:33:03 ] >>656 ちゃんと規格で決まってるんですか。 知りませんでした。 どうも、ありがとうございます。 >>657 構造体やクラスの静的関数で代用するのが常套句になってますね。
659 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 21:44:49 ] GCC の拡張でよければ関数内関数は使えるんだけどな。確か。
660 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 22:29:53 ] 関数内クラスをテンプレート引数に出来たらなぁ と思うことがある
661 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:05:55 ] charのバイト数の件で便乗質問。 shortって俺の使ってる環境では2byteなんだけど、これって決まってるんですか? 決まってないのなら確実に2byteの型は有りますか? また確実に4byteの型はありますか?
662 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:07:51 ] longは32bit以上というのはK&Rに書かれていた気がする。 というか規格原理主義者によると、1バイトが何ビットかも決められていないとか
663 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:17:52 ] >>661 #include <stdint.h> で int16_t と int32_t でおk。
664 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:20:56 ] >>661 sizeof (short) == 2と規格で定まっているわけではない でも規格の最大値・最小値の規定から少なくとも16ビット以上あるということは導ける 同様に(662も書いてあるように)、longが少なくとも32ビットあるということも導ける 2バイトの方が欲しければ、C99なら<stdint.h>のint16_tやint_least16_tが使える 前者がぴったし16ビットの型(対応する型があれば用意されている) 後者は少なくとも16ビットの型(絶対に用意されている) 後者だけ必須なのは1バイトが8ビットでない環境の存在を考えれば納得 C++に今のところ<stdint.h>は、存在しないから <boost/integer.hpp>や<boost/cstdint.hpp>で代用するくらいしかない
665 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:32:47 ] C/C++で処理系依存なのは、もう諦めるしかないんじゃないか?
666 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:48:09 ] 必要以上に移植性を求めるのは不毛。 必要以上に移植性を失うのも愚かしいこと。
667 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:53:10 ] 俺ッち、__propertyとか__finallyとか好きな訳だけど、使っちゃって委員会?^^
668 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 23:56:15 ] どうせ他の部分も環境依存しまくりなんだろ? どんどん使っちゃえYO!
669 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:04:53 ] >>667 __closureも活用してもっと便利に!
670 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:13:58 ] 勉強になるな。
671 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:19:27 ] #include <stdint.h> VC6だと「そんなヘッダ見つからねーよ。死ねボケ。」って言われてしまった OTL。
672 名前:デフォルトの名無しさん [2007/06/18(月) 00:47:53 ] 質問 void hoge() { 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif 何かの処理 #ifdef DEBUG printf("Debug %s, nanka); #endif ↑こんな調子で数百行位ある } こういう汚い関数を直したいんだが void DebugPrint(char *str) { #ifdef DEBUG printf("Debug %s, str); #endif } void hoge() { 何かの処理 DebugPrint(nanka); 何かの処理 DebugPrint(nanka); } って感じに直したいんだが、やったら動作変わっちゃう? #ifdefあんま使ったこと無いから教えてくださいな
673 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:48:22 ] そりゃそうだろ
674 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:49:09 ] >>673 すんません 分かり易く解説お願いします
675 名前:673 mailto:sage [2007/06/18(月) 00:49:19 ] >>671 の事ね VC6が出来たのはだいぶ前だから
676 名前:672 mailto:sage [2007/06/18(月) 00:50:28 ] >>675 あ、すんません タイミング良かったんで即レス来たのかと思っちゃいましたw
677 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 00:57:26 ] #ifdef DEBUG #define DEBUG_PRINT(a) printf("Debug %s, (a)) #else #define DEBUG_PRINT(a) #endif void hoge() { 何かの処理 DEBUG_PRINT(nanka); 何かの処理 DEBUG_PRINT(nanka); } こういうのはよくやるな。 ただ、printfは引数の数が可変だから、引数の数にばらつきがあるとまた別の対策が必要になるが。
678 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:04:08 ] >>677 おぉ、なるほど 後、確認なんですけど、自分が書いた>>672 だと動作変わっちゃうんですよね? 勉強として実際のソース見て動きを理解しろ とか言われてるんですが、こんなソースばっかで 見づらくてしょうがないんで 何とかしたくて・・・ コメントアウトと/*2007/6/19追加バージョン6.2*/等と#ifdef何チャラの嵐です・・・Orz
679 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:05:32 ] 別に動きは変わらんと思うが
680 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:11:32 ] >>679 あ、そうなんですか? ありがとうございます 個人的にはDebugPrintの部分は他から呼びたいので 関数化したいな〜と思ってたんですけど、 #ifdefとかはコンパイル時に読み込まれるとか有ったので 動作変わっちゃうのかと・・・糞初心者ですんません (もう、たまにソース直せと言われるとおっかなビックリっす・・・)
681 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:12:16 ] 失礼、 ×他から ○他からも
682 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:13:48 ] 動きは変わらないが、 後者は関数呼び出しのオーバーヘッドが発生する。
683 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:20:02 ] 関数本体の中にやたらと#ifdefなんかが入ってるのは、 あんまりいいコードとはいえないな。 「見づらくてしょうがない」というその感覚は限りなく正しい。 改善する方法をいろいろ考えるべきだな。
684 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:25:43 ] >>682 すいません そのオーバーヘッドって遅くなるって事ですよね? どの程度遅くなりますか? >>683 ありがとうございます パワハラ上司なんで聞くに聞けなくて ここでたまに質問してます 見やすくしろって教えてくれたのもこのスレです
685 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:39:54 ] 関数を呼び出すという処理は、それ自体スタック操作や プログラムカウンタの移動などの処理が行われる。 だから、>>672 のように関数を呼ぶ形にすると、その分オーバーヘッドが発生する。 一方で>>677 の方法だと、不要なときには関数呼び出し自体がなくなるので、 そういう心配がない。この方法が好んで使われる所以。 ただ実際は、よほどタイミングがシビアだったり、デバッグプリントがめちゃくちゃ多かった りしなければたいしたオーバーヘッドではないので問題にはならない。 でも、リリースバージョンのプログラムの中に、不要な関数呼び出しが残るのって 美しくないとは思わないかい?
686 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:47:04 ] >>685 なるほど、詳しい解説ありがとうございます せっかく用意したDebugPrintなのに リリース等の時は実際は使わないのに その度にDebugPrintの文だけより道、遠回りしちゃうって事ですね 確かに綺麗じゃないですね
687 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 01:56:30 ] 可変長引数マクロを使えるコンパイラならこんなこともできる #if DEBUG #define DebugPrint(...) fprintf(stderr, "\nDebugPrint : File %s - Line %d\n", __FILE__, __LINE__),fprintf(stderr, __VA_ARGS__) #else #define DebugPrint(...) #endif
688 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:01:41 ] リリース版ではインライン関数にして、 コンパイラの最適化に期待する手もある。
689 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:02:11 ] /* 古いコンパイラで使える技 */ #if DEBUG #define DebugPrint(args) printf args #else #define DebugPrint(args) #endif /* 使い方(一回余計に括弧で括らないといけないのが欠点だが) */ DebugPrint(("%d\n", 1234));
690 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:19 ] 古くなくてもできることないか?
691 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:03:47 ] >>687 ,>>689 おぉ、凄いですね 色々ご教授ありがとうございます >>688 もし良ければその方法も教えて頂けないでしょうか・・・
692 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:33 ] 1. インライン関数の定義を別ファイルに分ける 2. inline を INLINE マクロに置き換える INLINE マクロの定義は以下の通り(これは自分で定義する) #ifdef NDEBUG #define INLINE inline #else #define INLINE #endif 3. リリース版の場合はヘッダファイルでインクルードする #ifdef NDEBUG #include "***.***" #endif 4. デバッグ版の場合はソースファイルでインクルードする #ifndef NDEBUG #include "***.***" #endif
693 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:16:49 ] #if DEBUG #define DebugPrint printf #else #define DebugPrint (int)sizeof #endif
694 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:17:09 ] C++なら、こんなことできるお class DebugPrinter { DebugPrinter(const char *filename, int line) {...} void out(const char *format, ...) {...} }; #if DEBUG #define DebugPrint DebugPrinter(__FILE__, __LINE__).out #else #define DebugPrint #endif
695 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:21:38 ] >>694 リリースでエラーにならないか?
696 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:28 ] >>695 エラーにはならないがデバッグ用のコードが完全には消えないという問題がある。
697 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:30:35 ] >>695 たぶん、ならんよ。リリース時は DebugPrint("%d, %d", f(x), f(y)); → ("%d, %d", f(x), f(y)); ってなるだけだから。 ただ、これがいやなら、>>693 のようにsizeofしちゃうか、 dummyの関数作って #if DEBUG #define DebugPrint DebugPrinter(__FILE__, __LINE__).out #else inline DebugPrintDummy(const char *filename, ...) {} #define DebugPrint DebugPrintDummy #endif って感じにしちゃうのがいいかもね
698 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:33:27 ] VC++ なら ((void)0) (VC6まで)か __noop (VC2002以降)にした方がいいね。
699 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:34:36 ] if(1); else に置換するという技もある。 多分最適化で消える。
700 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:27 ] >>697 関数 f が副作用を持ってたら問題があるな。
701 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:39:55 ] VC++ならTRACEで以上では?
702 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:41:56 ] 皆さん 感謝、感激雨あられです ちょっとF1見てる隙にこんなに書き込みが・・・ 色々参考にさせてもらいます
703 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:52:34 ] 何F1見てんだよこのヤロー
704 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:55:55 ] ああ、F1押すと長々と待たされた後で 役に立たないヘルプが出るよね
705 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:56:43 ] >>700 まあ、必要なら>>699 で多分消せるじゃね? >>701 TRACEは問題点は以下の3つ。 1,Windows限定 2,Boost.Formatなどの他の形式が使えない 3,出力先が変更できない 他にもあるかもしれんがよく分からん
706 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 02:57:53 ] 必要ならって言うか、必須なんだぜ。
707 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:02:02 ] >>706 いや、そういう意味じゃなくて、 関数の副作用をどうしても消したいならって意味だお。 残したい場合も当然あるでしょ?
708 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:06:34 ] >>699 だと式のつもりが文になってしまうね。
709 名前:デフォルトの名無しさん [2007/06/18(月) 03:10:09 ] ちょっと相談です。 言語はCでもC++でも構いません。 ちなみに開発環境はWin2000+VisualStudio2005です。 DLLで用意された、既存の関数 Func(char* str) を呼び出す必要があります。 この関数は、処理結果を文字列として str に返してくれます。 strに渡される文字列の長さは *不明* です。 DLL、および関数Funcの中身を弄ることは出来ないものとします。 この時、長さの不明なstrを、安全に処理するテクニックがあれば教えてください。
710 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:04 ] >>708 これならいけるかな? #define DebugPrint 1 ? (void)0 : DebugPrintDummy
711 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:18:48 ] >>709 static str[100000000]; ではどうだ? そうですか、足りませんかすいません。
712 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:19:32 ] >>709 Func を呼び出すことで、str の指すアドレスに 文字列が書き込まれるのであれば、安全に処理する方法は無いです 通常は、どの程度の長さが必要かを返す関数があったり、 渡したバッファの大きさを知らせる引数を付けたりします。 例えばFuncがファイル名を返す関数であるならファイルシステムが許す最大パス長などがあるので、 関数の仕様以外から最大の長さを決めることが出来るかも知れません
713 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:21:19 ] >>711 charが抜けた。すいません。
714 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 03:25:49 ] >>707 そういやそうだな。
715 名前:709 mailto:sage [2007/06/18(月) 03:28:23 ] 即レスサンクス。 やっぱ無理そうですね。boostあたりでなんか何とかならないかなーとか淡い期待を抱いてましたが。 >711 とりあえず1万バイトくらいでがんばろうと思います。 >712 バッファサイズ関連のパラメータとか、実際に無いものは仕方ないんで諦めます(笑)
716 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:01:59 ] >>715 え、本当にどうしようもないの? 仕様上から決まる例(>>712 が言ってるMAX_PATH) とか、 NULL渡したら戻り値で必要length返るとかって挙動もないの? そりゃDLLの設計が糞としか言いようがないが…
717 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 09:45:43 ] gets を安全に使うにはどうすればいいですか? っていう質問と一緒だね。残念ながら無理だ。
718 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 10:59:41 ] 仕様上から決まる例で32bit整数が最大値だとわかれば 常にその大きさの配列渡せば安心、かな
719 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:10:29 ] メモリ使い切って落ちるに1票
720 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:12:45 ] OS の API 直呼びで仮想メモリに頼ってしまう手もあるんジャマイカ? それにしても 32bit 最大値はやりすぎだろうけど。
721 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 11:50:56 ] パイプとかその辺のOSの用意したプロセス間通信機能でどうにかするしかないんじゃね?
722 名前:デフォルトの名無しさん [2007/06/18(月) 13:48:29 ] すいません、また質問させてください。 #include <iostream> using namespace std; class base { public: int a; base(int x) {a=x;} }; class sub1 : virtual public base { public: sub1() : base(0) {} }; class sub2 : virtual public base { public: sub2() : base(0) {} }; class sub3 : public sub1, public sub2 {}; int main() { sub3 obj; obj.a = 10; return 0; } これがコンパイル通らないんですが、baseクラスに引数のないコンストラクタを 追加するとコンパイル通るようになります。virtual指定で継承すると、引数のない コンストラクタを呼ぶというルールなのでしょうか?
723 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:17:15 ] #include <iostream> namespace test_ { class base { public: base() { std::cout << "base::base()" << std::endl; } base(int x) { std::cout << "base::base(int x)" << std::endl; } }; class derived1 : virtual public base { public: derived1() : base(0) { std::cout << "derived1::derived1()" << std::endl; } derived1(int x): base(x) { std::cout << "derived1::derived1(int x)" << std::endl; } }; class derived2 : public derived1 {}; } int main() { test_::derived2 a; return 0; } そのようですね なので混乱を避けるために出来るだけデフォルトコンストラクタも定義しておきたいところです
724 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:53:20 ] >>722 >引数のないコンストラクタを呼 んでるじゃないか、自分で。 >sub3 obj;
725 名前:709 mailto:sage [2007/06/18(月) 15:00:50 ] >716 一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。 3000とか4000とか飛んでるのを何度か見たことはありますが。
726 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 15:21:26 ] >>725 >一応、strに渡されるのは1024バイト以内という仕様は一応あります。一応。 >3000とか4000とか飛んでるのを何度か見たことはありますが。 そりゃーDLLが糞でFAじゃね? もしくは文書に反映されてないだけで仕様が4096に変わってるとか…。 仕様であるならstrncpyでもなんでもやって1024以内にすべきだし。 仕事絡みなら、バッファサイズ1024で書いて落ちる&再現性ありの状態を作って、クレームつけるとかかね。 まぁがんがれw
727 名前:デフォルトの名無しさん [2007/06/18(月) 18:05:42 ] #include <iostream> #include <string> #include <boost/function.hpp> #include <boost/bind.hpp> class Writer { public: void run(const std::string& str) { std::cout << str << std::endl; } }; class Module1 { public: typedef boost::function<void(const std::string&)> func_t; private: func_t func; public: Module1(func_t func_) : func(func_) {} void run() { func("message"); } }; int main() { Writer w; w.run("test"); using boost::bind; Module1 module( static_cast<Module1::func_t>( bind(&Writer::run, &w) ) ); module.run(); return 0; } Writerクラスのrun()をコールバック関数として、boost::bindを使ってクラスModule1に渡します Module1はboost::functionを用いてこのコールバック関数を保持します これを実現したいのですがエラーどころか、コンパイラ(VC2005のcl.exe)が落ちます(汗 どうすればこの動作を実現できるんでしょうか?
728 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 18:09:09 ] 自己解決しました bind(&Writer::run, &w)→bind(&Writer::run, &w, _1) 引数とる場合はプレースホルダが要るんですね(汗
729 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 19:34:13 ] >>722 class sub3 : public sub1, public sub2 { sub3() : base(1) {} }; 仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている
730 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:43:11 ] こんばんは、皆さんに質問です テンプレートの定数の引数をエレガントに記述する方法が分かりません template <class Type, int Length> Array { …Arrayの実装… }; class Color : public Array< unsigned char, 3 > // RGBなので3 { public: static const int ColorDimension = 3; // これは使えない… …Arrayの実装… }; ここに出てくる3をエレガントに記述する方法が分かりません グローバルで定義したりdefineディレクティブで定義したりは汚いですし、 無名namespaceやconst staticなグローバルの定数はヘッダなので避けたいです。
731 名前:デフォルトの名無しさん [2007/06/18(月) 20:48:52 ] 元々汚いんだからエレガントなんて求めなくて良い
732 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:50:52 ] 少しはきれいに書ける方法としては派生元で定義してしまう方法ですが… template <class Type, int Length> Array { …Arrayの実装… }; class ColorBase { public: const static int Dimension = 3; } class Color : public ColorBase, public Array< unsigned char, ColorBase::Dimension > // RGBなので3 { …Arrayの実装… }; なんか微妙です…第一、継承する意味があるのかと…う〜ん。 でもnamespaceだと関連性の記述があいまいです。 さらにはこんな方法もあるのですが… class TColor<int Length> : public ColorBase, public Array< unsigned char, Length > { …Arrayの実装… }; typedef TColor<3> Color; 結局これでは定数をtypedefに移しただけで意味がなく、 const TColor::Dimension=3; typedef TColor<TColor::Dimension> Color; とまでして構造をめちゃくちゃにするのなら、 そのまま3って書いておいたほうがましな気がします。 何かよい方法があるのでしょうか?
733 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:53:19 ] >>731 では、その元々汚いものを綺麗にする方法を教えてください。
734 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:00:58 ] >>730 Arrayに手を付けていいなら、 template <class Type, int Length_> Array { public: static const int Length = Length_; //... }; class Color : public Array<unsigned char, 3> // RGBなので3 { public: static const int ColorDimension = Length; //... };
735 名前:デフォルトの名無しさん [2007/06/18(月) 21:10:10 ] int g1;int g2; int ga[10]; main(){ int li;int l2; int la[10]; int lb[10][10]; printf("%d\n", &g1); printf("%d\n", &g2); printf("%d\n", &l1); printf("%d\n", &l2); printf("%d\n", &l1-&l2); } ↑のようなプログラムの printf("%d\n", &l1-&l2);の表示結果の意味と 大局変数ga と局所変数la がどのように並んでいるのかを答えろって 課題なのですが、全くもって意味が分かりませんorz ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。 これはどういう事を意味しているのでしょうか? ga[10]とla[10]に関してですが、これは[0]〜[9]までの配列が用意されてるって事で良いんですかね? ヒントの方よろしくお願いしますorz
736 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:14:01 ] なぜに&
737 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:15:51 ] >ちなみにprintf("%d\n", &l1-&l2)の箇所の表示結果は”1”でした。 >これはどういう事を意味しているのでしょうか? 「鼻から悪魔がでてきて私をたぶらかした結果である」
738 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:16:17 ] すみません、いくつか質問させてください。 1、ArrayクラスのLength変数はテンプレートが使用されたときに初期化されるのですか? int i = Array<int, 3>::Length; とかやったら(この例では最適化はされるでしょうが)アクセスしたその瞬間に 初期化が行われるのでしょうか? 2、int i = Color::ColorDimension; とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか? ちなみに、せっかく答えていただいたのに恐縮ですが、 class Color : public Array<unsigned char, 3> の、3がマジックナンバーとなっているのを何とかしたかったのですが… やはり無理でしょうか?何度も質問して申し訳ありません。失礼します。
739 名前:730 mailto:sage [2007/06/18(月) 21:18:19 ] あ、私は730で>>734 さんに対してのコメントです
740 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:20:20 ] >>735 ヒント:課題スレではない しかし答えておいてやろう 「&変数」は、メモリ上における変数のアドレスを意味している。 つまり、画面に表示されるのは各変数のアドレスだ。 &l1-&l2が1であるというのはつまり、ローカル変数は連続してるってことだ。
741 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:23:23 ] >>735 >printf("%d\n", &l1-&l2);の表示結果の意味と ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。 配列を指すポインタであれば、例えば &la[4] + 3 = &la[7] であり、逆に &la[7] - &la[4] = 3 なわけだが 配列でもなんでもないポインタの引き算に意味なんかない。 メモリ上、int のサイズ分離れた場所に割り当てられていると 答えさせたいんだろうが、課題として激しく相応しくない。 >[0]〜[9]までの配列が用意されてるって事で おk。
742 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:27:19 ] クラスを増やしたり、 define使ったり、 グローバルなenum使ったり namespaceを使ったり できないのなら、それは不可能ってことだよ。 別にグローバルにColorDimensionを定義してもいいじゃん。
743 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:44:32 ] ここは格好良く可変引数取れるArrayにして Array<unsiged char, RED, BLUE, GREEN>みたいに出来るようにしかないな 俺はやり方知らん上、この方法でもRED,BLUE,GREENをenum型か何かで定義しないと駄目だけど
744 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:49:54 ] >>741 理論上は意味ないかもしれないけど、 実装を見るというのなら、意味ないこともないような気がしないでもない。
745 名前:デフォルトの名無しさん [2007/06/18(月) 21:51:47 ] >>736 頭のおかしい講師に言ってくださいよorz ほんと変な人で・・・ 殆ど説明せずに課題をポンとだし、回答及び解説は次週って感じで 授業を進めるんです。 >>740 神様有難う。スレ違いだったんですか・・・。申し訳ないです。 &l1-&l2の件、理解しました。 >>741 神様レス有難う。 ga[10]とla[10]の件理解しました。 >ぅゎぁ…課題だしたド阿呆を連れてきてくれ。説教してやるから。 やっぱり、おかしいですよねえ?? Cのプログラムを受け持ってる髭面の汚らしい講師なんですが、 どうも変な奴なんですよ・・・。
746 名前:730 mailto:sage [2007/06/18(月) 21:54:59 ] >>742 グローバルの名前空間は絶対に汚せない環境というのがございまして… #define COLOR_DIMENSION 3 class Color : public Array< unsigned char, COLOR_DIMENSION > // RGBなので3 { …Arrayの実装… }; #undef COLOR_DIMENSION とかwww、もう何がなんだか… #undef _COLOR_DIMENSION 3 あたりで我慢っすかねぇ >>743 しかし、ArrayはColorとはあんまり関係なかったりして… そもそも、public継承なのかprivate継承なのかという問題までありまして… template <int Dimension = 3> class Color : public Array< unsigned char, Dimension > // RGBなのでデフォルトは3 { public: Color() { assert(Dimension==3); } } とか…いや、assertで比較している3がまたマジックナンバーに… なんかもう、素直にあきらめたほうが良いかも
747 名前:594デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:57:33 ] C言語の全角半角処理について二点程分からないので、宜しかったらアドバイスを頂けたらと思います。 仕様してるのはVisualStudio2005で、プロジェクトはWin32コンソールアプリケーションのMFC付与です。 (CDatabaseクラスとかCRecordsetクラス等も使うこともできます)。 現在、入力された文字列に「@全角記号、半角記号、全角数字、半角数字を一文字でも含むならエラー」 (つまり@の処理は漢字や平仮名カタカナや英字は入力出来ます) という処理と、「A全角半角のハイフン以外の全角半角記号を一文字でも含むならエラー」 (Aは、@の通過可能な条件に、全角半角数字が含まれます) という処理と、「B全角半角の数字と全角半角のハイフンはOK」という処理の3つのロジックを組んでます。 半角記号や半角数字はASCIIコードを見ながら「for文で文字列を回してコードの中の記号を表す数字ならエラー」というロジックで どうにかなってますが、Aのハイフンの判別ができずに詰まってます。 使ってるソースは、 ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.cgi?mode=thr&no=3606 こちらの掲示板に 書き込んでおきます。 長くなりそうなので、続きの質問文はそっちのほうに書きます。 もし宜しかったお手数ですが、見てやって下さい。(投稿者名を「全角半角処理」にしておきます)。
748 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:58:46 ] >>745 とりあえずグダグダうるせえ。
749 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:00:47 ] >730 というか、継承では"Color is an Array"が成立するかという問題がある ので、素直に包含関係にしてしまえ。
750 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:03:07 ] >747 ShiftJISの仕様についてもうちっと調べるべき、かな。 まあ、一旦wcharに変換して扱う手もあるけどネ。
751 名前:デフォルトの名無しさん [2007/06/18(月) 22:17:19 ] クラスと構造体の違いはデフォのアクセス制御以外に何かありますか? 継承、仮想関数も構造体で定義できるので、両者の違いは「文化的、歴史的」なモノだけだと思って良いでしょうか?
752 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:21:47 ] classでレガシーな初期化はできなかった希ガス。 class Foo {int bar; int barz;} foo = {1, 2} できたらごめん。
753 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:39:10 ] >752 全メンバをpublicにすればコンパイルできた。 まあ、当然といえば当然か。
754 名前:デフォルトの名無しさん [2007/06/18(月) 22:49:14 ] サンクス。 しかし、C++標準仕様は金を出さんと見れないのが癪だわ。。。 内緒にしとくもんでもなかろうて。
755 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:00:50 ] 質問 1. 死ぬまでenumハックを使うべきなのか。 2. 死ぬまでexportは使ってはならないのか。
756 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:07:21 ] >>755 1. そうです 2. そうです 早死にしないように気をつけて
757 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:10:24 ] 1 VC6を窓から投げ捨てりゃいいんじゃね 2 EDG使ってないコンパイラを窓から投げ捨てりゃいいんじゃね
758 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:16:47 ] >>754 www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014
759 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 23:44:18 ] >738 初期化は実行時に起こる。 テンプレートが使用された時、というのはコンパイル時の話。 件の場合、定数化されてしまうというのを無視すると int i = Array<int, 3>::Length; とすると、Array<int, 3>::Length に相当する定義がコンパイル時に生成される。 で、その生成されたソース中に初期化が存在するから、コンパイルした結果のコードでも 初期化が実行される。タイミングは普通の初期化と一緒で main 到達前。 >2、int i = Color::ColorDimension; > とアクセスしたときは派生元のArrayから初期化が行われることは保証されていますか? 実際には Color::ColorDimension は定数と見なされるので Array と無関係に単なる 3 として評価されると思われ。
760 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 06:38:16 ] いくつかのサイトで見られたのですが、 STARTUPINFO si = {sizeof (STARTUPINFO)}; は何をやっているんでしょうか? STARTUPINFO si = {0}; や、 STARTUPINFO si; memset(&si,0,sizeof (STARTUPINFO); si.cb = sizeof(STARTUPINFO); などなら分かるのですが。
761 名前:760 mailto:sage [2007/06/19(火) 07:24:58 ] あ、すみません。 構造体の第一メンバをsizeof (STARTUPINFO)で、 残りのメンバを0で初期化している事が分かりました。 値を設定してないと0で初期化されるようですが、 STARTUPINFO si = {}; のような使い方では0で初期化される保証はないのでしょうか?
762 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 07:59:43 ] >>760 定義時初期化で済むことを、わざわざバグの混入する可能性のあるmemset()にする理由はなかろう。 また、STARTUPINFOに先頭にサイズを入れておくお約束があるならやはり初期化で入れるのが一番。 >STARTUPINFO si = {}; コンパイル通った?
763 名前:760 mailto:sage [2007/06/19(火) 08:56:24 ] はい。VC2005でコンパイルが通り、結果も0で初期化されてることを確認しました。 コンパイル通らない可能性もあるんですね。それなら使いません。 あと、STARTUPINFO si = {0}; による初期化でも、/NODEFAULTLIBでビルドすると 「error LNK2001: 外部シンボル "_memset" は未解決です。」と出ることがあります。 これはmemset()が使われてるということなんでしょうか?
764 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 08:56:28 ] >>761 全部省略できるのは C++ だけ。
765 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 09:59:42 ] >>763 そうみたいだね。 memset() は標準ライブラリだから、 リンクできることを前提にしてるんだろう。
766 名前:デフォルトの名無しさん [2007/06/19(火) 10:21:17 ] すみません、このスレでいいのか迷うんですが、 Windows2000やXP、Vistaで、アプリからサービスを一時的に停止したり 開始したりする方法を教えて下さい。 宜しくお願いします。
767 名前:760 mailto:sage [2007/06/19(火) 11:07:01 ] >>764 おお、なるほど。C++でした。 >>765 ありがとうございます。 みなさん、どうもありがとうございました。
768 名前:766 mailto:sage [2007/06/19(火) 12:48:11 ] 解決しますた
769 名前:デフォルトの名無しさん [2007/06/19(火) 12:57:26 ] 今現在BMPの画像をexeファイルで表示する方法をやってるのですが よろしければ必要最低限のプログラムのソースを教えていただけませんか? よろしくお願いします。
770 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:01:28 ] >>769 >>1 >ただしその場合、質問者は必ず、環境を書きましょう。
771 名前:デフォルトの名無しさん [2007/06/19(火) 13:10:27 ] >>469 とりあえずこれで"今現在BMPの画像"を表示できるプログラムができる #include <stdio.h> int main(){ printf("今現在BMPの画像"); return 0; }
772 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:11:07 ] どうせWindowsだろ 猫でも読んどけ
773 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 13:47:09 ] 丸投げは宿題スレ以外はだめ 今どこまで理解しててどこら辺がわからないのか書け
774 名前:デフォルトの名無しさん [2007/06/19(火) 14:38:22 ] >>729 ありがとうございます。 なるほど、そうなってるんですか。。 しかし、以下のソースをコンパイルしようとしたところ、 sub3クラスでの仮想基底クラスのコンストラクタ呼び出し (base(33)の呼び出し)はコンパイルを通すために必須でした。 ということは、 ー仮想基底クラスのコンストラクタは、最派生クラスから引数を指定してやることになっている +仮想基底クラスのコンストラクタは、多重継承になるクラス以降最派生クラスまで、毎クラスで指定することになっている ということなのでしょうか? (有効なのは最派生クラスでの呼び出しだけみたいですが、、、)
775 名前:デフォルトの名無しさん [2007/06/19(火) 14:46:23 ] すいません、ソース貼り忘れた #include <iostream> using namespace std; class base { public: int a; base(int x) { a=x; cout << "x=" << x << endl; } }; class sub1 : virtual public base { public: sub1() : base(0) {} }; class sub2 : virtual public base { public: sub2() : base(0) {} }; class sub3 : public sub1, public sub2 { public: sub3() : base(33) {} }; class sub4 : public sub3 { public: sub4() : base(1) {} }; int main() { sub4 obj; obj.a = 10; return 0; }
776 名前:デフォルトの名無しさん [2007/06/19(火) 14:49:43 ] win32 SDKでwindowsプログラムの勉強をしているのですが、windowsプログラムを作製するにあたり win32 apiとc言語標準ライブラリに同じような関数があった場合、Windowsではapiの方を使ったほうがよいのですか? また、両者の使い分け基準って何かあるのですか? たとえば、CopyMemoryとmemcpyは同じことをする関数なんですけど..どっち使うのべきか
777 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 14:56:41 ] 環境に依存しない部分はなるべく標準ライブラリ使ってるな、俺は。 趣味でやるなら好みでいいんじゃない?
778 名前:デフォルトの名無しさん [2007/06/19(火) 16:30:34 ] try catchでわざと例外を出す方法を教えてください 今は変数を0の入った変数で割って例外を出しています
779 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:40:49 ] try catchじゃ例外は出せない
780 名前:デフォルトの名無しさん [2007/06/19(火) 16:42:51 ] tryの中でcatchに飛ばす方法を教えてください
781 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 16:48:03 ] 「C++ 例外」でググれ
782 名前:デフォルトの名無しさん [2007/06/19(火) 17:01:37 ] このソースで LINK : warning LNK4039: /SECTION オプションで指定されたセクション '.share' は存在しません。 がでるんだけど、何が悪いか教えてください。 どうやったらwarning消せますか。ちゃんと.shareが使える形で。 #include <windows.h> #pragma comment(linker, "/section:.share,RWS") #pragma data_seg(".share") HANDLE x = NULL; #pragma data_seg() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK); return TRUE; }
783 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 17:24:35 ] >>782 とりあえずコピペしてビルドしてみたのだがwarningなんかでなかった@vc7.1
784 名前:デフォルトの名無しさん [2007/06/19(火) 17:35:43 ] 捕捉でごめんなさい。 debugだとでなくて、releaseだとでるみたい。
785 名前:783 mailto:sage [2007/06/19(火) 18:05:35 ] releaseでもでなかった printfでx見たいからコンソールにした 複数プロセス起動させるとxの値が増加したからshareされてると思う@vc7.1 winxp sp2 #include <stdio.h> #include <windows.h> #pragma comment(linker, "/SECTION:.share,RWS") #pragma data_seg(".share") int x = 1; #pragma data_seg() int main(int ac, char** av) { printf("%d\n", x); x += 1; MessageBox(NULL, TEXT("Press Enter key to continue"), TEXT("TINKO"), MB_OK); return 0; }
786 名前:デフォルトの名無しさん [2007/06/19(火) 18:59:16 ] >>785 まじですか。 こちらの環境はVS2005のExpress。 調べたらこんな差がわかった。でも、なんでかは不明。初期化されないからと推測。 コンパイルエラーが出ないソース。 #include <windows.h> #pragma comment(linker, "/section:.share,RWS") #pragma data_seg(".share") int x = 1; #pragma data_seg() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow) { ++x; MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK); return TRUE; } つづく
787 名前:デフォルトの名無しさん [2007/06/19(火) 19:01:28 ] コンパイルエラーが出るソース。 #include <windows.h> #pragma comment(linker, "/section:.share,RWS") #pragma data_seg(".share") int x = 1; #pragma data_seg() int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, PSTR szCmdLine, int iCmdShow) { MessageBox(NULL, TEXT("HOGE"), NULL, MB_OK); return TRUE; } ++x; がないだけ。 ↑のは ×初期化されない ○一度も利用されることがない かと思っています。
788 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 20:14:08 ] 最適化で消されてるだけじゃないかな /Faで.asm見ればわかるよ
789 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:00:05 ] スカトロCGを激しく集めるスレver27 sakura03.bbspink.com/test/read.cgi/ascii2d/1178640935/537 537 名前:名無したん(;´Д`)ハァハァ[sage] 投稿日:2007/06/19(火) 21:47:45 ID:C++ilogK >>528 試 し た の か ? IDがC++
790 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:08:56 ] よりにもよってスカかよw
791 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 22:12:52 ] しかも logK か。 何か化学的な雰囲気を感じるぞ。
792 名前:730 mailto:sage [2007/06/19(火) 22:17:42 ] >>759 Color::ColorDimension が定数でなかった場合の動作はどうなりますか? クラスのstaicオブジェクトが初期化される順番は未定義であるように、 初期化順序が未定義なために不定動作となるのか、 派生関係があるので初期化順序をコンパイラが考えてくれるのか、 どちらになるのでしょうか?
793 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:26:19 ] >>792 テンプレート展開はコンパイル時に行われるから、 コンパイル時に判明する定数値しかを与えることができない
794 名前:730 mailto:sage [2007/06/19(火) 23:51:30 ] >>793 ああなるほど、確かにそうですね。これはテンプレートを使わない場合も同じですよね。 コンパイル時に行われるということを考えると文法も分かりますね。 ・OKな例 class Base { public: static const int A; }; class Derived : public Base { public: static const int B; }; const int Base:: A = 1; const int Derived:: B = A; ・ダメな例 class Base { public: static const int A; }; class Derived : public Base { public: static const int B = A; }; const int Base:: A = 1; たしかにwww。ありがとうございました。
795 名前:デフォルトの名無しさん mailto:sage [2007/06/19(火) 23:55:57 ] いかん 最近始めたCの勉強をここ一週間ほどさぼってたんだが ここ見てちょっと焦ってきた いかんいかん
796 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 01:49:32 ] 例としてですが、とある値を格納するクラスを作ってます。型はテンプレートで template<typename T> value_t { public: T get() const { return value; } void set(T n) { value = n; } private: T value; }; という感じになると思います。value_t<int> とかなら問題ないと思いますが、 (普通は参照を使って渡す)クラスや構造体が型に指定されると、 無駄にコピーコンストラクタが呼ばれたりすると思うので、微妙な感じになってしまいます。 ということで、最初から参照を使って、 template<typename T> value_t { public: const T & get() const { return value; } void set(const T &n) { value = n; } // ここで operator= が呼ばれるのは問題ないことにする private: T value; }; こう書いても問題ないですか?(というか、こう書くべきですか?)
797 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:00:31 ] 問題はないけど、 プリミティブ型だと結構遅くなる。
798 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 02:37:39 ] >>796 boost::call_traitsはどう? もしくは、参照を扱うメソッドと値を扱うメソッドの2パターン作るとか
799 名前:デフォルトの名無しさん [2007/06/20(水) 08:26:49 ] >>783 >>788 ありがとう。「最適化で消された」みたいです。腑に落ちました。
800 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:49:37 ] ofstream ofs("a.txt",ios::app); ofs << ((LPCREATESTRUCT)lParam)->lpszClass << ',' << ((LPCREATESTRUCT)lParam)->lpszName << endl; や、 if (!lstrcmp(((LPCREATESTRUCT)lParam)->lpszClass,"ClassName") && !lstrcmp(((LPCREATESTRUCT)lParam)->lpszName,"WindowName")) だとプログラムがクラッシュすることがあります。(lpszClass、lpszNameどちらか一方のみでも) ofs << ((LPCREATESTRUCT)lParam)->hwndParent << endl; や、 if (((LPCREATESTRUCT)lParam)->hwndParent == FindWindow("ClassName","WindowName")) のようにhwndParentならクラッシュしません。これは何が原因でしょうか?
801 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:51:30 ] >>800 各変数の値がどうなってるかくらい調べろよ
802 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 12:56:12 ] >>800 とりあえず無節操に行われているこのキャスト (LPCREATESTRUCT)lParam が怪しすぎる。 キャストが安全である根拠はあるか? キャストが安全だとして、有効なポインタが渡されてるという保証はあるのか?
803 名前:800 mailto:sage [2007/06/20(水) 13:04:12 ] >>801 すみません、フックなので変数を予測できず、どの値でクラッシュしてるか分かりません。 >>802 ウィンドウプロシージャのメッセージがWM_CREATEの時に使用してるので大丈夫だと思うのですが。
804 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:13:25 ] C++で安全なコードを書きたいなら、キャスト前のチェックとか、 ->の元がNULLでないことを保証するassertなんかは必須かと というか、クラッシュするコードの lpszClassや lpszNameの内容チェックコードを 処理の前に挿入してログにでも吐けばいいんじゃね?
805 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:17:03 ] >>803 予測なんてしなくていいから、デバッグ実行しろ。
806 名前:800 mailto:sage [2007/06/20(水) 13:41:47 ] >>804 lstrcmp〜でクラッシュするのでofstream〜で値を確認しようとしたんですが駄目だったんです。 >>805 デバッグしたんですが慣れてないので分からなかったんです、ごめんなさい。
807 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 13:56:34 ] MSDNのCREATESTRUCTに関するヘルプには Because the lpszClass member can contain a pointer to a local (and thus inaccessable) atom, do not obtain the class name by using this member. Use the GetClassName function instead. と書かれているようだが。 lpszClassに直接アクセスしてクラス名を取得しようとするな ってことじゃねえの。
808 名前:800 mailto:sage [2007/06/20(水) 15:24:02 ] >>807 わざわざありがとうございました。
809 名前:デフォルトの名無しさん [2007/06/20(水) 19:21:18 ] class Stone{ public: Stone(); int color, groupNumber; Stone *nextStone, * groupHead, *nextGroup; }; Stone::Stone(){ color = groupNumber = 0; *nextStone, = *groupHead, = *nextGroup = 0; // (1).ここで整数を代入できない } というStoneオブジェクトのインスタンスを21*21の二次元配列として生成して、 Boardオブジェクトを作りたいと考えています。 改行が多いといわれたので続きます
810 名前:809の続き [2007/06/20(水) 19:22:32 ] class Board{ public: Board(); Stone board[21][21]; Stone *boardHead; }; Board::Board{ *boardHead = &board; // (2).Stone(*)型はStone型に変換できない for(int i; i < 20; i++){ int j; for(j; j < 19; j++){ board[i][j].color = 3; board[i][j].(*nextGroup) = board[i][j + 1]; } board[i][j].color = 3; board[i][j].(*nextGroup) = boardboard[i + 1][1}; // (2).と同様 } と表記したところ、(1).(2)のエラーが起きました。 配列の要素一つ一つにポインタを持たせて、グループ化をしたいと思っています。どうすればよいのでしょうか?
811 名前:809、810 [2007/06/20(水) 19:24:44 ] すいません。書き忘れです。 (1)では、ヌルポインターを取り合えず代入したいと思っています。 (2)では、配列番号から、要素のポインターを代入したいと思っています。
812 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:29:47 ] (1)のところには、余計なカンマが付いている (2)の最初の箇所は、余計な*が付いている 2つ目の(2)は、board[i][j].nextGroup = &boardboard[i + 1][1];にしろ
813 名前:デフォルトの名無しさん [2007/06/20(水) 19:31:34 ] (1)で*付ける意味も分からんし nextStone = groupHead = nextGroup = 0; とか
814 名前:デフォルトの名無しさん [2007/06/20(水) 19:33:43 ] すみません、質問させてください。 void foo(const char *const& hoge); のような宣言の関数があるのですが、引き数定義部分の「const&」の意味が 分からずに悩んでいます。この宣言はどう解釈すればよいのでしょうか? よろしくお願いします
815 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 19:42:09 ] constな(C++の)参照 宣言自体の読み解き方がわからなければ、ここでも読んでおけ kmaebashi.com/programmer/pointer.html Cだから参照は出てこないが、ポインタの*と同じような要領で解釈しろ
816 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:19:12 ] >>812-813 あ、*の扱い方が間違ってたのか。ありがとうございました。
817 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:05:47 ] windowsで、C++builder使用してます。 質問です。 Linuxだと、iptablesのテーブルの中身を書き換えて iptablesを再起動すると、設定変更できますよね。 やりたいことは、 ※時間ごとに、アクセスできる人を変更したいんです。 これをwindowsでやりたいんです。 1、ファイアーウォールみたいなのから、自分で作る。 これは難しいでしょうか?パケット見て、捨てたり、捨てなかったり とかのやり方がわからないです。本などご存じないでしょうか。 2、フリーのファイアーウォールソフトを探してきて、 linuxのiptablesと同じように、テーブル書き換え->ソフト再起動 で、できそうでしょうか? 2番目だと簡単そうですか?
818 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:56:04 ] ソフト単体ならパケット監視してどうこうということもできるだろうけど、 windowsのばあい、システムに対してユーザーが介入するのは難しい。 アクセスというのは、何に対してのアクセスなんだ? webサーバーとか、ftpサーバーとかだったら、そのサーバーソフトのフィルタリング設定を使うべきだろう。 共有ディレクトリへのアクセスを制限するというなら、また別の方法が必要だろうが。
819 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:05:58 ] >>817 ttp://www.wilderssecurity.com/showthread.php?t=112582 でも読んでみたら
820 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:29:39 ] >>818 レスありがとうございます。 ふむふむ。windowsだと難しいですか。 自分作ってないソフトで、しかもそのソフトは フィルタリング機能とか無いんです。 >>819 ありがとうございます。 iptablesと似てるのないですか。だけ理解できました。 じっくり、読んでみます。 似たようなのがあれば、やりたいことできそうですね。
821 名前:デフォルトの名無しさん [2007/06/20(水) 22:47:33 ] >>820 そんなあなたにフィルタドライバか、DLLインジェクション。
822 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:07:41 ] なんで具体的にそのソフト名をいわんのかね。
823 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:36:12 ] 改造する気?
824 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:45:03 ] C++でLinkポインタというのを作りました 所有権を持つポインタオブジェクトが自分のコピー?に対する参照リストを持っていて 自分が消滅する時にそれらを一気にぬるぽ値に設定することで コピーは本体の事を意識しなくて済むというメリットがあります 質問はこれと似たような事が出来る既存のライブラリは無いかということです 正直あまり良い実装じゃない上に根本的に泥臭いんですよね…
825 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:53:56 ] Lockできないboost::weak_ptrを実装したって話?
826 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:31:22 ] あのー (unsigned int) ((context->count[0] >> 3) & 0x3F) これがなぜ64のあまりになるのですか?
827 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:33:42 ] >>826 0x3fは2^6-1だから。
828 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:47:40 ] 0x3f=16*3+1*15
829 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:50:06 ] えーとじゃあ 45と120の場合いくらになるんだろ なんか計算あわない
830 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:52:38 ] >>826 一瞬、LISPあたりのコードかと思った。
831 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 00:53:37 ] ところでなんで (context->count[0] >> 3)してるんだろう。 これすると値辺になる気がするのですが
832 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:05:29 ] つーかそれ、 8で割った後に64で割った余りを求めてる事になるが
833 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 13:14:49 ] あっそ、よかったね
834 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:30:08 ] よくないという話だな
835 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 14:54:13 ] >>826 10進数で下6桁残して上の桁を0にしたら それは100万 (10^6) で割った余りになる。 それと同じように、0x3F で AND とると (=2進数の下6ビットを残して上のビットをクリア) 64 (2^6) で割った余りになるわさ。
836 名前:ひろみつ [2007/06/21(木) 16:29:58 ] Cって何言語で一版最初書かれたの?今のC言語はCで書かれてるとかいうのはなしね。 K&Rだかなんだかが、一版最初に書いたのは、何で書いたの?アセンブラ?B?
837 名前:デフォルトの名無しさん [2007/06/21(木) 16:33:43 ] ひろみつ死ね
838 名前:デフォルトの名無しさん [2007/06/21(木) 16:50:44 ] すみません。長いソース打ち込みたいとおもって、本屋で長いソースが載っている本を買ってきました。 www.amazon.co.jp/C%E4%BE%BF%E5%88%A9%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E9%9B%86-%E6%9E%97-%E6%AD%A3%E5%B9%B8/dp/4320027108/ref=sr_1_3/250-4187414-6697033?ie=UTF8&s=books&qid=1182412183&sr=1-3 です。 QuickC対応って書いてあるんですが、VC++6.0でも大丈夫ですか?
839 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:10:28 ] >>838 QuickC…… その本は今すぐ返品しなさいw ソースが欲しいなら、 sourceforge.jp/ sourceforge.net/ なんかで探しなさい。 もしくはあなたの好きなアプリやライブラリでオープンソースなのを探しなさい。
840 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:57:25 ] 94年じゃしょうがないな
841 名前:デフォルトの名無しさん [2007/06/21(木) 18:27:59 ] unsigned conv_in:1; という記述を見かけたのですが このコロンはなんですか?
842 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:31:58 ] >>841 ビットフィールド。 変数のサイズを1bitにする指定。 とはいっても、実際に1bitになっているわけじゃないけど。 1bitしか使わない宣言というべきなのかな。
843 名前:838 mailto:sage [2007/06/21(木) 18:33:45 ] >>839 どうもありがとうございました。そんなサイトがあるんですね・・ すごいです。独学者なので、助かります。ありがとうございました。 >>840 やっぱだめですよね。。どうもありがとうございました。
844 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:35:49 ] おいおい独学社ならそれくらい嫉妬家よ
845 名前:841 mailto:sage [2007/06/21(木) 18:44:33 ] >>842 ありがとうございます
846 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:55:12 ] >>844 今日始めたばかりの独学者なんだろ。事情を察しろ。
847 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:06:10 ] そういうところのリンクをまとめて貼ってもいいんだが 見つける喜びってのがあるからなあ
848 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:09:04 ] >>847 急に貼られても今日始めたばかりの独学者だから困るだろ。事情を察しろ。
849 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:20:52 ] 長いソースを打ち込みたいならCプログラミング診断室 いや本気にしないでね
850 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:22:08 ] >>825 おー、weak_ptrで出来るんですね しかもロック付ですか…凄い
851 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:45:49 ] OfficeのWORDの文字だけをいじるプログラムを組みたいのです。 ただ、UNIX系を想定しているので、COMを使った方法ではダメなのです。 DCOMを使うのも、避けたいのです。 そこで、WORDのデータ構造を調べてみたのですが、どこにも見当たらないのですが、 UNIX系で操作できるようなライブラリ・もしくはデータ構造がわかるサイトがあれば教えてもらいたいです。 よろしくお願いします、
852 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 22:51:51 ] あ〜残念。データ構造がわかる頭は持っててもサイトは知らないやゴメンね、
853 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:10:31 ] あー残念。RTFやOpenOfficeText形式なら知っているけどMSWord形式は知らないや。
854 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 01:17:29 ] POIでいいじゃん。 がんばって移植すれ。
855 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 04:31:38 ] typedef vector<int> V; typedef V::iterator I; typedef vector<V> VV; VV vv; for_each( vv.begin(), vv.end(), tr1::bind( &fill<I,int>, tr1::bind(static_cast<I (V::*)()>(&V::begin), tr1::placeholders::_1), tr1::bind(static_cast<I (V::*)()>(&V::end), tr1::placeholders::_1), 0)); g++ 4.1.2です。 2次配列の初期化をalgorithmの練習でやってみようと思っていろいろ試行錯誤してみたのですが、 こんな悲しいコードになってしまいます。 static_castは省略できても良さそうなものですが、これはg++特有の問題でしょうか? (省略できたとしても普通にループ書いたほうがわかりやすいけど)
856 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 08:20:41 ] >>852 ふと思ったんだが、公開されてないデータ構造ってどうやってわかるの? やっぱバイナリエディタで開くと、大体わかっちゃうものなの?
857 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:06:54 ] >>856 バイナリデータの解析の基本は 「ちょっといじって何が変わったか調べる」。
858 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 10:10:48 ] 夏カシス昔よくやった
859 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:00:27 ] >>855 g++ じゃなくても static_cast は外せないだろうね。 bind() の第1引数にはほとんど何でも入るから、コンパイラの知ってる情報だけでは オーバーロードされた &V::begin のうち適切なものを選べない。
860 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 11:55:40 ] >>851 WORDは色々バージョンも多いから そんなめんどくさい事せずに、POIを使った方がいいと思われ。 ただ無駄にJavaのコード呼び出す必要があるけどな。
861 名前:デフォルトの名無しさん [2007/06/22(金) 13:26:29 ] 0〜9の数字をランダムに発生させて 数字が被らないように どのような順番で数字が来たか表示させるという処理をしたいのですが このようなプログラムを作るにはどうすればいいのでしょうか 乱数生成時に数字が被りすぎて無限ループに近いじょうたいになってしまいます
862 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:14 ] 0〜9 の数字を入れた配列を作ってシャッフルするのが一般的。 C++ なら random_shuffle って関数テンプレートがあるから、それ使う。 C なら自前で作るべし。 アルゴリズム悪いと確率が偏るから、 ランダムシャッフルで検索してアルゴリズム調べてちょ。
863 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:30:39 ] >>861 絶対被っちゃいけないなら、それは0-9のランダムではなくて0-9のうち前回の数字を取り除いたランダムじゃないか。
864 名前:861 [2007/06/22(金) 13:35:54 ] ,, ,,, ゙'lliiiiiiiiiiiiilllllllllllllllll|||li,, l||||l ゙゙゙゙゙ 、,,,,,,,ii!!"゙゙゙゙゙ 、,,,,,, 、,,,, |||| ,l||||" ゙゙'llli,, ゙l||! ,,l|||゙ ill,,,,,,,,,,,,,,,,,,,,,,,,,,,iiilllll,,, ||| ,,l|||! ゙゙゙゙゙ ,,,l||" ゙゙'゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙゙ || ,il|l゙゙ ,,rlll" ,,,, ,,ill"゙ ,,,ril"゙ il||||l
865 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:40:26 ] 力抜けよ
866 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:56:17 ] そう、もっと・・・力を抜いてごらん・・・。
867 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 13:59:44 ] for (;;) { >>865 >>867 >>866 }
868 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:02:50 ] 5→6→4じゃね?
869 名前:デフォルトの名無しさん [2007/06/22(金) 14:27:56 ] C++では変数の宣言をどこにでも置けると聞いたのですが、 goto文で変数の宣言を飛ばすことはできないのですか? 以下の文をコンパイルできません。 int main() { goto end; int a = 100; end: return 0; }
870 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 14:38:20 ] >>869 何が目的なのかさっぱり解らんが、 「宣言」は「実行」されないんだから 飛ばすも何もない。
871 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:43:43 ] つまり、gotoで分岐する範囲では宣言できないということだ。
872 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 15:46:05 ] switch - case で、caseで宣言できないのと同じだな
873 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 16:18:11 ] 最初に格納する数値を入力して、 以下のように文字などを無視してその個数分だけ整数値を格納する というプログラムを作りたいのですが、これって可能でしょうか? fgetsとstrtolを使うといけそうな気がするのですが 頑張ったものの自分ではどうにもならない状況ですorz 【実行画面】 個数を入力したください>>5 5a11bbb7 88yew99 数値1:5 数値2:11 数値3:7 数値4:88 数値5:99
874 名前:デフォルトの名無しさん [2007/06/22(金) 16:53:19 ] いままでCでは数値を文字列にするときは sprintf(str,"%d",num);のようにやってたのですが、 C++でstd::stringとsize_type size()等、STLを使う場合はどのように変換すればいいのでしょうか? std::string str1 = "ああああ"; std::string str2 = "長さ" + str1.size() + "です"; みたいに使いたいのですが、これはエラーがでます。
875 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:01:09 ] boost::lexical_castなどはどうだろう
876 名前:874 [2007/06/22(金) 17:10:29 ] >>875 おお、すげー便利なもんあるんですね。ありがとうございます。早速使ってみます。
877 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:20:04 ] >>873 一文字ずつアスキーコードで比較して行けばいいのでは?
878 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:25:46 ] >>873 宿題なら宿題スレ行きを薦めるが、とりあえずこんな感じで出来る。 #include <stdio.h> #include <ctype.h> int main(void) { int i, c, nc, *nv; printf("個数を入力してください>>"); if (scanf("%d", &nc) != 1 || nc <= 0) return 1; nv = malloc(nc * sizeof(int)); for (i = 0; i < nc && (c = getchar()) != EOF; ) { if (isdigit(c)) { ungetc(c, stdin); scanf("%d", &nv[i++]); } } nc = i; for (i = 0; i < nc; i++) printf("数値%d:%d\n", i+1, nv[i]); free(nv); return 0; }
879 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:41:32 ] >>877 このスレを最初から読んでいたらscanf処理のことが書いてあって、 代わりにfgets+strtolということが書いてあったので この処理を弄くって上に書いたような処理がOKになったら 使いやすくなりそうだと思ったのですが やはりこの仕様にするとそれが早いかもですね…。 >>878 宿題では無くちょっとこのスレを読んでいて気になったので考えていました。 しかし書いてくださりありがとうございます。 いくつか知らない関数があるのでググって見てみます。 ちなみにfgetsとstrtolで12a23から12と23を取りたかったら strtol(str,&error[i],0); strtol(&error[i]+1,&error[i+1],0); こんな感じでずらしていく感じにするのでしょうか?
880 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 17:51:22 ] >>879 こんなかんじ。 #include <stdio.h> #include <stdlib.h> #include <ctype.h> int main(void) { char buff[0x1000], *p, *q; unsigned char c; while (fgets(buff, sizeof buff, stdin)) { for (p = buff; c = *p++; ) { if (isdigit(c)) { printf("%ld\n", strtol(p-1, &q, 10)); p = q; } } } return 0; }
881 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 18:25:06 ] >>880 おぉ、激しく感謝です! しかもコードが短くて使いやすくて良いですね! 今日なんだかんだで5、6時間ほど考えていたので 教えてくださりかなりガチで嬉しいです>< 重ね重ねですが本当にありがとうございます!
882 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:30:17 ] 突然すみません。質問させていただきます 自分は最近Cを始めたばかりの初心者で、初心者向けの本を参考にしてプログラムしています。 そして、その本を読み終えてさあがんばってみようと、ためしにオープンソースのものをDLして、ソースコードを見てみました すると、いくつもファイルがあり、ひとつではありませんでした。 教本を見ても複数ファイルを同時に扱ってプログラムをする、なんてやりかたはどこにも書いていなく、戸惑っています どうやって複数のソースコードをひとつのプログラムとしてまとめられるのでしょうか? 分がわかりにくかったらすみません。教えていただけたら幸いです。
883 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:35:30 ] 分割コンパイルで検索
884 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 19:43:54 ] 解凍したディレクトリで、./configure か、counfigure.bat したあと、make か nmake
885 名前:たろう [2007/06/22(金) 21:41:10 ] 曖昧さについて質問があります。 現在、ある処理をできるだけ小さいプログラムで記述する競争をしてまして、 以下のような記述か可能かどうか教えてください。 ●質問1 ----- int a = 0; int b[] = {a++, a++, a++}; ----- と記述した場合、 b = {0, 1, 2} となるのでしょうか? それともコンパイラ依存でしょうか? コンマ演算子は左から行う結合ルールですが、 この場合は演算子じゃないので、 明確なルールはなく、コンパイラ依存でしょうか? ●質問2 func1 があるクラスのポインターを返す関数であるとして、 ----- int a = 0; func1(a++)->func2(a++); ----- と記述した場合、 func1(0)->func2(1) となるのでしょうか? それともコンパイラ依存でしょうか? func1(0) を実行してからでないと、func2 が決定しないので、 なんとなくその中の引数の評価が後のような気がしますが。
886 名前:じろう [2007/06/22(金) 22:12:25 ] やあ、たろう この勝負は俺がもらった 約束通りお婆ちゃんの貞操は頂いて逝くぜ
887 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:20:55 ] int a = 0; int b[] = {a++, a++, a++}; ----- int b[] = {0, 1, 2};の方がよほど短いわけだが。 ----- int a = 0; func1(a++)->func2(a++); ----- 同様にfunc1(0)->func2(1);ではいけないのだろうか。 まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。
888 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:27:23 ] >885 プログラムを短くするノウハウについては ↓のスレが勉強になるかもよ 七行プログラミング part5 ttp://pc11.2ch.net/test/read.cgi/tech/1142467359/
889 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:38:11 ] >>880 sizeof(buff)の形ならよく見るのですが、sizeof buffのように括弧のないものって何でしょうか?
890 名前:デフォルトの名無しさん mailto:sage [2007/06/22(金) 23:41:30 ] >>889 別にカッコつけなくても生きていけるんです
891 名前:デフォルトの名無しさん [2007/06/22(金) 23:46:17 ] sizeofというのは「関数」じゃない。 だから、sizeof(buf)のbufは、関数の「引数」じゃない。 関数じゃないから、括弧は「関数呼び出し演算子」ではない。 sizeofは、演算子の一つ、sizeof演算子です。だから、括弧は不要。 「1+1」を「 (1)+(1) 」とは書かないでしょ?これと一緒。
892 名前:889 mailto:sage [2007/06/23(土) 00:11:33 ] ありがとうございます。付けなくてもいいんですね。 なのに()付きのサンプルコードが多いのは何故なんでしょうか?
893 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:15:46 ] >>892 型のサイズを知るには、sizeof(int)のように括弧が必要。 それに倣って、括弧をつける人が多数。
894 名前:889 mailto:sage [2007/06/23(土) 00:19:49 ] なるほど、そういうことだったんですね。 ありがとうございました。
895 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:22:27 ] 括弧つけても優先順位に全く影響与えないしな。 無駄だし勘違いする人も出るからと嫌う人もいるし、 括弧を付けた方が統一性が出ると付ける人もいる。 そして、よく知らないけど括弧付けないといけないと勘違いしてる人もいる。
896 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:56:10 ] 何でtypeidはカッコ必須なの?
897 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 00:58:17 ] typeidの場合はsizeofと違って対象が型だろうが値だろうが括弧が必要。 だから個人的には、sizeofも常に括弧を書いたほうが何となく対象性がある気がする。
898 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 01:07:29 ] >887 >まぁ、一つの式の中にa++が二つある場合の評価順序は不定と言うことで。 不定じゃなくて未定義でしょ。 鼻から悪魔がでてくるじょ
899 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 06:59:03 ] いや不定だろ
900 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 07:11:10 ] JISX3010 6.5式 (70)によれば、 「この段落の規定によると(略)a[i++]=i;は、未定義の式文である」
901 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 13:33:55 ] せいぜい言葉遊び。 「未定義」だから、コンパイラにより「不定」になるんだろ。
902 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 14:02:30 ] >>901 www.kouno.jp/home/c_faq/c11.html#33
903 名前:デフォルトの名無しさん [2007/06/23(土) 14:44:39 ] C++とはちょっと違うのですが、適当なスレが見つからなかったので、すみませんが質問させてください。 VC++6.0のマクロ機能を使って、エディタ上で選択している文字列を 外部プログラムに渡すマクロを作りたいのですが、このマクロの仕様というか そもそもこいつが何者なのかがさっぱりわかりません。 マクロのサンプルを見て出てきた文字列を片っ端からぐぐりつつやってみたのですが 外部プログラムの実行だけがどうしてもできません。 どなたかこいつが何者なのか、どうすれば外部プログラムを実行できるのか教えてください。
904 名前:855 mailto:sage [2007/06/23(土) 21:13:36 ] >>859 遅くなってすみません。キャスト外せませんか…ありがとう。 俺もそのような意味の話をネットのどこかで読んでキャストをつけたんですが、 でもV::beginってオーバーロードされてないですよね?何か勘違いしてるんでしょうか。
905 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 21:15:34 ] >>904 const の有無で2つある。
906 名前:855 mailto:sage [2007/06/23(土) 23:25:01 ] >>905 あ、ありがと。気づきませんでした。 &V::beginは関数ポインタの集合で、これをキャストなり代入なりする時に 型に合う関数ポインタが適当に選ばれるような感じでしょうか。 V::iterator (V::*b)() = &V::begin; V::const_iterator (V::*cb)() const = &V::begin; V::beginは前者、(const V)::beginは後者を選ぶようなルールがあれば話は早いと思うけど、残念。
907 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 23:46:52 ] 文字列中の " を \" に変える関数ってコレで良いんですかね? std::basic_string<TCHAR>::iterator dquoteToESC(std::basic_string<TCHAR>& str) { typedef std::basic_string<TCHAR>::iterator iter; iter i = str.begin(); while ( i != str.end() ) { i = std::find(i, str.end(), _T('\"')); if ( i == str.end() ) break; i = str.insert(i, _T('\\')) +2; } return str.begin(); }
908 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 00:03:12 ] どうでもいいが関数名はEscDQuoteのほうがいいんじゃないの?
909 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 05:33:08 ] 今では vector のメモリ上での連続性は保証されてますけど、 昔は少なくとも規格上では保証されていませんでした。 で、実際のところ、メモリ上での連続性がない場合のある処理系って実在したんでしょうか? 実在しなければ、メモリ上での連続性を仮定したプログラムは 過去の処理系との互換性があるということで安心できるのですが。
910 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:15:16 ] 俺は聞いたことがない 普通に作れば連続するから実質的に実装の後追いで連続性の保障が与えられたのであって、 連続していなかった処理系なんてないと思って差し支えないはず
911 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 07:17:54 ] そうですか。安心しました。 d。
912 名前:デフォルトの名無しさん [2007/06/24(日) 13:53:56 ] ifstreamへの書き込みについて質問させてください。 ifstream fin("test"); として、 char c; char s[100]; のとき、 (1) fin >> c; ===> 読み込みは一文字だけ。 (2) fin >> s; ===> 読み込みは一行全部。配列sのサイズを越えても。 という理解でいいでしょうか。 (実験したらそうなりました。)
913 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:04:56 ] 普通は、fin.read(s, 100 )とかstd::getline( fin, str )とか使うけどね。
914 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:14:46 ] >>912 配列の先頭アドレスしか受け取っていない関数は、配列のサイズについて関知しない。
915 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:31:41 ] >.912 (1)についてはそのとおり (2)についてはちがう。 空白文字(スペース、タブ、改行等)を読み飛ばし、 次の空白文字が来るまでバッファを超過しようがsに詰め込もうとする。 scanfの%sと同じと思っておけばよい。
916 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:35:50 ] まあ、折角 istream 使ってるんなら、 char じゃなくて string 使った方が安全でいいね。
917 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:52:06 ] そもそも、なんでifstreamへの書き込みについての質問なのに読み込む話ばかりなんだ?
918 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 14:54:29 ] >>917 2行目以後を読めば、1行目の「書き込み」はただのtypoだと分かるから。
919 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:22:55 ] >>910 設計時点で C 配列の代用という用途は考えられていて、 規格への明記が漏れていただけだと思われ。 ↓でも現状の実装についての考察なんて問題にならなかったみたいだし。 www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69
920 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 15:59:49 ] >>919 なるほど。確かに。 ただ、仕様上 one-past-the-end の問題は無い、 と言ってる点がいまいち分からんのですが。 5.7 para 5-7 (配列では one-past-the-end のアドレスが有効であることを保証) あたりとは矛盾しないのですか?
921 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:17:52 ] >>920 !v.empty() な v について &v[0] + v.size() が有効なことは &v[0] + (v.size() - 1) が 有効なことと 5.7p4 の 「配列じゃないオブジェクトもポインタの加算においては長さ1の配列とみなす」 っていうルールから導き出せるから、特に vector について書くことは無い ってことじゃないかな? まぁ、そうだとしてもわかりにくいね。
922 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 16:26:54 ] なるほど・・・。確かに。
923 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:10:37 ] 自動配線ツールをCで書こうと思ってるんですけど。 アルゴリズムはmazeをベースで。 書くときに参考になるソースコードとかってどっかに落ちてるものなんでしょうか? アルゴリズム分かっても、書くのが素人なので、どれ位の規模(行数)になるかとか、必要な関数が予想つきません。 サンプルなどがあればと思って質問させていただきました。
924 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:28:14 ] これですか? www5e.biglobe.ne.jp/~me-jin_k/
925 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:30:07 ] 早速ダウンロードしました
926 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 17:33:48 ] ないのならないで結構です。
927 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:24:12 ] >>923 半導体用の自動配置配線ツールなら、優秀なものが出来て売ることが出来れば 2本程度売れるだけで遊んで暮らせるでしょう そして、そんなものが作れるなら…
928 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:35:00 ] >>927 そうなんですか。 イメージしてるのはたとえばこここの配線プログラムみたいなものなんですけど。 ht_tp://www.icot.or.jp/ARCHIVE/Museum/IFS/abst/058-J.html プログラムを落としてみたんですけど、分からない言語(KL1?)で書かれている(?)ようで、 中身を開けませんでした。
929 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 18:36:55 ] 難しいようですね、お騒がせして申し訳ありませんでした。
930 名前:ちんこ [2007/06/24(日) 19:27:46 ] www.uploda.org/uporg872561.cc.html g++です。 三目並べのゲームを作ります。 show_stateがばぐります。どこがおかしいか教えてください
931 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:34:07 ] こんなのコンパイルとおるんだな。
932 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 19:37:08 ] >>930 State::State(bool s[3][3]){ for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ a[i][j] = s[i][j]; } } } ちなみに、マスの状態は、「○」「×」「どちらもおかれていない」の3通りあるから、boolではだめかと。
933 名前:ちんこ [2007/06/24(日) 20:33:11 ] [akira@58x13x98x215 sanmoku]$ g++ test.cc [akira@58x13x98x215 sanmoku]$ ./a.out 1 0 1 0 1 0 1 0 1 さんくるです。>>932 では3通りを表現するのに一番適したデータ型はなんですか? 空 1 0 というつもりだったのですが。intだとメモリがでかくなる。 まぁ三目なら全検索してもうんこだけど。 幅検索型の三目並べゲームをclassを使って作るというのが目標です。 計画しているクラスは Player CPU State Queue(Stateを含みまくるキューのクラス) Board(mainのクラスです) とかです。オブジェクト指向的に考えて適切ですか? うまい人ならどういうクラスを考えるんでしょうか。
934 名前:ちんこ [2007/06/24(日) 20:35:34 ] これが出来たら9*9盤くらいで5目並べをしてみたいです。 最終目標は囲碁のソフトですがこれはやばそうなので、まずは五目並べとかでゲーム作りのノウハウを学びます。
935 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:38:40 ] >3通りを表現するのに一番適したデータ型はなんですか? boost::triboolってのがある これはtrue, false, indeterminateの3値を表現できる これをtrue = 白, false = 黒, inderteminate = 何がおかれているかわからない = 色が不定 とでも使えばちょうど良いんじゃないかな
936 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:39:14 ] >>933 intでもメモリには大差なくね? ってより、intのほうが高速になる可能性を秘めていると思うが・・・ あくまでも可能性だけど
937 名前:ちんこ [2007/06/24(日) 20:53:33 ] >>935 不定か、なんか怪しいデータ型ですね。 >>936 intの方が高速になる理由は? intって4byteですよね、boolがダメならcharかなと思っています
938 名前:デフォルトの名無しさん [2007/06/24(日) 20:55:37 ] ちんこあほすぎでわろたw
939 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 20:58:59 ] ちょっとすれ違いですが、 eclipse + Java並のリファクタリングやコード補完、コード整形等の機能を備えたC/C++のIDEはありますか?
940 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:02:43 ] >>939 あります。スレ違いなので詳細は割愛。 >>937 サイズが大きいから遅いとは簡単にはいえません。 まずは真っ当に作り上げることが先決でしょう。
941 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:07:12 ] >>937 そのCPUがもっとも得意とするビット幅を、intに割り当ててるコンパイラが多い可能性がある。 って程度じゃない。intの処理速度≧charの処理速度になる可能性があると。 ほとんどintの処理速度=charの処理速度だと思うが。 実際型のビット幅が決まってないのって弊害にしかならん気がする。
942 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:12:39 ] typedef int TRIBOOLとでも定義しておいて とりあえず組んでみたら? 出来てから速度とか使用メモリーを測定してそれから決めればいい
943 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:16:21 ] >>937 高速になる理由は>940-941のとおり。 charとintでの速度比較した場合、intが早くなることはあっても遅くなることはあまり無いと思う。 1億×1億のフィールドとかを考えるならそりゃcharのほうがメモリは節約できるだろう。 ただ、intだとメモリが危ういがcharならきっと大丈夫程度の問題ならば、ベタに 配列として持つより設計を見直すほうがいいと思われる。
944 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:20:22 ] メモリアクセスの遅延により、メモリの節約自体が速度に効くだろうから やっぱり最終的に実測しないと決まらない。
945 名前:ちんこ [2007/06/24(日) 21:21:39 ] うお、その話ならどっかで聞いたことがあったような。 じゃあintにしてみます。 9路盤で5目並べする時用にプログラムをあらかじめ N // 盤の大きさ M // これだけ並べば勝ちだぜぃな数 として組んだ方がいいですかね? しかしどうやればいいかはさっぱりなんですがね。 何しろゆとりなもんでwww
946 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:25:46 ] >>945 とりあえず数字決め打ちでもintでもcharでもいいから作りあげろ 話はそれからだ
947 名前:ちんこ [2007/06/24(日) 21:27:00 ] まじ難しい。
948 名前:ちんこ [2007/06/24(日) 21:29:53 ] クラスの依存関係がイミフ
949 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:33:39 ] 日記帳にでも書いてろ
950 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:43:37 ] あきらめろ
951 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:45:30 ] >>937 メモリ気にするんなら2bit一組で使えばいい、速度気にするんならintでok ちなみにC++ではbool型のサイズは環境によって違う 普通はintかcharになってるようなのでメモリの節約にはならない でもな、実際にこんなの気にしなきゃいけない環境って最近は少ないから まず動くもの作ってそれから考えるほうがいいよ
952 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 21:58:34 ] >>945 ちなみに、見た目簡単そうな5目並べだが、 まともな思考エンジン作れたら結構な額で売れる 昔仕事でUIだけ作って5目並べの思考エンジン買ってきた奴組み込んだけど、 中身かなり複雑で読む気もしなかったわw
953 名前:ちんこ [2007/06/24(日) 21:58:57 ] Playerクラスとかいるか・・・? でもないとオブジェクト指向っぽくないよなぁ・・
954 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:00:34 ] >>945 この辺参考にして頑張ってくれ www.h6.dion.ne.jp/~game296o/GameMain.html www002.upp.so-net.ne.jp/ys_oota/mdp/ 後はひたすら試行錯誤 考えて分からなければとりあえず書いたら最低限何が駄目か何が必要かとかわかってくるんじゃね?
955 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:05:01 ] >>953 お前には無理だ せいぜい無駄な時間を浪費するがよい
956 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 22:42:47 ] >>928 KL1 www.klic.org/software/klic/index.ja.html
957 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:48:42 ] くだらない質問だと思いますがお願いします。 STLのvectorに格納した要素を、配列に即変換する方法はないのでしょうか? Iteratorを使って地道にループさせて配列に設定する方法しか思いつきませんでした。
958 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:49:27 ] std::copy
959 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:06:23 ] >>958 どうもです。
960 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:09:28 ] &vector_instance[0]ではいかんのか?
961 名前:こんにちは mailto:こんにちは [2007/06/25(月) 03:30:00 ] こんにちは
962 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:45:34 ] 次期仕様のドラフトだと data 関数があるみたいだが、 今の所は &v[0] か &v.front() だな。
963 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 04:47:50 ] >>953 Player インタフェースクラスを作って、 PlayerCom と PlayerHuman クラスを派生して・・・
964 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:03:54 ] GameMaster クラスを用意して本物の盤面をいじれるのはそのクラスだけにして…
965 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 06:05:41 ] PlayerCom からも複数のクラスを派生して・・・
966 名前:ちんこ [2007/06/25(月) 07:14:38 ] そんなにクラス作るのか。 PlayerからPlayerComとPlayerHumanを継承 PlayerComから複数はなんで? もしや思考パターンを変える為?
967 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:32:33 ] ちんこ死ね
968 名前:ちんこ [2007/06/25(月) 07:36:38 ] 初心者歓迎スレなのに・・・ クラスを使ったものとしてはC++かつGUI以外でははじめて もう何がなんだか分からんとです。 まずUML勉強した方がいいかな? 生半可に利用するのはおれのタチじゃない、オブジェクト指向なら徹底的にオブジェクト指向にしたい。
969 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:01 ] はいはいわろすわろす
970 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:53:12 ] ○×ゲーム程度なら、まず非オブジェクト指向で作ってから 設計をやり直してオブジェクト指向にするのが(勉強には)いいと思う。
971 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 07:59:30 ] >>968 愚かな一貫性は小人物に憑いたお化けである
972 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:03:07 ] まあ、色々なパターンで作って、 それぞれのプログラムの性質を比較してみるのも勉強になるよね。
973 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 08:13:38 ] そろそろ次スレの季節だな。
974 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 09:55:20 ] 定刻も、過ぎてることだしな
975 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:02:09 ] 次スレ立てた 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/
976 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 12:03:14 ] 乙
977 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:36:14 ] VisualC++2005です。switch文で以下のように下にcaseが続くと変数の宣言と同時に初期化できません。 これは何故でしょうか? case 1: int i=1;//int i; i=1;ならOK break; case 2: break;
978 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 22:38:42 ] case 1 に飛んだ場合はいいけど、 case 2 に飛んだ場合は i が使えるのに 初期化の位置を飛ばしてしまう。 だから、そういうことはできないようになってる。 case 1: { int i = 1; } break; みたいにブロックで囲むといいよ。
979 名前:977 mailto:sage [2007/06/25(月) 22:54:36 ] ありがとうございます。そのようにします。
980 名前:デフォルトの名無しさん [2007/06/26(火) 21:11:34 ] >>913-918 ありがとうございました。
981 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:34:30 ] >>978 横レスだが なるほど 時間があれば言語仕様もきっちり読んでおけってことか
982 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:55:00 ] 時間が無くても言語仕様は嫁
983 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:21:51 ] 必須かよorz プログラム開発の面接を受けた感触として ひょっとしたら読まなきゃかもなーとは思ってたが
984 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:24:17 ] 必要があれば読みたくなるだろうからそれまでは別に無理して読まなくて良いよ 経験があってこそ初めて理解できるような部分もあるし
985 名前:デフォルトの名無しさん [2007/06/26(火) 23:52:05 ] C++で一時オブジェクトを関数に渡す時に値渡しするしかないんですか? boost::functionとかそれだけで40バイトぐらいあるから何とか参照渡ししたいんですが 右辺値を参照で渡せるような何か良い手段ありますか?
986 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:52:50 ] constのことかーーーーーー?
987 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 23:59:47 ] あああ、const参照にはこういう使い方もあったんでうsね どうもです
988 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:09:12 ] 亀だが charとかshortは演算途中で内部的にintに無理矢理キャストされることがある 理由は>>941 の通り だからキャストのオーバヘッドまで考慮するとintの方が速い場合が多い
989 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:23:42 ] >>988 「ことがある」じゃなくて、その動作が標準として規定されている。
990 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:27:02 ] ちなみに windows.hのBOOL型は実際はlongのtypedefで TRUE = 1, FALSE = 0 Cだと_Bool型で _Bool型は符号なし型として扱われる _Bool型には signed, unsigned はつけられない _Bool型は 0 と 1 を格納できれば十分なサイズ _Boolに変換するときその値が0なら0、それ以外は 1 _Bool型はどの標準整数型ランクよりも小さい ビットフィールドに無修飾版の _Bool をおける 引用(ttp://seclan.dll.jp/c99d/c99d05.htm)
991 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 00:29:54 ] >>989 そうか、すまん俺の勉強不足だった
992 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:19:35 ] sdk\include>grep typedef.*BOOL WinDef.h File WinDef.h: typedef int BOOL;
993 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:34:17 ] >>989 格上げされない場合もあるわけだが。
994 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 03:52:27 ] >>993 sizeof ぐらいじゃね?
995 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 04:18:22 ] 今更だけど、C/C++とC99は別物だと思う。
996 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 05:44:06 ] 「演算途中で」となるとまあ sizeof くらいなのかな? あ、いや、キャストもか。
997 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 07:02:02 ] 【初心者歓迎】C/C++室 Ver.39【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1182740506/ 念のためにもう一度貼っとくよ〜 二重に立てるような無駄を防ぐためだよ〜
998 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 12:26:27 ] >>992 MSのやつはバージョンによって違うらしいぞ
999 名前:デフォルトの名無しさん [2007/06/27(水) 14:45:41 ] 1000ゲトー
1000 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 14:46:23 ] 。 + 『1 0 0 0 G E T ぃ ゃ っ ほ ぉ ぉ ぉ ぅ ー !』 * 。 . . * . * + 。 。 + __ _ /ヾ_/ヽ 旦 f ミv'´{ごづヾ彡 , '´⌒'v'ヾ '´ ̄`ヽ * 。 ゙i´!(((从 从リ ! ifi」liリ゙l i!卯、 (((/从从 i !○(l ^ヮ゚ノ!| i * |i、゚ヮ^ |!)○゙ 。 从゚- ゚ ||○ * ノノ ヽ)本iO ヾ Oi本(~/ヽ OL介_(ノ . + ガタン||| ((´ く/_i_iヾ )) ||| /i_i_ヾ> ) )) ||| + /_|_|ヾ> |||ガタン +  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ロ リ 最 強 ! 華 麗 な 1 0 0 0 に 超 感 動 !
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。