1 名前:デフォルトの名無しさん [2010/03/05(金) 16:51:13 ] エスケープシーケンスやWin32APIなどの環境依存なものでもOK。 ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm codepad.org/ (コンパイルもできるし出力結果も得られるのでお勧め) ◆ソースのインデントについて 半角空白やTABでのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
664 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 20:00:49 ] プログラミングの世界だと、参照って言葉ははっきりと定義されて使われるから誤解を招く場合があるもんな
665 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 21:56:14 ] 関数Aが2つのスレッドから同時に使われている、 関数Aに渡すデータは完全に別物 って場合は、スレッドセーフなの?
666 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:01:17 ] >>665 いいえ
667 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:05:19 ] >>665 それに加えて、関数内でstatic変数とかglobal変数とかを使っていないという縛りが入るな。
668 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:27:42 ] そこからさらにスレッドアンセーフな関数を呼び出さないという縛りもあるな
669 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 22:41:53 ] グローバルデータをローカルに移し持たないという縛りもあるな
670 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 23:40:33 ] 要約すると、マルチスレッドについてちゃんと勉強してから使ってね
671 名前:665 mailto:sage [2010/05/03(月) 11:58:08 ] >>666-670 thx
672 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:04:33 ] メンバ変数とローカル変数の区別が付けにくいのですが、 お前らはどうしていますか?
673 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:06:30 ] class hoge { int m_value; }; class fuga { int value_; }; class piyo { int value; void func(void) { this->value; } };
674 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:09:51 ] this->厨は滅ぶべき 単純な構造体は除くが
675 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:10:27 ] >>672 int mVariable; メンバー int aVariable; 自動変数 int cVariable; 定数 int rVariable; 参照
676 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:12:14 ] class widget { int value; void method(void) { widget &self = *this; self.value = 1; } };
677 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 13:16:54 ] >>975 引数は? 自動変数のconst参照は? static constメンバは?
678 名前:672 mailto:sage [2010/05/03(月) 13:22:46 ] 大体の人が同じみたいですね ありがとうございます
679 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 14:24:39 ] #typpedef longPointerConstInto
680 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:24:57 ] namespace Test { class Hoge; } ヘッダファイルにこれしか書いていないんですけど、何がしたいんですか?
681 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:27:54 ] pc12.2ch.net/test/read.cgi/tech/1271591488/502-
682 名前:デフォルトの名無しさん mailto:sage [2010/05/03(月) 20:39:29 ] コンパイラにこんなヤツがいるよって教えてるだけです
683 名前:680 mailto:sage [2010/05/03(月) 20:56:44 ] >>682 thx
684 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 09:57:42 ] ポインタの配列はどうしますか? 思いつく限りで↓ int* pVar[10]; int* pTblVar[10]; int* ppVar[10]; int* pVarTbl[10]; int* TblPVar[10];
685 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 10:08:10 ] int* vals[10];
686 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 11:37:52 ] ポインタにpを付けた所で 特別分かりやすくなるわけでもない そんなの気にして命名しなくてもいいよ
687 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:18:07 ] pがないと,ドット演算子使うかアロー演算子使うか迷うじゃないですか.
688 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:20:58 ] 地味にそれはある。IDE使ってる身分で言えば迷う事も無いけど、 テキストエディタで作業する時は地味に頼りにする
689 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:23:16 ] 迷わねーよどんだけスコープ広くしてんだよ
690 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:25:48 ] どんだけ小規模なコード書いてんだよ
691 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:28:04 ] 変数のスコープと規模は関係ねーだろ工夫しろ
692 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:30:50 ] 型名が変数名に含まれていないと型が分からないじゃないですか とか言ってシステムハンガリアンになりそうだな
693 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:33:40 ] LPDIRECTX9DEVICE dev; これってポインタかそうでないか
694 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:35:35 ] IDirect3DDevice9 * device; com とか全部に p 付けるのはめんどくさい
695 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:38:29 ] そんな訳でtypedefして型名に LP と付けました。 名前に書かれてるとわかりやすいですネ
696 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:39:30 ] nearポインタって組み込みとかだと 現役だったりするの?
697 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:40:19 ] CComPtr<IDirect3DTexture9> texture; std::vector<CComPtr<IDirect3DTexture9>> textures; これをpTexture、pTextureArrayとかにするのは嫌だ
698 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:49:14 ] おそらくVisualStudioしか使わない人がp付けないんだろうな イニシャライザリストでもNULLに初期化かどうかで迷うし
699 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:53:19 ] 俺システムハンガリアンじゃないけど、pくらいは付けるわ。 あとは特にprivate空間でとか割りと気楽に付けられる変数名は臨機応変。
700 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:56:40 ] >>698 emacs使いだけどpなんてつけないな。 ポインタかどうかに限らず、初期化リストで値突っ込むときは型見るだろ。
701 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:57:01 ] GCCで書いててもpは付けねーわ。
702 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 12:58:45 ] gccにエディタなんてあるの?
703 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:01:32 ] 標準入力からソース打ち込んでるんだろ
704 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:05:08 ] strcpyを使って配列を初期化するコードはあんまりよろしくないんですか?
705 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:08:01 ] intの配列とかだとよろしくないだろうな、とか言って
706 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:12:40 ] もちろん文字列ですよ^^
707 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 13:44:12 ] >>704 なぜよろしくないと思った(あるいは見た、聞いた?)のか?
708 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:12:22 ] VC2005以降は警告出るしな 出力先の配列サイズをチェックしない関数で危険だから safe関数使えって
709 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:17:15 ] >>688 >>690 引数、ローカル変数、メンバ変数くらいしか確認する必要ないし 普通初めて使う変数の型くらい確認するだろ >>693 >>694 ATL使えでFA スマポなしでプログラムしてるのが悪い >>698 初期化リストに突っ込むときは基本的に変数を作る時だから 自分で型分かってるだろ
710 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:26:42 ] >>709 は是が非でもp付けるのは認めないとする使いづらいPGの典型 >普通初めて使う変数の型くらい確認するだろ だから、初めて使う時以外、その変数は使わないのかってww 全部型覚えとくの?それとも使うたびに毎回確認するの?p って付いてるだけで一手間減るなら別にいいじゃない
711 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:30:45 ] どちらにしろ久しぶりに使うコードなら型を確認するだろう 型も分からない変数を扱おうとする人の気が知れない
712 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:34:13 ] コンパイラがチェックするのにpとか無意味。pが正しいかどうか保障できないし、結局確認しなけりゃならない。 C++でポインタ使うのはライブラリの中だけだし
713 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:35:42 ] 関数の戻り値がポインタだからって関数名の先頭にp付けてるか? 関数の定義を見なくても引数のどれがポインタなのか分かるように関数名を修飾してるのか? そもそもポインタかどうか以外にも確認すべき事はあるんじゃないか? ポインタかどうかだけ分かっても仕方が無いんじゃないか? ポインタ止めて参照にした時変数名変えるのか? ってこと
714 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:36:47 ] そうか毎回コンパイラにチェックさせて書き直せばいいのか そう考えたらIDEって便利だよな。 どれだけ適当でも行ける
715 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:38:15 ] どうせ毎回一発でコンパイル通る事ないしな
716 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:40:10 ] >>713 少なくともポインタ止めて参照に変えるようなケースなら そのタイミングでむしろ変数名変えたっていいんじゃね? とりあえずおちつけ
717 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 15:58:28 ] 好みだとは思うけど ・どうせ変数の型は使うときに確認する ・名前の変え忘れが多い(ポインタじゃないのにpつける、ポインタじゃなくなったのにpのまま) っていう実務上の教訓から、うちの会社はpつけんな、っていうコーディング規約になってるよ。 特にインテリセンスに慣れた輩は、変数名の記述ミス、スペルミスがあっても平気で放置するしな。
718 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:02:27 ] ポインタかどうか迷うぐらい曖昧だと変数名にpがついてたかどうかもわかんねーんじゃ? 読むだけならヒントにはなるかもね〜程度に考えた方がいい そして読むだけなら周辺をチラ見すりゃポインタかどうかの判断ぐらいすぐつく
719 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:05:46 ] Hoge hoge; Hoge hoges[num]; Hoge *hoge = new Hoge(); Hoge *hoges = new Hoge[num]; shared_ptr<Hoge> hoge; vector<shared_ptr<Hoge>> hoges; p つけると配列なのかそうでないのかとか 変数名の命名に困る
720 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:09:54 ] C++だとtemplateがあるからなぁ 名前付ける時点で型がわからないかもしれないじゃん そういう時はpの人はどうしてるの?
721 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:34:29 ] >>719 C++で今時生ポは無いだろう。
722 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:36:27 ] あるよ…
723 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 16:40:14 ] 必要ないところで汎用のスマポ使う奴は雑魚
724 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:00:23 ] >>721 今のC++でも普通に生ポは使うだろう。 俺はshared_ptr愛用するけども。
725 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:03:13 ] ポインタ扱うところはさっさとclass内に隠蔽しちゃうけど
726 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:03:26 ] 配列を渡す所全部テンプレートかvectorにするのは流石に厳しいな
727 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:04:18 ] >>721 は知らず識らず循環参照してそう
728 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 17:06:55 ] >>721 は最近スマポを勉強したばかりなので許してあげてください
729 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 21:49:29 ] 生ポはスマポより軽いですよ スマポなんて,絶対つかっちゃだめ
730 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 21:54:39 ] 結局どっちなんだYO
731 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:05:24 ] 共有するならshared_ptr しないなら状況に最適化されたスマポを自作 カプセル化された環境で管理しきれるなら生ポ
732 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:07:01 ] とりあえず生ポはクラスのメンバでなら持ってるな デストラクタで廃棄
733 名前:急にごめんなさい。。。 [2010/05/04(火) 22:10:50 ] 大学2年です。もう1時間半苦戦しています。教えてください。 構造体を使い、メンバー変数に氏名、所属コース、出身高校を持つものを作成し キーボードからこれらの変数を入力し、出力するプログラムを作成しなさい。 という実習課題がでたのですが自分が作成したプログラムでは セグメンテーション違反です と表示されるばかりで。。。 教えてください。どこがおかしいのでしょうか? #include<stdio.h> struct profile{ char *Name; char *Course; char *Koukou; }; int main(void){ struct profile seito1 ; printf("氏名を入力してください。\n"); scanf("%s",&seito1.Name); printf("所属コースを入力してください。\n"); scanf("%s",&seito1.Course); printf("出身高校を入力してください。\n"); scanf("%s",&seito1.Koukou); printf("氏名:%s\n",seito1.Name); printf("所属コース:%s\n",seito1.Course); printf("出身高校:%s\n",seito1.Koukou); return 0; }
734 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:17:13 ] いい気になりやがって。何でもかんでも&つけりゃいいと思うなよ
735 名前:デフォルトの名無しさん [2010/05/04(火) 22:17:54 ] とりあえず徹夜しろ。
736 名前:急にごめんなさい。。。 [2010/05/04(火) 22:19:56 ] &をつけてもつけなくても セグメンテーション違反です。と表示されます。。。 どこを変えればいいんでしょうか?
737 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:20:21 ] >>733 char Name[100]; //保存場所が無い。 scanf("%s",seito1.Name) //配列はポインタとして使える
738 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:22:58 ] >>736 入力された文字列のデータはどこに格納してるつもりだい
739 名前:急にごめんなさい。。。 [2010/05/04(火) 22:26:27 ] >>737 できました!!!ありがとうございます。
740 名前:デフォルトの名無しさん mailto:sage [2010/05/04(火) 22:27:45 ] >>734 リアルゆとりにそんなこというなよ >>733 は低脳日本人が生み出した超すごい世代なんだから >>733 ゆとりだから質問するスレが分らないのはしょうがないけど、普通は pc12.2ch.net/test/read.cgi/tech/1269438098/l50 で宿題関連は質問する。次回からそこで質問汁
741 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:01:51 ] ポインタについて、*tに文字列を関数内で入れたいのですが、 下記のようにすると、ビルドは成功するのですが 実行時に"The variable 't' is being used without being defined" というエラーメッセージが出ます。 関数test(t)で*tに文字列を入れるにはどうしたらいいでしょうか。 教えてください。 int main(int argc, char *argv[]) { char *t; test(t); cout << t << endl; return EXIT_SUCCESS; } void test(char *t) { t = new char[100]; int i = 0; cout << "step1" << endl; t[i++] = 'a'; t[i++] = '\0'; }
742 名前:741 mailto:sage [2010/05/05(水) 01:09:57 ] pc12.2ch.net/test/read.cgi/tech/1269438098/l50 で質問しました。
743 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:18:04 ] >>741 void test(char *t) これはポインタを値渡ししてるからポインタを引数で返すことはできない ポインタを返すにはポインタのポインタ void test(char **t) にしなければならない 後は自分で治して
744 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:31:13 ] こっちにも貼っとくわ int main(int argc, char *argv[]) { char *t; test(t); cout << t << endl; return EXIT_SUCCESS; } void test(char *&t) { t = new char[100]; int i = 0; cout << "step1" << endl; t[i++] = 'a'; t[i++] = '\0'; }
745 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:32:30 ] >>741 つ void test(char* &t)
746 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:34:56 ] >>744 ポンタポンタ版もよろ
747 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 01:56:40 ] >>746 int main(int argc, char *argv[]) { char *t; test(&t); cout << t << endl; return EXIT_SUCCESS; } void test(char **t) { *t = new char[100]; int i = 0; cout << "step1" << endl; (*t)[i++] = 'a'; (*t)[i++] = '\0'; }
748 名前:741 mailto:sage [2010/05/05(水) 02:04:30 ] >>743-747 アドレス版(*&t)とポインタポインタ版(**t)共に ビルドと実行がうまくいきました。 本当にありがとうございました。 いと難しいこと限りなし
749 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 03:42:08 ] strncpyに関しての質問ですが, 実装が↓みたいな感じで かなり定型的で面倒なのですが, こういうものなのでしょうか. というより,もっと簡便な方法があったりするでしょうか? char dst[256]; memset( dst, 0, sizeof( dst ) ); strncpy( dst, src, sizeof( dst ) / sizeof( char ) - 1 );
750 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 04:00:42 ] 俺ならこうする char dst[256]; int len = strlen(src); if (len >= sizeof(dst)) { len = sizeof(dst) - 1; } memcpy(dst, src, len); dst[len] = '\0'; か、 こうする sprintf(dst, "%.*s", sizeof(dst)-1, src));
751 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 04:02:20 ] 所詮Cは高級アセンブラなのです。 マクロ使うぐらいじゃないかなぁ。 あとそのコードだとmemsetはいらないと思うけど。 Better CとしてのC++に移行するとちょっと楽になるよ。
752 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 04:11:46 ] C++でもSTL使えない環境だったらおなじですよね. あとmemsetはdstの最後に終端文字を付けてるんですね.
753 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 04:18:39 ] STLも使えないような糞組み込み環境なら贅沢言わないでCで書いてろよ……
754 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 07:05:54 ] >>749 「定型的」ってことは、文字列を入れる配列は「とりあえず0クリア」 みたいに思ってるのかね。 文字列の後ろはゴミを入れたままでいいよ。
755 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 07:53:56 ] >>732 他のメンバがあったりしてコンストラクタから例外が飛ぶと漏れることがあるから気をつけろよ。
756 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 08:55:01 ] cFunc::cFunc(HWND hWnd, bool tyui, int width, int height) { //初期化メンバ関数 this->init(hWnd, tyui, width, height); } C++の勉強をしていたのですが、とあるソースのコンストラクタの中に以上のような記述がありました クラスの中で、コンストラクタとは別に初期化用関数を作るメリットなどがありましたら教えて頂きたいです
757 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:12:25 ] 他のコンストラクタや コンストラクタ以外でも init() を使える
758 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:13:54 ] >>756 引数違いのコンストラクタが複数ある場合には必須だとか デフォルトコンストラクタを定義したいとか 色々あるだろうけど、this->厨は爆発すればいいと思う。
759 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:27:12 ] >>757-758 参考になりました。ありがとうございます。 ちなみに「this->」は何が問題なのでしょうか・・・?
760 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 09:34:17 ] this->厨厨は基地外だから触らなくていいよ
761 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 10:49:16 ] >>754 とりあえず0クリアがコーディング規約になってる場合もあるからなあ でも char dst[256] = ""; だけで0クリアできるんだけどね 配列の初期化では、初期化を行っている場合、値の指定されていない要素は0で初期化される (明示的に初期化していない場合は実際に何も初期化されないので、とりあえず何かで初期化する必要はある)
762 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 10:52:16 ] this->はインテリセンスが効いて便利と言う人もいるが 純粋にキモい
763 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 12:42:39 ] ゼロ終端さえあればあとはゴミだらけでもいい でも例えばその文字配列を丸ごとどこかファイルに永続化するような場合には、 予めそこにゴミが残ってる事もわかった上で使わないといけない 気にするべきポイントなんてそんなもん
764 名前:デフォルトの名無しさん mailto:sage [2010/05/05(水) 12:53:34 ] ファイルに文字列、文字列のペアを保存して読み書きしたいのですが 今やってるのは ・keyの長さ(4 byte) ・valueの長さ(4 byte) ・key (x byte) ・value (y byte) を1つのデータと見て データの長さを読む→keyとvalueを読む→次のデータの長さを読む→・・・ といった感じで先頭から繰り返して欲しいkeyに対応するvalueをメモリに読み込みます ですがこれだと死ぬほど遅いので効率をよくしたいです なにか典型的な解決方法とかってありますか?