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
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 じゃなくてオーバーフロー。
733 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 12:09:54 ] 0x81がunsigned charじゃないじゃん
734 名前:732 mailto:sage [2008/04/16(水) 12:20:21 ] > char c = 0x81 の時点で未定義動作。 ごめん。間違い。オーバーフローが問題なのは違いないけど、型変換での オーバーフローは未定義動作じゃなくて、値が処理系定義のものになるか、 処理系定義のシグナルが発生する、らしい。
735 名前:729 mailto:sage [2008/04/16(水) 20:42:23 ] >>732 >>734 了解いたしました。 char buffer[N]; ... while (fgets(buffer, N, fp) != NULL) { if (buffer[i] == ...) ... } などと安易に考えると、(たとえば漢字コードの判別など)わからなくなってしまった経験がありました。 unsigned char buffer[N]; とすれば、問題ないのではありますが。 ご指摘ありがとうございました。 またひとつ賢くなりました。
736 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 20:49:18 ] >>735 漢字コードをいろいろ扱うなら >>735 だと unicode の時に困るんじゃなかろうか? (文字列に \0 が含まれる可能性が高いから)
737 名前:デフォルトの名無しさん mailto:sage [2008/04/16(水) 21:04:51 ] C++では以下のように大丈夫そうですけど。 signed char と unsigned char は同表現と書いている 読み間違い? A char, a signed char, and an unsigned char occupy the same amount of storage and have the same alignment requirements (3.9); that is, they have the same object representation. For character types, all bits of the object representation participate in the value representation. For unsigned character types, all possible bit patterns of the value representation represent numbers.
738 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 01:47:49 ] >>737 読みには自信ないのですが、 単に、 1) char/unsigned char/signed char のいずれも同じ量のメモリを占有する。 2) char/unsigned char/signed char のアラインメント(配置位置、偶数バイトを先頭にする、アドレスが4 の倍数のバイトを先頭にする、など)が同一である。 という意味でのみ same としているだけではないでしょうか。 char / unsigned char / signed char の表現がまったく同一であるというのは不可能と思われますのですが。 後続の文では、 char のすべてのビットが数をあらわしているわけではない(単に関係するといっているだけ、符号の場合もありますよ、ということでしょうか。) unsigned char はすべてのビットが数を構成する要素となる。 と読めます。
739 名前:デフォルトの名無しさん [2008/04/17(木) 07:16:24 ] template <class T> template <typename T> この2つはちがいがありますか?
740 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 07:21:28 ] 違いは無い
741 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:20:34 ] class じゃないのも使うよなーとか思っていつも typename にする俺
742 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:26:55 ] 俺もある時期から、typenameが手癖になってしまった。 別にこだわるわけじゃないから、もし仮にclassと書いてくれと職場で言われたら 二つ返事でclassにするけど。
743 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 08:30:00 ] なんとなく表明の意味で使い分けるかも。 その後しっかり中でstatic_assertするけどね。
744 名前:デフォルトの名無しさん [2008/04/17(木) 10:03:28 ] クラス配列をnewで生成する時に呼ばれるコンストラクタを指定できますか?
745 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 10:06:12 ] 残念ながらできない。
746 名前:デフォルトの名無しさん [2008/04/17(木) 11:04:06 ] strcatを使わずに char src[ ] = "seikima" char dest[4] = "tsu" という文字列を結合し、表示させることが出来ますか?
747 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:10:49 ] >>746 char result[11]; sprintf(result, "%s%s", src, dest); printf("%s\n", result);
748 名前:746 [2008/04/17(木) 11:14:54 ] 746です。言葉足らずでした。 sprintfも使わずにforを使って何とか表示させたいのですが いかがでしょうか?
749 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:25:24 ] >>747 じゃないがやっつけ仕事なんで間違ってたらごめん char ret[11]; for(int i =0 ; i < strlen(src) ; i++) { ret[i]= src[i]; } for(int i=0 ; i <strlen(dest) ; i++) { ret[i+strlen(src)}=dest[i]; } printf("%s\n",ret);
750 名前:746 [2008/04/17(木) 11:27:20 ] >>749 >>746 に書いたんですが、今回string.hに関するものは使っちゃいけないので strlenも使用出来ない感じです。
751 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:34:17 ] >>746 にそんなこと書いてNEEEEEEEwwwww strlen()をsizeof()-1に変えれば同じ動作だ
752 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:37:17 ] >>746 条件後だししすぎ char result[20], *p, *q; for(p=result,q=src;*p++=*q++;); for(p--,q=dest;*p++=*q++;);
753 名前:746 [2008/04/17(木) 11:46:22 ] 重ね重ね、申し訳ないです。 ポインタも使ってはいけないようです。
754 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:50:24 ] 宿題かよ。消えろ。
755 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:51:00 ] ついでに、その出題者はぶん殴っていい。
756 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:55:25 ] 宿題なら学習内容に沿ってるはずだから テキストでも目を通した方が早いんじゃないの? 何の項目についての課題か分からないんじゃ答えようがないわ
757 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 11:57:30 ] 入念な釣りだなあ。 次は「 [] 演算子も使えません 」とか?
758 名前:746 [2008/04/17(木) 11:59:26 ] 一旦、整理してみます。 課題:配列について 内容:char src[ ] = "seikima"; char dest[4] = "tsu"; と配列を用意し、destの中身をsrcに結合させる。 ただし、for文を使うこと・ポインタ、string.hは使ってはならない。
759 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:03:12 ] >>758 宿題は宿題スレへ。 C/C++の宿題を片付けます 105代目 pc11.2ch.net/test/read.cgi/tech/1208268461/
760 名前:746 [2008/04/17(木) 12:03:56 ] >>759 誘導ありがとうございます。ご迷惑をおかけしました。
761 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:06:07 ] 連結するための容量は確保しなくていいのか、とか dest を書き換えずに src に書き込むのか、とか、 宿題にしてもクソすぎるだろ。学校名晒してくんない?
762 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:12:22 ] 746の時点で明らかに宿題じゃないか。なにを今更
763 名前:デフォルトの名無しさん [2008/04/17(木) 12:21:40 ] printfの様な、引数の数が一定しない関数を作るにはどう定義し 中でどう読めば良いのでしょか。
764 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:25:31 ] Cで標準ライブラリが用意されてない環境なら、自動的に>>758 の条件に 近くなると思うけど、ポインタも駄目てのは解らん。
765 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:14 ] >>763 関数のオーバーロードとかでできんじゃね
766 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:41 ] 可変長引数でぐぐる
767 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:30:53 ] >>763 ttp://wisdom.sakura.ne.jp/programming/c/c62.html
768 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:31:06 ] >>763 可変長引数とかva_argsなんかでググるといいと思うよ。
769 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:31:25 ] >>763 可変引数または可変個引数でぐぐる
770 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:34:09 ] 重婚もいいところだな
771 名前:763 mailto:sage [2008/04/17(木) 12:37:07 ] 有り難うございます。 stdarg.hなんてヘッダ、目にした事すらありませんでした。
772 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:40:07 ] ところで可変長引数って設計的にどうなのかな? 個人的には設計に失敗してやむなく・・・ってイメージがあるのだが
773 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:45:05 ] ハックやチートの部類に入りそうなやり方してるよね。
774 名前:763 mailto:sage [2008/04/17(木) 12:46:42 ] >>772 **でも事足りるんですが、その場でわざわざポインタの配列を用意しないと いけない場合が出てくるだろうし、その場で列挙出来たら楽かなぁとか。
775 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 12:50:54 ] >>772 型安全性に問題があるから、特に C++ ではやむなくって意識でいいと思う。 C++ 的には iostream や boost::format みたいに演算子で繋ぐのが正解かな。
776 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 22:15:48 ] CかC++の組み込みの勉強したいんですがお勧めの本ありませんか? 組み込みの本って探してもどこにも無いし、ネットで買おうにも中身がどんな感じかも分からないんでどれを買えばいいのか分からないです あとできれば必要で組み込み初めてに適した機材とかも教えて欲しいです
777 名前:デフォルトの名無しさん mailto:sage [2008/04/17(木) 23:24:03 ] ソフィアシステムズで評価ボードを買ってBSPをいじって動作確認すればいいお^^
778 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 00:41:53 ] 以下の2つは戻り値以外に何か違いがありますか? fwrite(buf, 1, 1024, fp); fwrite(buf, 1024, 1, fp);
779 名前:デフォルトの名無しさん [2008/04/18(金) 00:45:24 ] 沢山の実数(doubleとか)が生成されるときに、その分散を計算したいんですが、これってやはり一度生成される全部の実数を どこか配列とかに格納しないとだめでしょうか?
780 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:00:21 ] >>779 分散=(X^2 の平均) - (Xの平均)^2 を使用すれば、1pass で計算できますよ。
781 名前:デフォルトの名無しさん [2008/04/18(金) 01:04:09 ] 値が生成されるたびに、X^2とXの平均を計算しておくのですね。
782 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:07:17 ] 逐一平均を計算するんじゃなくて、合計値と要素数を記憶だな。 最後にまとめりゃOK
783 名前:デフォルトの名無しさん mailto:sage [2008/04/18(金) 01:23:46 ] >>778 もしかしたら処理速度が変わるかも・・・ね?
784 名前:デフォルトの名無しさん [2008/04/18(金) 02:02:27 ] 色々ありがとうございました。クラスをつくってみました。 class stat { public: stat() : sum(0), sum_square(0), num(0) {} void push(double a) { sum += a; sum_square += a*a; ++num; } double mean() { return sum / num; } double variance() { return sum_square/num - (sum/num)*(sum/num); } private: double sum; double sum_square; int num; };