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でのインデントはスレに貼ると無くなります。 そのため、アップローダーに上げるのも手ですが直接貼る場合は、 全角空白か に置換すると見栄えだけはよくなります。
648 名前:642 mailto:sage [2010/05/02(日) 08:04:44 ] >>644 ありがとうございます。
649 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:08:33 ] ちなみに、>>645 がどういう意味かと言うと、 1.単に char str0[20]; としただけじゃメモリ領域が確保されただけなので、 そこには既に何かの値が残っているかもしれない 2.printf や strlen など、「ここからここまでを文字列とみなす」 処理は、ASCIIコード 0x00 を終端として見ている 3.1と2から、中身をクリアしていない str0 を渡したらどうなるかは誰にもわからない なので、先に 0x00 を置いて「空っぽの文字列」を表した。 と、言う事 str0[0]='\0'; とする代わりに strcpy(str0, ""); でもいいよ
650 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:09:13 ] >>647 \0がなかったのが原因なんですね。 ところでこの滅茶苦茶な値はどっからきたんでしょうか?
651 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:17:13 ] >>650 >>649 を見ろ。どこから来たんじゃなくて、既にあった何かだよ メモリは有限なので常に再利用されてるだけ
652 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 08:19:00 ] >>651 すみません、すぐ前の書き込みだったので見ずに投稿してしまいました。 ありがとうございました。
653 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 10:21:44 ] 何を再利用してそうなったのかってのを考えたり調べたりしてみても楽しいかもね 「再利用を繰り返すことで、本来見えない部分を見ようとする」攻撃手法もあるので それを見越してゼロクリアするようになってる環境もあったりする
654 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 10:43:21 ] >623 だいぶ間が開いてるけど指摘がないので。 >char foo[] = "XYZ"; // その2:char 配"列の先頭"の、アドレスを渡している これ初期化だからアドレスを渡しているわけではない。 char foo[]={'X',Y'',Z'','\0'}; のシンタックスシュガーになっているだけ。 >char *bar = foo; // その3:その2の配"列の先頭のアドレス"を、コピーしてから渡している これも微妙な表現。日本語で書くと以下のような感じ。 「配列fooの先頭要素をさすポインタを代入」 char *bar = &foo[0]; のシンタックスシュガーになっている。
655 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 10:52:11 ] 普通の関数はname space/classのどっちに所属させた方がいいんですか?
656 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 11:19:12 ] >>654 指摘が無いのは、話の流れ上じゃね。論点の違いというか。 ・・・ただまぁ、横から見ただけの初心者がそのレスだけみたら誤解するかもしれないから 安価つけて補足や指摘しておくのはいいことだと思うけど
657 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 11:20:27 ] >>655 "普通の"ってのが何なのか分からないけど ただの計算関数とかならnamespace オブジェクトに属するならclass
658 名前:655 mailto:sage [2010/05/02(日) 11:39:41 ] >>657 わかりました ありがとうございます
659 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 17:55:38 ] 配列のポインタは、先頭の要素のアドレスが入るんですよね? char a[2] = "XY"; printf("%p ", a); //アドレスが表示される printf("%c ", *a); //要素そのものを表示させる時は間接参照演算子をつける ここまでは理解できるんですが printf("%c ", *a[0]); ↑では正しくはa[0]と書くそうですが、なぜですか? 今までの流れだと*のついてないa[0]は配列aの先頭要素を表すポインタを表しそうなんですが… 実際には要素を現すみたいです。
660 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 17:59:25 ] arr[N] == *(arr + N)
661 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 18:11:26 ] []は普通要素への参照を返す a[0]なら先頭の要素 a[1]なら2番目の要素
662 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 18:23:56 ] >659 >配列のポインタは、先頭の要素のアドレスが入るんですよね? 確実に勘違いしているが、どう勘違いしているのかよくわからない。 「配列のポインタ」が何を指しているのかが不明。 1)式の中で配列名のみを書くと、その配列の先頭要素を指すポインタとして評価される。 ※例外は&,sizeofのオペランドと、char配列の初期化子として文字列を記述した場合。 2) char *aStr[10]; // charポインタの配列 3) char (pArray)[10]; // char配列を指すポインタ >661 何を言っているかさっぱりわからない。>660をよく読むこと。
663 名前:デフォルトの名無しさん mailto:sage [2010/05/02(日) 19:53:21 ] うかつに参照って言葉を使っちゃ駄目
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)共に ビルドと実行がうまくいきました。 本当にありがとうございました。 いと難しいこと限りなし