- 1 名前:デフォルトの名無しさん [2008/03/30(日) 01:50:26 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.50【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1204124447/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 632 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:54:26 ]
- 無理やり
template<typename T, template<class> class Comp> class eval_lapper { public: eval_lapper( std::pair<T, T> rhs ) : obj_(rhs.first), target_(rhs.second) {} operator bool() const { return Comp<T>()(obj_, target_); } T& obj() { return obj_; } const T& obj() const { return obj_; } private: T obj_; T target_; }; int main() { std::set<int> s; //s.insert(123); if( eval_lapper<std::set<int>::const_iterator, std::not_equal_to > it = std::make_pair( s.find(123), s.end() ) ) std::cout << *(it.obj()) << std::endl; return 0; }
- 633 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:57:33 ]
- ifの評価部分ってboolのオーバーロードがあったらちゃんとboolとして評価してくれるの?
- 634 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 15:58:44 ]
- してくれるが、if 文以外の所でも本当に bool 値として解釈されて欲しい場合でなければ bool のオーバーロードはすべきじゃない。
- 635 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:00:12 ]
- if 文だけでそう解釈されて欲しい場合は、
普通には使われないようなポインタへのキャスト演算子を オーバーロードするのが一般的。 メンバポインタとか。
- 636 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:41:51 ]
- >>632
面白いなやり方だな でも、lapper => wrapper じゃね
- 637 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 16:53:02 ]
- //test.h
struct test{ int a; test(int a_) : a(a_){} }; //instance.cpp #include "test.h" test obj(1024); //program.cpp #include <iostream> #include "test.h" extern test obj; int main(){ std::cout << obj.a << std::endl; return 0; } 別々の翻訳単位に型testが定義されてるけど、同一の型として認識されるの? VC8ではコンパイル通った。
- 638 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:01:05 ]
- そりゃ通るだろ
同じヘッダインクルードしてるんだし
- 639 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:01:59 ]
- メンバ変数が一部が#ifdefあたりで囲んであると
場合によっては非常に愉快な話になるけどね
- 640 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 17:09:35 ]
- 愉快なというかバグな話だろ
- 641 名前:デフォルトの名無しさん mailto:sage [2008/04/12(土) 22:59:36 ]
- 中々原因が掴めず笑うしかないとかそういうアレだろう
鼻から悪魔が出たらもっと愉快だな
- 642 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:40:49 ]
- String name;
と String^ name; の違いはなんですか?ハンドルの意味がわかりません
- 643 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:48:53 ]
- >>642
C++/CLI はスレ違いなのです。 C++/CLI part3 pc11.2ch.net/test/read.cgi/tech/1206447234/
- 644 名前:デフォルトの名無しさん mailto:sage [2008/04/13(日) 22:50:41 ]
- >>642
とりあえず「C++/CLI ハンドル 自動変数」でググったら説明が見つかると思う。 それで分からなかったら、もう一度おいで。 # CLIってちょい過疎気味の本スレしか無いのな
- 645 名前:デフォルトの名無しさん [2008/04/14(月) 01:32:44 ]
- コピーコンスタクタ辺りで質問です。
template <bool M> struct P { int* _p; P(int* v=NULL) : _p(v) {} P(P& v) : _p(v.release()) {} // (1) ~P() { if(M && _p) delete _p; } void reset(int* v=NULL) { if(M && _p && _p != v) delete _p; _p = v; } int* release() { int* temp = _p; _p = NULL; return temp; } }; P<true> pf(int n) { return P<true>(new int(n)); } int main() { P<true> a = pf(3); } 上記だと error: no matching function for call to ‘P<true>::P(P<true>)’ とコンパイルエラーがでます。 しかし (1) を template <bool _M> P(P<_M>& v) : _p(v.release()) {} にするとエラーにならずにコンパイルできるようになります。なぜコンパイルエラーがでなくなるのでしょうか? コンパイラは gcc version 4.0.1 (Apple Inc. build 5465) です。
- 646 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:43:50 ]
- >>645
コピーコンストラクタをテンプレート関数にして異なるテンプレート引数の型でも受け取れられるれりれるようにしたから。
- 647 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:46:07 ]
- >>645
よく分からんけど、VC8だとどちらもコンパイル通ったぞ
- 648 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 01:49:12 ]
- >>647
エスパーすると645は(1)をP(P& v) : _p(v.release()) {}とした上でソースコードのどこかで P<false> oldObj; P<true> newObj(oldObj); とでもしているんだろう。
- 649 名前:645 [2008/04/14(月) 01:52:20 ]
- >>646
テンプレート引数の型は書き変える前も後も true しか扱わないのに異なる型を受け取れるようにしないと いけない理由が分かりません。 途中で P<false> に変換されているのも確認できませんでした。 >>647 gcc だけで起きる問題なんでしょうか… >>647 いやしてないのです。上記のソースのみです。
- 650 名前:デフォルトの名無しさん [2008/04/14(月) 02:17:53 ]
- 質問です。4桁の乱数を取得する関数なのですが
if(num[i] == num[j])以降のdowhileで必ずループに入ってしまうのですが 原因を教えていただけませんか? void random::gt(){ srand((unsigned) time(NULL)); num[0] = rand() % 10; if(num[0] <= 0){ do{ num[0] = rand() % 10; }while(num[0] <= 1); } //その他乱数取得 for(i=0;i<4;i++){ if(i <= 4){ for(j=1;j<4;j++){ num[j] = rand() % 10; if(num[i] == num[j]){ do{ num[j] = rand() % 10; system("PAUSE"); }while(num[i] != num[j]); } }; } }; }
- 651 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 02:47:43 ]
- >>649
Pは接頭語みたいなもので一部の例外を除いて単独では使えない この場合だとP<true>とP<false>が型 たとえばP<true>を定義したとき、もしP(P&)の記述が許されると コピーコンストラクタP(P<true>)か 引数付きのコピーじゃないコンストラクタP(P<false>)か曖昧になる
- 652 名前:>650 mailto:sage [2008/04/14(月) 03:22:48 ]
- 日本語でおk
dowhileは必ず1回はループ内の処理を実行するが? あと、その貼ったソースはそのままか?変更して貼ってない?
- 653 名前:645 [2008/04/14(月) 03:33:40 ]
- >>651
あーなるほど。コピーコンストラクタかコンストラクタが曖昧になるんですね。 P<true> -> P<false> の変換がされると嫌で書き方に困っていたのですが P<true> -> P<true> OK P<true> -> P<false> OK P<false> -> P<false> OK P<false> -> P<true> NG の時に template <bool M> struct P { template <bool _M> P(P<_M>& v); ... }; template <> template <> P<true>::P(P<true>& v) : _p(v.release()) {} //template <> template <> P<true>::P(P<false>& v); // NG template <> template <> P<false>::P(P<false>& v) : _p(v._p) {} template <> template <> P<false>::P(P<true>& v) : _p(v._p) {} みたいにもできるってことですね!ありがとうございました。
- 654 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 03:33:47 ]
- あああ、すいません
if(num[i] == num[j]){のところで 変数num[i]とnum[j]が違っていても処理をしてしまう原因 を知りたかったのです ソースは特に変えてないと思うのですが どこかおかしいでしょうか
- 655 名前:645 [2008/04/14(月) 03:36:18 ]
- 違った。P<false> -> P<true> が嫌だった。です。
- 656 名前:650 mailto:sage [2008/04/14(月) 03:39:19 ]
- またもすいません
>>654は>.650です・・・
- 657 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 09:29:44 ]
- >>650
i が 0 から 3 をとりながら動き、 そのループのなかで j が 0 から 3 をとりながら動くんですよね。 すると, i = j ならば, num[i] == num[j] となって、system("pause") がかならず 実行されることになります。 なさりたいことは、こんなのでしょうか? (確認環境 WindowsXP, 処理系 cygwin(gcc 3.4.4) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6239.txt
- 658 名前:650 mailto:sage [2008/04/14(月) 11:06:42 ]
- >>657
まさにそんな感じです ありがとうございます
- 659 名前:657 mailto:sage [2008/04/14(月) 11:24:42 ]
- >>658
バグってました。 kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/6240.txt
- 660 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 14:51:59 ]
- set<Class> a, b;とあってaからbに含まれていない要素を取り除きたいときに
remove_ifなんかのアルゴリズムでスマートに書けますか?
- 661 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 15:06:05 ]
- operator^
- 662 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 16:59:15 ]
- >>660
#include <iostream> #include <algorithm> #include <set> #include <boost/lambda/lambda.hpp> #include <boost/lambda/bind.hpp> int main() { namespace bll=boost::lambda; std::set<int> a,b; a.insert(1); a.insert(2); a.insert(3); b.insert(2); b.insert(3); std::remove_copy_if(a.begin(), a.end(), std::ostream_iterator<int>(std::cout), bll::bind(std::find<std::set<int>::iterator, int>, b.begin(), b.end(), bll::_1 ) == b.end()); return EXIT_SUCCESS; } uu-n...
- 663 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 17:49:02 ]
- huninnkidearuboost::egg::lazywotukattemitayo
#include <iostream> #include <algorithm> #include <set> #include <boost/lambda/lambda.hpp> #include <boost/egg/lazy.hpp> #include <boost/lambda/bind.hpp> #include <boost/assign/std/set.hpp> struct base { template< class Myself, class Arg0, class Arg1, class Arg2 > struct apply { typedef Arg0 type; }; template< class Result, class Arg0, class Arg1, class Arg2 > Result call(Arg0 begin, Arg1 end, Arg2 value) const { return std::find(begin, end, value); } }; typedef boost::egg::function<base> op; boost::egg::result_of_lazy<op>::type const find_lazy = BOOST_EGG_LAZY({}); int main() { namespace bll=boost::lambda; using boost::assign::operator+=; std::set<int> a,b; a+=1,2,3; b+=2,3; std::remove_copy_if(a.begin(), a.end(), std::ostream_iterator<int>(std::cout), find_lazy(b.begin(), b.end(), bll::_1) == b.end()); } uuu-nnn...
- 664 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 17:52:02 ]
- p_stade乙
- 665 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:01:20 ]
- >>660
a = bはだめなの? だめだから聞いているんだろうけど。
- 666 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:06:40 ]
- >>665
横からだけど a : 10,20,30,40 b : 20,50 この場合多分望む結果は a : 20 だろうけど、>>665だと間違った結果を返す。
- 667 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 18:37:09 ]
- vectorやらlistで
vector<int>の要素が 1 2 (空白) 3 4 (空白) の様に途中に空白をいれることはできるのでしょうか?
- 668 名前:デフォルトの名無しさん [2008/04/14(月) 18:46:45 ]
- VC++でPC情報を取得するPGを作成します。
プロジェクト作成は(Win32とか)どれを選ぶのが 適当でしょうか?
- 669 名前:デフォルトの名無しさん [2008/04/14(月) 19:40:07 ]
- >>668
Linux+GCCがお勧め
- 670 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 19:42:55 ]
- .exe が出来るならどれでもいいと思う。
- 671 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:02:18 ]
- とあるクラスに関数を一個追加しようとしたところ
.hファイルに関数の本体を書き出すと正常にコンパイルが通るのに .cppファイルに書き出すと C2039 'foo' : 'hoge' のメンバではありません。 となってしまいます これはどういう事でしょうか・・・
- 672 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:05:04 ]
- ソースを見せれ
- 673 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:10:42 ]
- f´'´ ノ ヽ l 、 \!
l / / // ,.ィ´ !', ト、 ヽ. ヽ . レ′, / //_,..イ// ,| l |lλぃ い. ', } / { ‐7Ζ_∠!イ 〃 /リ,}/┤!」l 小 ! ノ i| 八//'゛ -`l 〃 /ノ'´ j ! |l/| iイ/ ヽ|l//イ ャ''Tェ歹''`y゙/ 'ヾ歹¨リ`イ!ノ// まさか、ロリコンじゃないわね・・・ ) 〃A ``''''"´ '^ r; `'''"´/クK/ Y/ !トヘ. //// //// /.ィi| ;| |i( l|`Ti\,___ '⌒) ,∠lj_|iリ {い ヾLr┤:.:.:.:.`:、__,,..イ;:.::.:./勹_」! ``ァ;=<´ ̄``ヽ:ヽ;‐-/;/``Tr-.、
- 674 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:13:11 ]
- >>671
>.cppファイルに しか書いてなかったとかいうオチだったら、君が泣くまで殴るのをやめない。
- 675 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:14:56 ]
- >>672
仕事でのデータが含まれてるのでちょっとソースは公開できないですorz >>674 インテリセンスで関数宣言を確認してから中身を書いてるのでそれはないと思います
- 676 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:25:23 ]
- 問題が再現するコードを作ってそれを貼ればいいじゃん。
- 677 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:27:54 ]
- テンプレート関数だったらお前の殴る
- 678 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:39:03 ]
- hppで解決♪
- 679 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 20:58:05 ]
- リビルドし直したら通った・・・
これはどういう事??
- 680 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:22:35 ]
- VCではよくあること
- 681 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:53:28 ]
- そしてインテリセンスが延々と更新されないことも
- 682 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:58:23 ]
- インテリセンスが嘘つくのも。
- 683 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 21:58:43 ]
- >>667
vector<int>に整数以外のものは入れられません。 仮に、負値を例外として扱ってよいなら空白の代わりに-1を入れておくと言う手もなくはありませんが、 boost::optionalを使ってみてはどうでしょう。
- 684 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:18:55 ]
- メモリが断片化している場合、ポインタに+1した場合はきちんと断片先に飛んでくれるんですか?
それとも型サイズ分だけ強引にアドレスが+1されるんですか?
- 685 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:21:43 ]
- 断片化?
どういう状況を言ってるんだ?
- 686 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:22:45 ]
- vectorではなくdequeの実装を言っているのかもw
- 687 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:25:23 ]
- deque のことなら、イテレータに +1 したら断片化先に飛ぶけどポインタは当然無理だな。
- 688 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:26:51 ]
- >>685
1つのデータがメモリに書き込まれる時は必ず連番のアドレスに配置されるんですか?
- 689 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:27:37 ]
- >>688
少なくとも仮想アドレスは連番だが。 物理アドレスは知らんがな。
- 690 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:28:51 ]
- STLとかboostみたいので
RECTとかSIZEを包んだクラスはありますか?
- 691 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:31:41 ]
- CRectならMFCにあるけどな…
- 692 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:31:51 ]
- WTLにも
- 693 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:32:58 ]
- >>689
つまり&で表示されるアドレスは仮想でWindowsが物理メモリの番地とリンクを取って隙間に埋め込んでるから考えなくていいってことですね ありがとうございました。
- 694 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:38:39 ]
- >>693
それでいいのか? 本当にそれでいいのか?w
- 695 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 22:43:16 ]
- C++でプロパティー的なものを表現する場合
getとsetはつけたほうがいいの?それともOR?
- 696 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:04:14 ]
- 漢は黙ってpublic:
- 697 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:06:53 ]
- それだとブレークポイントはれないじゃん・・・。
- 698 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:15:52 ]
- __declspec(property(get=getHoge, put=setHoge))
int Hoge;
- 699 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:43:26 ]
- winsockのsock関数の第一引数にAF_BTHを指定すると、AF_BTHが定義されていないとエラーがでます。
winsock2.hはインクルードしてるんですが、ほかになにかインクルードしなければいけないんでしょうか?
- 700 名前:デフォルトの名無しさん mailto:sage [2008/04/14(月) 23:55:47 ]
- grepかけたらws2bth.hででてきたけど。
- 701 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:24:06 ]
- std::list<int> iListの参照を作りたいのですがこの場合
std::list<int>& refList = iList; で良いのでしょうか?
- 702 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:31:23 ]
- アドレスを比べてみたらいいと思うよ
- 703 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:39:51 ]
- >>702
簡単に試してみたけど 大丈夫そうな気がしました
- 704 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 00:54:33 ]
- C言語での構造体の初期化について質問です。
typedef struct Foo_tag{ int a; int b; int c; } Foo; というような構造体があったときに、 Foo foo = {0}; という初期化を行っているコードをたまに見かけますが、これは何を行っているのでしょうか? 一応MinGW環境で同様のコードを書いてテストしてみましたが、{0} で初期化した構造体はゼロクリアされており、 初期化しなかった構造体にはゴミが入っていました。 ということは、上記のコードは構造体をゼロクリアするという認識でいいのでしょうか? それと、標準Cの規格でこういう初期化は許されていますか? 構造体のゼロクリア処理は memset() などを利用して行っているコードが多いことを考えると、標準規格ではなさそうな 気がするんですが…。
- 705 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:00:36 ]
- メンバを途中まで初期化すると
残りは0で初期化されるってヤツだったと思う。 標準Cでどうなのかは知らん。
- 706 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:04:31 ]
- Foo foo = {1};でa=1,b=0,c=0になるのが保証されてる
- 707 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:12:58 ]
- >>705-706
ありがとうございます。途中まで初期化ということができるんですね。 それなら構造体をゼロクリアするときはこれを使うと楽かもしれないですね。 (先頭にネストした構造体があったりするとどうなるのかよくわからないので、汎用ではないのかもしれないですが)
- 708 名前:デフォルトの名無しさん [2008/04/15(火) 01:13:32 ]
- >>704
初期化時のみOK
- 709 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:18:46 ]
- memsetだとパディングも初期化できるのが利点だったかな
普通の使い方で初期化する必要があるのかどうかは知らないが
- 710 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:36:11 ]
- >>709
ものすごく行儀の悪いコーディングだけど構造体同士を memcmp で比較できる
- 711 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:58:11 ]
- >>710
あくまで「普通の使い方」の話な キャストしたりすればいろいろ問題も出てくるだろうよ
- 712 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 01:59:59 ]
- >>704
標準規格です。
- 713 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 02:01:05 ]
- >>704
昔のコンパイラだと 0 で初期化されません
- 714 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 03:28:46 ]
- >>660
template<typename Class> void assign_intersection(std::set<Class>& a, std::set<Class> const& b) { std::set<Class> result; std::set_intersection(a.begin(), a.end(), b.begin(), b.end() , std::inserter(result, result.end())); a.swap(result); }
- 715 名前:デフォルトの名無しさん [2008/04/15(火) 08:00:05 ]
- *
** *** **** ... みたいな感じの出力を得たいのですが、***を出力する部分は、なにか特別な書き方とかないですか? 関数を作るしかないですか?
- 716 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 08:06:55 ]
- >>715
MFCならスタティックテキストの表示を*に変えるという機能(設定)があったり。 自前でもキー入力(KeyDownとか)→別の変数に格納→その文字数だけ*を表示で簡単に出来る。
- 717 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 10:30:07 ]
- // * を n 個出力する関数
void f(int n){ for(int i = 0; i < n; i++) std::cout << '*'; std::cout << std::endl; } void g(int n){ for(int i = 0; i < n; i++) f(i); }
- 718 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 14:19:49 ]
- std::string s(length, '*');
std::cout << s << '\n';
- 719 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 20:41:31 ]
- #include <iostream>
#include <iomanip> int main() { for (int i = 0; i < 10; ++i) std::cout << std::setw(i) << std::setfill('*') << "" << std::endl; } ところでC++でいいんだよね?
- 720 名前:デフォルトの名無しさん mailto:sage [2008/04/15(火) 22:13:39 ]
- C言語ならこんなもんか
void f1() { int n, i; for(n = 1; n <= 10; n ++) { for(i = 0; i < n; i ++) putchar('*'); putchar('\n'); } } void f2() { int n; for(n = 1; n <= 10; n ++) puts("**********" + 10 - n); } void f3() { int n; for(n = 1; n <= 10; n ++) printf("%.*s\n", n, "**********"); }
- 721 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:27:56 ]
- printfの書式でもっと簡単にできなかったっけ?
イメージ>>720のf3()が近いんだけど・・・使う機会が少ないとすぐにわすれちゃうな・・・
- 722 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:38:10 ]
- >puts("**********" + 10 - n);
このやり方はじめて見た。目から鱗やわ
- 723 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 00:42:59 ]
- >>722
その鱗はつけておいた方がいいw
- 724 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:36:32 ]
- 課題でc++のbasic_stringの様なstringクラスを作っています。
その中でstr >> coutはクラス内でoperator>>を用意することで 動くようになったのですが、cout << strは「二項演算子<<はクラス strをサポートしていません」と言われてしまいます。 これはどのようにしたらcout << strが出来るようになるのでしょうか? またお恥ずかしながら、str = "aaa"は作れたのですが、str ="aaa"+"bbb"は 作ることが出来ませんでした。これはどの様に作ったらいいのでしょうか? どうかよろしくお願いします。
- 725 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:46:22 ]
- なんか物凄く基本的なことのような気がしますが
C言語で、unsigned char から signed char に代入、もしくはその逆を行った場合、ビットバターンは常に保存されますか?
- 726 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 02:55:53 ]
- >>725
いいえ。
- 727 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:01:40 ]
- >>724
上:strをサポートする二項演算子を書く。 basic_ostream<foobar> & operator <<(basic_ostream<foobar> & os, str & st); 下:無理。
- 728 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:02:50 ]
- >>726
ありがとうございます。そうなると char* を適宜 unsigned char* にキャストしたりしないとダメですね。 一部バイナリが混ざってるファイルを読む必要があったので助かりました。
- 729 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 03:58:13 ]
- >>728
K&R2 A6.1 (promotion) を参照してください。 char/unsigned char は先に int に変換される点、特に要注意です。
- 730 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 04:09:29 ]
- >>729 promotion は関係ないだろ。
- 731 名前:729 mailto:sage [2008/04/16(水) 04:57:02 ]
- >>730
char c = 0x81; if (c == 0x81) printf("=\n"); else printf("!=\n"); の結果って、あれ〜?!ってなりませんか?
- 732 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 11:52:33 ]
- >>731
char が符号付きで最大値が 127 の場合の話なら、 char c = 0x81 の時点で未定義動作。 問題は promotion じゃなくてオーバーフロー。
|

|