1 名前:デフォルトの名無しさん mailto:sage [2011/12/12(月) 21:21:26.11 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.76【環境依存OK hibari.2ch.net/test/read.cgi/tech/1312621728/ ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。 【アップローダー】(質問が長い時はココ使うと便利) codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック) ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
511 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 10:12:30.97 ] template <unsigned int N> void init(char (&)[N]) { for(unsigned int i = 0 ; i < N - 1 ; ++i) a[i] = 1; a[N - 1] = 0 ; } char a[10] ; init(a) ; cout << strlen(a) << endl ;
512 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 10:24:30.57 ] >>510 ??? hogeに何が入っているかに因るから strlen(hoge)が保証される分けない。 strcpy(hoge, "a"); ってやった後に strlen(hoge); ってすればstrlen(hoge);は1であることが保証されるけど、 strcpy(hoge, "abcdefghi"); の後に strlen(hoge);ならstrlen(hoge);が9であることが保証される。 hogeの定義により確保したmemoryの大きさを保証したいのなら >>506 の言うとおりsizeof(hoge)とする以外にないよ。
513 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 10:53:05.54 ] やはりそういういうことですよね >>511 参考にさせて頂きます
514 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 12:07:59.47 ] 配列の長さと文字列の長さを混同しないようにな。 strlenはたんに'\0'の前までの数を数えているだけなのだから。
515 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 12:09:49.37 ] 配列に格納できる最大長が欲しいのか。 それならそうと最初からそう言えと。
516 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 12:10:16.96 ] char hoge[] = "123456789";
517 名前:デフォルトの名無しさん mailto:sage [2012/01/20(金) 13:00:26.21 ] コンパイル時に決定される配列の大きさを実行時に求めたいという要求が理解出来ない
518 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 10:41:15.47 ] コンパイル時に決定されるかどうかは関係なく、 ポインタから配列の大きさを求めることは出来るのか?という疑問です もっと言えば、関数にポインタだけ渡しておけば、あとは勝手にサイズも見てもらって処理するような処理は可能か?ということです 上では一応sizeof使えとのことでしたが、ポインタの渡し方によっては ポインタそのもののサイズを返したりするので、結局素直に初期化する関数を作るべきかなあ
519 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 11:05:15.29 ] >>518 vector使えでFA
520 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 11:05:33.02 ] vector渡せばいい
521 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 11:10:22.47 ] サイズ付きの構造体、クラスでPK
522 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 11:42:01.82 ] > ポインタから配列の大きさを求めることは出来るのか?という疑問です これを書こうよ。。。 答え:できない
523 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 11:45:38.89 ] すいません、疑問がうまく文章になるまで時間がかかりまして。 vector考えてみます
524 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 12:59:38.80 ] // func.cpp namespace { template <unsigned int R> inline BigInt Factor(BigInt const & n) { return n == 0 ? 1 : n * Factor<R - 1>(n - 1); } template <> inline BigInt Factor<0>(BigInt const & n) { return n == 0 ? 1 : n * Factor<256>(n - 1); } } BigInt factor(BigInt const & n) { return Factor<256>(n) ; } // func.hpp BigInt factor(BigInt const & n); こんな感じのコードを見かけたんですけどこのテンプレートになにか意味あるんですか?
525 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 13:14:48.03 ] >>524 どこら辺を意味がないと思ったの。
526 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 13:49:19.71 ] >>525 なんで普通に再帰しないのかなーって
527 名前:デフォルトの名無しさん mailto:sage [2012/01/21(土) 13:51:40.62 ] >>526 再帰の限界の数の回避とかなのかね。
528 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 12:18:57.37 ] こんなならループのほうがよさそうに思えるが
529 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 12:49:56.34 ] test
530 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 16:48:29.11 ] >>528 テンプレートでコンパイル時に計算させようとすると再起しかないんじゃないの。
531 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 17:21:33.84 ] >>530 そういう意味じゃないとおもう
532 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 17:53:13.43 ] テンプレート関数を特殊化したり、 テンプレート引数の代わりに関数引数で再帰している よくわからないコード
533 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 17:53:29.35 ] >>528 コンパイル時定数として階乗の結果が欲しいのをループじゃ対応できないのでは?
534 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 18:03:02.90 ] 問題は、100やそこらの再帰じゃ済まない階乗の値をBigIntで持つ必要が本当にあるのかどうか。
535 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 18:26:06.14 ] inline展開されてオーバーヘッドが無くなるというメリットはありそうだがこのサンプルでは無意味だろうな
536 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 20:12:08.33 ] >>535 コンパイル時に計算されるからインラインに展開してオーバーヘッドがなくなるとか関係ないのでは?
537 名前:デフォルトの名無しさん mailto:sage [2012/01/23(月) 21:30:45.28 ] >>530 ,533,536 それはもしかしてこんなコードじゃないのかい ttp://codepad.org/t8ejWQ2g
538 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 10:01:51.79 ] 質問です。 template <typename T = char> class Hoge { }; void test(void) { Hoge h; } テンプレート引数 T に対して char を与えてやってるので、 Hoge を使用する際、テンプレート引数を与えなくてもよさそうなのに、 error C2955: 'Hoge' : クラス テンプレート を使用するには テンプレート 引数リストが必要です となります。どうしてですか? どうぞよろしくお願いします。 VS2008 pro Win7 pro x64
539 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 10:03:11.96 ] Hoge<> hoge;
540 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 11:31:02.17 ] つまり、class Hogeとtemplate<>class Hogeの区別がつかないんだな。
541 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 11:49:44.40 ] GPU計算に興味が有るんだけど、C++だとOpenCLってやつが一般的? C++で使えて入門に向いてるのって何があるかな?
542 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 11:53:37.64 ] 下記関数は5ms周期で実行されています。 CTMAXが200を超えたとき、例えば201に なったとき、10ms周期の処理が5ms後に実行 されるという現象がおきます。 下記のように毎回実行される5msの処理は仕方 ありませんが、10ms以降の処理は実行タイミング がかぶらないようになっています。この状態でさ らに実行タイミングがずれないような処理を作りた いのですが、思いつきません。できるものでしょうか? void time(void){ #define CTMAX 200 static int ct; if(++ct > CTMAX) ct = 0; func5ms();/* 5ms処理 */ if(ct & 0x01) == 0) func10ms(); else{ if(ct & 0x02) != 0) func20ms(); else{ switch (ct){ case 1: case 21: case 41: case 61: case 81: case 101: case 121: case 141: case 161: case 181: func100ms(); break; case 13: case 53: case 93: case 133: case 173: func200ms(); break; case 5: case 105: func500ms(); break; case 9: func1s(); break; }}}}
543 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 12:12:36.72 ] よく分からんけど、 s = milisecond(); do_something(); e = milisecond(); if(e-s<200)) sleep_milisecond(200-(e-s)); ぐらい?
544 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 12:24:07.29 ] とりあえずこういうこと? ctって0〜200までの値、つまり 201個の値を取ることになっていたんだけど、 そこがまず問題だよね。 1005ms が 1000ms と等しいよ。 本当ならば、>= としなければならないよね? // if(++ct >= CTMAX) ct = 0; or ct++; ct %= CTMAX;
545 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 12:34:49.47 ] void time(void) { #define CTMAX 200 static int ct = 0; // 0 <= ct <= 199 ct %= CTMAX; mod_10 = ct % 10; mod_100 = ct % 100; mod_200 = ct % 200; mod_500 = ct % 500; if(!mod_500) func500ms(); if(!mod_200) func200ms(); if(!mod_100) func100ms(); if(!mod_10) func10ms(); ct++; }
546 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 13:52:36.91 ] 素直に書いた方がoptimize有利なんだから ct = (ct + 1) % CT_MAX;
547 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 14:01:39.16 ] time()を初めて実行した時に困るでしょ。 ct = 1;で実行することになって起動後9ms, 19ms, 29ms, ... で実行することになるよ。 人が書いたコードにbug入れる奴っているんだよな 迷惑なんだよな
548 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 14:06:09.81 ] そもそも標準関数と同じ名前の関数を作るな間抜け。
549 名前:デフォルトの名無しさん mailto:sage [2012/01/24(火) 14:10:55.35 ] これって組み込みだから問題ないと思って特に指摘しなかったよ。 time.hなんて高尚なヘッダは存在しないんじゃないの?
550 名前:538 mailto:sage [2012/01/24(火) 16:33:33.09 ] >>539 ありがとうございます。助かりました。
551 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 07:51:50.37 ] 結局>>542 はどうなった? 自分は解決したから後はシーラないってか?
552 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 09:36:12.44 ] >>544 さんのいうとおり++ct >= CTMAXとしただけでとりあえず 自分の作ったやつでも正常に動くっぽいですね。 ちなみに関数名にtimeなんて使ってません。書き込むとき 面倒なんで簡単な名前に変更しただけです。 >>545 のプログラムはわかりやすいですが、0のとき全部実行され てしまうのが難ですね。 それからmod_10で考えると10回に1回しか起動しないので、 それだと10msじゃなくて50ms周期になってしまいます。
553 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 09:43:21.64 ] >>552 > ちなみに関数名にtimeなんて使ってません。書き込むとき > 面倒なんで簡単な名前に変更しただけです。 それにしても標準関数と名前がかぶるってねーだろ
554 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 09:51:57.71 ] まぁ549さんの言うとおり、組み込みなんでtime.hなんて 使いませんし。
555 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 10:14:03.52 ] >>552 bug指摘されちゃった。 static int ct = 0; if(ct == 0){ ct = 1; return; } 投稿した後に、これでうまくいくって気づいてはいたんだけどね。。。 この後はctが0になることはなくて、 0と等価な200がctの値としてくるから問題ないよね。 これくらい思いついてよ。。。 > それからmod_10で考えると10回に1回しか起動しないので、 > それだと10msじゃなくて50ms周期になってしまいます。 こっちは気づかなかった。きちんとdebugしてうまい具合にしてよ。
556 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 10:19:00.51 ] 実際に問題になるかどうかじゃなくて、そういう紛らわしいことはするなってこった。
557 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 10:24:21.70 ] ct += 5とするか、 time()を1ms毎に実行するようにするかして修正すれば良さそうだね。 後は任せた。 void time(void) { #define CTMAX 200 #define POLLING 5 static int ct = 0; if(ct == 0){ ct = POLLING; return; } // 0 <= ct <= 199 ct %= CTMAX; mod_10 = ct % 10; mod_100 = ct % 100; mod_200 = ct % 200; mod_500 = ct % 500; if(!mod_500) func500ms(); if(!mod_200) func200ms(); if(!mod_100) func100ms(); if(!mod_10) func10ms(); ct += POLLING; }
558 名前:549 mailto:sage [2012/01/25(水) 10:29:57.73 ] 自分で実装する時はtime.hがないからっていって、 time()やらtime.hに含む関数名を使ったりしないよ。 本当は、time()なんて関数を自作するのはまずいし、 他人に披露する時に借りの名前とするのも、 あらぬ誤解を招きかねないのでまずいんだけど、 でも、2chに書き込まれるような関数名に意見するのも面倒だし、 組み込みで使っている関数だって事は一見して明らかだったので、 time.hを使うことはまずないだろうって事であえて指摘しなかったんです。 まあ、本当は>>549 がおかしいんだよ。 一々指摘するのも嫌だから指摘しなかっただけでさ。 私が名付けるとすれば、polling()かなぁ
559 名前:549 mailto:sage [2012/01/25(水) 10:31:25.79 ] >>558 の まあ、本当は>>549 がおかしいんだよ。 は間違いで、 まあ、本当は>>542 がおかしいんだよ。 が正しい。
560 名前:デフォルトの名無しさん mailto:sage [2012/01/25(水) 10:47:03.80 ] >>542 コードを書く前にまずは何をしたいのかを正しい日本語で人に説明する訓練をしなさい
561 名前:デフォルトの名無しさん mailto:sage [2012/01/26(木) 21:39:52.68 ] てすと
562 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:12:52.00 ] class Hogeを事前に宣言しておいて、 あとから定義したいと思うのですが、うまくできません。 何か解決方法はありますか? // 宣言 class Hoge; Hoge func( ); int main( ) { Hoge h = func( ); return 0; } // 定義 class Hoge { public: }; Hoge func( ){ return Hoge(); }
563 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:19:17.13 ] //hoge.h/////////////// // 宣言 class Hoge; Hoge func( ); /////////////////////// //hoge.cpp///////////// #include "hoge.h" int main( ) { Hoge h = func( ); return 0; } // hoge定義 class Hoge { public: }; Hoge func( ){ return Hoge(); } ///////////////////////////// ってことなら無理 Hoge h = func( );この時点でHogeの定義が見えてないとダメ int main()の前に hoge定義を持ってこないと
564 名前:デフォルトの名無しさん mailto:sage [2012/01/27(金) 13:21:27.99 ] func()がHogeではなくHoge*(またはスマートポインタ)を返すようにすれば大丈夫なはずだが、 設計を見直したほうがいいような気がする。
565 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:37:44.02 ] std::map<boost::shared_ptr<Hoge>, value_t>から要素を生ポインタで検索したいという状況に陥ったのだけど、何かいい手はないですか? とりあえず動くコードとして、 mapの要素を巡回してshared_ptr<Hoge>::getの返り値と検索キーを比較 一致していたらそのイテレーターの指す要素をmから削除 としているのですが、これではO(N)になってしまいmapの利点を生かせません
566 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 00:44:01.91 ] 生ポインタをキーにする。
567 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 01:03:22.81 ] スマポをキーにしようという発想が理解できない
568 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 01:44:20.83 ] 検索キーになるポインタをshared_ptrに放り込む。 カスタムデリータに何もしない関数を指定してdeleteを防ぐ。 でも危険度は生ポインタをキーにするのとかわらないな。
569 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 09:47:26.46 ] >>568 それって別ポインタとみなされて比較うまくいかないと思うけど
570 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 14:08:13.74 ] コードが長くなってきたので、クラスの宣言と定義を、hとcppに分けたいのですが 下記のような場合、どう分ければいいでしょうか? class Hoge { private: const int m_x; public: Hoge(int x = 3) throw() : m_x(x) { //do something 1 } void func(int a = 5) { //do something 2 } };
571 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 14:31:36.35 ] // Hoge.h struct Hoge { Hoge(int x = 3); void func(int a = 5); private: const int m_x ; }; //Hoge.cpp #include "Hoge.h" Hoge(int x) : m_x(x) { do_something_1(); } void Hoge::func(int a) { do_something_2(); }
572 名前:デフォルトの名無しさん mailto:sage [2012/01/28(土) 14:46:52.59 ] >>571 ありがとうございます 理解できました
573 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 16:27:31.12 ] Cを独学で学んでいる入門者です コンパイル→実行について教えてください PCは富士通のノートパソコンで OSはvista home premium エディタはemacs コンパイラはMinGW です ソースファイルをコンパイルして実行する際、 M-x compile だと上手くいかないので、 M-x shell から >gcc -std=c99 ファイル.c でコンパイルしています ただ、毎回gcc -std=c99を書き込むのは煩わしいし、複数のソースファイルをコンパイルして実行する方法がわかりません。 Emacsで複数のソースファイルをC99で?コンパイルして、実行する効率的なやり方が知りたいです
574 名前:デフォルトの名無しさん mailto:sage [2012/01/29(日) 16:40:29.72 ] IDE(統合開発環境) vs emacs(テキストエディタ) kohada.2ch.net/test/read.cgi/prog/1244310984/
575 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 07:41:57.55 ] >>573 make もしくはbatかシェルスクリプト
576 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 07:46:48.53 ] ふつうmakeだろ
577 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 08:57:23.22 ] GetOpenFileName/GetSaveFileNameで lpstrFileに確保するバッファの大きさを決めるにあたって あらかじめ受け取るファイル名の長さを取得できないでしょうか。 長さが足りない場合再起不能だし、かといって使われないのに数キロも確保したくないし それでも足りない場合だってあるだろうし。 GetWindowTextに対するGetWindowTextLengthのような 関数があればよいのですが、この場合ユーザーからの入力なので どうしたものやら。
578 名前:573 mailto:sage [2012/01/30(月) 09:04:33.22 ] ありがとうございます。 Makeの使い方を調べてみます。
579 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 10:32:00.09 ] >>577 MAX_PATH分確保しとけばいいだろ
580 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 10:36:18.61 ] 大きなバッファを用意しても、260文字以上は格納されないんですか?
581 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 11:04:06.02 ] WinAPIならファイル名読むタイプのAPIは大抵バッファに読み込んだ文字数返るから その文字数とバッファ長比べてバッファが足りてないと判断したら失敗とみなしてバッファを伸ばしてリトライすればいいよ
582 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 11:12:39.59 ] つーか、そもそもCommonDialogで256文字以上返せるのか? そうでないなら260どころか、257で充分だ。
583 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 11:22:41.08 ] ttp://msdn.microsoft.com/en-us/library/ms646839(VS.85).aspx
584 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 21:01:42.03 ] 仮想関数の戻り値が、継承先の型でもOK、っていうルールの名前を何ていったっけ?
585 名前:デフォルトの名無しさん mailto:sage [2012/01/30(月) 21:11:23.37 ] 共変性かな
586 名前:584 mailto:sage [2012/01/31(火) 07:55:25.34 ] >>585 それだ!ありがとー!
587 名前:577 mailto:sage [2012/01/31(火) 16:47:56.33 ] おお、ディレクトリ含めて260文字とかいれたら、無効ですって言われた・・・ ってことは、260文字以上入れたかったら、自分でダイアログ作れってことか・・・
588 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 17:03:36.11 ] 32ビットWindowsなんだけど アクセスして良いポインタかどうかを判定しようとしていて ぬるぽ 0 初期化されてない有効なヒープ 0xcdcdcdcd 解放されたヒープ 0xfeeefeee この他に、一見してアクセスできなそうなポインタって何かあるかな。
589 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 17:06:29.89 ] そんなんで判断するなよ
590 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 17:07:41.88 ] 0xdeafbeef 0xdeaddead 0xbeaffeed
591 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 18:05:29.85 ] 自分で確保してない領域にアクセスすんな。
592 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 19:51:41.31 ] 外部から渡される未知のポインタなんよ
593 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:47:10.19 ] なにそれ怖い
594 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 20:50:48.03 ] 悪魔召喚ポインタ
595 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:17:34.81 ] 絶対に逆参照してはいけな
596 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:23:31.08 ] 書き込んだ名前の人間は必ず死ぬという死神のポインタ
597 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:26:01.82 ] C系列って恐ろしい言語だったんだな
598 名前:デフォルトの名無しさん mailto:sage [2012/01/31(火) 21:29:14.36 ] しょうもないネタには食いついてやがんの